Code Golf: tu propia serpiente ASCII mascota

34

Entonces, escribí una línea que imprimía una serpiente en la consola. Es un poco divertido, y me preguntaba cómo podría condensar mi código ...

Aquí hay una salida de ejemplo (corta):

                +
                 +
                  +
                   +
                   +
                   +
                  +
                   +
                    +
                    +
                    +
                     +
                     +
                      +
                      +
                       +
                      +
                     +
                     +
                    +

Aquí están las especificaciones:

  • En cada línea, se imprime un único carácter que no sea un espacio en blanco (lo que desee) en la consola, inicialmente con 29 a 31 espacios de relleno a la izquierda de la misma.
  • Cada iteración, se toma una decisión aleatoria entre estas tres acciones
    • La cantidad de relleno disminuye en 1
    • La cantidad de relleno sigue siendo la misma.
    • La cantidad de relleno aumenta en 1

Haga esto 30 veces, para imprimir una serpiente de 30 segmentos en la consola.

La respuesta más corta en bytes gana.

AJFaraday
fuente
¿Podemos devolver una serie de líneas? ¿Se permiten espacios iniciales / finales o nuevas líneas?
Shaggy
1
Supongo que se permiten espacios finales en cada línea, ¿verdad?
Luis Mendo
1
¿Qué significa "aleatorio"? Uniformemente al azar? ¿Aleatorio de cualquier distribución con apoyo positivo en cada uno de los tres resultados? Al azar de cualquier distribución alguna? ¿Los resultados tienen que ser diferentes en cada ejecución del programa?
Nathaniel
1
Tenga en cuenta que, por defecto, aleatorio no significa que sea uniforme . Por ejemplo, la segunda parte de mi respuesta de brainfuck es (a partir de ahora) perfectamente válida, a pesar de que genera una línea recta la mayor parte del tiempo.
Jo King
1
En este momento, hay dos puntos que no están claros: 1) ¿Al azar significa aleatoriamente uniforme? (afecta a esta respuesta ) y 2) ¿La salida debe ser diferente cada vez? (es decir, ¿puede no
generarse el

Respuestas:

14

05AB1E , 15 14 bytes

30DF2Ý<+ΩD0sú,

Pruébalo en línea!

Usos 0.

Explicación

30DF2Ý<+ΩD0sú,
30D            # Push 30 to the stack (One for the amount of iterations we are going to perform and one for the initial padding)
   F           # Pop one of the 30s and perform the following that many times...
    2Ý          # Push [0,1,2] ...
      <         # and create [-1,0,1] from that
       +        # Add the last padding to every entry (e.g. 30 in the beginning resulting in [29,30,31]
        Ω       # Pick one of the results at random ...
         D      # and push it to the stack twice
          0     # Push 0 (Any character will work fine here) ...
           sú   # and pad it with the randomly chosen amount of spaces in the front
             ,  # Finally print the result with a trailing newline
Datboi
fuente
39
05AB1E: 0 bytes, ¡ Pruébelo en línea! ... espera, no, aunque casi.
Urna mágica del pulpo
14

Random Brainfuck , 123 122 121 bytes

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>>++<[>>[->+<<.>]>[-<+>]>?>+++<[>->+<[>]>[<+>-]<<[<]>-]>-->,<[-<<<+>>>]<<<<+.-<<.>-]

Pruébalo en línea!

Brainfuck aleatorio es una extensión de brainfuck, con la útil adición del ?comando, que establece la celda actual en un byte aleatorio. Esto imprime una serpiente hecha de !s, que se parece más a los pasos que a una serpiente curiosamente.

Cómo funciona:

+[--[<]>>+<-]>+ Create the value 30
[->+>+>+<<<]    Copy it three times
++++++++++      Create a newline cell
>>++<            Adds 2 to the second copy to make it a space and move to the counter
[ While counter
  >>[->+<<.>]>[-<+>] Print out the padding cell number of spaces
  ?>+++<[>->+<[>]>[<+>-]<<[<]>-] Get 3-(random byte%3)
  >-->,<[-<<<+>>>]   Add (result-2) to the padding cell
  <<<<+.-<           Print an exclamation mark
  <<.                Print a newline
  >-                 Decrement counter
] end loop

Otra solución que se adhiere a la letra de la pregunta, en lugar del espíritu.

87 bytes

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>++>[>[->+<<<.>>]>[-<+>]?[,<+>]?[,<->]<<<+.-<.>>-]

Pruébalo en línea!

Este está muy sesgado para dejar el relleno solo, pero aumentar o disminuir el relleno es igualmente posible. Cada uno tiene un poco menos de 1 en 256 posibilidades de suceder.

Jo King
fuente
¡Muy agradable! No estaba al tanto del ?comando. +1
Grant Miller
@GrantMiller ?solo está disponible en Random Brainfuck , no en brainfuck clásico
Jo King
8

C (gcc) , 61 58 56 bytes

Respuesta editada para reflejar cambios en las reglas ...

i;f(s){for(s=i=31;--i;printf("%*d\n",s+=1-rand()%3,8));}

Pruébalo en línea!

cleblanc
fuente
guarde un byte moviéndose s+=1-rand()%3a la función printf. i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus
@Vaelus Eso hace que la primera línea tenga una cantidad variable de espacios en lugar de los 30 especificados en la pregunta.
Steadybox
@Steadybox Lo que aparentemente está permitido en los comentarios ...
Kevin Cruijssen
7

Retina , 24 bytes


30* +
-29{¶<`^
 
S,2@1`

Pruébalo en línea!

Explicación


30* +

Inicialice la cadena de trabajo a la primera línea, es decir, 30 espacios y a +.

-29{¶<`^
 

Hay un espacio en la segunda línea. -29{envuelve el resto del programa en un bucle, que se ejecuta 29 veces. ¶<imprime la cadena de trabajo al comienzo de cada iteración de bucle con un salto de línea final. La etapa atómica en sí misma inserta un espacio al comienzo de la cadena (la idea básica es insertar un espacio y luego eliminar aleatoriamente 0–2 espacios, porque es un byte más corto que elegir aleatoriamente entre eliminar, insertar y no operar).

S,2@1`

Esto coincide con la expresión regular vacía contra la entrada, lo que nos da cada posición entre los caracteres (y el inicio y el final de la cadena). Luego ,2mantiene solo los primeros tres partidos, es decir, los partidos después de cero, uno y dos espacios. @selecciona uno aleatorio de esos tres partidos. Luego, la etapa dividida ( S) divide la entrada alrededor de esa coincidencia. Y 1le dice que mantenga solo la segunda parte de la división. En otras palabras, descartamos todo hasta nuestra coincidencia aleatoria.

La línea 30, que es el resultado de la iteración final del bucle, se imprime implícitamente al final del programa.

Martin Ender
fuente
¿Sabes qué es aún más corto que eliminar 0-2 espacios? Barajar espacios alrededor! . Por cierto, la nueva Retina es genial: D
Leo
7

VBA, 60 59 49 bytes

For l=1To 30:?Spc(30+i)"+":i=i+Sgn(Rnd()-.5):Next

Pégalo en la ventana Inmediato y presiona enter. (¡Asegúrese de que la declaración explícita esté desactivada!)

Es mucho más probable que se mueva que permanecer en una línea (es decir, las acciones no tienen la misma ponderación), pero ese no era un requisito específico (¡Afortunadamente!)

{EDITAR} Guardado 1 byte eliminando el espacio entre =1yTo

{EDIT2} Guardado 10 bytes gracias al comentario de remoel

Versiones antiguas:

'V1
i=30:For l=1 To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next
'V2
i=30:For l=1To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next
Cronocidales
fuente
55
Bienvenido a PPCG!
Martin Ender
2
Puede guardar algunos bytes reemplazándolos String(i," ")para Spc(30+i)luego eliminarlos i=30:. O -1 byte eliminando &. :)
remoel
7

C # (.NET Core), 112 110 106 100 99 98 bytes

v=>{var r="";for(int t=30,i=t;i-->0;r+="+\n".PadLeft(t+=new System.Random().Next(3)-1));return r;}

-1 byte gracias a @raznagul .
-1 byte gracias a @auhmaan .

Explicación:

Pruébalo en línea.

v=>{                      // Method with empty unused parameter and no return-type
  var r="";               //  Result-string, starting empty
  for(int t=30,           //  Temp-integer, starting at 30
      i=t;i-->0;          //  Loop 30 times
    r+=                   //   Append the result-String with:
       "+\n"              //    The character and a new-line,
            .PadLeft(     //    left-padded with `t` spaces,
                     t+=new System.Random().Next(3)-1));
                          //    after `t` first has been changed with -1, 0, or 1 randomly
  return r;}              //  Return the result-string
Kevin Cruijssen
fuente
Una cosa extraña: si llamo new Random().Next()varias veces localmente (.net Framework Versión 4.6.1) siempre obtengo el mismo resultado. Necesito agregar un Thread.Sleep(10)entre llamadas para obtener resultados diferentes de manera confiable. Con un tiempo de sueño de menos de 10 ms, a veces todavía obtengo el mismo resultado. Entonces .net-Framework y TIO (.net-Core) tienen diferentes PRNG o al menos usan diferentes semillas. Si cambio su programa en TIO a C # -mono, obtengo el mismo comportamiento que localmente en .net-Framework.
raznagul
@raznagul Hmm, esa salida con C # (compilador Mono C #) es realmente extraña ...
Kevin Cruijssen
3
@raznagul new Random()usa el tiempo como semilla, por lo que en un ciclo cerrado el tiempo es el mismo y el resultado es el mismo.
TheLethalCoder
@TheLethalCoder: Sí, eso es lo que (más o menos) esperaba. Lo extraño es que 1) .net-Core (al menos en TIO) se comporta de manera diferente. 2) Que necesito Thread.Sleep(10)obtener resultados diferentes de manera confiable e Thread.Sleep(1)incluso 9 ms no es suficiente.
raznagul
@raznagul Bueno, dormir durante 1, 9 o 10 ms debería dormir al mismo tiempo, dependiendo de otros procesos que se ejecuten ... de hecho extraño.
TheLethalCoder
7

