Stuff Δημοσ. 2 Ιανουαρίου 2006 Μέλος Δημοσ. 2 Ιανουαρίου 2006 Καλημέρα και Χρόνια Πολλά Κάπου με μπερδεύει αυτό που θες να κάνεις. Αν έχω καταλάβει καλά' date=' ζητάμε καταρχήν από κάθε Πίνακα το σύνολο των μεταθέσεων, δηλαδή 6 τριάδες από τον πρώτο Πίνακα και έξι από τον δεύτερο αφού 6=3! Πιό συγκεκριμένα, οι τριάδες του πρώτου Πίνακα θα είναι (1,2,3), (1,3,2), (2,3,1), (2,1,3), (3,1,2) και (3,2,1). Αντίστοιχα, οι τριάδες του δεύτερου Πίνακα θα είναι (Χ,Υ,Ζ), (Χ,Ζ,Υ), (Υ,Ζ,Χ), (Υ,Χ,Ζ), (Ζ,Χ,Υ) και (Ζ,Υ,Χ). Το τελικό output θα αποτελείται από το σύνολο των διατετεγμένων ζευγών που προκύπτουν συνδυάζοντας όλες τις τριάδες της πρώτης ομάδας μ' εκείνες της δεύτερης, πράγμα που σημαίνει 6*6=36 συνδυασμούς. Ομως πιό πάνω γράφεις "27 tha einai oles oi diaforetikes periptoseis". Εχω καταλάβει κάτι λάθος; Εννοείται ότι ο κώδικας δεν είναι ότι πιό εύκολο. Με δεδομένο των πλήθος τριών στοιχείων ανά ομάδα η λύση βγαίνει -λίγο μπακάλικα- με nested for, η γενική περίπτωση λύνεται πιό κομψά με αναδρομή. Γίνεται πάντως, αλλά το σημαντικότερο είναι να διατυπωθεί, όσο σαφέστερα γίνεται αυτό που ζητάμε.[/quote'] Geronta dikio exeis, oloi oi sindiasmoi tha einai 36! O kathe arithmos kai to kathe gramma parousiazetai 1 fora mesa stin parenthesi ton stoixeion. Diladi den mporei na einai (1X, 1Y, 3Z). Kai pistevo oti isxeiei o tipos n^3 + n^2 logo tou oti exoume ena 3x3 pinaka. An katalavete to silogismo tora ..mia pio diskoli erotisi! Mporei na ginei implement sto Excel? i se kana SPSS? i kana allo programma? Efxaristo
Stuff Δημοσ. 12 Ιανουαρίου 2006 Μέλος Δημοσ. 12 Ιανουαρίου 2006 Geronta mipos exeis erthei me kamia lisi?
gerontas Δημοσ. 14 Ιανουαρίου 2006 Δημοσ. 14 Ιανουαρίου 2006 Geronta mipos exeis erthei me kamia lisi? Oups sorry, μόλις τώρα το είδα αυτό. Ετοιμη λύση, κάπου πρέπει νάχω, αλλά δυστυχώς κατά 99% σε ...Prolog. Αν δεν επείγει πολύ, ευχαρίστως να γράψω κάτι σε pascal ή C, όχι όμως αυτό το Σ/Κ, πνίγομαι
Sta Δημοσ. 14 Ιανουαρίου 2006 Δημοσ. 14 Ιανουαρίου 2006 Geronta dikio exeis' date=' oloi oi sindiasmoi tha einai 36! O kathe arithmos kai to kathe gramma parousiazetai 1 fora mesa stin parenthesi ton stoixeion. Diladi den mporei na einai (1X, 1Y, 3Z). Kai pistevo oti isxeiei o tipos n^3 + n^2 logo tou oti exoume ena 3x3 pinaka. An katalavete to silogismo tora ..mia pio diskoli erotisi! Mporei na ginei implement sto Excel? i se kana SPSS? i kana allo programma? Efxaristo[/quote'] Ο τύπος που αναφέρεις δεν ισχύει, αν τα σύνολα σου ήταν: (1,2,3,4) και (Χ,Υ,Ζ,W) θα είχες 4!*4! αποτελέσματα, γενικά δηλαδή είναι n!*n! (n παραγοντικό επί n παραγοντικό). Τώρα εσύ θέλεις πρόγραμμα που να συνδυάζει έτσι όπως λές τα: (1,2,3) και (Χ,Υ,Ζ) και να δίνει τα 36 πιθανά αποτελέσματα ή να πάμε στη γενική περίπτωση για ν-μελή σύνολα;
Stuff Δημοσ. 15 Ιανουαρίου 2006 Μέλος Δημοσ. 15 Ιανουαρίου 2006 STA afto thelo pou aneferes: (1,2,3) και (Χ,Υ,Ζ) και να δίνει τα 36 πιθανά αποτελέσματα
Sta Δημοσ. 15 Ιανουαρίου 2006 Δημοσ. 15 Ιανουαρίου 2006 Έκανα μία μετατροπή σε ένα παλιότερο πρόχειρο προγραμματάκι σε C, προέκυψε το εξής όχι και τόσο αποδοτικό αποτέλεσμα: > #include <stdio.h> typedef struct triad { char a,b,c; } triad; void permutationsOf3(triad t,triad *triads) { int i,j,k,counter=0; for (i=0;i<3;i++) for (j=0;j<3;j++) for (k=0;k<3;k++) if ( (i!=j) && (j!=k) && (k!=i) ) { char *c=&t; triad t2={c[i],c[j],c[k]}; triads[counter++]=t2; } } void combine(triad t1[6],triad t2[6]) { int i,j,counter=0; for (i=0;i<6;i++) for (j=0;j<6;j++) printf("%d: (%c%c,%c%c,%c%c)\n",++counter,t1[i].a,t2[j].a,t1[i].b,t2[j].b,t1[i].c,t2[j].c); } int main() { triad t1={'1','2','3'}; triad t2={'A','B','C'}; triad t3[6],t4[6]; permutationsOf3(t1,t3); permutationsOf3(t2,t4); combine(t3,t4); return 0; }
wultz Δημοσ. 15 Ιανουαρίου 2006 Δημοσ. 15 Ιανουαρίου 2006 Συνημμένα υπάρχει ένα αρχειάκι με αυτό που θες. Είναι λίγο πολύπλοκο, αλλά δεν βρήκα πιο απλό τρόπο που να μη χρειάζεσαι μακροεντολή. Test.zip
Stuff Δημοσ. 16 Ιανουαρίου 2006 Μέλος Δημοσ. 16 Ιανουαρίου 2006 Wultz apistefto! Afto akrivos epsaxna. Ti macro einai akrivos afto? mporo na to katevaso i iparxei kapoios sxoliasmos aftou tou macro? Efxaristo poli pantos kai tous proigoumenous gia tis apantiseis tous!
clairvoyant Δημοσ. 17 Ιανουαρίου 2006 Δημοσ. 17 Ιανουαρίου 2006 Wultz apistefto! Afto akrivos epsaxna. Ti macro einai akrivos afto? mporo na to katevaso i iparxei kapoios sxoliasmos aftou tou macro? Efxaristo poli pantos kai tous proigoumenous gia tis apantiseis tous! δεν χρησιμοποιεί macro, αλλά μια τερααααααάστια συνάρτηση!
wultz Δημοσ. 20 Ιανουαρίου 2006 Δημοσ. 20 Ιανουαρίου 2006 Όπως είπε και ο clairvoyant δεν είναι μακροεντολη αλλά συνάρτηση. Πιο εύκολα θα ήταν να έκανες χειροκίνητα τους συνδυασμούς, παρά αυτό. Τι εννοείς αν υπάρχει σχολιασμός; Δεν το κατάλαβα...
Stuff Δημοσ. 22 Ιανουαρίου 2006 Μέλος Δημοσ. 22 Ιανουαρίου 2006 Wultz, nomiza oti eixes xrisimopoiisei macroentoli, kai xreiazotan kapoia perigrafi gia afti, alla afou einai synartisi den iparxei provlima. Se efxaristo poli kai pali, epsaxna pantou gia afto
Stuff Δημοσ. 4 Δεκεμβρίου 2007 Μέλος Δημοσ. 4 Δεκεμβρίου 2007 Mia mikri tropopoiisi an ginetai, se 4x4 pinaka kai olous tous random sindiasmous stin sinartisi pou eftiakse o Wultz?
Stuff Δημοσ. 19 Φεβρουαρίου 2008 Μέλος Δημοσ. 19 Φεβρουαρίου 2008 Δεν μπορώ να βγάλω την ακριβή εξίσωση για 4χ4. Μπορεί κάποιος να βοηθήσει?
bilco Δημοσ. 20 Φεβρουαρίου 2008 Δημοσ. 20 Φεβρουαρίου 2008 > Sub CombineRanges(ByRef r1 As Range, ByRef r2 As Range, ByRef rw As Range) On Error GoTo failed If ((r1.Rows.count <> r2.Rows.count) Or (r1.Columns.count <> 1) Or _ (r2.Columns.count <> 1) Or (r1.Rows.count > 5)) Then MsgBox "Input ranges must have one column and equal number of rows," & _ " not more than 5" Exit Sub End If If (rw.Rows.count <> 1) Or (rw.Columns.count <> 1) Then MsgBox "Output range must be a single cell" Exit Sub End If Dim r As Range Dim n As Integer, k As Integer, i As Integer, count As Integer Dim v1() As Integer, v2() As Integer n = r1.Rows.count k = Application.WorksheetFunction.Fact(n) k = k ^ 2 Set r = rw.Worksheet.Range(rw, rw.Offset(k, n)) ReDim v1(n) ReDim v2(n) For i = 1 To n v1(i) = i v2(i) = i Next count = 1 Do Do WriteRow r1, r2, r, v1, v2, count Loop While (NextPermutation(v2)) Loop While (NextPermutation(v1)) Exit Sub failed: MsgBox "Operation failed", vbCritical, "Error" End Sub Sub WriteRow(ByRef r1 As Range, ByRef r2 As Range, ByRef ro As Range, _ ByRef v1() As Integer, ByRef v2() As Integer, ByRef row As Integer) Dim i As Integer For i = 1 To UBound(v1) ro(row, i).Value = r1(v1(i)).Value & r2(v2(i)).Value Next row = row + 1 End Sub Function NextPermutation(ByRef v() As Integer) As Boolean Dim n As Integer, n1 As Integer, m As Integer n = UBound(v) While (True) n1 = n n = n - 1 If (v(n) < v(n1)) Then m = UBound(v) While (v(n) >= v(m)) m = m - 1 Wend Swap v, n, m Reverse v, n1, UBound(v) NextPermutation = True Exit Function End If If (n = 1) Then Reverse v, 1, UBound(v) NextPermutation = False Exit Function End If Wend End Function Sub Swap(ByRef v() As Integer, ByVal i As Integer, ByVal j As Integer) Dim k As Integer k = v(i) v(i) = v(j) v(j) = k End Sub Sub Reverse(ByRef v() As Integer, ByVal first As Integer, ByVal last As Integer) Dim i As Integer For i = 0 To (last - first) \ 2 Swap v, first + i, last - i Next i End Sub Και το τρέχεις με την > Sub doit() CombineRanges ActiveSheet.Range("A1:A4"), ActiveSheet.Range("B1:B4"), _ ActiveSheet.Range("D1") End Sub Όπου στην Α1:Α4 είναι τα 1,2,3,4 στην Β1:Β4 τα X,Y,Z,W και το αποτέλεσμα θα ξεκινήσει από το D1 προς τα δεξιά και κάτω Μέχρι 5χ5 το αφήνω. Από κει και πέρα έτσι όπως είναι δεν δουλεύει (πρέπει να αλλάξεις τα integer σε long) και δεδομένου ότι έχεις (n!)^2 συνδυασμούς θα έχει πρόβλημα (εκτός απο τον "άπειρο χρόνο" που θε πάρει) και με το μέγιστο αριθμό γραμμών του excel (περίπτωση για 7χ7 δεν παίζει)
Stuff Δημοσ. 21 Φεβρουαρίου 2008 Μέλος Δημοσ. 21 Φεβρουαρίου 2008 Bilco φοβερός! Ευχαριστώ πολύ, αν και πρώτη φορά έβαζα VB κώδικα στο Excel, το έκανα και λειτούργησε.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.