Forum >> Principianti >> QUADRATO MAGICO 3X3

Pagina: 1 2 Avanti

Scusate, mi sto approcciando da poco a python, ci sarebbe qualcuno così gentile da propormi una soluzione per questo problema o comunque un aiuto?

Grazie





Testo


Verifica se una matrice 3x3 è un quadrato magico.
Un quadrato magico
di ordine n è una matrice quadrata n x n composta da tutti a soli i
numeri interi da 1 a n^2 e tale che la somma degli elementi su ogni
riga, ogni colonna ed ognuna delle diagonali principali sia la stessa.
beh, puoi rappresentare la matrice come una lista di liste. Poi, manovrando gli indici di lista è facile ottenere le somme delle righe e delle colonne.
Scusa per il disturbo, potresti inviarmi un esempio di come creare una matrice 3x3 del tipo [[8,4,6],[7,9,2],[5,1,3]] e poi verificare che le righe, le colonne e le diagonali siano il numero magico(15)

Grazie

beh, puoi rappresentare la matrice come una lista di liste. Poi, manovrando gli indici di lista è facile ottenere le somme delle righe e delle colonne.

Scusa, ho appena trovato come sommare le righe,colonne e diagonali, l'unica cosa che non capisco è come far si che nella matrice vengano inseriti numeri da 1 a 9 compreso senza che ci siano doppioni e non in ordine preciso ma casuale.

Grazie se mi rispondi




È facilissimo, se hai studiato bene il libro dovresti riuscirci da solo.



Non chiedere aiuto finché non sarai impazzito a furia di provare.




Perseverare è diabolico :devil:







##
# Questo programma visualizza tutti i quadrati magici 4 x 4 contenenti i numeri interi da 1 a 16.
# Una matrice n * n contenente i numeri interi 1, 2, 3, ..., n * n è un quadrato magico se la somma
# dei suoi elementi in ciascuna riga, in ciascuna colonna e nelle due diagonali ha lo stesso valore.
#

magicNumber = 34
n = 4

def visualizza(matrice, count):
 print("\n%d%s Quadrato magico" % (count, chr(186)))
 chr0 = chr(9472)
 print("%s%s%s%s" % (chr(9484), (chr0 * 2 + chr(9516)) * 3, chr0 * 2, chr(9488)))
 for riga in range(n) :
  for colonna in range(n) : print("%s%2d" % (chr(9474), matrice[ riga ][ colonna ]), end="")
  print(chr(9474))
  if riga < 3 : chr1, chr2, chr3 = chr(9500), chr(9532), chr(9508)
  else : chr1, chr2, chr3 = chr(9492), chr(9524), chr(9496)
  print("%s%s%s%s" % (chr1, (chr0 * 2 + chr2) * 3, chr0 * 2, chr3))
          
