Haz que llueva personajes


31

Inspirado en este mini desafío de chat.

Dada una cadena como entrada (solo caracteres imprimibles ASCII), genera la cadena con las letras "lloviendo" hacia abajo. Cada letra debe ser un número aleatorio de líneas hacia abajo (aleatorio entre 0y la longitud de la cadena, cada una con una probabilidad distinta de cero), y solo un carácter por columna. Todas las salidas posibles deben tener nuevamente una probabilidad distinta de cero.

Tal vez sea un poco confuso, así que aquí hay un ejemplo (tomado de ese CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Tenga en cuenta cómo Hes un espacio hacia abajo, el dcero es hacia abajo, y llotodo sucede para alinearse. El res el más alejado, en 9, pero aún es menor que la longitud de la cuerda desde la parte superior. Este es solo un ejemplo, hay docenas de otras posibilidades de entrada Hello World.

Otros ejemplos podrían ser:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • La entrada y salida se pueden dar por cualquier método conveniente .
  • La entrada está garantizada como no vacía (es decir, nunca recibirá ""como entrada).
  • Puede imprimirlo en STDOUT o devolverlo como resultado de una función.
  • Un programa completo o una función son aceptables.
  • Cualquier cantidad de espacio en blanco extraño es aceptable, siempre y cuando los caracteres se alineen apropiadamente (por ejemplo, siéntase libre de rellenar como un rectángulo).
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

2
Pensé que esto implicaría animación cuando leí el título. ¿Hemos tenido una versión animada de esto?
Shaggy

@ Shaggy No es que haya visto o haya podido encontrar.
AdmBorkBork

"Cualquier cantidad de espacio en blanco extraño es aceptable", ¿eso incluye una línea principal de espacio en blanco?
Jonathan Allan

Sé que hemos tenido uno basado en el código de Matrix, ¡pero buena suerte al encontrarlo con esas 2 palabras clave! ¿Te molesta si la idea de Sandbox?
Shaggy

¿Cuál es el tamaño máximo de entrada que las respuestas deben implementar? Veo que muchas personas usan funciones aleatorias que usan "pseudoaleatorio" en el fondo, y ciertas palabras de entrada son más grandes que el tamaño de la semilla utilizada en esos generadores, y fallarán el "Todas las salidas posibles deben tener nuevamente probabilidad distinta de cero de que ocurra ". restricción que ha especificado
Ferrybig

Respuestas:


5

R , 104 bytes

function(s){m=matrix(" ",l<-nchar(s),l)
m[cbind(1:l,sample(l,l,T))]=el(strsplit(s,""))
write(m,1,l,,"")}

Pruébalo en línea!

Entrada como una cadena; escribe a stdout.


Puede guardar un byte usando scan(,'')y anidando un montón de llamadas, pero sinceramente, prefiero ampliamente el enfoque de la función, este otro es horrible para una ganancia mínima. Sin embargo, podría provocar algunas ideas. Pruébalo en línea!
CriminallyVulgar

Creo que es sample(l,,T)suficiente en lugar de sample(l,l,T)(-1 byte).
Robin Ryder

4

JavaScript (ES6), 72 bytes

Toma la entrada como una lista de caracteres. Devuelve una matriz de caracteres.

a=>a.map((_,y)=>a.map((c,x)=>Math.random()<.5|!a[y+1]?(a[x]=' ',c):' '))

Pruébalo en línea!


Creo que podría guardar un byte al no negar la expresión ternaria.
orthoplex

2
@orthoplex Eso no funcionaría porque (0|'A') === (0|undefined)ya no se garantizaría que las letras restantes aparecieran en la última fila. (Entonces, básicamente, es como si |!a[y+1]se hubiera eliminado por completo.)
Arnauld

Google dice que Math.random()devuelve un número en [0, 1), por lo que no podría Math.random()<.5convertirse Math.random()>0?
nedla2004

@ nedla2004 En teoría, sí. En la práctica, creo que es muy probable que la aplicación (s) de la PRNG no puede volver exactamente (y mucho menos lo suficientemente cerca 's de manera que todas las configuraciones en realidad tienen la oportunidad de producirse). Debido a que definimos un lenguaje por su implementación, personalmente creo que, por lo tanto, no es válido. 00 0
Arnauld

¿Para qué plataforma hiciste tu javascript? Dado que el desafío tiene un requisito de unicidad y no especifica una entrada máxima, esto realmente importa, ya que la mayoría de las plataformas están usando una math.random()implementación que tiene un estado interno y, por lo tanto, no pueden generar una salida única.
Ferrybig

4

Pyth - 9 bytes

Lista de salidas de líneas.

.tm+*;OlQ

 .t                       Transpose, padding with spaces
  m      (Q implicit)     Map over input
   +    (d implicit)      Concatenate to loop var
    *                     String repeat
     ;                    This refers to the var replaced by loop var, which is d=" "
     O                    Random number less than
      lQ                  Length of input

Pruébalo en línea .


4

J , 30 19 bytes

|:@,.]{.~"+_2-#?@##

Pruébalo en línea!


1
0|:]{.~"+_1-#?#por 15 bytes
Galen Ivanov

@GalenIvanov Me encanta esta idea, pero dado que el acuerdo de díada se lleva a cabo sin repetición, el rango de resultados no abarcará el rango completo de posibilidades. por ejemplo, no será posible que 2 letras caigan aleatoriamente a la misma altura.
Jonás

@Conor, puede hacerlo 0|:]{.~"+_2-#?@##por 17 bytes sin cambiar el comportamiento de su respuesta.
Jonás

1
@ Jonás Sí, claro. Me di cuenta de eso y tuve otra solución de 17 bytes.
Galen Ivanov

4

Japt , 8 bytes

-1 byte de @Shaggy

y_iUÊö ç

y_iUÊö ç        Full Program. Implicit input U
y_              transpose and map each row in U (Call it X)
  i             Insert at the beginning of X:
       ç        " " repeated ↓ many times
   UÊö          random integer in [0, length of U] 
                implicit transpose back and output

Pruébalo en línea!



jajaja @Shaggy Recibí la misma respuesta hace un tiempo, solo estaba agregando una explicación. Gracias de todos modos c:
Luis felipe De jesus Munoz

3

APL (Dyalog Unicode) , SBCS de 16 bytes

Función de prefijo tácito anónimo

⍉∘↑⊢↑¨⍨∘-∘?≢⍴1+≢

 longitud de la cuerda

1+ uno agregado a eso

≢⍴ copias de "longitud" de ese

∘? enteros aleatorios en el rango 1 ... esos, y luego ...

∘- negar, y luego ...

⊢↑¨⍨ tomar muchos elementos de cada personaje, rellenando a la izquierda con espacios

∘↑ Mezcle la lista de cadenas en la matriz, rellenando con espacios a la derecha

 transponer

Pruébalo en línea!


2

Japt , 8 bytes

yÈùUÊö Ä

Intentalo

yÈùUÊö Ä     :Implicit input of string U
y            :Transpose
 È           :Pass each column through the following function and transpose back
  ù          :  Left pad with spaces to length
   UÊ        :    Length of U
     ö       :    Random number in the range [0,UÊ)
       Ä     :    Plus 1

2

Jalea , 10 bytes

³LŻX⁶x;)z⁶

Pruébalo en línea!

      )    | For each input character
