Forum >> Principianti >> quadrato magico

Pagina: 1

buongiorno a tutti, devo realizzare un programma che realizzi un quadrato magico 4X4 numero magico 34
ho prodotto questo codice, ma il risultato non lo raggiungo mai, non riesco a trovare l'errore
qualcuno saprebbe aiutarmi per piacere?
from random import *

NumMagico = 34
n = 4


def popola(n):
    lista = []
    while len(lista)<n**2:
        num =int(input(" Inserisci i numeri da 1 a 16 "))
        lista.append(num)
        
    return lista

def quadrato(lista):
    square = []
    square.append(lista[:4])
    square.append(lista[4:8])
    square.append(lista[8:12])
    square.append(lista[12:16])
    return square

def controlloRighe(square,n):
    ctrl = 0
    total = 0
    for i in range(0,n-1):
        for j in range (0,n-1):
            total = total + square j
        if total == NumMagico :
            ctrl += 1
        else : ctrl = 0
    return ctrl

def controlloColonna(square,n):
    ctrl = 0
    total = 0
    for n in range(0,3):
        for m in range (0,n-1):
            total = total + square mn
        if total == NumMagico :
            ctrl += 1
        else : ctrl = 0
    return ctrl

def controlloDiagonale(square,n):
    ctrl = 0
    total = 0
    for i in range (0,n-1):
        total = total + square 
    if total == NumMagico :
            ctrl += 1
    else : ctrl = 0
    return ctrl

def visualizza(matrice,n):
    for riga in matrice:
        print (riga)

def controlloMatrice():
    lista = popola(n)
    #square = quadrato(lista)
    trovato = " "
    while trovato != " si ":
        square = quadrato(lista)
        r = controlloRighe(square,n)
        c = controlloColonna(square,n)
        #d = controlloDiagonale(square,n)
        if (r+c) == 8:
            trovato = " si "
            visualizza(square,n)
        else:
            trovato = " no "
            print("NO")
            shuffle(lista)
            

controlloMatrice()





mi scuso per l'assenza delle parentesi quadre quando si parla di indici della matrice
grazie
Salvatore
Salvatore, ormai dovresti sapere che devi fare una sorta di refactoring del tuo codice prima di chiedere aiuto.

Devi capire cosa non va il tuo script, isolare il punto incriminato e proporre solo quella frazione di codice accompagnandolo da qualche spiegazione di massima.

La "sbrodolata" di codice è risaputo che indispone gli interlocutori e le tue possibilità di ricevere una risposta positiva si assottigliano di molto.

Cya
Capisco non riesco a risolvere il problema delle parentesi quadre
Posterò solo la porzione di codice che credo dia problemi a fra poco

Grazie
come consigliatomi
def controlloRighe(square,n):
    ctrl = 0
    total = 0
    for i in range(0,n-1):
        for j in range (0,n-1):
            total = total + square j
        if total == NumMagico :
            ctrl += 1
        else : ctrl = 0
    return ctrl
def controlloColonna(square,n):
    ctrl = 0
    total = 0
    for n in range(0,3):
        for m in range (0,n-1):
            total = total + square mn
        if total == NumMagico :
            ctrl += 1
        else : ctrl = 0
    return ctrl
def controlloMatrice():
    lista = popola(n)
    trovato = " "
    while trovato != " si ":
        square = quadrato(lista)
        r = controlloRighe(square,n)
        c = controlloColonna(square,n)
        if (r+c) == 8:
            trovato = " si "
            visualizza(square,n)
        else:
            trovato = " no "
            print("NO")
            shuffle(lista)
spero che così vada meglio
S!
Capisco non riesco a risolvere il problema delle parentesi quadre


Metti un \ prima delle parentesi e non avrai più problemi. Anche per il CamelCase funziona, ma questo lo sai. ;)
SonoUnCamelCase
square[j]
Cya
Ciao, in questo periodo sto studiando le liste, quindi mi sono divertito a risolvere l'esercizio da te proposto.
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.
Anche se correggo gli errori nel tuo codice, non raggiungerai ugualmente il risultato.
Se aspetti che, mescolando casualmente i 16 valori contenuti nella matrice, si formi un quadrato magico, la barba ti verrà lunga un metro. ;)
Quindi ho realizzato dei cicli annidati, all'interno dei quali ho inserito il turbo, che controllano tutte le possibili permutazioni.
Dopo qualche minuto il programma avrà già visualizzato parecchi quadrati magici.

##
# 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()


--- Ultima modifica di Ὅμηρος 蟒蛇 in data 2018-04-16 19:09:37 ---
Hey ciao grazie per la replica non pensavo il post riscuotesse ancora interesse.
Faccio tesoro della soluzione.
A presto
Ho fatto alcune modifiche, ora sforna quadrati magici a manetta.
In circa 5 minuti trova tutti i quadrati magici che si possono formare permutando la lista 21 mila miliardi di volte.
Prossimamente spero di poterlo migliorare ulteriormente.
Se qualcuno riesce a renderlo più rapido, posti la soluzione.
Grazie.


--- Ultima modifica di Ὅμηρος 蟒蛇 in data 2018-04-16 19:44:02 ---


Pagina: 1



Esegui il login per scrivere una risposta.