C, 56 bytes

n;f(p){n>29?n=0:f(printf("%*d\n",n++?p-rand()%3:31,0));}

Pruébalo en línea!

Explicación:

n; // As a global variable, n is initialized to zero.
f(p)
{
    // Call the function recursively until n > 29.
    n > 29

        // At the end, set n back to zero.
        ? n=0

        // On the first iteration, n == 0 and p has an indeterminate value.
        // 'n++ ? p-rand()%3 : 31' returns 31 (without reading p), and thus
        // 30 spaces get printed. printf() returns the number of characters
        // printed, 32 (30 spaces + '0' + '\n').
        //    On subsequent iterations, p has the value the previous printf
        // call returned, which is the padding on last iteration + 2. Also,
        // n > 0, so the same expression now returns p-rand()%3, and thus
        // the padding changes either by -1, 0, or 1 spaces. The function
        // is again called with the value of the current line's padding + 2.
        : f(printf("%*d\n", n++ ? p-rand()%3 : 31, 0));
}

C (gcc) , 55 bytes

n;f(p){n=n<30&&f(printf("%*d\n",n++?p-rand()%3:31,0));}

Depende de que f "devuelva" el valor asignado a n en la función, que es un comportamiento indefinido, pero funciona de manera coherente con gcc cuando no se habilitan optimizaciones.