³L         | Length of original input
  Ż        | 0..length
   X       | Random number from that list
    ⁶x     | That number of spaces
       ;   | Concatenate to the character
        z⁶ | Finally transpose with space as filler

Podemos generar una línea inicial de espacios, por lo que 9 bytes (aunque creo que puede haber un 8 ...)
Jonathan Allan

@JonathanAllan ¿no sería eso equivalente al rango 0..(length - 1)? La pregunta especifica entre 0 y la longitud de la cadena. ¿O me estoy perdiendo algo?
Nick Kennedy

Ah, sí, me olvidé de la inclusión: cuando pregunté hace tres días sobre el espacio en blanco, estoy bastante seguro de que tenía un 9, y creo que no fue lo que sugerí anteriormente ... hmm
Jonathan Allan


2

PHP , 88 bytes

for($o='';$i<$l=strlen($argn);$o[$i+$l*rand(0,$l)]=$argn[$i++]);echo chunk_split($o,$l);

Pruébalo en línea!

O 94 bytes usando la función de enteros aleatorios criptográficos de PHP .

for($o='';$i<$l=strlen($argn);$o[$i+$l*random_int(0,$l)]=$argn[$i++]);echo chunk_split($o,$l);

Pruébalo en línea!

Entrada de STDIN, salida a STDOUT. Correr como:

