Einzeiliges Aquarium

31

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!

WallyWest
quelle
Wenn der Fisch zu nahe an den Rand des Aquariums kommt, muss er gedreht werden, oder der Bildschirm wird möglicherweise ausgeblendet? Muss es möglich sein, dass der Fisch in dieser Situation Blasen bläst? Muss es auch möglich sein (oder ist es verboten oder erlaubt, aber nicht erforderlich), dass der Fisch zweimal hintereinander Blasen wirft?
John Dvorak
1
Warten Sie, nein, machen Sie keine Änderungen wie diese! Ich habe schon angefangen zu programmieren! Würde es Ihnen etwas ausmachen, zurückzurollen?
John Dvorak
5
Bitte benutzen Sie das nächste Mal den Sandkasten .
John Dvorak
1
Es ist nicht explizit angegeben, aber ich denke, es muss genau einen Fisch im Aquarium geben?
John Dvorak
1
Ist es erforderlich, dass der Fisch zweimal hintereinander sprudelt, oder dürfen wir das zulassen? Das macht für mich einen Unterschied von drei Zeichen.
John Dvorak

Antworten:

11

Python 3 (278)

Zuvor: 334, 332, 325, 302, 300, 299, 291, 286, 284, 281

import random,time
r=random.random
F="}}('_'){{%s","}}< }} ',')%s","%s(',' {{ >{{"
p,d=9,1
c=b=0
while 1:
 if c:p-=c+c*3*(2*d+c==1);d=c-c*d*d;c-=d
 elif b%5:b+=1
 elif.3>r()or{p*d}<{-5,53}:c=-d
 elif.1>r():b=1
 else:p+=d
 print('|%-70s|'%(' '*p+F[d])%' .oO*'[b%5]);time.sleep(2)

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

from random import random as r
from time import sleep as s
F = { 1: "}}< }} ',')%s", 0: "}}('_'){{%s", -1: "%s(',' {{ >{{" }

# p: position (from left)
# d: direction (-1: left, +1: right)
# c: changing direction (0: not changing, +1: to right, -1: to left)
# b: bubble (0)
p, d, c, b = 9, 1, 0, 0

while 1:
    if c:
        p -= c*[1,4][2*d+c==1]
        if d:
            d = 0
        else:
            d, c = c, 0
    elif b % 5:
        b += 1
    else:
        # change direction
        if r() < .3 or p * d in (-5,53):
            c = -d
        # start bubbling
        elif r() < .1:
            b = 1
        # move forward
        else:
            p += d

    # print fish and sleep
    print('|{:<70}|'.format(' '*p+(F[d]%' .oO*'[b%5])))
    s(2)
Sack
quelle
7

Rubin, 291 289

l="(',' {{ >{{";m="    }}('_'){{    ";r="}}< }} ',')";w=?\s;s=w*6;q="|#{r+s*9}|"
f=->*s{(puts q;sleep 2)if q.sub! *s}
loop{rand>0.1||(f[") ",")."]||f[" (",".("];f[?.,?o];f[?o,?O];f[?O,?*];f[?*,w])
q[7]==?(||q[-8]==?)||rand<0.3?f[s+l,m]&&f[m,r+s]||f[r+s,m]&&f[m,s+l]:f[w+l,l+w]||f[r+w,w+r]}

Der Fisch ist elf Zeichen lang, wodurch das Aquarium 6 * 9 + 11 + 2 = 67 Zeichen breit ist, was genau in die erforderliche Toleranz passt.

Die fLambda-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 als 2(die genommene Verzögerung) oder nil(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: Ersetzen f[?*,w]durch q[?*]=w- kostenlos)

Löscht die Konsole nicht. Korrektur: Fügen Sie `clear`(Unix) oder system 'cls'(Windows-Konsole) hinzu, bevor Sie puts qdie Korrektur durchführen ( Ref. ), Oder verwenden Sie diese printanstelle von putsund stellen Sie \rsie dem Aquarium voran ( empfohlen von @manatwork ).

Lesbare Version:

# l - left fish; m - middle fish + space; r - right fish
# w - single space character; s - six spaces; q - the aquarium
l="(',' {{ >{{"; m="    }}('_'){{    "; r="}}< }} ',')";
w=" "; s=w*6; q="|#{r+s*9}|"
f = ->k,v do
  if q.sub! k,v
    puts q
    sleep 2
    return 2
  else
    return nil
  end
end

