La impresora aleatoria Walker


24

Dibuje un programa o función que escriba a STDOUT nveces (cada uno para un paso) una cadena que contiene un punto .en la ubicación del andador. El programa también necesita escribir una línea cada ssegundo (o esperar ssegundos después de cada línea).

Una caminata aleatoria es una formalización matemática de una ruta que consiste en una sucesión de pasos aleatorios ( wiki ), de modo que cada nuevo paso será el último paso más un nuevo valor, por lo que cualquier tvalor de paso es solo la suma de todos los valores aleatorios antes de ir más el valor inicial.

El programa debe tomar 2 entradas y usará solo espacios " "y puntos "."en la salida. El valor inicial del andador será 20tal que la salida debería ser un punto después de 19 espacios.

                  . #19 spaces then a dot

En cada nuevo paso, el valor será el último valor del caminante más uno de estos [-2-1,0,1,2](20% de probabilidad cada uno). Después de que se imprime la nueva posición, el programa debe esperar ssegundos y pasar al siguiente paso. Si el paso lleva al caminante fuera del rango 1 to 40, simplemente se debe ignorar y la posición del caminante permanece igual. El número de espacios siempre será un número de 0 a 39.

Ejemplo

#input
Mywalk(s = 0.1, n = 30)

#output
                     .
                    .
                      .
                        .
                          .
                           .
                            .
                          .
                         .
                          .
                           .
                            .
                           .
                          .
                           .
                           .
                         .
                         .
                          .
                            .
                           .
                          .
                           .
                           .
                           .
                         .
                          .
                         .
                          .
                          .

Consideraciones

  • Puede tomar la entrada como cualquier formato razonable

  • El código más corto gana

  • Está bien si su programa solo acepta los segundos como enteros


2
Supongo que nes el número de pasos?
ASCIIThenANSI

Sí, lo he aclarado, gracias.
Mutador

Creo que debería decir que el rango es 1 to 40, porque el número de espacios es siempre position-1.
geokavel

@geokavel que parece mejor, ¡arreglado!
Mutador

10
Dibuja un programa ??? ;-)
Digital Trauma

Respuestas:


6

Pyth, 39

J19VEK+.d0QW<.d0K)+*d=JhtS[Z39-+O5J2)\.

Toma scomo la primera línea de entrada y ncomo la segunda. Funciona en la línea de comando pero no con el intérprete en línea. ¡Mi primer programa Pyth! Consejos de golf son apreciados.


¡Bienvenido a Pyth! El único consejo de golf que puedo ver es que puede usar Qy Epara las dos entradas en lugar de fo hQy eQ, si separa la línea, separe las entradas.
isaacg

13

Matlab, 112

La idea central es generar una lista de las siguientes posiciones posibles y luego dibujar uniformemente una de ellas. Si estamos, por ejemplo, en la posición $ l = 1 $, los posibles pasos serían, por [-1,0,1,2,3]supuesto, si eligiéramos -1eso sería inválido y tendríamos que permanecer en la misma posición. Es por eso que reemplazamos las posiciones inválidas con la posición actual [1,0,1,2,3], y luego elegimos aleatoriamente un elemento de esta lista actualizada.

La OP nos pidió Tho elaborar el programa, así que aquí vamos:

ingrese la descripción de la imagen aquí

La transcripción:

function c(n,s);
l=19;                             %initialize position
for k=1:n;                          
    disp([ones(1,l)*32,'.']);     %print the line
    z=(-2:2)+l;                   %get vector of possible next steps (for l=1 we get [-1,0,1,2,3])
    z(z<0)=l;                     %prune invalids: here we just replace the the invalid positions with the current position
    z(z>39)=l;                    %   this ensures the same behaivour as staying in the same spot when going outside of the range
    l=z(randi(5));                %draw random sample of those
    pause(s);
end

1
-1 usa MathJax en un entorno que no es MathJax;)
Conor O'Brien

2
Ya sabes, las ecuaciones que no están escritas en látex simplemente no son tan confiables, ¡incluso podrían no ser ciertas! Mejor estar en el lado seguro.
defecto

3
Los programas dibujados deben medirse en volumen de tinta, en lugar de bytes ...
Darrel Hoffman

8