$ echo Hello World|php -nF rain.php
   l  W    
  l        

 e      r d

H      o   

         l 


    o 

-1 byte (cadena vacía en lugar de espacio) y +1 byte (error en el lado de las reglas) gracias a @ ASCII-only!


me pregunto si esto está permitido, ya que no incluye el <?phpque ?>cierra. también parece que está bien si $oes la cadena vacía
solo ASCII

@ Solo ASCII, tienes razón, la cadena vacía también funcionará (con un poco más de queja). No estoy seguro de la decisión sobre el uso de etiquetas de cierre y reapertura, aunque lo actualizaré para mantenerme al día. ¡Gracias!
640 KB el

Tenga en cuenta que las reglas para este desafío dicen "Todas las salidas posibles deben tener nuevamente una probabilidad distinta de cero", esto no es posible con la randfunción PHP , ya que puede tener un texto de entrada que requiere más al azar que el tamaño del interno semillas de rand utiliza, por lo que técnicamente su respuesta no cumple con esta condición en todas las situaciones
Ferrybig

@Ferrybig Estoy de acuerdo en que el PHP / libc heredado randno es útil para mucho, sin embargo, todas las versiones compatibles / de producción de PHP (7.1+) usan Mersenne Twister RND ( mt_rand) internamente para una generación de números aleatorios. ¿Le preocupa que esto no sea lo suficientemente aleatorio para este desafío?
640 KB el

mt_randTambién utiliza un sistema de números pseudoaleatorio internamente, y también tiene las limitaciones. Suponiendo que PHP se compila con números de 64 bits (y que la semilla, utilizada para rando mt_randacepta este rango completo) generaría salidas únicas para palabras de hasta 13 caracteres o menos. Bastante limitante si me preguntas
Ferrybig

1

Carbón , 10 9 bytes

↑Eθ◧ι⊕‽Lθ

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: guardado 1 byte gracias a @ ASCII-only. Explicación:

  θ         Input string
 E          Map over characters
        θ   Input string
       L    Length
      ‽     Random value
     ⊕      Incremented
    ι       Current character
   ◧        Padded to length
↑           Print rotated

Como señala ASCII-only, puede mover las letras aleatoriamente hacia arriba en lugar de hacia abajo para obtener el mismo efecto (excepto que puede haber espacio en blanco adicional en la parte inferior en lugar de en la parte superior). Imprimir una matriz de caracteres hacia arriba es equivalente a imprimir una cadena normalmente, por lo que el relleno simplemente compensa cada carácter verticalmente en una cantidad aleatoria.


me pregunto si imprimir en su lugar funcionaría
Solo ASCII

1

05AB1E (heredado) , 9 bytes

εIgÝΩú}ζ»

Ingrese como una cadena o lista de caracteres (cualquiera está bien).

Pruébalo en línea.

Alternativa de 9 bytes mucho más lenta:

gDÝsãΩúζ»

Entrada como una lista de caracteres.

Pruébalo en línea.

Ambos utilizan la versión heredada de 05AB1E, ya que la nueva versión requiere un explícito €Santes de la ζ..

Explicación:

