Das ist eine Kartoffel:
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
Im Allgemeinen wird eine Kartoffel der Größe N als die folgende Form definiert:
Wenn N gerade ist, sind es 2 zentrierte @
Symbole, gefolgt von 4 zentrierten @
Symbolen, gefolgt von 6 zentrierten @
Symbolen, bis hin zu N zentrierten @
Symbolen; dann N zentrierte @
Symbole, gefolgt von N-2 zentrierten @
Symbolen, bis hinunter zu 2.
Wenn N ungerade ist, wird eine Kartoffel der Größe N auf dieselbe Weise wie oben beschrieben erzeugt, aber wir beginnen mit 1 @
Symbol anstatt mit 2 .
Eine Kartoffel wird geschält, indem man in der oberen rechten Ecke beginnt und @
jedes Zeichen gegen den Uhrzeigersinn entfernt. Das Schälen einer Kartoffel der Größe 3 sieht beispielsweise so aus:
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Herausforderung
Schreiben Sie ein Programm, das bei einer Ganzzahleingabe alle Schritte zum Schälen einer Kartoffel dieser Größe anzeigt.
Nachgestellte Leerzeichen / Zeilenumbrüche sind erlaubt.
Wertung
Das ist Code-Golf ; der kürzeste Code in Bytes gewinnt.
Beispiel-Testfälle
N = 2
@@
@@
@
@@
@@
@
N = 7
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@@@
@@@
@
@@
@@@
@@@@@
@@@@@
@@@
@
@
@@@
@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@
@
@@
@@@@
@@@@
@@@
@
@@
@@@@
@@@@
@@
@
@@
@@@@
@@@@
@@
@@
@@@@
@@@@
@
@@
@@@@
@@@
@
@@
@@@
@@@
@
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Katalog
Basiert auf Ist diese Zahl eine Primzahl?
Antworten:
Perl, 129 Bytes
128 Byte Code +
-n
Flag.Sie benötigen
-nE
Flags, um es auszuführen:Erklärungen: (Ich werde sie genauer beschreiben, wenn ich einen Moment Zeit habe.)
Der erste Teil
$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;
generiert die ursprüngliche Kartoffel: Er beginnt in der Mitte der Kartoffel und fügt bei jeder Iteration zwei Zeilen hinzu: eine vor der vorherigen Zeichenfolge, eine nach. Beachten Sie, dass$"
es sich um ein Leerzeichen handelt. Da$n
es nicht initialisiert ist, beginnt es bei 0 und$/
ist eine neue Zeile.Beachten Sie viel zu sagen darüber,
say$_=$p;
dass die ursprüngliche Kartoffel gedruckt wird, während sie aufbewahrt wird$_
(was später einfacher zu bearbeiten sein wird).Zum Schluss
say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/
die Kartoffel schälen. Die letzte Position, an der a@
entfernt wurde, enthält aA
(es ist willkürlich, es könnte ein beliebiges Symbol sein). Also besteht jede Iteration darin, das zu findenA
, es durch ein Leerzeichen zu ersetzen und in der Zwischenzeit das nächste@
durch ein zu ersetzenA
. Dies geschieht dank zweier Regex:s/(^| )A(.*\n? *)@/$1 $2A/m
Wenn sich derA
auf der linken Seite der Kartoffel befindet (A(.*\n? *)@
nach rechts oder unten gehen kann) unds/@( *\n?.*)A/A$1 /
wenn sich derA
auf der rechten Seite befindet (@( *\n?.*)A
nach oben oder links gehen kann).s/@/A/
Ersetzt das erste@
durch einA
(das ist die Initialisierung). Da wir immer einA
in der Zeichenfolge haben, müssen wir es beim Drucken durch ein Leerzeichen ersetzeny/A/ /r
.Nur für die Augen sieht die animierte Version ziemlich gut aus: (um in einem Terminal zu laufen, ist es ungefähr der gleiche Code, aber mit
clear
undsleep
)quelle
Befunge,
319254 BytesDie Motivation für diesen Algorithmus bestand darin, Verzweigungen so weit wie möglich zu vermeiden, da ein einziger Ausführungsweg im Allgemeinen einfacher zum Golfen ist. Der Code besteht somit nur aus zwei Schleifen: Die äußere Schleife durchläuft die Frames des Schälprozesses und die innere Schleife gibt die Kartoffel für jedes Frame wieder.
Die Wiedergabeschleife gibt im Wesentlichen nur eine Folge von Zeichen aus, wobei das Zeichen für jede Iteration durch eine ziemlich komplizierte Formel bestimmt wird, die die Rahmennummer des Abziehprozesses und den Index der Ausgabesequenz nimmt und entweder ein
@
, ein Leerzeichen oder ein zurückgibt Zeilenumbruch nach Bedarf.Probieren Sie es online!
quelle
Python 3.5.1, 520 Bytes
Erläuterung
Grundidee: Wechseln Sie zwischen dem Durchlaufen jeder Zeile und dem Entfernen des Zeichens ganz links und dem Durchlaufen jeder Zeile, wobei das Zeichen ganz rechts entfernt wird, solange noch Zeichen
@
übrig sind.Insgesamt ein trauriger Versuch eines unkomplizierten Verfahrens.
quelle