Perl, 136 128 116 106 101 90 86

$p=19;map{say$"x$p.".";sleep $ARGV[0];$x=rand(5)+$p-2;$p=$x>0&&$x<40?$x:$p}1..$ARGV[1]

Requiere que los segundos sean un número entero.

Corre con perl <filename> <second delay> <number of steps>.

Puede haber más potencial de golf aquí, aunque, sinceramente, me sorprende que haya llegado tan lejos. (Vamos, solo 6 bytes más para superar la respuesta bash ...)

Cambios

  • Ahorró 8 bytes eliminando paréntesis innecesarios y deletreando ARGV (en realidad es más corto de esa manera)
  • Guardado 12 bytes más mediante la eliminación $sy $nya sólo el uso de la llanura $ARGV[0]y$ARGV[1]
  • Ahorré otros 10 bytes cuando me di cuenta de que podía usar $"y no necesitaba definir específicamente $ucomo $undef.
  • Ahorró 5 bytes más reorganizando el ternario y cómo $xse usa y usando en maplugar de for.
  • Ahorró 11 bytes al no aceptar más los segundos como decimales (la especificación de desafío dice que está bien).
  • Se guardaron otros 5 bytes utilizando en saylugar de print.

6

Python 2, 124 119 bytes

@janrn y @Steve Eckert: no tengo suficiente reputación para comentar su respuesta, pero aquí está esencialmente su versión acortada. La tarea es dibujar un programa o una función , por lo que al usar f(s,x)puede guardar bastantes bits, y también puede usar max(0,min(x,39))para evitar una ifcláusula adicional . Lo tengo todo a:

import time,random as r
def f(s,x):
 n=19
 while x:print' '*n+'.';time.sleep(s);n=max(0,min(n+r.randint(-2,2),39));x-=1

5

Bash, 81

for((s=20;i++<$1;t=s,s+=RANDOM%5-2,s=s<0|s>39?t:s)){
printf %${s}s.\\n
sleep $2
}

Editar: si el paso lleva al caminante fuera del rango de 1 a 40, debe ignorarse y la posición del caminante se mantiene igual manejada correctamente.

Entrada de opciones de línea de comandos. P.ej:

$ ./randwalk.sh 5 0.5
                    .
                     .
                    .
                  .
                 .
$ 

4

Rubí, 84

def w(s,n)q=19;n.times{puts ' '*q+'.';sleep s;q+=rand(5)-2;q=[[q,0].max,39].min};end

4

Python 2.7, 198 162 143 133

import time,random as r;p=20;s=0;d=input();w=input()
while s<d:
 print' '*p+'.';s+=1;p=max(1,min(p+r.randint(-2,2),40));time.sleep(w)

Al llamar al script con python script.py, la primera entrada es la cantidad de pasos, la segunda entrada el tiempo entre pasos (acepta flotante o int). ¿Alguna sugerencia para mejorar?

Ediciones

  • ahorró 36 bytes debido al uso actual print ' '*p+'.', gracias a @corsiKlause Ho Ho Ho
  • elimine otros 19 bytes eliminando las sangrías de pestañas, reemplazándolas con un espacio o ;cuando sea posible
  • 10 bytes menos gracias a la idea de @Bruce_Forte con p=max(1,min(p+r.randint(-2,2),40))(no puedo comentar tu respuesta también, pero gracias; no quiero copiarla por completo)

En Python, ¿no puedes simplemente ir ' '*pa repetir la cadena?
corsiKa

En realidad sí, no lo sabía. Editando ahora, gracias
janrn

4

Procesamiento, 150 147

void w(int n,int s){int x=20,i,y,c=0;for(;c<n;c++){x+=y=int(random(5)-2);if(x>40||x<0)x-=y;for(i=1;i<x;i++)print(" ");println(".");delay(s*1000);}}

Uso:

void setup() {
    w(10,1);
}

Nota: 1000 no se puede cambiar 1e3por razones de tipo.


3

Lua, 140 bytes

Nota: Este programa requiere el paquete LuaSocket.

require"socket"p=19 for i=1,arg[2]+0 do print((" "):rep(p)..".")p=p+math.random(-2,2)p=p<0 and 0 or p>39 and 39 or p socket.sleep(arg[1])end

3

Perl 6 , 92 bytes

my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';sleep s} # 92
my (\n,\s)=@*ARGS;
$/=19;
for (-2..2).roll(n) {
  put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';
  sleep s
}

Uso:

$ perl6 -e 'my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put " "x($/+=(40>$/+$_>=0??$_!!0)),".",;sleep s}' 10 0.001
                  .
                .
               .
              .
               .
                .
               .
                .
                  .
                 .

3

JavaScript (ES6), 125 bytes

(s,n)=>(t=setTimeout)(c=`console.log(" ".repeat(p)+".");p+=m=Math.random()*5|0;p-=p>41|p<2?m:2;--i&&t(c,d)`,d=s*1e3,p=19,i=n)

Explicación

(s,n)=>
  (t=setTimeout)(                     // set inital timeout
    c=`                               // c = code for timeout to execute
      console.log(" ".repeat(p)+"."); // print the current line
      p+=m=Math.random()*5|0;         // move walker 0 - 4 positions to the right
      p-=p>41|p<2?                    // if walker was moved out of bounds (2 - 41 instead
                                      //     of 0 - 39 because the random move of 0 - 4 to
                                      //     the right has not had the 2 subtracted yet)
        m:                            // undo the move
        2;                            // else subtract 2 to make the move -2 to 2
      --i&&t(c,d)                     // while we have steps remaining schedule next one
    `,
    d=s*1e3,                          // d = milliseconds to wait between steps
    p=19,                             // p = position of walker (0 indexed)
    i=n                               // i = steps remaining (needed to make n global)
  )

Prueba


3

k4, 61 caracteres

f:{y{-1((y:1|40&y+-2+*1?5)#" "),".";."\\sleep ",$x;y}[x]\20;}

ejecución de muestra:

  f[.1]30
                      .
                    .
                    .
                   .
                   .
                  .
                  .
                   .
                   .
                     .
                    .
                  .
                  .
                    .
                   .
                   .
                 .
                .
               .
               .
              .
            .
          .
         .
         .
          .
            .
              .
              .
                .

3

Mathematica, 122 117 bytes

$RecursionLimit=∞;If[#2>0,Print[Indent[a=Min[#3+RandomInteger@{-2,2},39]~Max~0],"."];Pause@#;#0[#,#2-1,a]]&[##,19]&

Función anónima recursiva, toma la entrada en el orden especificado. Probablemente podría jugar más golf.


2

Python 3, 154 bytes

import time
from random import*
w=int(input())
z=int(input())
g=19
c=6
s=" "
while c:
    c-=1
    s+=s
while z:
    z-=1
    if -1<g<40:
        print(s[:g]+'.')
    time.sleep(w)
    g+=randint(-2,2)

Genere una cadena de espacios mayor que la longitud máxima requerida, luego imprima esa cadena SOLAMENTE hasta el carácter en el índice 'g', luego imprima un '.'. Termine incrementando g en un valor aleatorio en el rango [-2: 2] y repita.

Si alguien pudiera ayudarme a bajar ese horrible bloque de entrada, lo agradecería.


Para jugar golf, ¿por qué no usar sys.argv?
ASCIIThenANSI

1
Además, en lugar de while z:, ¿por qué no usar for i in range(1,z)?
ASCIIThenANSI

Tengo curiosidad, ¿cómo conseguiste que esto sea 154 bytes? bytesizematters.com ofrece un recuento diferente (incluso si desactiva el espacio en blanco)
p1xel

@ASCIIThenANSI: Hmm ... cuando agrego la llamada inicial sys.argvy la importación, no puedo ver cómo puedo guardar los bytes haciendo eso. E incluso con las líneas adicionales para declarar cluego decrementar cy z, según mi cuenta, todavía es más barato hacerlo de esta manera.
Steve Eckert

@ p1xel: conté espacios en blanco internos a la línea, simplemente no espacios en blanco iniciales o finales. ¿Hay un estándar de puntaje diferente que desconozco?
Steve Eckert

1

Función C, 114

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

Casi una traducción directa de mi respuesta bash .

Programa de prueba completo:

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

int main (int argc, char **argv) {
  w(10, 0.2);
  return 0;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.