ε       # Map each character in the (implicit) input to:
 Ig     #  Take the length of the input
   Ý    #  Create a list in the range [0, input-length]
    Ω   #  Pop and push a random integer from this list
     ú  #  Pad the current character with that many leading spaces
      # After the map: zip/transpose; swapping rows/columns (with space as default filler)
  »     # Then join all strings by newlines (and it output implicitly as result)

g          # Get the length of the (implicit) input-list
 D         # Duplicate this length
  Ý        # Create a list in the range [0, input-length]
   sã      # Take the cartesian product of this list that many times
     Ω     # Pop and push a random list from this list of lists of integers
      ú    # Pad the characters in the (implicit) input-list with that many spaces
       ζ   # Zip/transpose; swapping rows/columns (with space as default filler)
        »  # Then join all strings by newlines (and it output implicitly as result)

Estaba pensando en la línea de gD¸s∍ÝδΩpero es más largo ... y ooo ... esto ni siquiera funciona en el nuevo 05AB1E;).
Urna de pulpo mágico


1

Julia, 69 bytes

f(s)=(n=length(s);z=fill(' ',n,n);for i=1:n z[rand(1:n),i]=s[i]end;z)

Esto define una función fque acepta un Stringo Vector{Char}y devuelve una Matrix{Char}.

Sin golf:

function f(s)
    n = length(s)
    z = fill(' ', n, n)  # an n×n matrix of spaces
    for i = 1:n
        # set a random entry in the ith column to the ith character in s
        z[rand(1:n),i] = s[i] 
    end
    z
end

Ejemplo:

julia> f("test")
4×4 Array{Char,2}:
 't'  ' '  ' '  ' '
 ' '  ' '  ' '  ' '
 ' '  'e'  ' '  't'
 ' '  ' '  's'  ' '

Esto seguramente podría ser mejor; Mis habilidades de golf son bastante oxidadas.

Pruébalo en línea!



1

PowerShell , 108 102 98 bytes

-4 bytes gracias a mazzy

$a=1..($z=($y=$args|% t*y).count)|%{random $z}
1..$z|%{-join($y|%{" $_"[$a[$i++%$z]-eq+$r]});$r++}

Pruébalo en línea!

Básicamente itera 1..lengthla cadena dos veces, una para obtener ubicaciones de línea aleatorias para cada carácter y una segunda vez para construir cada línea usando esos índices. Descubrir cómo hacerlo en un barrido es donde están los grandes ahorros de bytes.



0

SmileBASIC 3, 62 bytes

LINPUT T$L=LEN(T$)CLS
FOR I=0TO L-1LOCATE,RND(L+1)?T$[I];
NEXT


0

Python - 92 bytes

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])

Tienes que incluir elimport random
MilkyWay90

@ MilkyWay90 d'oh
Maltysen

1
Puede guardar 1 byte usando en su from random import*lugar.
orthoplex

Creo map(None,...que no funciona en Python 3, por lo que debe especificar Python 2 en su título.
orthoplex

0

K (oK) , 20 bytes

Solución:

+c$(-1-c?c:#x)$++x:

Pruébalo en línea!

Explicación:

+c$(-1-c?c:#x)$++x: / the solution
                 x: / store input as x
                +   / flip (enlist)
               +    / flip again (break into chars)
              $     / pad (each) character
   (         )      / do this together
           #x       / length of x
         c:         / save as c
      -c?           / choose (?) c times from c
    -1              / subtract from -1
 c$                 / pad to length of x
+                   / flip


0

Python 3, 208 bytes

import random as r;x=input();R=range(len(x));c=[r.choice(R) for i in R];y=[' '*c[i]+x[i]+' '*(len(x)-c[i]) for i in R];R=range(len(y));print('\n'.join([''.join(r) for r in [[y[i][j] for i in R] for j in R]]))

Crea una lista de opciones aleatorias, luego hace una lista de columnas con espacio en blanco en todas partes excepto en el índice especificado por cada opción aleatoria. Las columnas se transponen en filas y se imprimen con nuevas líneas entre ellas.

Pruébalo en línea!

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.