Erzeugen Sie ein Raster von 7 mal 7, das mit Zufallszahlen gefüllt ist. In Zellen mit einer ungeraden Zeilen- und Spaltennummer (beginnend bei 0) müssen Sie jedoch die Summe der umgebenden Zellen verwenden. Hier ist ein kleines Beispiel mit einem 3 x 3-Raster (Summenquadrat in Fettdruck):
2 2 2
2 16 2
2 2 2
Und hier ist ein Beispiel 7 mal 7 Raster:
6 5 4 3 7 2 5
6 43 3 50 8 43 8
4 7 8 8 9 3 1
4 36 1 43 6 40 5
3 3 6 1 4 7 5
4 35 3 45 9 42 1
2 6 8 6 8 5 3
Regeln
Zahlen, die keine Summen sind, müssen immer zwischen 1 und 9 liegen.
Das Gitter muss zufällig generiert werden. Für jede Nicht-Summe muss jede Ziffer die gleiche Chance haben, angezeigt zu werden, unabhängig davon, in welcher Zelle sie sich befindet.
Zahlen müssen ausgerichtet sein. Dies bedeutet, dass entweder die erste oder die letzte Ziffer jeder Zahl in einer Spalte vertikal ausgerichtet sein muss. (Sie können davon ausgehen, dass die mittleren Zahlen immer zweistellig sind.)
Die umgebenden Zellen enthalten Diagonalen. Daher wird jedes Summenquadrat von acht Zahlen umgeben, die Sie hinzufügen müssen.
Der kürzeste Code gewinnt, da dies Code-Golf ist .
quelle
Antworten:
APL,
53 49 43 42 40 3936Ich habe es geschafft, Js
;.
in APL zu replizieren , und Gareths Ansatz verwendet , um 13 Zeichen zu sparen.Probelauf:
Erläuterung:
∘.∨⍨9⍴0 1
erzeugt eine Bitmaske.×∘?∘9¨
Multipliziert jedes Bit mit einem Zufallswert von 1 bis einschließlich 9 und erzeugt ein maskiertes Gitter von Zufallszahlen.3,⌿3,/
verwendet, was nur als Hackery bezeichnet werden kann, um alle 3 mal 3 überlappenden Felder im maskierten Array zurückzugeben. Diese werden dabei auch abgeflacht.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
iteriert über das Array und weist jedes Element zu⍵
. Für jede Iteration wird die fünfte benötigt (in der Mitte wird daran erinnert, dass die APL-Indizierung auf 1 basiert) und das Vorzeichen zurückgegeben. In diesem Fall entspricht dies dem Testen, ob die Zahl größer als 0 ist. Wenn dies 1 (für true) zurückgibt, geben Sie dieses Element zurück. Andernfalls geben Sie die Summe der Elemente im Feld Abgeflacht 3 mal 3 zurück. Es wird der:⋄
ternäre Operator verwendet, der?:
in vielen Sprachen dem entspricht .quelle
J,
63615955525149473937 ZeichenVielen Dank an Volatility für seine 10-Zeichen-Speicherung.
Erklärung (jeder Schritt hat unterschiedliche Zufallszahlen ...):
Generieren Sie die Maske zur Generierung der Zufallszahlen (Verwendung
$
:Jetzt haben wir einen Haken . Dies ist eigentlich ein glücklicher Zufall, als ich eine frühere Version runtergeschnitten habe. Es sollte transponiert
|:
und+.
mit dem Original verbunden werden. Es hat Sinn gemacht, da ich zu der Zeit Einsen und Nullen verwendet habe, aber jetzt habe ich Neunen und Nullen. Es kommt einfach so vor, dass es genauso mit der GCD-Bedeutung von funktioniert+.
. Glück für mich. :-)Nun, da wir ein Raster von 9s und 0s haben, wollen wir einige Zufallszahlen erzeugen.
?
generiert eine Zufallszahl von 0 bis (aber ohne) eine bestimmte Zahl. Bei einer gegebenen Liste wird auf diese Weise eine Zufallszahl für jedes Mitglied der Liste erzeugt. In diesem Fall wird für jede 9 in der Tabelle eine Zahl von 0 bis 8 und für jede 0 eine Gleitkommazahl von 0 bis 1 generiert.Aber wir wollen Zahlen von 1 bis 9, nicht 0 bis 8. Also addieren wir 1.
Das ist sehr schön, aber wir haben die Nullen verloren, die ich haben will, also multiplizieren wir sie mit der Originalmaske, nachdem wir alle Neunen zu Einsen gemacht haben. Ich überprüfe dazu, ob der Wert größer als 1 ist
(1&<*1+?)
.Es gibt ein paar Dinge, die hier vor sich gehen:
&
die 1 an das<
Verb gebunden ( ) .Alles zusammen
(1&<*1+?)
erzeugt Zufallszahlen und setzt alle Zahlen auf Null, die durch Nullen im ursprünglichen Gitter erzeugt wurden.Das nächste bisschen ist das (meiner Meinung nach jedenfalls :-) clevere bisschen.
Das
;.
Verb " Ausschneiden" hat eine Form, inx u;._3 y
der die Eingabe in die mit "Beschrieben" gekennzeichneten Felder aufgeteilt wirdx
und das Verb dannu
auf diese Felder angewendet wird . In diesem Fall haben wir3 3(4&{++/*0=4&{)@,;._3
.3 3
beschreibt die Boxen, die wir wollen - 3x3.(4&{++/*0=4&{)@,
ist ein Verbzug, der beschreibt, was wir mit jeder Box machen wollen.Um das
;.
Verb zu demonstrieren, werde ich<
jedes Kästchen zeigen:Einige Dinge zu beachten:
0
in der Mitte der Box.Jetzt müssen wir nur noch den Wert in der Mitte zurückgeben (wenn er nicht Null ist) oder die Zahlen im 3x3-Feld summieren (wenn die Mitte Null ist).
Dazu benötigen wir einen einfachen Zugang zur Centernummer.
,
hilft hier. Es stellt sich die 3x3 - Gitter in eine Liste von 9 Teilen mit der Center - Nummer an der Nummer 44&{
wird benutzt{
den Mittelwert zu ziehen und dann vergleichen Sie es mit 0:0=4&{
. Dies gibt ein0
oder1
für wahr oder falsch zurück, die wir dann mit der Summe multiplizieren+/
. Wenn es in der Mitte Null war, haben wir jetzt unsere Summe wie erforderlich. Wenn es nicht Null ist, addieren wir zum Schluss einfach den Mittelwert4&{+
.Dies gibt das Verb train
(4&{++/*0=4&{)@,
quelle
?
. Ich werde die Erklärung ändern, um die neueste Version wiederzugeben.Ruby (135 Zeichen)
Beispielausgabe
Nervenzusammenbruch
Es ist nicht ganz klar, wie das funktioniert. Hier ist eine kurze Übersicht. HINWEIS: Möglicherweise können Sie einige dieser Schritte überspringen und schneller zu kürzeren Versionen wechseln, aber ich denke, es ist lehrreich genug, um zu sehen, wie ich Zeichen abgeschabt habe, insbesondere, indem Muster in Literalen erkannt werden, um zweistellige Zahlen in einstellige Versionen umzuwandeln .
Naive Version
Im Gegensatz zu den anderen Ruby-Lösungen , die auf einem zweidimensionalen Array basieren, können Sie (möglicherweise) eine kürzere Version erhalten, indem Sie mit einem eindimensionalen Array beginnen und mit Versatzwerten arbeiten, da sich die Muster wiederholen.
Das Schlüsselprinzip hierbei ist, dass wir an den Indexpositionen 8, 10, 12 arbeiten, die nur um ein Vielfaches von 14 versetzt sind. Die Positionen 8, 10 und 12 sind die Zentren der 3x3-Gitter, die wir summieren. In der Beispielausgabe ist 34 Position 8, 42 Position 8 + 14 * 1 usw. Wir ersetzen Position 8 durch 34 durch Positionen, die von Position 8 versetzt sind, mit
[-8,-7,-6,-1,1,6,7,8]
anderen Worten -34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])
. Dasselbe Prinzip gilt für alle Werte von[8 + 14*i, 10 + 14*i, 12 + 14*i]
, da sich das Muster wiederholt.Es optimieren
Zunächst einige schnelle Optimierungen:
3.times { ... }
wirdj + 14*i
jedes Mal eine Berechnung durchgeführt[8,10,12,22,24,26,36,38,40]
.offsets
Array wird einmal verwendet. Ersetzen Sie daher die Variable durch das Literal.do ... end
mit{...}
und schalten Sie den Druck auf um$> << foo
. (Es gibt hier einen Trick mitputs nil
und() == nil
.)Der Code danach ist 177 Zeichen:
Beachten Sie für die nächste Reduzierung, dass
inject
das Offsets-Array nicht in Ordnung sein muss. Wir können entweder eine[-8,-7,-6,-1,1,6,7,8]
oder eine andere Reihenfolge haben, da die Addition kommutativ ist.Kombinieren Sie also zuerst die positiven und negativen Punkte, um sie zu erhalten
[1,-1,6,-6,7,-7,8,-8]
.Jetzt können Sie kürzen
zu
Das führt zu
Das sind 176 Zeichen.
Verschieben Sie um 8 und bewegen Sie sich zu Differenzen
Die zweistelligen Literalwerte scheinen verkürzt zu werden. Nehmen Sie also
[8,10,12,22,24,26,36,38,40]
alles auf und verschieben Sie es nach unten8
,j
um es am Anfang der Schleife zu aktualisieren . (Beachten Sie, dass Sie+=8
die Offsetwerte von nicht aktualisieren müssen1,6,7,8
.)Das ist 179, das ist größer, aber das
j+=8
kann tatsächlich entfernt werden.Erste Änderung
zu einer Reihe von Unterschieden:
und addiere diese Werte kumulativ zu einer Initiale
j=8
. Dies wird schließlich die gleichen Werte abdecken. (Wir könnten wahrscheinlich direkt dorthin springen, anstatt zuerst um 8 zu verschieben.)Beachten Sie, dass wir auch einen Dummy-Wert von
9999
am Ende des Differenzen-Arrays undj
am Ende , nicht am Anfang der Schleife , hinzufügen . Die Rechtfertigung ist, dass es furchtbar ähnlich2,2,10,2,2,10,2,2
aussieht, als wären es die gleichen 3 Zahlen, die dreimal wiederholt werden. Wenn Siej+difference
am Ende der Schleife rechnen, hat der Endwert von9999
keinen Einfluss auf die Ausgabe, da es keinena[j]
Aufruf gibt, bei demj
ein bestimmter Wert vorliegt vorbei10000
.Mit diesem Unterschiedsarray
j+=8
ist das jetztj=8
natürlich gerade, da wir sonst immer wieder8
zu viele hinzufügen würden . Wir haben auch die Blockvariable vonj
nach geändertl
.Da das
9999
Element keine Auswirkung auf die Ausgabe hat, können wir es ändern10
und das Array verkürzen.Dies sind 170 Zeichen.
Aber jetzt
j=8
sieht das ein bisschen klobig aus, und Sie können 2 Zeichen speichern, indem Sie um 2 nach[2,2,10]
unten verschieben , um ein Zeichen zu erhalten, das8
Sie für die Zuweisung verwenden können. Das muss auchj+=l
werdenj+=l+2
.Dies ist 169 Zeichen. Eine runde Sache, um 7 Charaktere zusammenzudrücken, aber es ist ordentlich.
Letzte Verbesserungen
Der
values_at
Anruf ist eigentlich redundant und wir können einenArray#[]
Anruf einleiten. Sowird
Sie können auch erkennen , dass
flat_map
+j+e/j-e
+inject
kann mit einem anfänglichen zu einer direkteren Summe reduziert wird0
in der Anordnung.So bleiben Ihnen 152 Zeichen:
Schließlich:
map.with_index
werden kanneach_slice
.135 :
quelle
each
mitmap
für ein Byte.Python, 132
Dies entspricht technisch nicht den Regeln, da die letzten Ziffern der einzelnen Nummern anstelle der ersten ausgerichtet sind. Aber ich dachte, ich würde trotzdem teilen:
Beispielausgabe:
quelle
Mathematica, 108
Für eine schönere Ausgabe
Column/@
kann mitTableForm@
einem Preis von 2 Zeichen ersetzt werden.quelle
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
Gibt eine sauberere Ausgabe und speichert ein paar Zeichen, wenn Sie Transponieren als ein einzelnes Zeichen zählen, was in Mathmatica der Fall ist. Die OneLinerSubmission-Vorlage von Wolfram zählte übrigens 106 Zeichen, davon 105 für die Transponierung mit einem Zeichen.:>
ein einziges Symbol, obwohl es sich im Bereich für den privaten Gebrauch von Unicode befindet. Man könnte sogar die Transponierung entfernen, da die Gültigkeitssummierungsregel auch nach der Transposition gilt. Aber es scheintGrid
nicht die Einträge ohne weitere Optionen auszurichten (v8)Grid
zentriert die Zahlen in Spalten. Technisch gesehen würde dies die Herausforderung nicht erfüllen, aber es sieht besser aus, als wenn eine Liste in der angezeigten Tabelle angezeigt wird.Part
und verwendetTuples
. Posting bald.p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
GolfScript (
79 78 72 70 68 66 6560 Zeichen)NB Dies enthält eine wörtliche Registerkarte, die Markdown möglicherweise beschädigt.
Das Schlaue ist Gareth zu verdanken: Sehen Sie sich seine J-Lösung an.
Online-Demo
quelle
R: 114 Zeichen
In der ersten Zeile wird ein 7 x 7-Array erstellt, das mit zufällig ausgewählten Zahlen von 1 bis 9 gefüllt ist (gleichmäßige Verteilung mit Ersetzung, daher
r=T
steht das fürreplace=TRUE
). In der zweiten Zeile werden die Summen von 3 mal 3 Gittern berechnet, das Zentrum subtrahiert und durch das Ergebnis ersetzt. In der dritten Zeile wird das resultierende Raster gedruckt (Matrix- und Arrayspalten sind standardmäßig rechtsbündig).Beispielausgabe:
quelle
J,
6765 BytesEine naive und ausführliche Lösung in J. Es ist eine unkomplizierte Umsetzung der Aufgabe.
Zuerst erstelle ich ein 7 x 7-Array mit ganzen Zahlen zwischen 1 und 9. In der Tat ist J? verb erzeugt Zahlen bis zu seinem Argument, deshalb müssen wir jedes Element inkrementieren,>: in J
Ich bereite eine Maske vor, die zum Nullsetzen der ungeraden Zeilen / Spalten-Zellen verwendet werden soll, ein Paar ungerader Zeilen / Spalten-Indizes:
Das Katalogverb {kombiniert Elemente aus den Atomen in der Boxliste
um einen Katalog zu bilden, die 3x3-Tabelle der obigen Paare
Dann bereite ich eine Tabelle mit Zeilen- / Spaltenindizes vor, die für die Auswahl jedes der 3x3-Subarrays verwendet werden.
Für jedes Paar im m-Array erstelle ich ein Paar Drillinge, die um jede Zahl des m-Paares zentriert sind:
Diese Triplettpaare werden vom J From-Verb {verwendet, das mehrere Zeilen und Spalten gleichzeitig auswählen kann. 0 1 2/2 3 4 bedeutet, dass ich die Zeilen 0, 1 und 2 zusammen mit den Spalten 2, 3 und 4 auswähle und so das zweite 3x3-Subarray oben auswähle.
Schließlich kann ich das 7x7-Array und die Masken verwenden, um die Aufgabe zu erfüllen: Zuerst verwende ich m als Maske, um die entsprechenden Elemente auf 0 zu setzen:
Dann nehme ich alle 3x3-Subarrays mit s als Selektor und finde ihre Summen:
Dann habe ich diese Zahlen wieder in das Startfeld eingefügt.
Probieren Sie es online!
quelle
APL (Dyalog Unicode) ,
323130 Byte SBCS-1 Byte dank @jslip
Probieren Sie es online!
quelle
∧/¨~
->⍱/¨
Rubin, 207
Ich werde zuerst meine Lösung vorstellen (wie immer):
quelle
Ruby, 150 Zeichen
Wenn die Rechtfertigung für die Linksbegründung eine Rechtfertigung für die Linksbegründung ist,
ljust
müsste diese verwendet werden ... nun, nein. Ich liebe Rubys Formatierungsmöglichkeiten.Nicht verwenden
Array.new(7){...}
.(0..6).map{...}
ist sowohl kürzer als auch lesbarer und Sie erhalten einen zuweisbaren Bereich kostenlos.Linie 3 inspiriert von der Doorknob-Lösung .
quelle
GolfScript, 87 Zeichen
Da sind zu viele Reißverschlüsse drin ... (siehe online )
quelle
J, 58/64/67 Zeichen
Während die Angabe erfordert, dass die Zahlen linksbündig ausgerichtet sind, muss die Dezimalnotation nicht verwendet werden. Ich denke, dies ist eine gültige Ausgabe:
Wenn die Ausrichtung nach rechts anstelle der Ausrichtung nach links akzeptabel ist, haben wir 58 Zeichen
J's
":
(Format) hat drei Formatierungsmodi:Das ausführlichste, aber auch vielseitigste und einzige, das die Ausgabe gemäß dem Beispiel erzeugen kann, ist das
8!:2
Formatierungs-Foreign, für das ein Formatierungs-String als linkes Argument verwendet wird. Auch 67 Zeichen :Hier ist das Box-Format:
quelle
Perl, 117 Zeichen
Dies ist eines dieser Perl-Skripte, bei denen alle bis auf eine for-Schleife zu
map
Aufrufen zusammengefasst wurden, sodass alles in einer einzigen Anweisung ausgeführt werden kann. Globale Variablen erscheinen auch in dieser. Ich denke, was ich hier sagen will, ist, dass dieses Programm ein bisschen ekelhaft ist.Warten Sie, es wird schlimmer: Es gibt einen bekannten Fehler im Skript! Es hat jedoch weniger als eine Eins-zu-eine-Million-Chance, ausgelöst zu werden, sodass ich mich noch nicht darum gekümmert habe, es zu beheben.
quelle
Mathematica , 106/100
Ich habe etwas gefunden, das dem Code von ssch sehr ähnlich ist, bevor ich es gesehen habe. Ich leihe mir seine Idee aus
Column
. Nur mit ASCII 106 :Mit Unicode-Zeichen (wie von ssch verwendet), 100 :
quelle
Excel VBA, 74 Bytes
VBE-Sofortfunktion, die an ausgegeben wird
[B2:H9]
.Beispielausgabe
quelle
Powershell,
149148 Bytes-1 Byte dank @AdmBorkBork. Es ist cool!
Erläuterung:
quelle
$a
Zuweisung in Parens einkapseln und die nächste Zeile nach oben verschieben, um eine große Zeile zu bilden. -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Also hier sind zwei Schritte. Ich hatte mehrere Versuche, in einer Pipe zu kapseln. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
wird vor der nächsten Pipeline-Instanz vollständig gefüllt. Es sollte funktionieren (zumindest für mich).Mathematica
142 151 172179Code
Verwendung
quelle
0
s; Die Regeln sagen 1-9Julia 0,6 , 127 (89) Bytes
Probieren Sie es online!
89 Bytes bei Verwendung der nativen Anzeige, die zulässig sein kann, wenn zusätzliche Zeilen gedruckt werden können:
quelle
Java 10,
262260248239 Bytes-12 Bytes dank @ceilingcat .
Erläuterung:
Probieren Sie es hier aus.
quelle
var
stattString
und+=Math.random()*9+1;
statt ein paar Bytes mehr sparen=(int)(Math.random()*9+1);
. Es ist eigentlich ziemlich nützlich für dich, all meine alten Antworten zu besuchen, haha! : D