Wer liebt nicht Actionfilme mit schnellen, lauten Autos, besonders mit vielen Stürzen? Wer liebt Action-Shots in der ASCII-Kunst nicht?
Die Szene ist:
Zwei Autos starten an gegenüberliegenden Seiten einer geraden Straße (mit 60 Zwischenräumen). Sie fahren mit konstanter Geschwindigkeit aufeinander zu. Das linke Auto fährt mit 1 Leerzeichen pro Sekunde und das rechte mit 2 Leerzeichen pro Sekunde.
Offensichtlich können sich die Autos nicht gegenseitig passieren, so dass n ≥ 20
die Szene aus zwei verunglückten Autos mit Motorhauben an der Stelle besteht, an der der Unfall aufgetreten ist.
Als Filmliebhaber möchte ich die Szene ab und zu pausieren, nur um die Schönheit zu genießen.
Bei einer gegebenen Ganzzahl n
(Funktionsargument oder STDIN), die die Anzahl der Sekunden ab Beginn der Szene darstellt, wird die Szene zu diesem Zeitpunkt angezeigt.
Dies ist die Startszene mit 60 Zwischenräumen zwischen den Vorderrädern:
__ __
_/ \_ _/ \_
o o o o
das ist die szene nach 11 sekunden:
__ __
_/ \_ _/ \_
o o o o
und so sieht es nach dem Crash aus (beachte, dass die Motorhauben nach dem Crash oben sind):
__ __
_/ \/\/ \_
o oo o
Ich bin nur daran interessiert zu sehen, wie zwei Autos zusammenstoßen, Leerzeichen, Zeilenumbrüche, ++ spielen keine Rolle.
Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes. Später hinzugefügte Antworten können immer noch gewinnen, wenn sie kürzer als die aktuell akzeptierte Antwort sind.
/ \
und nicht runter sind_ _
?Antworten:
CJam,
6866 BytesProbieren Sie es online aus
Jeder, der den Anfang des Codes sieht, ist sich dessen sicher
liKe
!Erläuterung:
quelle
Labyrinth ,
394386 BytesIch stelle stolz vor ...
... mein neues zweidimensionales Esolang-Labyrinth! Der obige Code ist nicht besonders gut umgesetzt (es gibt 161 Felder und 25 NOPs, so dass ein besseres Layout dies erheblich verkürzen könnte), aber ich konnte zumindest zeigen, dass die Sprache für nicht-triviale Aufgaben geeignet ist. :)
Wie es funktioniert
Zunächst ein kurzer Überblick über die Sprache:
"
ist ein NOP, der keine Pinnwand ist und zum Auffüllen bestimmter Pfade im Code hilfreich sein kann. Im Gegensatz zu vielen anderen 2D-Sprachen werden die Kanten nicht umbrochen.@
Beendet das Programm.>v<^
werden, die eine Zeile oder Spalte des Quellcodes zyklisch um eine Zelle verschieben. Welche Zeile oder Spalte betroffen ist, hängt von der Stapelspitze ab. Wenn die eigene Zeile oder Spalte der IP verschoben wird, bewegt sie sich mit der Verschiebung. Dies ermöglicht es, von einer Kante des Quellcodes zur anderen zu springen.Für diese besondere Herausforderung ist hier die allgemeine Idee des Algorithmus:
/ \_o oo o
) auf den Zusatzstapel.__
oder als/\
nächstes.__ __ _/ \
und zwei führende Leerzeichen) auf den Zusatzstapel.20
, nennen wir diese N .Schauen wir uns zum Schluss einige Teile des Codes an. Die IP beginnt in der oberen linken Ecke mit einem Befehl zum Verschieben des Rasters. Der obere Teil des Hauptstapels ist
0
(der als relativer Index verwendet wird), daher wird die erste Zeile nach links verschoben, wodurch auch die IP an das rechte Ende des Rasters verschoben wird. Jetzt wird die erste Zeile einfach von rechts nach links ausgeführt, wodurch der erste Satz fester Zeichen auf den Zusatzstapel verschoben wird:Diese Zeilenverschiebung ist nützlich zum Golfen, wenn Sie mit einer großen Menge linearen Codes beginnen möchten.
Als nächstes lesen wir die Eingabe und schieben die richtigen Hauben:
Das linke Bit mit den drei NOPs sendet negative Ergebnisse entlang des oberen Zweigs und nicht negative Ergebnisse entlang des unteren Zweigs. Rechts werden sie wieder zusammengefügt.
Nun folgt ein weiterer großer linearer Abschnitt (der wahrscheinlich mit einem anderen Trick zum Verschieben von Reihen viel Golf gespielt werden könnte):
Dies drückt den Rest der Autos auf den Hilfsstapel.
Als nächstes berechnen wir
min(20, input)
, was dem ersten Zweig ähnlich ist:Schließlich haben wir die Schleife, die dreimal ausgeführt wird, um die Zeilen zu drucken. Jede Iteration der Schleife enthält zwei kleine (3x3) Schleifen zum Drucken der Leerzeichen sowie zwei Abschnitte zum Drucken von 6 Zeichen aus dem Zusatzstapel:
Ein guter Trick, auf den ich gerne aufmerksam machen möchte, ist der
.{.{.
am rechten Rand. Dies ist eine Sackgasse. Abgesehen von der Sackgasse wird.
der Code zweimal ausgeführt, einmal vorwärts und einmal rückwärts. Dies bietet eine gute Möglichkeit, den Palindrom-Code zu verkürzen (der Haken ist, dass Sie sicherstellen müssen, dass die IP die richtige Kurve nimmt, wenn Sie die Sackgasse wieder verlassen).quelle
Python 2.7,
167164159 BytesDies nimmt Eingaben von stdin entgegen.
Demo hier
Testen Sie diese -
quelle
(n,20)[n>20]
ist einfachmin(n,20)
.(' \_',' \/')[s<1]
mit' \\\\_/'[s<1::2]
.l
notwendig? Könnten Sie einfach tunfor e in [' _',"_/ ","o "]:
undl
insgesamt entfernen ?l
ist jetzt nicht notwendig. Ich musste es in einer früheren Version verwenden. Danke :)R, 191 Bytes
Etwa so gut wie ich es jetzt bekommen kann. Nimmt die Sekunden von STDIN und Katzen zu STDOUT.
Erläuterung
Tests
quelle
formals()
. :)CJam, 120 Bytes
Demo
Ungolfed:
Demo
quelle
J
hat den Wert 19,K
hat den Wert 20 und speichert jeweils ein Zeichen für diese Konstanten. Wenn Sie ein Array mit einem Element benötigen, können Sie dena
Operator zum Umbrechen des Elements verwenden, anstatt zwei Klammern zu verwenden.PHP,
160 bis155 BytesDer Code wird hier in 3 Zeilen angezeigt, um dem Layout des Codefelds zu entsprechen. Diese Zeilenumbrüche werden nicht benötigt.
Der ungolfed Code:
Es wird die Anzahl der Sekunden von der Befehlszeile abgerufen (erstes Argument):
Die PHP-CLI-Option
-d error_reporting=0
wird benötigt, um einige Hinweise auszublenden, die PHP zu undefinierten Konstanten (str_repeat
,_
) anzeigt , die es in Zeichenfolgen konvertiert (2 Byte, die für jeden Hinweis gespeichert werden).Ein zusätzliches Byte kann in PHP 7 gespeichert werden, indem die Initialisierung von
$f
bei der ersten Verwendung gedrückt wird ($m=($f=str_repeat)(...)
). Es kann nicht mit PHP 5 kompiliert werden.Der Testfall und einige der zum Verkleinern des Codes verwendeten Techniken sind auf github zu finden .
Aktualisieren:
@ ismail-miguel hat die Initialisierung von
$left
und$c
die Argumente für dieecho
Einsparung von 4 Bytes unterstrichen (siehe Kommentar unten).Durch Vertauschen der Reihenfolge der Variablen
$m
und ders
Initialisierung habe ich ein Paar Klammern entfernt und 1 Byte mehr gespart.quelle
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
in eine Variable zu extrahieren , aber die gleiche Länge oder eine schlechtere.\n
durch echte Zeilenumbrüche ersetzen . Ich habe es vergessen. Und es zählt jeweils 1 ByteJavaScript (ES6), 121 Byte
Unter Verwendung der Schablonenzeichenfolge sind die 2 Zeilenumbrüche in der Zeichenfolge von Bedeutung und werden gezählt.
Um Bytes zu sparen, geben Sie mit aus
alert
, auch wenn die in verwendete proportionale Schriftartalert
für ASCII-Grafiken nicht gut geeignet ist und das Ergebnis für n> = 20 (Absturz) hässlich ist.Testen Sie das Ausführen des Snippets in FireFox
quelle
Python 2, 148 Bytes
Dies verwendet ANSI-Escape-Codes, um den Cursor an der richtigen Stelle zu positionieren, um die Autos zu zeichnen. Anschließend wird geprüft, ob die Eingabe 20 war. Wenn dies der Fall ist, wird zurückgegangen und auf die Motorhauben des Autos zurückgegriffen.
Übernimmt ein Int von stdin und gibt es an stdout aus.
Ungolfed:
quelle
Pyth, 67 Bytes
Probieren Sie es hier aus .
quelle
C
180,191,168 Bytesungolfed:
Testprogramm:
Ausgabe:
Ich konnte dieses Spiel ziemlich hart spielen. Ich glaube ich habe mit fast 300 Bytes angefangen.
Aber ich weiß nicht, ob dies noch alle Anforderungen erfüllt. Wie Sie nach 21 Sekunden sehen können, schiebt das erste Auto das zweite Auto nach rechts. Ich müsste ein paar Bytes hinzufügen, wenn dies nicht erlaubt ist.Bearbeiten: behoben. Das sollte realistischer sein als Sharknado ;-)
Bearbeiten: Ich könnte meine Lösung erheblich verkürzen, indem ich mir die
printf
Manpage noch einmal anschaue . Wenn Sie '*' verwenden, können Sie die Feldlänge direkt an printf übergeben, ohnesprintf
vorher einen Format-String mit erstellen zu müssen.quelle
> <> ,
538276 BytesIch habe die Größe VIEL reduziert, ich bin erstaunt, dass ich es geschafft habe, die Größe um die Hälfte zu reduzieren. Der alte ist unten. Dieser ist aufgrund der Breite des Gitters, meistens von der ersten Zeile an, nicht so leistungsfähig.
Sie können es hier ausprobieren . Legen Sie die verstrichene Zeit in den "Initial Stack" und nicht in "Input"!
Hier ist die alte Version.
quelle
Java, 258 Zeichen
Ungolfen
Ergebnisse
quelle
Python 2, 102 Bytes
Ziemlich einfach. Für jede Reihe des Autos drucken wir
n
Leerzeichen, diese Reihe,60-3*n
Leerzeichen und die Reihe erneut. Um die Autos anzuhalten, anstatt dies zu tunmin(n,20)
, war es ein Zeichen kürzer, den ersten Durchgang von Leerzeichen mit zu begrenzen[:20]
, und das zweite ist in Ordnung, da ein negativer Zeitpunkt, zu dem eine Zeichenfolge die leere Zeichenfolge ist.Um die Kotflügel nach oben zu bewegen, machen wir einfach a
replace
. Da__
auch auf dem Dach erscheint, brauchen wir ein bisschen Kontext, um die Kotflügel zu identifizieren, also suchen wir nach/
Folgendem.quelle
Java,
270 -267 ByteIch bin mir ziemlich sicher, dass es einen besseren / kürzeren Weg gibt, aber mein Gehirn ist nicht richtig beschäftigt.
Für n = 19:
Für n = 20:
Ungolfed
quelle
PHP 7, 140 Bytes
Verwendung:
Speichern Sie als ANSI in
file.php
(es sollten Zeichen mit der Breite Null in sein$o
) und führen Sie Folgendes aus:mit
x
wie die Anzahl der Sekunden.Und eine Version, die ohne Änderung der Fehlerberichterstattung ( 148 Byte ) funktioniert :
quelle
Javascript, 193 Bytes
Es ist kein Gewinner, aber es ist etwas
http://jsfiddle.net/yb703y0p/2/
quelle