Crear un mapa de bola que cae

16

Introducción

Para los que nunca antes habían oído hablar de este juego. Estás jugando una pelota que necesita sobrevivir el mayor tiempo posible. Esto se hace moviéndose hacia la izquierda o hacia la derecha, yendo a los agujeros. Dado que el mapa se mueve hacia arriba, debes ir hacia abajo para sobrevivir más tiempo. Si busca imágenes, probablemente sepa a qué juego me refiero.

La tarea

Dado un número entero positivo n , genera un mapa de bola descendente de n capas. Entre las capas, hay 4 líneas nuevas. El ancho de la capa está formado por 25 caracteres de subrayado, con un agujero de longitud 5. Eso significa que el ancho total es igual a 30. Esto se desplaza aleatoriamente después de cada capa. Un ejemplo de una capa válida es:

_______________     __________

El agujero también puede estar en los bordes, como si la capa fuera como un cilindro:

  _________________________   

Tenga en cuenta que hay 2 espacios iniciales y 3 espacios finales. Hacer un solo agujero de ancho 5.

Casos de prueba

Para n = 4, esta es una salida válida:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Nota: los agujeros deben estar distribuidos uniformemente . Se permiten nuevas líneas finales y / o iniciales.

Este es el , por lo que gana el envío con la menor cantidad de bytes.

Adnan
fuente
1
@DonMuesli Jaja, eso puede pasarle a cualquiera: p
Adnan

Respuestas:

7

Pyth, 19 bytes

VQ.>+*\_25*d5O30*b4

Pruébalo aquí!

Explicación

VQ.> + * \ _ 25 * d5O30 * b4 # Q = entrada

VQ # Repetir Q veces
     * \ _ 25 # 25 guiones bajos
          * d5 # 5 espacios
    + # concat los guiones bajos y espacios
  .> O25 # rotar esta cadena 0-29 veces
                * b4 # imprime las nuevas líneas separadas
Denker
fuente
4

Rubí, 74 71 59

Gracias a Alex A. por recordarme que ser básicamente una línea significa que puedo usar la lambda stabby

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}
Tinta de valor
fuente
putsagrega una nueva línea al final (mientras que Ruby printno), por lo que se ha actualizado a las 5nuevas líneas.
Value Ink
Todos aclaman la timesfunción para ahorrarme 3 bytes en el forciclo: D
Value Ink
1
57 bytes: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} Pruébelo aquí
Alex A.
No necesita asignar la lambda como parte del envío ya que no requerimos que se nombren las funciones.
Alex A.
1
Puede hacer (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]o simplemente especificar que necesita asignarlo para llamarlo. Esto es bastante común en el sitio.
Alex A.
3

Julia, 72 bytes

n->join([join(circshift(["_"^25*" "^5...],rand(1:30)))"\n"^5 for i=1:n])

Esta es una función anónima que acepta un número entero y devuelve una cadena. Para llamarlo, asígnelo a una variable.

Construimos una cadena de 25 guiones bajos seguidos de 5 espacios, luego los dividimos en una matriz de caracteres. Lo desplazamos circularmente un número aleatorio de veces (entre 1 y 30), lo unimos nuevamente en una cadena y agregamos 5 líneas nuevas. Este proceso se repite. n veces, donde n es la entrada. La matriz resultante se une y se devuelve.

Pruébalo aquí

Alex A.
fuente
3

PowerShell 65 bytes

0..$args[0]|%{-join("_"*25+" "*5)[($r=Random 25)..($r-29)];,""*5}

Ejecute un bucle para n iteraciones. Obtenga un número aleatorio y haga una cadena de subrayado con 5 espacios al final. Indice en la cadena como una matriz para extraer a partir de una ubicación aleatoria. La indexación negativa termina desde el final. Únase a eso nuevamente y agregue 5 nuevas líneas.

Editar: No sé por qué pensé que necesitaba el parámetro porque -Maximumes posicional. Gracias a TimmyD , eliminé algunos bytes y olvidé recibir información, lo que me llevó de nuevo a 65.

Mate
fuente
@TimmyD Me sorprendería si alguien todavía tuviera 1.0. Solo estaba disponible como descarga y no se envió con ningún sistema operativo. 2.0 debería considerarse la norma.
Matt
@TimmyD Estoy de acuerdo con ese punto, pero no en lo que respecta a PowerShell 1.0 . Si alguien está usando este sitio usando eso, me sorprendería. Si utilizara una característica 3.0 o superior, lo destacaría con seguridad.
Matt
3

Pyth, 19 bytes

VQ.>r"5 25_"9O30*4b

Pruébalo aquí

Gracias a FryAmTheEggman por atrapar un error.

Mike Bufardeci
fuente
@AandN FryAmTheEggman tiene razón, lo he cambiado para que se cambie aleatoriamente por 0-29 caracteres en lugar de 0-25.
Mike Bufardeci
2

SpecBAS - 93 bytes

