Hintergrund
Hier ist eine Halloween-bezogene Herausforderung.
Wie Sie vielleicht aus meiner letzten Herausforderung gesehen haben, gefällt mir das, was ich als ASCII-Kunstanimationen bezeichne, sehr gut, nämlich nicht nur ein Muster zu zeichnen, sondern ein fortschreitendes Muster zu zeichnen. Diese Idee kam mir, als ich vor ein paar Jahren gebeten wurde, eine (ziemlich langweilige) Präsentation zu beleben, indem ich an Halloween zufällige Ascii-Fledermäuse über den Bildschirm fliegen ließ. Unnötig zu sagen, dass ich gebührend verpflichtet war (ich wurde dafür bezahlt), aber es brachte mich auf den Gedanken, dass das Leben mehr beinhaltet als zufällige Fledermäuse. Davon inspiriert möchte ich diese Herausforderung vorschlagen.
Herausforderung
Lass eine Fledermaus um den Mond fliegen.
Hier ist eine Fledermaus:
^o^
Hier ist der Mond:
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Sie müssen jede Phase des Fledermausflugs anzeigen (siehe Ausgabe).
Eingang
Keiner
Ausgabe
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm^o^
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm^o^
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm^o^
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm^o^
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
^o^mmm
mmm
mmmmmmm
mmmmmmmmm
^o^mmmmmmm
mmm
mmm
mmmmmmm
^o^mmmmmmmmm
mmmmmmm
mmm
mmm
^o^mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Regeln
- Kein Lesen von externen Dateien oder Websites
- Sie können ein vollständiges Programm oder eine Funktion einreichen
- Zusätzliche Leerzeichen und / oder Zeilenumbrüche sind von mir in Ordnung
- Standard-Schlupflöcher wie gewohnt verboten
- Die Fledermaus muss oben auf dem Mond enden
- Wenn Sie möchten, können Sie den Bildschirm zwischen den Frames löschen, dies ist jedoch keine Voraussetzung. Die oben gezeigte Ausgabe ist in Ordnung
- Da dies Codegolf ist, ist der Gewinner die Antwort mit der niedrigsten Byteanzahl, obwohl jede Antwort erwünscht ist
Probe
Referenzimplementierung in völlig ungolfed Python 2 (620 Bytes, aber nur um zu beweisen, dass es möglich ist. Kann es später Golf spielen).
b='^o^'
m=[' ',
' mmm ',
' mmmmmmm ',
' mmmmmmmmm ',
' mmmmmmm ',
' mmm ',
' ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
x=map(str,m[z])
c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
x=map(str,m[z])
c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
Ergebnis
Obwohl @Jonathan offensichtlich bei der Anzahl der Bytes mit Jelly gewinnt, werde ich die Brainfuck-Antwort von @Oyarsa als akzeptierte Antwort markieren, nur weil ich denke, dass jeder, der so etwas in einer so verrückten Sprache tatsächlich kann, +15 Wiederholungen verdient, egal wie viele Bytes es braucht. Das liegt nicht daran, dass ich Probleme mit Golfsprachen habe. Wenn Sie irgendwelche Zweifel haben, lesen Sie meine Antwort auf eine diesbezügliche Frage auf meta . Vielen Dank und Respekt an alle, die in welcher Sprache auch immer beigetragen haben.
Antworten:
Brainfuck, 690 Bytes
Ich spiele zum ersten Mal Golf und bin mir sicher, dass es noch viel zu verbessern gibt
Probieren Sie es online aus
Ungolfed einige für die Lesbarkeit:
Ich wollte die Tatsache nutzen, dass durch Hinzufügen einer neuen Zeile am Anfang jede Stufe in beide Richtungen gelesen werden kann, um zwei verschiedene Stufen zu erhalten, aber ich konnte keinen guten Weg finden, dies zu tun, ohne die vollständigen sechseinhalb Stufen zu generieren auf einmal.
quelle
05AB1E ,
696260 Bytes2 Bytes gespart dank Adnan .
Probieren Sie es online!
Erläuterung
3ð×…^o^)U
speichert die Liste[" ","^o^"]
in X zur späteren Verwendung.13FNV
Schleifen über die 13 Stufen [0 .. 12] und speichert die aktuelle Iterationsindex in Y .0379730v
Schleifen über die Zeilen jeder Stufe,wobei N der Zeilenindex und y die aktuelle Anzahl von m ist .
Wir beginnen mit dem Hinzufügen von
floor(5/(y+1))-(y==0)
Leerzeichen zu jeder Zeile mitð5y>;ï-y_+×
.Wir bestimmen dann, ob es eine Fledermaus oder 3 Felder vor dem m geben sollte .
Wenn dies
(-N-Y)%12 == 0
zutrifft, fügen wir eine Fledermaus hinzu, ansonsten 3 Felder.Dieser Ausdruck (
N(Y-12%_Xè
) platziert Fledermäuse in Stufen0,6-12
.Dann legen wir y Ms mit
'my×
.Nun legen wir fest, ob es einen Schläger oder 3 Felder nach dem m geben soll .
Der Code setzt
NY-12%_y&Xè
einen Schläger, wenn er((N-Y)%12 == 0) and y!=0
wahr ist, ansonsten 3 Leerzeichen.Dadurch platzieren Sie die Fledermäuse auf den Bühnen
1-5
.Endlich haben wir die ganze Reihe in einen String verbinden und mit einem Newline drucken:
J,
.quelle
3ð×…^o^)
Stattdessen" ^o^"2ä
sollten zwei Bytes gespeichert werden.3ð×
.JavaScript (ES6),
109144140138 ByteAnimierte Version
Code-Snippet anzeigen
quelle
HTML + JS,
153149 BytesBearbeiten: Dank @RickHitchcock eine Menge Bytes gespeichert. Die langweilige Version, die nur die 13 mehrzeiligen Zeichenfolgen in einem Array zurückgibt, ist
132131 Bytes:quelle
setInterval
, das bei meinem Browser immer gleich ist, bei anderen Browsern jedoch abweichen kann.innerHTML
anstelle von verwendentextContent
. Und ein weiteres Byte durch Ändernrepeat(+c)
vonrepeat(c)
.1000
kann werden1e3
.)Jelly ,
76 6958 BytesTryItOnline
Wie?
quelle
Python 2,
146 144138 Bytes-2 Bytes dank @Willem (benutze die Variable
c
anstatt eine Schleife durchlaufen zu lassenmap
)repl.it
'6643466'
ist die Anzahl der Felder vor dem Mond (mit 6 in der leeren ersten und letzten Zeile, da die Fledermaus dorthin geht).'0379730'
ist die Anzahl der'm'
s im Mond in jeder Zeile.Das
zip
packt diese Charaktere ina
undb
und macht den Mond zum Himmelm
, mit 3 nachgestellten Leerzeichen in jeder Zeile.Die letzte Linie durchquert dann die Positionen der Fledermaus im Mond und ist effektiv:
Das Tupel der Positionen wird jedoch als Ordnungszahl der druckbaren Zeichen mit einer zusätzlichen 23 codiert (da 9 nicht druckbar ist). Dies wird als
" -;L[hrbQ@2' "
ausgegeben undc=ord(b)-23
zum Extrahieren der Werte verwendet.quelle
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Autovim ,
8581 BytesKeine Animation, wahrscheinlich noch golffähig ... Trotzdem nicht schlecht für das neue Kind auf dem Block! (autovim)
Um es auszuführen:
Erläuterung
Kurz gesagt, wir zeichnen den Mond, kopieren und fügen ihn 12 Mal ein und verwenden zwei Makros: eines zum Anhängen des Schlägers an die ersten 7 Monde, das andere zum Voranstellen der letzten 6.
quelle
PHP, 167 Bytes
Ich habe ein kleines Programm in PHP gemacht:
Hier ist eine ausführlichere Version:
Dies ist mein erster Codegolf, wenn Sie einen Vorschlag haben, den ich gerne höre :)
quelle
Python 2, 112 Bytes
Drucken Sie das Bild. Jede Zeile besteht aus drei Teilen
m
für den MondDiese Teile sind verkettet und zur Beabstandung in einem Karton der Größe 15 zentriert. Um zu vermeiden, dass die Fledermäuse die Mitte verschieben, besteht ein fehlender Fledermaus aus drei gleich langen Feldern. Bei Fledermäusen über oder unter dem Mond wird der linke Balkenplatz weggelassen und der rechte Platz belegt.
Es gibt 91 Zeilen: ein 7-Zeilen-Bild für jedes der 13 Bilder. Diese werden über divmod hochgezählt: Wie
k
von0
bis zählt91
,(k/7, k%7)
gehtNimmt man den ersten Wert
k/7
als Bild und den zweiten Wertr=k%7
als Zeilennummer im Bild, zählt dies zuerst nach Bild und dann nach Zeilennummer in jedem Bild, beide mit 0-Index.Die Anzahl
m
der Monds ändert sich mit der Zeilennummerr=k%7
als[0,3,7,9,7,3,0]
. Anstatt dies zu indizieren, war eine Formel kürzer. Ein geeigneter Freiheitsgrad besteht darin, dass das0
s ein beliebiger negativer Wert sein kann, da dies bei Multiplikation mit immer noch die leere Zeichenfolge ergibtm
. Das Spielen mit einer Parabel und die Unterteilung des Bodens ergaben eine Formelr*(6-r)*8/5-5
.Nun schauen wir uns an, ob wir auf beiden Seiten eine Fledermaus oder ein leeres Feld zeichnen wollen. Das Array
b=[' ','^o^']
enthält die Optionen.Die Fledermaus in Reihe 0 auf in Bild 0 (oben), in Reihe 1 in Bild 1 (rechts), auf in Reihe 6 in Bild 6 (oben). So ist es einfach zu überprüfen, ob die Zeilen- und Bildnummer gleich sind
k/7==r
. Wir brauchen aber auch Bild 12, um wie Bild 0 auszusehen, also nehmen wir zuerst die Bildnummer modulo 12.Links ist es ähnlich. Die Fledermaus erscheint links in Reihen
r=5,4,3,2,1
in Bildern7,8,9,10,11
. Wir prüfen also, ob die Reihen- und Bildnummer 12 ergibt. Wir achten auch darauf, dass Sie nur drei Leerzeichen auf die Reihen0
und6
- den richtigen Schlägerschlitz setzen, um den Schläger zu zeichnen. Wir dürfen seine Zentrierung nicht durcheinander bringen.quelle
C #,
615582337 BytesDies ist mein erster (immer noch viel zu lesbarer) Versuch, also freue ich mich über Vorschläge, ein paar hundert Bytes zu entfernen! Ganz oben auf meiner Liste steht jetzt eine kürzere Möglichkeit, das Mond-Array zu erstellen.
Ungolfed (inklusive Schleife!)
Bearbeiten:
Entfernte 21 Bytes, indem die nachgestellten Leerzeichen in der Array-Deklaration entfernt wurden. Anstelle eines 15 Zeichen breiten Gitters ist jede Reihe nur so breit, dass der Schläger hineinpasst. Es wurden weitere 12 für die unnötigen Zeichenfolgen [] in der
Main()
Deklaration entfernt.Bearbeiten 2:
Den größten Teil der Logik neu geschrieben und 245 Bytes herausgenommen! Enthält Änderungsvorschläge aus den Kommentaren. Vielen Dank!
Aus den Kommentaren wurde eine Funktion
M()
anstelle der vorherigenMain()
Methode - daher muss diese jetzt extern aufgerufen werden.quelle
new string[]
ausm
und nur darumstring[]m={...}
.var
an Orten wiestring[]w=(string[])m.Clone();
-var w=(strin[])m.Clone();
Python 2,
299300290270 BytesGolf bis 270, nachdem ich ein bisschen mehr Golferfahrung gesammelt habe.
Die Referenzimplementierung wurde um
321320330 Bytes reduziert . Nicht hübsch oder elegant. Verwendet nur Brute Force String und List Slicing. Es hat Spaß gemacht, den Byte-Countdown zu starten, aber ich denke, dass der Ansatz für einen ernsthaften Konkurrenten zunächst völlig falsch war.Ich erwarte nicht, dass diese Antwort ernst genommen wird, also bitte keine Abstimmungen. Ich habe in der Frage gesagt, dass ich versuchen würde, die Referenzimplementierung zu spielen, und das ist genau das. Nur zum Spaß gepostet.
Probieren Sie es online!
quelle
Ruby,
164156 BytesSehr einfaches Programm. Kann weiter bearbeitet werden. Bitte hinterlassen Sie Tipps in den Kommentaren.
quelle
base64
undzlib
-Bibliotheken auf kürzestem Weg einbinden und zur Bytezahl hinzufügen?puts
undsay
? Ich kenne Ruby nicht./// 205 Bytes
Probieren Sie es online!
Nur wenn ich nicht Tonnen von Leerzeichen brauchte ...
quelle
Mumps, 223 Bytes
Hierbei werden InterSystems-Cache-Mumps verwendet. Sie ermöglichen geschachtelte Schleifen in einer einzigen Zeile.
Könnte wahrscheinlich mehr Golf spielen und ich kann damit spielen, wenn ich mehr Zeit habe. Füge weitere 9 Bytes hinzu und es wird animiert [[aufgrund des Hinzufügens von 'H 1 W #' -> das für eine Sekunde anhält und den Bildschirm löscht:
Hier ist eine ungolfed / EXPLAIN-Version (der Animationsversion) mit den korrekten 'do'-Anweisungen und Punktschleifen:
Ich habe versucht, den Jazz "Compress, dann Base-64-Codierung" zu machen, um zu sehen, was passieren würde, aber die codierte Zeichenfolge endete etwas länger als das Programm selbst! Das und die Systemaufrufe von Cache für die Komprimierung und Base64-Codierung sind ziemlich lang. Hier ist beispielsweise der Systemaufruf zum Decodieren von Base64: $ System.Encryption.Base64Decode (STRING)
Diese Methode würde das Programm auf über 300 Zeichen "aufblähen", denke ich ...
quelle