Faça chover personagens

31

Inspirado neste mini-desafio de bate-papo.

Dada uma sequência como entrada (somente caracteres imprimíveis ASCII), imprima a sequência com as letras "chovendo". Cada letra deve ser um número aleatório de linhas para baixo (aleatório entre 0e o comprimento da sequência, cada uma com probabilidade diferente de zero) e apenas um caractere por coluna. Todas as saídas possíveis devem ter novamente uma probabilidade diferente de zero.

Talvez isso seja um pouco confuso, então aqui está um exemplo (retirado desse CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Observe como o Hespaço é um abaixo, o dzero é baixo e llotudo acontece na linha. O ré o mais distante 9, mas ainda é menor que o comprimento da corda do topo. Este é apenas um exemplo, existem dezenas de outras possibilidades de entrada Hello World.

Outros exemplos podem ser:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • A entrada e a saída podem ser fornecidas por qualquer método conveniente .
  • A entrada é garantida como não vazia (ou seja, você nunca receberá ""como entrada).
  • Você pode imprimi-lo em STDOUT ou retorná-lo como resultado de uma função.
  • Um programa completo ou uma função são aceitáveis.
  • Qualquer quantidade de espaço em branco estranho é aceitável, desde que os caracteres sejam alinhados adequadamente (por exemplo, fique à vontade para preencher como um retângulo).
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
AdmBorkBork
fonte
2
Pensei que isso envolveria animação quando li o título. Já tivemos uma versão animada disso?
Shaggy
@ Shaggy Não que eu tenha visto ou conseguido encontrar.
AdmBorkBork 13/04
"Qualquer quantidade de espaço em branco estranho é aceitável" - isso inclui uma linha principal de espaço em branco?
Jonathan Allan
Eu sei que tivemos um baseado no código Matrix, mas boa sorte em encontrá-lo com essas duas palavras-chave! Você se importa se eu sandbox a idéia?
Shaggy
Qual é o tamanho máximo de entrada que as respostas precisam implementar? Estou vendo muitas pessoas usarem funções aleatórias que usam "pseudo-aleatório" no backendground, e certas palavras de entrada são maiores que o tamanho da semente usada nesses geradores, e elas falharão "Todas as saídas possíveis devem ter novamente um probabilidade diferente de zero de ocorrer ". restrição que você especificou
Ferrybig 13/04

Respostas:

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,,"")}

Experimente online!

Entrada como uma string; escreve para stdout.

Giuseppe
fonte
Você pode salvar um byte usando scan(,'')e aninhando um monte de chamadas, mas sinceramente eu prefiro muito a abordagem de funções, essa outra é hedionda para ganho mínimo. Pode desencadear algumas idéias, no entanto. Experimente online!
CriminallyVulgar
Eu acho que sample(l,,T)é suficiente em vez de sample(l,l,T)(-1 byte).
Robin Ryder
4

JavaScript (ES6), 72 bytes

Recebe a entrada como uma lista de caracteres. Retorna uma matriz de caracteres.

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

Experimente online!

Arnauld
fonte
Eu acho que você poderia economizar um byte não negando a expressão ternária.
orthoplex
2
@orthoplex Isso não funcionaria porque (0|'A') === (0|undefined)e as letras restantes não teriam mais garantia de aparecer na última linha. (Então, basicamente, é como se |!a[y+1]fosse completamente removido.)
Arnauld
O Google diz que Math.random()retorna um número em [0, 1), então não poderia se Math.random()<.5tornar Math.random()>0?
nedla2004 13/04
@ nedla2004 Em teoria, sim. Na prática, acho muito provável que a (s) implementação (ões) do PRNG não possa retornar exatamente (muito menos fechar 0 o suficiente para que todas as configurações tenham a chance de ocorrer). Como definimos uma linguagem por sua implementação, eu pessoalmente acho que ela é inválida. 0 0 0
Arnauld
Para qual plataforma você criou seu javascript? Como o desafio tem um requisito de exclusividade e não especifica uma entrada máxima, isso realmente importa, pois a maioria das plataformas está usando uma math.random()implementação que possui um estado interno e, portanto, não pode gerar uma saída exclusiva.
Ferrybig 13/04
4

Pitão - 9 bytes

Lista de linhas de saída.

.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

Experimente online .

Maltysen
fonte
4