1 a$="_"*25+" "*5: INPUT n: FOR i=1 TO n: r=1+INT(RND*30): ?a$(r TO)+a$( TO r-1)''''': NEXT i

Hace una cadena de 25 guiones bajos + 5 espacios, selecciona un punto de inicio aleatorio y divide la cadena en esa posición y pega el inicio de la cadena para finalizar.

El apóstrofe fuerza una nueva línea, por lo que 1 al final de la cadena y 4 líneas vacías.

Brian
fuente
2

MATL , 23 bytes

:"95l25X"5Z"h30YrYS10ct

Pruébalo en línea!

Explicación

:"           % take input n implicitly. Repeat loop n times
  95l25X"    %   row vector with number 95 ('_') repeated 25 times
  5Z"        %   row vector of 5 blank spaces
  h          %   concatenate vertically
  30Yr       %   random number uniformly distributed on [1,2,...,30]
  YS         %   circularly shift
  10c        %   newline character. Includes another newline when printed
  t          %   duplicate
             % implicitly end loop and display stack contents
Luis Mendo
fuente
2

Java, 177 140 bytes

-1 byte a Azul moviendo el i ++

-2 bytes para mí dejando espacios en blanco sin sentido en el original

-34 bytes a Azul para darse cuenta de que no necesitaba el char [] en absoluto

Porque, ya sabes, Java.

n->{String s="";for(;n-->0;){int r=(int)(Math.random()*30);for(int i=0;i<30;){s+=i>r&i<r+6|r>24&i++<=r%25?" ":"_";}s+="\n\n\n\n";}return s;}

Ligeramente incólume:

Function<Integer, String> fallingBall = n -> {
    String s = "";
    for (;n-->0;) {
        int r = (int)(Math.random()*30);
        for (int i=0; i<30; i++) {
            s += i>r&i<r+6|r>24&i<=r%25?" ":"_";
        }
        s += "\n\n\n\n";
    }
    return s;
}

Como Java no tiene una cadena 'rotar', tuve que adoptar un enfoque diferente. Generé un int aleatorio 0-29 que representa el índice de inicio del hoyo (OBO porque >es más corto que >=). Cada personaje individual es entonces decidido por la lógica

l[index] = (index>random && index<random+6) || (random>24 && index<=random%25) ? ' ' : '_';

Esto maneja la naturaleza de "envoltura" del conjunto.

CAD97
fuente
Al colocar i ++ en el último lugar donde se usa, puede guardar un byte.
Azul
Inteligente. Hacky, pero inteligente. Más inteligente aún soy yo de alguna manera dejando espacios en blanco sin sentido al comienzo de mi fragmento ( s = ""). Ambos están arreglados ahora.
CAD97
También puede ahorrar un montón más deshaciéndose de la matriz de caracteres, cambiar los literales de caracteres a literales de cadena y usar s + = en el interior para el bucle. Lo acabo de probar
Blue
Por cierto gran respuesta
Azul
Eso es lo que obtengo por enfocarme en una forma de hacerlo. -34 (!) Bytes.
CAD97
1

Python 3.5 - 109 113 bytes (+4 para imprimir 4 líneas nuevas entre cada resultado):

def g(a,j='_'*25+' '*5):
 for l in range(a):import random;n=random.randrange(len(j)+1);print(j[-n:]+j[:-n]+'\r'*4)

Forma sin golf:

# j is the starting string with the 25 underscores and then 5 spaces at the end
def g(a,j='_'*25+' '*5):
    import random #Import the random module
    for l in range(a): # Do the following as many times as provided by the user
        n=random.randrange(len(j)+1) Get a random number in the range 0-29
        print(j[-n:]+j[:-n]+'\r'*4) #Shift the string characters right "n" times and print out the results with 4 new lines in between

Básicamente, lo que está sucediendo es que una cadena 'j', que consta de 25 guiones bajos seguidos de 5 espacios, se da como argumento para la función "g". Luego, se importa el módulo aleatorio y, tantas veces como lo especifique el usuario, se elige un número aleatorio en el rango 0 => 29, y la cadena, "j", se desplaza a la derecha tantas veces. El resultado se imprime después de cada iteración, con 4 líneas nuevas entre cada resultado.

R. Kap
fuente
¿Esto también imprime las nuevas líneas en el medio?
Adnan
@AandN Ahora sí. :)
R. Kap
Realmente necesita imprimir 4 líneas nuevas: p. Entonces cambiar '\r'a '\r'*4probablemente debería funcionar. Además, creo que puedes cambiar range(a+1)a range(a).
Adnan
@AandN En realidad, el uso range(a)realmente imprime el a-1número de líneas, por lo que range(a+1)es la mejor manera de imprimir el número exacto de líneas que proporciona el usuario. Además, ahora imprime 4 líneas nuevas entre cada resultado.
R. Kap
Hmmm, eso es extraño, porque probé esto g(5)e imprime 6 cadenas en lugar de cinco, por lo que cambiar a+1a aprobablemente solucionaría eso.
Adnan
1

Python, 119103 bytes

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]
DaveBensonPhillips
fuente
Su última actualización no funciona porque ha puesto el azar en un argumento predeterminado, por lo que la función siempre generará los mismos ntiempos de fila
Sp3000