Προς το περιεχόμενο

Random Pairs se excel


Stuff

Προτεινόμενες αναρτήσεις

Δημοσ.
Καλημέρα και Χρόνια Πολλά

 

Κάπου με μπερδεύει αυτό που θες να κάνεις. Αν έχω καταλάβει καλά' 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

  • 2 εβδομάδες αργότερα...
Δημοσ.
Geronta mipos exeis erthei me kamia lisi?

Oups sorry, μόλις τώρα το είδα αυτό. Ετοιμη λύση, κάπου πρέπει νάχω, αλλά δυστυχώς κατά 99% σε ...Prolog.

 

Αν δεν επείγει πολύ, ευχαρίστως να γράψω κάτι σε pascal ή C, όχι όμως αυτό το Σ/Κ, πνίγομαι :(

Δημοσ.
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 πιθανά αποτελέσματα ή να πάμε στη γενική περίπτωση για ν-μελή σύνολα;

Δημοσ.

Έκανα μία μετατροπή σε ένα παλιότερο πρόχειρο προγραμματάκι σε 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;

}

Δημοσ.

Συνημμένα υπάρχει ένα αρχειάκι με αυτό που θες.

 

Είναι λίγο πολύπλοκο, αλλά δεν βρήκα πιο απλό τρόπο που να μη χρειάζεσαι μακροεντολή.

Test.zip

Δημοσ.

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!

Δημοσ.
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, αλλά μια τερααααααάστια συνάρτηση! :)

Δημοσ.

Όπως είπε και ο clairvoyant δεν είναι μακροεντολη αλλά συνάρτηση.

Πιο εύκολα θα ήταν να έκανες χειροκίνητα τους συνδυασμούς, παρά αυτό.

Τι εννοείς αν υπάρχει σχολιασμός; Δεν το κατάλαβα...

Δημοσ.

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

  • 1 χρόνο αργότερα...
  • 2 μήνες μετά...
Δημοσ.

>
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 δεν παίζει)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...