Pruébalo en línea!

Steadybox
fuente
6

JavaScript (ES8), 63 62 60 bytes

Incluye una nueva línea final. *2-1podría reemplazarse -.5por un ahorro de 1 byte, pero las posibilidades de que cada línea tenga la misma longitud que la línea anterior aumentaría considerablemente. Por supuesto, como "aleatorio" no está definido en el desafío, el RNG podría ser reemplazado pornew Date%3-1 por un recuento total de bytes de 55 .

f=(x=y=30)=>x?``.padEnd(y+=Math.random()*2-1)+`+
`+f(--x):``

Ahorré un byte gracias a alguien que eliminó su comentario antes de que pudiera captar el nombre. En realidad lo intenté de esta manera repeaty padStartno pensé en intentarlo padEnd, ¡no sé por qué!


Prima

Para el mismo número de bytes, aquí hay una versión que toma el número de espacios e iteraciones iniciales como entrada.

f=(x,y=x)=>x?``.padEnd(y)+`+
`+f(--x,y+Math.random()*2-1):``

Lanudo
fuente
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``es un byte más corto. (Nota: dado que SO no permite saltos de línea en los comentarios, tuve que escribir \ n en lugar de usar un salto de línea).
Stefnotch
Gracias, @Stefnotch. Desafortunadamente, incluso con un valor inicial de y=31, habría una posibilidad de que la primera línea sea demasiado corta. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
Shaggy
1
Corríjame si me equivoco, pero ¿su solución actual también no sufre ese problema?
Stefnotch
1
La primera línea debe tener exactamente 30 espacios, según el desafío.
Nit
1
@Nit, el OP ha confirmado que la primera línea puede contener 29-31 espacios, pero aún tiene que editar ese hecho en el desafío, a pesar de las repetidas solicitudes para hacerlo.
Shaggy
6