def controlloMatrice():
 count = 0
 lista1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ]
 for i1 in lista1 :
  lista2 = list(lista1)
  lista2.remove(i1)
  for i2 in lista2 :
   lista3 = list(lista2)
   lista3.remove(i2)
   for i3 in lista3 :
    if 17 < i1 + i2 + i3 < magicNumber :
     lista4 = list(lista3)
     lista4.remove(i3)
     for i4 in lista4 :
      if i1 + i2 + i3 + i4 == magicNumber :
       lista5 = list(lista4)
       lista5.remove(i4)
       for i5 in lista5 :
        lista6 = list(lista5)
        lista6.remove(i5)
        for i6 in lista6 :
         lista7 = list(lista6)
         lista7.remove(i6)
         for i7 in lista7 :
          if 17 < i5 + i6 + i7 < magicNumber :
           lista8 = list(lista7)
           lista8.remove(i7)
           for i8 in lista8 :
            if i5 + i6 + i7 + i8 == magicNumber :
             lista9 = list(lista8)
             lista9.remove(i8)
             for i9 in lista9 :
              if 17 < i1 + i5 + i9 < magicNumber :
               lista10 = list(lista9)
               lista10.remove(i9)
               for i10 in lista10 :
                if 17 < i2 + i6 + i10 < magicNumber and 17 < i4 + i7 + i10 < magicNumber :
                 lista11 = list(lista10)
                 lista11.remove(i10)
                 for i11 in lista11 :
                  if 17 < i9 + i10 + i11 < magicNumber and 17 < i3 + i7 + i11 < magicNumber and 17 < i1 + i6 + i11 < magicNumber :
                   lista12 = list(lista11)
                   lista12.remove(i11)
                   for i12 in lista12 :
                    if i9 + i10 + i11 + i12 == magicNumber and 17 < i4 + i8 + i12 < magicNumber :
                     lista13 = list(lista12)
                     lista13.remove(i12)
                     for i13 in lista13 :
                      if i1 + i5 + i9 + i13 == i4 + i7 + i10 + i13 == magicNumber :
                       lista14 = list(lista13)
                       lista14.remove(i13)
                       for i14 in lista14 :
                        if i2 + i6 + i10 + i14 == magicNumber :
                         lista15 = list(lista14)
                         lista15.remove(i14)
                         for i15 in lista15 :
                          if i3 + i7 + i11 + i15 == magicNumber and 17 < i13 + i14 + i15 < magicNumber :
                           lista16 = list(lista15)
                           lista16.remove(i15)
                           i16 = lista16[ 0 ]
                           if i13 + i14 + i15 + i16 == i4 + i8 + i12 + i16 == i1 + i6 + i11 + i16 == magicNumber :
                            matrice = [ [ i1, i2, i3, i4 ], [ i5, i6, i7, i8 ], [ i9, i10, i11, i12 ], [ i13, i14, i15, i16 ] ]
                            count += 1
                            visualizza(matrice, count)
              
controlloMatrice()


scusa ma... cos'è questa specie di minestra che vedo qui sopra?
Ho provato per un pò ma nel mio libro di testo non viene spiegato e non riesco a capire come fare a mescolare una matrice 3x3. Ho provato ad usare la funzione shuffle ma così riesco a mescolare solo le tre liste e gli elementi in ogni singola lista. Io vorrei mescolare gli elementi di tutte e tre le liste.

Qualcuno può aiutarmi?



--- Ultima modifica di Riycon2003 in data 2019-12-12 11:11:29 ---
cos'è questa specie di minestra che vedo qui sopra?
Ciao Riccardo, l'esercizio è proposto qui, alla fine del 6º capitolo, quindi con le sole conoscenze di "decisioni", "cicli", "funzioni" e "liste", non potevo risolverlo in modo migliore. O sbaglio? Hai qualche suggerimento?
cavoli ragazzi, non so se è un problema della traduzione italiana, ma *giuro* che non ci ho capito un'acca di quello che dice quel libro. Ma come si fa a vendere della m* del genere? Scusate l'inciso, ma io lo trovo pazzesco. Ogni volta che metto giù due righe ci passo le ore a cercare di esprimermi con esattezza (vedi mio libro, vedi mio blog...) e questi pubblicano e vendono delle schifezze inconcepibili.





