Python 3.5, 135 Bytes

5

CJam ( 39 37 Bytes)

A,1>e!{5ew{2Mtz}2*::+)-!},3f/Ma*Sf*N*

Online-Demo (Warnung: Die Ausführung kann mehr als eine Minute dauern und die Meldung "Dieses Skript abbrechen?" Wird vom Browser angezeigt).

Arbeitet durch Filtern aller möglichen Raster mit 5ewzuzuordnen

[a b c d e f g h i]

zu

[[a b c d e]
 [b c d e f]
 [c d e f g]
 [d e f g h]
 [e f g h i]]

und dann das mittlere Element und das mittlere Element von jedem anderen Element verwerfen, um zu erhalten

[[a b d e]
 [b c e f]
 [d e g h]
 [e f h i]]

Welches sind die vier Quadrate.

Peter Taylor
quelle
Wow, das ist großartig.
El'endia Starman

Antworten:

5

Python 3.5, 135 Bytes

from itertools import*
for x in permutations(range(1,10)):eval((("=="+"+x[%s]"*3)*4)[2:]%(*"013125367578",))and print("%d %d %d\n"*3%x)

Überprüft direkt die Summe jedes Quadrats abzüglich der Mitte. Höchstwahrscheinlich noch nach der Faustregel " itertoolsist unnötig" golfbar .

Sp3000
quelle
2

Python2 327 271 270 263 260 Bytes

z,v,s={},3,range(1,10)
while len(z)<376:
 for i in range(8):v=hash(`v`);s[i],s[v%9]=s[v%9],s[i]
 m=map(lambda i:sum(s[i:i+5])-s[i+2],[0,1,3,4]);T=tuple(s)
 if all(x==m[0] for x in m) and not T in z:
  z[T]=1;print '%i %i %i\n'*3 % tuple(s[0:3]+s[3:6]+s[6:9])

------------

Dies ist ... nicht so kurz, aber es werden keine Bibliotheken verwendet. Dies lässt ein Quadrat zufällig durch, überprüft es auf Magie, druckt es aus und zeichnet es auf, um Duplikate zu vermeiden. Nachdem es 376 einzigartige magische Quadrate gedruckt hat, stoppt es.

Ich habe mir den Pseudo-Zufallszahlengenerator von Keith Randalls Eintrag für das Golfspiel " Bauen Sie einen Zufallszahlengenerator, der die Diehard-Tests besteht " ausgeliehen.

z,v={},3
def R(x,y):global v;v=hash(`v`);return v
while len(z)<376:
 s=sorted(range(1,10),cmp=R)
 m=[sum(q) for q in map(lambda p:s[p[0]:p[1]+1]+s[p[2]:p[3]+1], [[i,i+1,i+3,i+4] for i in [0,1,3,4]] )]
 if all(x==m[0] for x in m) and not tuple(s) in z.keys():
  z[tuple(s)]=1;print '%i %i %i\n'*3 % tuple(s[0:3]+s[3:6]+s[6:9])

Entgolft

# each magic square is an array of 9 numbers
#
#for example [1 9 3 7 2 5 6 4 8] 
#
#represents the following square
#
#1 9 3
#7 2 5
#6 4 8
#
# to generate a random square with each number represented only once,
# start with [1 2 3 4 5 6 7 8 9] and sort, but use a random comparison
# function so the sorting process becomes instead a random permutation.
# 
# to check each 2x2 subsquare for sums, look at the indexes into the
# array: [[0,1,3,4] = upper left,[1,2,4,5] = upper right, etc.
#
# to keep track of already-printed magic squares, use a dictionary    
# (associative array) where the 9-element array data is the key. 

from random import *
def magic(s):
 quads=[]
 for a,b,c,d in [[0,1,3,4],[1,2,4,5],[3,4,6,7],[4,5,7,8]]:
  quads+=[s[a:b+1]+s[c:d+1]]
 summ=[sum(q) for q in quads]
 same= all(x==summ[0] for x in summ)
 #print quads
 #print 'sum',summ
 #print 'same',same
 return same

magicsquares={}
while len(magicsquares.keys())<376:
        sq = sorted(range(1,10),key=lambda x:random())
        if magic(sq) and not magicsquares.has_key(tuple(sq)):
                magicsquares[tuple(sq)]=1
                print sq[0:3],'\n',sq[3:6],'\n',sq[6:9],'\n'
Don Bright
quelle
Es muss nichts Zufälliges passieren. Es gibt genau 376 verschiedene quadratische Lösungen, die Sie jeweils genau einmal ausgeben müssen.
Calvins Hobbys
Ich habe genau 376 verschiedene quadratische Lösungen gedruckt und jede davon genau einmal ausgegeben. zufälligkeit ist weder in der beschreibung noch in den standardlücken verboten meta.codegolf.stackexchange.com/questions/1061/…
don bright
Okay, fair genug.
Calvins Hobbys
Sie können einen schlechteren Zufallsgenerator verwenden, solange Sie alle benötigten Quadrate erhalten.
Lirtosiast
1

Rubin 133

a=[]
[*1..9].permutation{|x|[0,1,3,4].map{|i|x[i]+x[i+1]+x[i+3]+x[i+4]}.uniq.size<2&&a<<x.each_slice(3).map{|s|s*' '}*'
'}
$><<a*'

'

Unkomplizierter Brute-Force-Ansatz. Teste es hier .

Cristian Lupascu
quelle
0

J 83 Bytes

([:;@,(<LF),.~[:(<@(LF,~":)"1@#~([:*/2=/\[:,2 2+/@,;._3])"2)(3 3)($"1)1+!A.&i.])@9:

Dies ist eine Funktion, die eine Zeichenfolge ausgibt, die die 376 stabilen Quadrate enthält. Verwendet Brute-Force, generiert alle Permutationen von 1 bis 9, formt jedes zu einem 3x3-Array und filtert es, indem überprüft wird, ob die Summen jedes 2x2-Subarrays gleich sind. Fertig in einer halben Sekunde.

Verwendung

   f =: ([:;@,(<LF),.~[:(<@(LF,~":)"1@#~([:*/2=/\[:,2 2+/@,;._3])"2)(3 3)($"1)1+!A.&i.])@9:
   $ f ''  NB. A function has to take something to be invoked,
           NB. but in this case it is not used by the function
   37 {. f ''  NB. Take the first 37 characters
1 5 3
9 8 7
4 2 6

1 5 6
8 7 3
4 2 9

   _38 {. f ''  NB. Take the last 38 characters
9 5 4
2 3 7
6 8 1

9 5 7
1 2 3
6 8 4


   NB. The output string ends with two newlines
Meilen
quelle