Meine Schwiegereltern haben einen mit Koi gefüllten Fischteich in ihrem Garten. Es kam mir nicht wirklich in den Sinn, bis ich den folgenden Auszug aus meinem Code bemerkte.
',') & '_'
... Ich hatte Fischgesichter, die mich von meinem Bildschirm aus ansahen ...
Welches hat mir eine gute Idee gegeben ...
Meine Suche nach Ihnen, meine lieben Golfer, ist es, ein einzeiliges ASCII-Aquarium mit den folgenden Regeln zu erstellen:
- Die Größe des Aquariums von der Seite des Tanks zur anderen Seite des Tanks sollte nicht kleiner als 60 Zeichen und nicht größer als 80 Zeichen sein. Die Seiten des Tanks müssen mit dem
|
Zeichen pipe / bar ( ) angegeben werden. - Fische müssen in der Lage sein, von links nach rechts zwischen den Seiten des Beckens zu "schwimmen". Da sie sich drehen werden, ist eine Vorderansicht für den Übergang von einer Richtung in die andere erforderlich.
Der Fisch muss wie folgt aussehen:
}}< }} ',')
Fische schwimmen richtig(',' {{ >{{
Fische schwimmen links}}('_'){{
Fisch nach vorne
Wenn sich ein Fisch dreht, um die Richtung zu ändern (30% Chance), muss er von einer Richtung nach vorne und dann in die andere Richtung zeigen Tankrand Minimum ...
- Wenn ein Fisch keine Luftblase bläst oder die Richtung ändert, bewegt er sich in die Richtung, in die er blickt. Wenn er sich innerhalb von sechs Feldern von der Seite des Tanks entfernt befindet, ändert er die Richtung.
- Der Fisch (nach links oder rechts zeigend) kann gelegentlich (mit einer Wahrscheinlichkeit von 10%) aufhören, Blasen nacheinander zu blasen (
.oO*
). Daher muss neben dem Fisch ein Platz verfügbar sein, damit die Blase vorhanden ist schwimme nur so nah wie möglich an den Seiten, spare einen Platz. Die Blase muss verschwinden, bevor sich der Fisch fortbewegen kann ...
Eine Reihe von Beispielzeilen zum Verhalten des Fisches mit -
Zeichen, die die Leerzeichen angeben, da die Codeanzeige hier ein wenig streng ist. Ich erwarte, dass diese Bindestriche durch Leerzeichen ersetzt werden, wenn Sie dies codieren.
Jede Zeile kann hier als Frame im Zeitraffer betrachtet werden.
|-}}< }} ',')----------|
|--}}< }} ',')---------|
|---}}< }} ',')--------|
|----}}< }} ',')-------|
|-----}}< }} ',')------|
|-----}}< }} ',').-----|
|-----}}< }} ',')o-----|
|-----}}< }} ',')O-----|
|-----}}< }} ',')*-----|
|---------}}('_'){{----|
|-----------(',' {{ >{{|
|----------(',' {{ >{{-|
|---------(',' {{ >{{--|
|--------.(',' {{ >{{--|
|--------o(',' {{ >{{--|
|--------O(',' {{ >{{--|
|--------*(',' {{ >{{--|
|--------(',' {{ >{{---|
|-------(',' {{ >{{----|
|------(',' {{ >{{-----|
usw. Das obige Beispiel ist, wie gesagt, klein, aber Sie haben eine allgemeine Vorstellung ...
Kürzester Code gewinnt ...
Ich erwarte die Ausgabe in derselben Zeile (wenn möglich), wenn nicht, ist es in Ordnung, Frame für Frame nacheinander anzuzeigen ... Es liegt an Ihnen, ob Sie eine Zeile oder mehrere Zeilen verwenden. Wenn Sie mehrere Zeilen eingeben, müssen diese durch einen Zeilenumbruch getrennt werden.
Es wird auch ein Zeitgeber zwischen Rahmen von 2000 ms auferlegt. Dies ist obligatorisch .
Mal sehen, was du hast!
quelle
Antworten:
Python 3 (278)
Zuvor: 334, 332, 325, 302, 300, 299, 291, 286, 284, 281
Golfen in Python ist aufgrund der Einrückungsanforderungen von Anweisungen immer schwierig, aber trotzdem lief es unglaublich gut!
Ein großes Dankeschön an Volatility und DSM, die mir dabei geholfen haben, so viel mehr Golf zu spielen.
Saubere Version
quelle
Rubin,
291289Der Fisch ist elf Zeichen lang, wodurch das Aquarium 6 * 9 + 11 + 2 = 67 Zeichen breit ist, was genau in die erforderliche Toleranz passt.
Die
f
Lambda-Funktion übernimmt das Schwerheben: Sie akzeptiert eine Substitution als Argumentpaar und versucht dann, die Substitution auf das Aquarium anzuwenden. Wenn dies erfolgreich ist, wird ein Frame der Animation gezeichnet. Es meldet dann den Erfolgswert als2
(die genommene Verzögerung) odernil
(die nicht ausgeführte Verzögerung).Fische blasen nicht zweimal hintereinander. (Fix:
...while rand>0.1
- 4 Zeichen)Fische können schon vor einer erzwungenen Wende Blasen werfen. (Fix: die Verzweigungsstruktur neu anordnen)
Es gibt einen Rahmen, in dem die Blase vollständig verschwunden ist (einschließlich der
*
), der Fisch sich jedoch nicht in die entstandene Leere bewegt hat. Dies folgt dem Buchstaben, aber nicht dem Beispiel. (Fix: Ersetzenf[?*,w]
durchq[?*]=w
- kostenlos)Löscht die Konsole nicht. Korrektur: Fügen Sie
`clear`
(Unix) odersystem 'cls'
(Windows-Konsole) hinzu, bevor Sieputs q
die Korrektur durchführen ( Ref. ), Oder verwenden Sie dieseprint
anstelle vonputs
und stellen Sie\r
sie dem Aquarium voran ( empfohlen von @manatwork ).Lesbare Version:
quelle
\r
bis Anfang q:q="\r|#{r+s*9}|"
. Dann verwenden Sie$><<q
stattputs q
. Ist 1 Zeichen länger, sieht aber ohne externe Befehle besser aus.\r
löscht den Bildschirm? In meinem Fall ist das nicht der Fall. Oder warum magst du es nichtputs
?\r
ist Wagenrücklauf. Wenn Sie$><<q
für die Ausgabe verwenden, bleibt der Cursor in derselben Zeile (puts
erzwingt ein\n
nach der Ausgabe), sodass beim Starten der nächsten Ausgabe mit\r
zum Anfang der aktuellen Zeile zurückgesprungen wird und von dort die Ausgabe gestartet wird. Überschreibt somit das vorherige „Bild“ der Aquarienlinie.\r
.R, 451 Zeichen
Ein erster Versuch:
Eingerückt:
Es druckt das Aquarium als Standard in einer einzelnen Zeile (dann 2s Pause und Wagenrücklauf, bevor das Aquarium bei t + 1 gedruckt wird).
quelle
Perl, 281
oder deutlicher
Fisch dreht sich richtig. Blasen weht.
285 - wenn Sie das echte Aquarium-Feeling mögen und nicht die Scroll-Version:
quelle
$d=0
das "erforderliche Drehen" einstellen .sleep2
(ohne Leerzeichen) funktioniert bei mir nicht; Auch wenn Sie drehen, halten Sie das Fischgesicht nicht ausgerichtet. Und die Blasen scheinen niemals aufzutauchen.C
400394373 ZeichenMit Leerzeichen:
quelle
i==l?(c=r):(c=l)
auf gekürzt werdenc=i==l?r:l
?#define p printf(