Vabbè, detto questo... il tuo codice non c'entra niente né con quello che chiede l'OP, né con quello che chiede il libro-schifezza.
L'OP chiede di verificare se un quadrato 3x3 è magico, oppure no. E' molto banale: basta avere la pazienza di sommare tutte le righe, tutte le colonne, le due diagonali. E' *davvero* molto banale, al punto che uno studente pigro potrebbe cavarsela semplicemente facendo la somma "a mano", perché l'esercizio non chiede nessuna generalizzazione (verificare se una matrice NxN è un quadrato magico) e una matrice 3x3 è abbastanza piccola che il calcolo a mano si fa in fretta (sarebbe stato più furbo almeno chiedere "verificare se una matrice 100x100 è un quadrato magico"... così anche lo studente più svogliato capisce che deve almeno usare un "for" o due...)
Il libro-schifezza chiede di implementare, se ho capito bene, il "metodo siamese" (che è anche l'unico che ricordo a memoria... non è che sono proprio un esperto di quadrati magici...) per costruire un quadrato magico di ordine 2n+1. E appunto, il metodo siamese (A) funziona solo per i quadrati di ordine dispari, e (B) costruisce un solo quadrato. Tra parentesi, questo in effetti sarebbe un discreto esercizio da proporre (se li libro-schifezza non lo proponesse in modo così schifoso), perché appunto costringe a generalizzare.


Il tuo codice costruisce *tutti* i quadrati magici di un ordine particolare (4, che tra l'altro è pari). Quindi non c'entra assolutamente nulla né con il medoto siamese, né con quello che vuole l'OP... Mi chiedo perché tu l'abbia postato, e se hai capito quello che fa e soprattutto *come* lo fa...


Dovresti spiegare l'algoritmo che usi: li codice di per sé è scritto in modo assolutamente opaco, a colpo d'occhio non riconosco nessun algoritmo che conosco (per il semplice fatto che non ne conosco nessuno! non sono un esperto di quadrati magici, come detto), e onestamente non ho né voglia né tempo di analizzare quel codice per capire. Sempre a colpo d'occhio, il problema è che comunque non affronta il caso generale... nel senso, se invece ti chiedessi di generare tutti i quadrati 5x5, dovresti scrivere daccapo un nuovo codice (che sarebbe magari più lungo di quanto e indentato di quanto il compilatore python può permettersi...).

Dovresti spiegare l'algoritmo che usi
OK

questa è la matrice:

i1  i2  i3  i4

i5  i6  i7  i8

i9  i10 i11 i12

i13 i14 i15 i16


Parto dalla casella in alto a sx, annidando di volta in volta i cicli for, e togliendo i numeri già utilizzati dalle liste successive.

Ogni casella ha la propria lista con il relativo ciclo for.

Ho inserito le condizioni nei cicli per evitare di farli procedere inutilmente.

Per esempio:
if 17 < i9 + i10 + i11 < magicNumber and 17 < i3 + i7 + i11 < magicNumber and 17 < i1 + i6 + i11 < magicNumber :


arrivati alla casella 11, se la somma dei valori contenuti nelle caselle orizzontali 9, 10, 11 non è compresa tra 18 e 33 è inutile continuare, e lo è anche se la somma di quelle verticali 3, 7, 11 e di quelle diagonali 1, 6, 11 non è compresa tra questi 2 valori.




Le permutazioni possibili con n oggetti sono pari al fattoriale di n!.

Con una matrice 4 x 4 sono possibili 16! permutazioni, cioè circa 21 mila miliardi.

Inserendo le condizioni nei cicli for ho risparmiato parecchie miliardi di iterazioni.

se invece ti chiedessi di generare tutti i quadrati 5x5, dovresti scrivere daccapo un nuovo codice


Esatto, devo utilizzare 25 cicli for annidati, ma con il nostro computer non riusciremo a visualizzarli tutti in tempi brevi perché se ne formano 275305224 unici, più le rotazioni e le simmetrie di questi, quindi il numero cresce parecchio.

Ho visto ora, facendo una ricerca, che la somma dei numeri interni dei quadrati magici 6x6 è pari a 666, numero "diabolico" per eccellenza, quindi probabilmente non è un caso che abbia postato l'emoticon del diavolo precedentemente. Il numero totale di questi dovrebbe essere circa 17 miliardi di miliardi più rotazioni e riflessioni, non so se è stato calcolato.

Non è stata ancora trovata una regola che consenta di determinare il numero di quadrati magici di un dato ordine.
Mi chiedo perché tu l'abbia postato

è colpa del diavolo


--- Ultima modifica di EL DIABLO in data 2019-12-13 23:47:28 ---


Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.