Acuario One Line

31

Mis suegros tienen un estanque de peces en su patio, lleno de koi. Realmente no se me pasó por la cabeza hasta que noté el siguiente extracto de mi código.

',') & '_'

... Tenía caras de pez mirándome desde la pantalla ...

Lo que me ha dado una gran idea ...

Mi búsqueda para ustedes, mis queridos golfistas, es crear un acuario ASCII de una línea, con las siguientes reglas:

  • El tamaño del acuario desde el lado del tanque hasta el otro lado del tanque no debe ser menor de 60 caracteres ni mayor de 80 caracteres. Los lados del tanque deben indicarse utilizando el carácter de tubería / barra ( |).
  • Los peces deben poder "nadar" de izquierda a derecha entre los lados del tanque. A medida que giren, se requiere una vista frontal para la transición de una dirección a otra.
  • El pez debe tener el siguiente aspecto:

    • }}< }} ',') Peces nadando a la derecha
    • (',' {{ >{{ Peces nadando a la izquierda
    • }}('_'){{ Pescado de frente
  • Cuando un pez gira para cambiar de dirección (30% de probabilidad), debe comenzar desde una dirección, mirar hacia el frente, luego mirar hacia la otra dirección ... Asegúrese de que haya suficiente espacio para que el pez gire, es decir, requiere seis espacios antes del borde del tanque mínimo ...

  • A menos que un pez esté soplando una burbuja o cambie de dirección, continuará en la dirección que está mirando, si se encuentra dentro de los seis espacios del costado del tanque, cambiará de dirección.
  • El pez (mirando hacia la izquierda o hacia la derecha) en ocasiones (10% de probabilidad) puede dejar de soplar burbujas en sucesión ( .oO*), por lo que se requiere que el pez tenga un espacio disponible al lado para que la burbuja exista, para que un pez pueda solo nade tan cerca de los costados, ahorre un espacio. La burbuja debe desaparecer antes de que el pez pueda avanzar ...

Una serie de líneas de ejemplo del comportamiento del pez, con -caracteres que indican los espacios, ya que la función de visualización del código aquí es un poco estricta ... Esperaré que estos guiones sean reemplazados por espacios cuando codifique esto ...

Cada línea aquí podría considerarse un marco en un lapso de tiempo.

|-}}< }} ',')----------|
|--}}< }} ',')---------|
|---}}< }} ',')--------|
|----}}< }} ',')-------|
|-----}}< }} ',')------|
|-----}}< }} ',').-----|
|-----}}< }} ',')o-----|
|-----}}< }} ',')O-----|
|-----}}< }} ',')*-----|
|---------}}('_'){{----|
|-----------(',' {{ >{{|
|----------(',' {{ >{{-|
|---------(',' {{ >{{--|
|--------.(',' {{ >{{--|
|--------o(',' {{ >{{--|
|--------O(',' {{ >{{--|
|--------*(',' {{ >{{--|
|--------(',' {{ >{{---|
|-------(',' {{ >{{----|
|------(',' {{ >{{-----|

El ejemplo anterior es, como dije, pequeño, pero se entiende la idea general ...

El código más corto gana ...

Espero que la salida en la misma línea (si es posible), si no, mostrar cuadro tras cuadro está bien ... Ya sea que vaya una línea o varias líneas depende de usted. Si está haciendo varias líneas, deben estar separadas por una nueva línea.

También se impone un temporizador entre cuadros, 2000ms. Esto es obligatoria .

¡A ver qué tienes!

WallyWest
fuente
Si el pez se acerca demasiado al borde del acuario, ¿es necesario que gire o puede desaparecer de la pantalla? ¿Debe ser posible que el pez haga burbujas en esta situación? Además, ¿debe ser posible (o está prohibido, o está permitido pero no es obligatorio) que el pez haga burbujas dos veces seguidas?
John Dvorak
1
¡Espera, no, no hagas cambios como este! Ya empecé a codificar! ¿Te importaría retroceder?
John Dvorak
55
Utilice el sandbox la próxima vez.
John Dvorak
1
No se dice explícitamente, pero supongo que debe haber exactamente un pez en el acuario.
John Dvorak
1
¿Se requiere que el pez burbujee dos veces seguidas, o se nos permite dejar que ocurra? Hace una diferencia de tres caracteres para mí.
John Dvorak

Respuestas:

11

Pitón 3 (278)

Anteriormente: 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)

Jugar al golf en Python siempre es difícil debido a los requisitos de sangría de las declaraciones, pero a pesar de eso, ¡esto fue increíblemente bien!

Muchas gracias a Volatility y DSM por ayudarme a jugar golf mucho más.

Versión limpia

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)
meter
fuente
7

Rubí, 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]}

El pez tiene once caracteres de largo, lo que hace que el acuario sea 6 * 9 + 11 + 2 = 67 caracteres de ancho, lo que encaja perfectamente en la tolerancia requerida.

La ffunción lambda hace todo el trabajo pesado: acepta una sustitución como un par de argumentos, luego intenta aplicar la sustitución en el acuario. Si tiene éxito, pinta un cuadro de la animación. Luego informa el valor de éxito como 2(demora tomada) o nil(demora no ejecutada).

Los peces no soplarán burbujas dos veces seguidas. (Solución: ...while rand>0.1- 4 personajes)

Los peces pueden hacer burbujas incluso antes de un giro forzado. (Solución: reorganice la estructura de ramificación)

Hay un marco donde la burbuja ha desaparecido por completo (incluido el *) pero el pez no se ha movido al vacío resultante. Esto sigue la letra, pero no el ejemplo. (Solución: reemplazar f[?*,w]con q[?*]=w- gratis)

No borra la consola. Solución: agregue `clear`(Unix) o system 'cls'(consola de Windows) antes puts qpara arreglar ( Ref. ) O use en printlugar de putsy anteponga \ral acuario ( sugerido por @manatwork ).

Versión legible:

# 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
fuente
Yo añadiría \ral principio de q: q="\r|#{r+s*9}|". Luego use en $><<qlugar de puts q. Tiene 1 carácter más, pero se ve mejor sin usar comandos externos.
manatwork
\rlimpia la pantalla? No lo hace en mi caso. O, ¿por qué no te gusta puts?
John Dvorak
1
No, \res retorno de carro. Al usar $><<qpara la salida, el cursor permanecerá en la misma línea ( putsfuerza a \ndespués de la salida), por lo que comenzar la siguiente salida \rvolverá al comienzo de la línea actual y comenzará a salir desde allí. Por lo tanto, sobrescribe la "imagen" anterior de la línea del acuario.
manatwork
@manatwork desafortunadamente, esto arruina completamente la ventana interactiva de jRuby, que ignora el \r.
John Dvorak
Oh. Lamento escuchar eso. Y gracias por la información. Lamentablemente, este es el primer hecho que aprendo sobre jRuby. :(
manatwork
3

R, 451 caracteres

Un primer intento:

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}}

Sangrado:

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
}

Imprime el acuario como stdout en una sola línea (luego 2 segundos de descanso y retorno del carro antes de que se imprima el acuario en t + 1).

plannapus
fuente
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}

o más claramente

@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
}

Pescado girando correctamente. Soplando burbujas.

285 - si te gusta la sensación real del acuario y no la versión de desplazamiento:

$|=@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
fuente
¿A dónde te diriges? No puedo verte $d=0en el caso de "giro obligatorio".
John Dvorak
1
sleep2(sin espacio) no funciona para mí; también cuando estás girando, no mantienes la cara del pez alineada. Y las burbujas parecen no aparecer nunca.
meter el
"También se impone un temporizador entre cuadros, 2000 ms. Esto es obligatorio". - Esto no me sucede en absoluto. Además, no aparecen burbujas, el pez simplemente se sienta en su lugar. Además, la cabeza debe permanecer en su lugar mientras el pez gira, no el centro del cuerpo (al menos eso es lo que muestra el ejemplo)
John Dvorak
Drat! Golfé demasiado duro. Necesita un espacio extra con el sueño! ¡El pescado también burbujeaba muy bien!
Espera
Vaya - se olvidó de la cabeza en el medio cuando se enciende en los bordes - Necesito un poco de la reanudación ...
KevinColyer
2

C, 400 394 373 caracteres

#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();} 

Con espacios en blanco:

#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
fuente
1
Se i==l?(c=r):(c=l)puede acortar a c=i==l?r:l?
John Dvorak
Parece que puede ser. ¡Gracias!
Josh
Puede guardar algunos caracteres por#define p printf(
user12205
@Ace gcc no le gusta cuando hago eso.
Josh
esto funciona para mi. oi41.tinypic.com/15fqbvb.jpg
user12205