Java 8, 89 87 bytes

Primero golf, estoy seguro de que podría ser mucho mejor ...

Editar: se corrigió la primera línea gracias a Steadybox .

l->{for(int a=31,b=a;--a>0;){System.out.printf("%"+b+"c\n",'+');b+=2-Math.random()*3;}}

Pruébalo en línea!

 l->{                                           //Begin lambda
    for(int a=31,b=a;--a>0;)                  //Initialise vars, loop through 30 lines
    {
        System.out.printf("%"+b+"c\n",'+');     //Print result
        b+=2-Math.random()*3;                   //Change padding by -1, 0, or 1
    }
JSchiff
fuente
55
Bienvenido a PPCG! :)
Shaggy
2
83 bytes
Steadybox
6

Python 2 , 83 65 64 bytes

Enfoque directo:

import os
k=30
exec"print' '*k+'+';k+=ord(os.urandom(1))%3-1;"*k

Pruébalo en línea!

¡Gracias a @Rod por guardar algunos bytes! ¡Gracias a @ovs por -1 byte!

Editar: cambió el nombre de la variable y la cadena de salida a la letra 's'

Más salida tipo serpiente para 88 bytes:

from random import*
s=[30,0]
exec"print' '*sum(s)+'(S)'[s[-1]+1];s+=[randint(-1,1)];"*30
Gábor Fekete
fuente
1
Me gusta esto. Solución realmente ordenada.
línea
5

Carbón , 14 bytes

× ³⁰F³⁰«↙+M‽³→

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

× ³⁰            Print 30 spaces (forces the desired indentation)
    F³⁰«        Repeat 30 times
        ↙+      Print a `+` and move down and left one square
          M‽³→  Move right a random number of squares from 0 to 2

Sería de solo 10 bytes si no hubiera un requisito de sangría inicial.

Neil
fuente
@KevinCruijssen Hmm, eso es incómodo, porque al carbón le gusta recortar por defecto.
Neil
5

PHP, 61 bytes