loop do
  if rand < 0.1
    f[") ",")."] || f[" (",".("]
    f[?.,?o]; f[?o,?O]; f[?O,?*]; f[?*,' ']
  end
  if q[7] == "(" || q[-8] == ")" || rand < 0.3
    (f[s+l,m] && f[m,r+s]) || (f[r+s,m] && f[m,s+l])
  else
    f[w+l,l+w] || f[r+w,w+r]
  end
end
John Dvorak
quelle
Ich möchte hinzufügen , \rbis Anfang q: q="\r|#{r+s*9}|". Dann verwenden Sie $><<qstatt puts q. Ist 1 Zeichen länger, sieht aber ohne externe Befehle besser aus.
Handarbeit
\rlöscht den Bildschirm? In meinem Fall ist das nicht der Fall. Oder warum magst du es nicht puts?
John Dvorak
1
Nein, \rist Wagenrücklauf. Wenn Sie $><<qfür die Ausgabe verwenden, bleibt der Cursor in derselben Zeile ( putserzwingt ein \nnach der Ausgabe), sodass beim Starten der nächsten Ausgabe mit \rzum Anfang der aktuellen Zeile zurückgesprungen wird und von dort die Ausgabe gestartet wird. Überschreibt somit das vorherige „Bild“ der Aquarienlinie.
Handarbeit
@manatwork Leider bringt dies das interaktive jRuby-Fenster völlig durcheinander, was das ignoriert \r.
John Dvorak
Oh. Tut mir leid das zu hören. Und danke für die Information. Leider ist dies die erste Tatsache, die ich über jRuby erfahre. :(
manatwork
3

R, 451 Zeichen

Ein erster Versuch:

f=function(j,p){cat("\r|",rep("-",j),p,rep("-",50-j),"|",sep="");Sys.sleep(2)};d=F;j=5;P=c("--}}(\'_\'){{--","-}}< }} \',\')-","-(\',\' {{ >{{-");B=c("-",".","o","O","*","-");g=Vectorize(gsub,v="replacement");b=list(g("-$",B,P[2]),g("^-",B,P[3]));repeat{if(j<5 & d){d=!d;j=j+1;f(j,P[1])};if(j>44 & !d){d=!d;f(j,P[1]);j=j-1};if(runif(1)<.1){for(i in b[[d+1]])f(j,i)}else{f(j,P[d+2])};if(runif(1)<.3){d=!d;f(j,P[1]);f(j,P[d+2])};if(d){j=j-1}else{j=j+1}}

Eingerückt:

f=function(j,p){ #Printing function (depends of buffer and kind of fish)
    cat("\r|",rep("-",j),p,rep("-",50-j),"|",sep="")
    Sys.sleep(2)
}
d=F   #Direction: if FALSE left to right, if TRUE right to left.
j=5   #Buffer from left side of tank
P=c("--}}(\'_\'){{--","-}}< }} \',\')-","-(\',\' {{ >{{-") #The fish
B=c("-",".","o","O","*","-") #The bubble sequence
g=Vectorize(gsub,v="replacement")
b=list(g("-$",B,P[2]),g("^-",B,P[3])) #Fish+bubble
repeat{
    if(j<5 & d){ #What happens if too close from left side
        d=!d
        j=j+1
        f(j,P[1])
        }
    if(j>44 & !d){ #What happens if too close from right side
        d=!d
        f(j,P[1])
        j=j-1}
    if(runif(1)<.1){ #If bubble sequence initiated
        for(i in b[[d+1]])f(j,i)
        }else{f(j,P[d+2])} #Otherwise
    if(runif(1)<.3){ #If fish decide to turn
        d=!d
        f(j,P[1])
        f(j,P[d+2])
    }
    if(d){j=j-1}else{j=j+1} #Increment or decrement j depending on direction
}

Es druckt das Aquarium als Standard in einer einzelnen Zeile (dann 2s Pause und Wagenrücklauf, bevor das Aquarium bei t + 1 gedruckt wird).

Plannapus
quelle
3

Perl, 281

@f=("s O(',' {{ >{{","s}}('_'){{s","}}< }} ',')O s");$d=1;@o=split//," *Oo. ";{$_="|".$"x$x.$f[$d+1].$"x(44-$x).'|
';s/O/$o[$b]/;s/s/    /g;print;if($b||$t){$b--if$b;if($t){$d+=$t;$t=0if$d}}else{$x+=$d;$t=($x<1)-($x>43);if(!$t){$b=5if.9<rand;if(.7<rand){$t=-$d;$b=0}}}sleep 2;redo}

oder deutlicher

@f = ( "s O(',' {{ >{{", "s}}('_'){{s", "}}< }} ',')O s" );
$d = 1;
@o = split //, " *Oo. ";
{
    $_ = "|" . $" x $x . $f[ $d + 1 ] . $" x ( 44 - $x ) . '|
';
    s/O/$o[$b]/;
    s/s/    /g;
    print;
    if ( $b || $t ) {
        $b-- if $b;
        if ($t) { $d += $t; $t = 0 if $d }
    }
    else {
        $x += $d;
        $t = ( $x < 1 ) - ( $x > 43 );
        if ( !$t ) {
            $b = 5 if .9 < rand;
            if ( .7 < rand ) { $t = -$d; $b = 0 }
        }
    }
    sleep 2;
    redo
}

Fisch dreht sich richtig. Blasen weht.

285 - wenn Sie das echte Aquarium-Feeling mögen und nicht die Scroll-Version:

$|=@f=("s O(',' {{ >{{","s}}('_'){{s","}}< }} ',')O s");$d=1;@o=split//," *Oo. ";{$_="\r|".$"x$x.$f[$d+1].$"x(44-$x).'|';s/O/$o[$b]/;s/s/    /g;print;if($b||$t){$b--if$b;if($t){$d+=$t;$t=0if$d}}else{$x+=$d;$t=($x<1)-($x>43);if(!$t){$b=5if.9<rand;if(.7<rand){$t=-$d;$b=0}}}sleep 2;redo}
KevinColyer
quelle
Wo drehst du dich? Ich kann nicht sehen, wie Sie $d=0das "erforderliche Drehen" einstellen .
John Dvorak
1
sleep2(ohne Leerzeichen) funktioniert bei mir nicht; Auch wenn Sie drehen, halten Sie das Fischgesicht nicht ausgerichtet. Und die Blasen scheinen niemals aufzutauchen.
Poke
"Außerdem wird ein Zeitgeber zwischen Frames von 2000 ms festgelegt. Dies ist obligatorisch." - Das passiert mir überhaupt nicht. Außerdem treten keine Blasen auf, der Fisch sitzt einfach an Ort und Stelle. Außerdem sollte der Kopf an Ort und Stelle bleiben, während sich der Fisch dreht, nicht die Körpermitte (zumindest zeigt dies das Beispiel)
John Dvorak
Drat! Golf zu hart. Brauchen Sie einen zusätzlichen Raum mit Schlaf! Fisch sprudelte auch schön!
Moment mal
Hoppla - habe den Kopf in der Mitte vergessen, als
ich mich
2

C 400 394 373 Zeichen

#define p printf
#define a(x) l[5]=r[11]=x;d();
char *l="      (',' {{ >{{",*f="    }}('_'){{    ",*r="}}< }} ',')      ",*c,s=7,i,*T;d(){p("|");for(i=0;i<s;i++)p(" ");p(c);for(i=0;i<70-s;i++)p(" ");puts("|");sleep(2);}b(){a(46)a(111)a(79)a(42)a(32)}t(){T=c;c=f;d();c=T==r?l:r;d();}m(){c==l?s--:s++;d();s>69||s<1?t():0;}main(){c=r;for(d();;)i=rand()%10,i?i>6?t():m():b();} 

Mit Leerzeichen:

#define p printf
#define a(x) l[5]=r[11]=x;d();
char *l="      (',' {{ >{{",
     *f="    }}('_'){{    ",
     *r="}}< }} ',')      ",
     *c, 
     s=7,
     i,  
    *T; 
d(){
  p("|");
  for(i=0;i<s;i++)
    p(" ");
  p(c);
  for(i=0;i<70-s;i++)
    p(" ");
  puts("|");
  sleep(2);
}
b(){
  a(46)
  a(111)
  a(79)
  a(42)
  a(32)
}
t(){
  T=c;
  c=f;
  d();
  c=T==r?l:r;
  d();
}
m(){
  c==l?s--:s++;
  d();
  s>69||s<1?t():0;
}
main(){
  c=r;
  for(d();;)
    i=rand()%10,
    i?i>6?t():m():b();
}
Josh
quelle
1
Kann i==l?(c=r):(c=l)auf gekürzt werden c=i==l?r:l?
John Dvorak
Sieht aus wie es sein kann. Vielen Dank!
Josh
Sie können ein paar Zeichen von speichern#define p printf(
pastebin.com slash 0mr8spkT
@Ace gcc mag es nicht, wenn ich das tue.
Josh
Für mich geht das. oi41.tinypic.com/15fqbvb.jpg
Schrägstrich 0mr8spkT