J , 30 19 bytes

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

Experimente online!

Conor O'Brien
fonte
1
0|:]{.~"+_1-#?#para 15 bytes
Galen Ivanov
@GalenIvanov Eu amo essa idéia, mas como o acordo da díade dura sem repetição, o intervalo de saídas não abrange todo o conjunto de possibilidades. por exemplo, não será possível que duas letras caiam aleatoriamente na mesma altura.
Jonah
@Conor, você pode fazer 0|:]{.~"+_2-#?@##por 17 bytes sem alterar o comportamento da sua resposta.
Jonah
1
@ Jonah Sim, certo. Eu percebi isso e tinha outra solução de 17 bytes.
Galen Ivanov
4

Japonês , 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

Experimente online!

Luis felipe De jesus Munoz
fonte
1
8 bytes
Shaggy
lol @ Shaggy Eu tenho a mesma resposta há um tempo atrás, eu estava apenas adicionando uma explicação. Obrigado mesmo assim c:
Luis felipe De jesus Munoz
3

APL (Dyalog Unicode) , 16 bytes SBCS

Função de prefixo tácito anônimo

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

 comprimento da corda

1+ um adicionado a isso

≢⍴ cópias "longas" desse

∘? números inteiros aleatórios no intervalo 1… aqueles e depois…

∘- negar e depois ...

⊢↑¨⍨ pegue muitos elementos de cada personagem, preenchendo a esquerda com espaços

∘↑ misture a lista de strings em matriz, preenchendo com espaços à direita

 transpor

Experimente online!

Adão
fonte
2

Japonês , 8 bytes

yÈùUÊö Ä

Tente

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
Shaggy
fonte
2

Gelatina , 10 bytes

³LŻX⁶x;)z⁶

Experimente online!

      )    | 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
Nick Kennedy
fonte
Podemos saída de uma linha líder de espaços, de modo 9 bytes (embora eu sinto que pode haver um 8 ...)
Jonathan Allan
@JonathanAllan não seria equivalente ao intervalo 0..(length - 1)? A pergunta especifica entre 0 e o comprimento da string. Ou eu estou esquecendo de alguma coisa?
Nick Kennedy
Ah, sim, eu esqueci a inclusão - quando perguntei há três dias sobre como liderar espaços em branco, tenho certeza de que tinha um 9, e acho que não foi o que sugeri acima ... hmm
Jonathan Allan
2

Ruby , 59 57 55 bytes

->a{a.map{|c|s=[' ']*z=a.size;s[rand z]=c;s}.transpose}

Experimente online!

Entradas 1D, gera uma matriz 2D de caracteres.

Kirill L.
fonte
2

PHP , 88 bytes

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

Experimente online!

Ou 94 bytes usando PHP função de números inteiros aleatórios criptográficos .

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

Experimente online!

Entrada de STDIN, saída paraSTDOUT . Correr como:

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

 e      r d

H      o   

         l 


    o 

-1 byte (string vazia em vez de espaço) e +1 byte (erro no lado das regras) thx para @ somente ASCII!

640KB
fonte
pergunto se isso é permitido, já que você não inclui o <?phpque ?>fecha. também parece que é bom se $ofor a string vazia
somente ASCII
@ Somente ASCII, você está certo, a string vazia também funcionará (com um pouco mais de reclamação). Não tenho certeza da decisão de usar as tags de fechamento e reabertura, mas atualizo-a para permanecer sempre atualizada. THX!
640 KB
Observe que as regras para este desafio dizem "Todas as saídas possíveis devem ter novamente uma probabilidade diferente de zero", isso não é possível com a randfunção PHP , pois você pode ter um texto de entrada que exija mais aleatoriamente que o tamanho da fonte interna. o seed rand usa, então tecnicamente sua resposta falha em satisfazer essa condição em todas as situações
Ferrybig 13/04
@Ferrybig Concordo que o PHP / libc legado randnão é útil para muitos, no entanto, todas as versões suportadas / de produção do PHP (7.1+) usam o Mersenne Twister RND ( mt_rand) internamente para uma geração aleatória de números. Você está preocupado que isso não seja suficientemente aleatório para esse desafio?
640KB 13/04
mt_randtambém usa internamente um sistema de números pseudo-aleatórios e também possui limitações. Supondo que o PHP seja compilado com números de 64 bits (e que a semente, usada para randou mt_randaceite esse intervalo completo), geraria saídas exclusivas para palavras com até 13 caracteres ou menos. Bastante limitante se você me perguntar
Ferrybig 13/04
1

