Wenn die Schüler zum ersten Mal in der Beweistechnik der mathematischen Induktion unterrichtet werden , ist ein häufiges Beispiel das Problem, ein 2 N × 2 N- Gitter mit L-förmigen Trominos zu kacheln , wobei ein vorgegebener Gitterraum leer bleibt . (N ist eine nicht negative ganze Zahl.)
Ich überlasse es Ihnen, den Beweis durchzugehen, wenn Sie es nicht bereits wissen. Es gibt viele Ressourcen, die darüber diskutieren.
Ihre Aufgabe hier ist es, ein Programm zu schreiben, das einen Wert für N sowie die Koordinaten des Gitterraums leer lässt und eine ASCII-Darstellung des resultierenden Gitters mit Tromino-Kacheln ausgibt.
Der Charakter O
wird den leeren Raum füllen und die 4 Umdrehungen unseres Trominos werden so aussehen:
|
+-
|
-+
-+
|
+-
|
(Ja, es kann zweideutig sein, was +
zu welchem -
und |
für bestimmte Arrangements gehört, aber das ist in Ordnung.)
Ihr Programm muss für N = 0 (für ein 1 × 1-Raster) bis mindestens N = 8 (für ein 256 × 256-Raster) funktionieren. Es werden x- und y-Werte angegeben, die die Koordinaten für Folgendes sind O
:
- x ist die horizontale Achse. x = 1 ist die linke Gitterkante, x = 2 N ist die rechte Gitterkante.
- y ist die vertikale Achse. y = 1 ist die obere Gitterkante, y = 2 N ist die untere Gitterkante.
Sowohl x als auch y liegen immer im Bereich [1, 2 N ].
Für ein gegebenes N, x und y muss Ihr Programm also ein 2 N × 2 N- Gitter drucken , das vollständig mit L-förmigen Trominos gekachelt ist, mit Ausnahme der x, y-Gitterkoordinate, die eine sein wird O
.
Beispiele
Wenn N = 0 ist, müssen x und y beide 1 sein. Die Ausgabe ist einfach
O
Wenn N = 1, x = 1 und y = 2, wäre die Ausgabe
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (zB das Bild auf dieser Seite ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Einzelheiten
- Sie können eine Funktion schreiben, die die 3 ganzen Zahlen enthält, anstatt ein ganzes Programm zu schreiben. Es sollte die Rasterzeichenfolge drucken oder zurückgeben.
- Nehmen Sie Eingaben von stdin, der Befehlszeile (oder von Funktionsargumenten, wenn Sie eine Funktion schreiben).
- Die Ausgabe kann optional eine einzelne Trainingszeile enthalten.
- Sie sind nicht erforderlich verwenden , um die Kachelmethode , dass der Nachweis der Regel vermuten läßt. Es kommt nur darauf an, dass das Gitter neben dem mit L-förmigen Trominos gefüllt ist
O
. (Trominos dürfen nicht geschnitten werden oder die Gittergrenzen überschreiten.)
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist früherer Beitrag. ( Handy-Byte-Zähler. )
if p!=i
; die Liste im Inneren.join()
braucht nicht[]
;(1-i%2)
kann gemacht werden als~i%2
; Sie können iterable schreiben verwenden Auspackent,l,a=[],...
wie*t,l,a=...
;if n==0
kann geprüft werden alsif n<1
weiln
nicht negativ sein kann; Das Finale"\n".join
kann wahrscheinlich durch Drucken jedes Elements erreicht werden, da allgemeine Regeln das Drucken anstelle des Zurückgebens erlauben. Diesif p!=i
kann daran liegen,if p-i
dass Werte ungleich Null die Wahrheit sind.f
rekursive Funktion. Eigentlich muss ichsplit()
nach jedem Selbstaufruf die Ausgabeformatierung mit zurücksetzen.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
in der vorletzten Zeile kann geschrieben werden alst+=...,
(Hinzufügen eines Tupels anstelle einer Liste) und ich bin nicht sicher, ob dies funktioniert,A if B else C
kann aber geschrieben werden alsB and A or C
(auch auf der vorletzte Zeile), aber nur, wenn A nie falsch ist (was ich nicht denke, dass es ist?)JavaScript (ES6) 317
414Viel Arbeit zum Golfen, aber immer noch ziemlich lang.
Führen Sie das Snippet zum Testen aus (besser aussehend mit Unicode-Blockzeichen - aber noch ein bisschen länger)
Code-Snippet anzeigen
quelle
IDL 8,3+, 293 Bytes
Das ist zu lang, ich versuche es zu reduzieren, aber ich bin noch nicht dort angekommen.
Ausgänge:
Und ... nur zum Spaß ...
quelle
Ruby Rev 1, 288
Als anonymes Lambda-Wort. Im Testprogramm gezeigt (das Lambda-Literal ist
->(n,a,b){...}
)Ruby Rev 0, 330 ungolfed
Derzeit behaupte ich, dass das einzige Golfspiel darin besteht, Kommentare, unnötige Zeilenumbrüche und Einrückungen zu entfernen.
Dies ist mein erster richtiger Algorithmus, der in Ruby codiert ist, und es war harte Arbeit. Ich bin sicher, dass es mindestens 50 Zeichen gibt, die beseitigt werden können, aber ich habe vorerst genug getan. Es gibt einige echte Schrecken, zum Beispiel die Eingabe. Das kann wahrscheinlich durch eine Funktion oder ein Lambda anstelle eines Programms behoben werden, aber die innere Funktion
t
, die die Trominos zeichnet, benötigt weiterhin Zugriff auf die globalen Variablen. Ich muss die Syntax dafür herausfinden.Eine Eigenschaft meiner Antwort, die in den anderen nicht vorhanden ist, ist, dass ich ein Array von Zeichenfolgen mit
|
Zeichen initialisiere . Das heißt, ich muss nur das+-
oder zeichnen-+
, die nebeneinander auf der gleichen Linie stehen.quelle
Haskell, 170 Bytes
Laufen Sie online bei Ideone
Beispiellauf:
quelle