for($p=32;$i<30;$i++)echo str_pad("+
",$p+=rand(-1,1),' ',0);

Pruébalo en línea!

chocochaos
fuente
8
$i<30;$i++puede ser $i++<30;para guardar 2 bytes.
Kevin Cruijssen
2
55 bytes: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');( \nse cuenta como 1 carácter, y debe reemplazarse por una nueva línea real)
Ismael Miguel
2
Alternativa de 55 bytes de largo, sin advertencias:for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Ismael Miguel
5

Java 8, 131 129 127 126 119 108 101 bytes

v->{String r="";for(int i=30,j,t=i;i-->0;r+="+\n")for(j=t+=Math.random()*3-1;j-->0;r+=" ");return r;}

Explicación:

Pruébalo en línea.

v->{                     // Method with empty unused parameter and String return-type
  String r="";           //  Result-String, starting empty
  for(int i=30,j,t=i;    //  Two index integers, and a temp integer (starting at 30)
      i-->0;             //  Loop 30 times:
      r+="+\n")          //    After every iteration: Append the character and a new-line
    for(j=t+=Math.random()*3-1;
                         //   Change `t` with -1, 0, or 1 randomly
        j-->0;r+=" ");   //    And append that many spaces to the result-String
  return r;}             //  Return the result-String

Antigua respuesta de 119 bytes:

v->{String s="",r=s;int i=90,t=30;for(;i-->t;s+=" ");for(;i-->0;t+=Math.random()*3-1)r+=s.substring(t)+"+\n";return r;}

Explicación:

Pruébalo en línea.

v->{                      // Method with empty unused parameter and String return-type
  String s="",            //  Temp-String, starting empty
         r=s;             //  Result-String, starting empty
  int i=90,t=30;          //  Temp integer, starting at 30
  for(;i-->t;s+=" ");     //  Fill the temp String with 60 spaces
  for(;i-->0;             //  Loop 30 times:
      t+=Math.random()*3-1//    After every iteration: Change `t` with -1, 0, or 1 randomly
    r+=s.substring(t)     //   Append the result with `60-t` amount of spaces
       +"+\n";            //   + the character and a new-line
  return r;}              //  Return the result-String
Kevin Cruijssen
fuente
4

R , 72 69 67 bytes

cat(sprintf(paste0("% ",cumsum(c(30,sample(3,29,T)-2)),"s"),"+\n"))

Gracias a Zahiro Mor por 2 bytes adicionales!

Pruébalo en línea!

plannapus
fuente
Cambiar de sample(3,29,T)-2a runif(29,-1,1)reducirá el número de bytes en 2, pero los movimientos ya no son igualmente probables. ¿Y también podría cambiar a en paste("%"lugar de paste0("% "o me estoy perdiendo algo aquí?
Grieta
@Rift si estaba usando pegar, las cadenas resultantes serían de la forma en % 30 slugar de % 30s. Como dijiste runif, arruinaría las probabilidades.
plannapus
Localmente sprintf("%30s"), sprintf("% 30s")y sprintf("% 30 s")devuelve los mismos resultados para mí. Pero en TIO solo los dos primeros tienen resultados idénticos, por lo que paste0("%"deberían guardar un byte. Y no hay requisito de que cada movimiento tenga la misma probabilidad.
Grieta
4

Japt , 13 bytes

Devuelve una matriz de líneas.

30ÆQù1nH±1n3ö

Pruébalo


Explicación

30Æ               :Create the range [0,30) and pass each through a function
   Q              :  The " character
    ù             :  Pad start to length...
           3ö     :    Random element from the range [0,3)
         1n       :    Subtract 1
       H±         :    Add the result of that to H (inititally 32)
     1n           :    Subtract 1 to avoid the possibility of the first line being 33 characters long in total

Prima

Para 2 bytes menos , aquí hay una versión que toma la cantidad de espacios e iteraciones iniciales como entrada.

U°ÆQùU±1n3ö

Intentalo


RNG alternativos

Los últimos 4 bytes se pueden reemplazar con cualquiera de los siguientes:

MrJ1     :A random float between -1 and 1
Jõ ö     :Generate the range [-1,1] and return a random element
3ö É     :An alternative way of writing the method used above
½nMr     :0.5 subtracted from a random float between 0 and 1
Lanudo
fuente
1
¡Guau, no puedo creer que estemos ganando en este momento! Creo que puede guardar un byte con esto (en el móvil, así que realmente no puedo verificar)
ETHproductions
@ETHproductions: ¡Ja! Eso es idéntico a lo que comencé. Sin embargo, el problema es que si -1el RNG devuelve la primera iteración, terminaremos con una longitud de línea total de 29cuándo debería ser 30, 31o 32.
Shaggy
Hmm, estoy confundido acerca de cómo su versión se mueve entonces ... Además, creo que OP ha aclarado en los comentarios que no les importa si se elimina o agrega un espacio adicional en la iteración inicial.
ETHproductions
En realidad estoy confundido por "cuando debería ser 30, 31 o 32", ¿dónde se requiere?
ETHproductions
@ETHproductions: Comenzamos con 30y luego agregamos -1, 0o 1dándonos 29, 30 o 31- agregamos el "y eso nos da una longitud total de 30, 31o 32para la primera línea.
Shaggy
4

Swift , 101 bytes

import UIKit
var g=29;for _ in 0...g{print((0..<g).map{_ in" "}.joined(),0);g+=Int(arc4random()%3)-1}

Explicación

Un programa completo Esto usa un truco bastante extraño: arc4random()es miembro del Darwinmódulo, pero UIKittambién viene con esta función instalada, por lo que guarda un byte :) También usa uno de mis consejos de golf Swift para repetir cadenas un número arbitrario de veces.

import UIKit        // Imports the UIKit module, necessary for the RNG.
var g=29;           // Declares an integer variable g by assigning it to 30.
for _ in 0 ... g {  // Execute the code block 30 times (for each integer in [0; g]):
 print(             // Output the following:
  (0..<g).map       // For each integer in [0; g)...
   {_ in" "}        // ... return a literal space character. 
    .joined()       // ... And join the result to a single string.
             ,0     // Also print a "0" preceded by a single space (g starts from 29).
 );
g+=                 // Increment the variable g by...
   arc4random()%3   // ... A random integer, modulo 3...
   Int(...)-1       // ... Casted to an integer (yes, this is needed!) and decremented.
}
Sr. Xcoder
fuente
¿No for _ in 0 ... gejecuta el bloque de código 29 veces ahora en lugar de 30 (bucle de 0 a 29 (exclusivo))?
Kevin Cruijssen
@KevinCruijssen No, 0...ggenera todos los enteros en [0; g] . Mi mal, arregló la explicación. 0..<ggeneraría los enteros en [0; g) : P
Sr. Xcoder
Ah, lo [0; g)que has editado [0; g]realmente me confundió. :) Hmm, pero ¿no es posible comenzar g=30y recorrer [1; g]en ese caso?
Kevin Cruijssen
@KevinCruijssen Hacer un bucle sobre cualquiera [0; g)o [1; g]definitivamente sería posible si elijo en su g=30lugar, pero luego print(...,0)debe cambiarse a print(...+"0"), porque de lo contrario se agregaría un espacio adicional (extraño) antes del 0. De cualquier manera, el recuento de bytes sigue siendo el mismo.
Sr. Xcoder
4

Perl, 36 bytes

perl -E '$#a=29;map{$#a+=rand(3)-say"@a -"}@a'
Ton Hospel
fuente
Tan bueno. Siempre olvido que puedes establecer una longitud de matriz como esa ... y usar saypara restar. ¿Estoy en lo cierto al pensar que no cambia el número de ejecuciones cuando $#ase incrementa porque no es una referencia?
Dom Hastings
@DomHastings: es porque uso lo mapque parece primero diseñar los elementos en la pila. forno tiene y habría tenido una longitud de bucle impredecible
Ton Hospel
Eso es realmente útil saberlo. ¡Gracias!
Dom Hastings
Buen golf. Traté de eliminar otro byte perl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30', pero eso a veces (no siempre) resultó en un fallo de segmentación. ¿Podría ser un error en perl v5.22.1 y v5.16.3?
Kjetil S.
@Kjetil Sí, ese es un problema bien conocido que probablemente nunca se solucionará. Al realizar un bucle de una matriz, las entradas no obtienen un recuento adicional, por lo que si las elimina, se liberan cuando el bucle llega a ellas y llega a la memoria liberada. Afortunadamente, nunca haces esto en programas reales.
Ton Hospel
4

R 54 53 bytes

cat(sprintf('
%*s',cumsum(c(30,sample(3,29,T)-2)),0))

Idea similar a la anterior , pero con sprintfcódigo acortado y una cadena de caracteres literal más corta. En lugar de \n(dos bytes) estoy usando un salto de línea literal (un byte).

Try it online!

Konrad Rudolph
fuente
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number. Lo he estado usando sprintfdurante años y de alguna manera siempre me perdí esa parte ... ¡Gracias por el recordatorio!
plannapus
1
La segunda línea a veces tiene sangría dos espacios en lugar de uno.
Scott Milner
@ScottMilner Encontró tiempo para arreglarlo.
Konrad Rudolph
4

Ruby , 45 39 bytes

x=30
x.times{puts' '*(x+=rand(3)-1)+?S}

Pruébalo en línea!

La modificación xdurante el ciclo no afecta al contador del ciclo. Elegí S como un personaje de salida particularmente parecido a una serpiente.

-6 bytes: uso en rand(3)-1lugar de [-1,0,1].sample. Gracias Eric Duminil !

benj2240
fuente
Puede guardar dos bytes en x.maplugar de x.times(equivalente ya que no utiliza el valor de retorno)
RJHunter
1
¡Vaya, tienes razón, ignórame!
RJHunter
1
OK, tengo uno mejor: rand -1..1es cinco bytes más corto que[-1,0,1].sample
RJHunter
1
@RJHunter: O rand(3)-1por 6 bytes menos.
Eric Duminil
1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(mismo tamaño) imprimirá exactamente 30 espacios para la cabeza de la serpiente según lo solicitado por el desafío
Asone Tuhid
4

SenseTalk , 237 198 Bytes

Este es un lenguaje que llegué a conocer y amar hace una década. Es el lenguaje de secuencias de comandos que impulsa la herramienta de prueba automatizada Eggplant Functional . Fui un ávido usuario de la herramienta durante muchos años antes de unirme a la empresa por un tiempo. No es el idioma más apto para el golf, pero me resulta muy divertido escribirlo. Jugar al golf en realidad es bastante desafiante, ya que el idioma debe ser detallado y similar al inglés ... me llevó bastante tiempo entenderlo. a 237 bytes.

set s to "                              +"&lf
set p to s
repeat 30
set a to random(0,2)
if a equals 0
delete first char of p
else if a equals 1
put " " before p
end if
put p after s
end repeat
put s

Ungolfed / Explicación

set the_snake to "                              +"&lf #assign the first line of the snake
set previous_line to the_snake                        #set up for the loop

repeat 30 times                                       #loop 30x
    set action to random(0,2)                         #random add/subtract/stay the same

    if action equals 0
        delete the first character of previous_line   #SenseTalk really shines at string manipulation
    else if action equals 1
        put " " before previous_line                  #insert a character at the beginning
    end if

    put previous_line after the_snake                 #plop the new segment into the string
end repeat                                            #close the loop

put the_snake                                         #print to standard out

Editar: Guardado 36 bytes gracias a @mustachemoses

Allen Fisher
fuente
1
¿Es necesario el espacio en blanco?
Moustache
Tengo mucho respeto por esto. Particularmente en el contexto de los "lenguajes de golf", que parecen existir completamente ilegibles, pero cortos. Es bueno tener un ejemplo que solo muestre lo que puede hacer con su idioma.
AJFaraday
1
¡Buena llamada @MustacheMoses! Actualizado.
Allen Fisher
Cuento 198 bytes (bueno, el script de usuario cuenta tantos)
HyperNeutrino
@AllenFisher ¿Tiene un intérprete o compilador independiente para este idioma que pueda usar sin obtener una demostración de Eggplant?
MoustacheMoses
3

PowerShell , 42 bytes

1..($l=30)|%{" "*$l+"x";$l+=-1,0,1|Random}

Pruébalo en línea!

Bucles de 1a $l=30. En cada iteración, colocamos $lespacios más un xen la tubería como una cadena, luego, +=ya sea en -1, 0, 1base Get-Randomal $lsiguiente ciclo. Esas cadenas se recopilan de la tubería y un implícito Write-Outputnos da una lista separada por una nueva línea de forma gratuita.

AdmBorkBork
fuente
3

Bash, 53

  • 3 bytes guardados gracias a @Dennis
for((i=p=30;i--;p+=RANDOM%3-1));{ printf %${p}s+\\n;}

Pruébalo en línea .

Trauma digital
fuente
p+=RANDOM%3-1también funciona
Dennis
@ Dennis Sí, por supuesto! ¡Gracias!
Trauma digital
3

Jalea , 18 bytes

1ŒRX+
30ǒС⁶ẋ;€0Y

Pruébalo en línea!

El personaje elegido es 0 . Si se permite devolver una lista de la lista de caracteres, entonces elY puede descartar y el envío se puede convertir en una cadena niládica de 17 bytes . Alternativa .

Cómo funciona

30Ç'С⁶ẋ; € 0Y | Enlace principal de Niladic.
30 A partir de 30 ...
  Ç'С | ... Repita el enlace auxiliar 29 veces y recopile los resultados en una lista.
             El | (Esta lista incluye los primeros 30, por lo que en realidad hay 30 números).
      ⁶ẋ | Repita un espacio tantas veces, para cada elemento de la lista.
        ; € 0 | Agregue un 0 a cada uno.
           Y | Y únete por nuevas líneas.
------------- +
1ŒRX + | Enlace auxiliar monádico. Alternativamente, puede usar µ1ŒRX + µ en lugar de Ç.
1 | El literal
 ŒR | Rango simétrico de –1 a 1.
   X + | Elija un número aleatorio y agréguelo al argumento.

Jalea , 16 bytes

Combinando las soluciones mías, de Erik y Jonathan, podemos reducir esto a 16 bytes. El personaje elegido es 1 .

’r‘X
30ǒСṬ€o⁶Y

Pruébalo en línea!

Gracias a Jonathan Allan por el heads-up (encendido Ṭ€o⁶).

Sr. Xcoder
fuente
Podrías usarlo Ṭ€o⁶en lugar de ⁶ẋ;€0mi 18 byter y bajar a 17.
Jonathan Allan
@JonathanAllan ¡Gracias! Combinando las tres respuestas de Jelly, en realidad terminé teniendo 16 bytes. Pero publiqué eso como una solución secundaria porque no es del todo mío. :-)
Sr. Xcoder
3

Octava , 53 51 50 49 bytes

printf('%*d\n',[a=31+cumsum(randi(3,1,30)-2);~a])

Pruébalo en línea!

Guardado 1 byte al no hacer más bucles. Salvó a otro como Octave printftambién fprintf.

Este nuevo código crea una matriz de 30 enteros aleatorios en el rango -1:1. Luego suma acumulativamente la matriz y agrega 30, lo que da la secuencia deseada.

El resultado se imprime fprintfcon un formato que dice "Un número decimal, rellenado con un ancho especificado, seguido de una nueva línea. El ancho será el primer valor ingresado y el número decimal será el segundo valor ingresado. Si el número de entrada de valores es más que esto, Octave seguirá repitiendo la impresión automáticamente para obtener la salida deseada.

Para lograr el bucle, entonces, solo necesitamos intercalar ceros entre la matriz de secuencia para que la fprintffunción use cada valor en la secuencia como un ancho, y cada cero como el dígito a imprimir.

Imprime una salida como:

                              0
                             0
                              0
                             0
                              0
                               0
                              0
                               0
                              0
                              0
                             0
                            0
                           0
                           0
                           0
                          0
                           0
                            0
                             0
                              0
                              0
                             0
                             0
                              0
                               0
                              0
                              0
                               0
                               0
                                0

El código anterior no siempre imprime exactamente 30 espacios en la primera línea. Será 29, 30 o 31. Para corregir eso, usaría esta versión de 53 bytes:

x=31;for i=2:x;fprintf('%*d\n',x,0);x+=randi(3)-2;end
Tom Carpenter
fuente
Puede guardar dos bytes:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen
@KevinCruijssen Pensé en eso, pero no funciona igual. Resultaría en la primera línea que comienza con 29, 30 o 31 espacios.
Tom Carpenter
1
@KevinCruijssen, de hecho, no importa. Acabo de notar los comentarios de los OP que dicen que está permitido.
Tom Carpenter
Sí. Es un poco molesto que haya una regla en el comentario (especialmente porque contradice la descripción actual del desafío ...). Le pedí a OP que edite el desafío para reflejar que puede comenzar con 29, 30 o 31, ya que parece permitirlo en los comentarios.
Kevin Cruijssen
3

Lua 81 75 bytes

n=30;for i=1,n do print(("%-"..n.."s+"):format(" "))n=n-2+math.random(3)end

En for i=1,n ...el to_exp n se evalúa sólo una vez antes de entrar en el bucle, el ahorro de un byte.

-6 gracias a @ user202729

Pruébalo en línea!

lqnrd
fuente
1
Bienvenido a PPCG! Es posible que desee agregar un enlace TIO a su publicación para que las personas puedan probar su programa más fácilmente.
user202729
Puede reducir su respuesta a 76 bytes . Además de la página Consejos para jugar al golf en Lua puede ser útil.
user202729
75 bytes .
user202729
3

Python 3.6 , 84 73 69 bytes

from random import*
x=30
exec("print(' '*x+'+');x+=randint(-1,1);"*x)

Gracias a @WheatWizard por -11 bytes. Gracias a @JoKing por -4 bytes.

MoustacheMoses
fuente
Como no terminas usando i, puedes usarlo for i in[1]*30para guardar bytes.
Wheat Wizard
También from random import*puedes hacerlo para no necesitar random.más tarde. Y puede eliminar el espacio de nueva línea después de su :.
Wheat Wizard
Y si cambias 30a 29la "+".rjust(x)puede ser reemplazado con " "*x+"+".
Wheat Wizard
En realidad, con respecto a mi último comentario, debería ser 30 espacios, no 29. Su respuesta actual solo pone 29 espacios y, por lo tanto, no cumple con la especificación. Esto se puede solucionar cambiando 30 a 31.
Wheat Wizard
1
@WheatWizard ¡Gracias! He añadido tus cambios y también te he acreditado. Cambié [1]*30a [1]*xporque es un byte más corto.
MoustacheMos
3

ES5, 97 95 81 bytes

for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)

ES5, 11298 bytes si se necesita el formato de función:

function a(){for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)}a()

Kyle Fairns
fuente
2
Bienvenido a PPCG! Creo que sus variables deben declararse dentro de una función:_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
Oliver
Eso matará los bytes, te lo diré. ES5 no incluye las funciones de flecha por defecto. Actualizaré
Kyle Fairns
@Oliver, formato de función agregado :)
Kyle Fairns
¡Agradable! No estoy seguro de cuándo se introdujo, pero creo que puede reemplazarlo join(" ")conjoin` `
Oliver
@ Oliver No estoy seguro de que puedas hacer eso en ES5, ¿verdad? ¿Pensé que era una plantilla literal añadida en ES6?
Kyle Fairns