Carvão , 10 9 bytes

↑Eθ◧ι⊕‽Lθ

Experimente online!Link é a versão detalhada do código. Editar: salvou 1 byte graças a @ ASCII-only. Explicação:

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

Como aponta apenas ASCII, você pode mover as letras aleatoriamente para cima em vez de para baixo para o mesmo efeito (exceto que pode haver espaço em branco extra na parte inferior, em vez da parte superior). Imprimir uma matriz de caracteres para cima é equivalente a imprimir uma sequência normalmente; portanto, o preenchimento compensa cada caractere verticalmente de forma aleatória.

Neil
fonte
gostaria de saber se a impressão funcionaria?
somente ASCII
1

05AB1E (herdado) , 9 bytes

εIgÝΩú}ζ»

Insira como uma sequência ou lista de caracteres (está correto).

Experimente online.

Alternativa de 9 bytes muito mais lenta:

gDÝsãΩúζ»

Insira como uma lista de caracteres.

Experimente online.

Ambos usam a versão herdada de 05AB1E, pois a nova versão requer um explícito €Santes doζ ..

Explicação:

ε       # 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)
Kevin Cruijssen
fonte
Estava pensando gD¸s∍ÝδΩcomo, mas é mais longo ... e ooo ... isso nem funciona no novo 05AB1E;).
Magic Octopus Urn
1

C (gcc) , 131 bytes

f(char*s){int l=strlen(s),R[l],i=l,j;for(srand(time(0));i--;)R[i]=rand()%l;for(;++i<l*l;printf("\n%c"+!!j,i/l^R[j]?32:s[j]))j=i%l;}

Experimente online!

gastropner
fonte
Sugerir em R[j=i%l]?32:s[j]));vez deR[j]?32:s[j]))j=i%l;
ceilingcat
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)

Isso define uma função fque aceita a Stringou Vector{Char}e retorna umaMatrix{Char} .

Ungolfed:

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

Exemplo:

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

Isso certamente poderia ser melhor; minhas habilidades no golfe são bastante enferrujadas.

Experimente online!

Alex A.
fonte
1

Perl 5 -F , 50 49 bytes

-1 por @DomHastings

map$;[rand@F][$i++]=$_,@F;say map$_||' ',@$_ for@

Experimente online!

Xcali
fonte
Bom, realmente funciona! : P Você também pode salvar alguns bytes com map$_||$",@$_!
Dom Hastings
1

PowerShell , 108 102 98 bytes

-4 bytes graças ao mazzy

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

Experimente online!

Basicamente, itera 1..lengtha string duas vezes, uma vez para obter localizações aleatórias de linhas para cada caractere e uma segunda vez para realmente construir cada linha usando esses índices. Descobrir como fazer isso de uma só vez é onde estão as grandes economias de bytes.

Veskah
fonte
1
Experimente online! ?
mazzy 17/07
0

SmileBASIC 3, 62 bytes

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

Vermelho , 84 bytes

func[s][foreach n random collect[repeat n length? s[keep n]][print pad/left s/:n n]]

Experimente online!

Galen Ivanov
fonte
0

Python - 92 bytes

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])
Maltysen
fonte
Você tem que incluir oimport random
MilkyWay90
@ MilkyWay90 d'oh
Maltysen
1
Você pode salvar 1 byte usando from random import*.
orthoplex
Eu acho map(None,...que não funciona no Python 3, então você deve especificar o Python 2 no seu título.
orthoplex
0

K (oK) , 20 bytes

Solução:

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

Experimente online!

Explicação:

+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
rua
fonte
0

Python 3 , 140 131 bytes

from random import*
def f(s):
	e=range(len(s))
	p=[choice(e)for t in s]
	for r in e:print(''.join((r-p[i]and' 'or s[i]for i in e)))

Experimente online!

movatica
fonte
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]]))

Cria uma lista de opções aleatórias e, em seguida, cria uma lista de colunas com espaço em branco em todos os lugares, exceto no índice especificado por cada escolha aleatória. As colunas são transpostas em linhas e impressas com novas linhas entre elas.

Experimente online!

CyborgOctopus
fonte