Fai piovere personaggi


31

Ispirato da questa mini-sfida di chat.

Data una stringa come input (solo caratteri stampabili ASCII), genera la stringa con le lettere "piove" in basso. Ogni lettera deve essere un numero casuale di righe verso il basso (casuale tra 0e la lunghezza della stringa, ognuna con probabilità diversa da zero) e solo un carattere per colonna. Tutte le uscite possibili devono avere di nuovo una probabilità diversa da zero.

Questo è forse un po 'confuso, quindi ecco un esempio (tratto da quella CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Nota come Hè uno spazio in basso, lo dzero è in basso e llotutto accade per allinearsi. Il rè il più lontano verso il basso, a 9, ma è ancora inferiore alla lunghezza della corda dall'alto. Questo è solo un esempio, ci sono dozzine di altre possibilità per l'input Hello World.

Altri esempi potrebbero essere:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Input e output possono essere forniti con qualsiasi metodo conveniente .
  • L'input è garantito non vuoto (ovvero, non riceverai mai ""come input).
  • È possibile stamparlo su STDOUT o restituirlo come risultato di una funzione.
  • È accettabile un programma completo o una funzione.
  • È accettabile qualsiasi quantità di spazio bianco estraneo, purché i caratteri siano allineati in modo appropriato (ad esempio, sentiti libero di riempire come un rettangolo).
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

2
Pensavo che questo avrebbe comportato l'animazione quando ho letto il titolo. Abbiamo avuto una versione animata di questo?
Shaggy,

@Shaggy Non che abbia mai visto o trovato.
AdmBorkBork,

"Qualsiasi quantità di spazio bianco estraneo è accettabile" - include una linea principale di spazio bianco?
Jonathan Allan,

So che ne abbiamo avuto uno basato sul codice Matrix, ma buona fortuna trovarlo con quelle 2 parole chiave! Ti dispiace se ho Sandbox l'idea?
Shaggy,

Qual è la dimensione massima di input che le risposte devono implementare? Sto vedendo che molte persone usano funzioni casuali che usano "pseudo-random" nel backendground, e alcune parole di input sono più grandi della dimensione del seme usato in quei generatori, e falliranno il "Tutti gli output possibili devono avere di nuovo un probabilità che non si verifichi zero. " vincolo che hai specificato
Ferrybig

Risposte:


5

R , 104 byte

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

Provalo online!

Input come stringa; scrive su stdout.


Puoi salvare un byte usando scan(,'')e annidando un sacco di chiamate ma sinceramente preferisco enormemente l'approccio funzionale, questo è orribile per un guadagno minimo. Potrebbe scatenare alcune idee, però. Provalo online!
CriminallyVulgar

Penso che sia sample(l,,T)sufficiente invece di sample(l,l,T)(-1 byte).
Robin Ryder,

4

JavaScript (ES6), 72 byte

Accetta input come un elenco di caratteri. Restituisce una matrice di caratteri.

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

Provalo online!


Penso che potresti salvare un byte non negando l'espressione ternaria.
orthoplex,

2
@orthoplex Non funzionerebbe perché (0|'A') === (0|undefined)e le lettere rimanenti non sarebbero più garantite per apparire nell'ultima riga. (Quindi, in sostanza, è proprio come è |!a[y+1]stato rimosso del tutto.)
Arnauld

Google dice che Math.random()restituisce un numero in [0, 1), quindi non potrebbe Math.random()<.5diventare Math.random()>0?
nedla2004,

@ nedla2004 In teoria sì. In pratica, penso che sia molto probabile che l'implementazione del PRNG non possa restituire esattamente (figuriamoci chiudere abbastanza 0 in modo che tutte le configurazioni abbiano effettivamente la possibilità di verificarsi). Poiché definiamo un linguaggio in base alla sua implementazione, penso personalmente che non sia quindi valido. 0 0
Arnauld,

Per quale piattaforma hai realizzato il tuo javascript? Poiché la sfida ha un requisito di unicità e non specifica un input massimo, questo è davvero importante, poiché la maggior parte delle piattaforme utilizza math.random()un'implementazione che ha uno stato interno e quindi non può generare output univoci.
Ferrybig

4

Pyth - 9 byte

Elenco di righe di output.

.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

Provalo online .


4

J , 30 19 byte

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

Provalo online!


1
0|:]{.~"+_1-#?#per 15 byte
Galen Ivanov il

@GalenIvanov Adoro questa idea, ma poiché l'accordo sulla diade prende senza ripetizione, la gamma di uscite non coprirà l'intera gamma di possibilità. ad esempio, non sarà possibile che 2 lettere siano cadute casualmente alla stessa altezza.
Giona

@Conor, puoi farlo 0|:]{.~"+_2-#?@##per 17 byte senza cambiare il comportamento della tua risposta.
Giona

1
@Jonah Sì, giusto. L'ho capito e avevo un'altra soluzione a 17 byte.
Galen Ivanov,

4

Japt , 8 byte

-1 byte da @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

Provalo online!



lol @Shaggy Ho avuto la stessa risposta qualche tempo fa, stavo solo aggiungendo una spiegazione. Grazie comunque c:
Luis felipe De jesus Munoz il

3

APL (Dyalog Unicode) , 16 byte SBCS

Funzione prefisso tacito anonimo

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

 lunghezza della stringa

1+ uno aggiunto a quello

≢⍴ "lunghezza" copie di quello

∘? numeri interi casuali nell'intervallo 1 ... quelli e poi ...

∘- negare, e poi ...

⊢↑¨⍨ prendi più di molti elementi da ciascun personaggio, riempiendo a sinistra gli spazi

∘↑ mescola elenco di stringhe in matrice, imbottitura con spazi a destra

 trasporre

Provalo online!


2

Japt , 8 byte

yÈùUÊö Ä

Provalo

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

Gelatina , 10 byte

³LŻX⁶x;)z⁶

Provalo 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

Siamo in grado di generare una linea principale di spazi, quindi 9 byte (anche se mi sembra che ci possa essere un 8 ...)
Jonathan Allan

@JonathanAllan non sarebbe equivalente alla gamma 0..(length - 1)? La domanda specifica tra 0 e la lunghezza della stringa. Oppure mi sfugge qualcosa?
Nick Kennedy,

Oh sì, mi sono dimenticato della inclusività - quando ho chiesto tre giorni fa di dirigere gli spazi bianchi sono abbastanza sicuro di avere un 9, e penso che non era quello che ho suggerito sopra ... hmm
Jonathan Allan


2

PHP , 88 byte

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

Provalo online!

O 94 byte usando la funzione di numeri interi casuali crittografici di PHP .

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

Provalo online!

Ingresso da STDIN, uscita a STDOUT. Correre come:

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

 e      r d

H      o   

         l 


    o 

-1 byte (stringa vuota anziché spazio) e +1 byte (err sul lato delle regole) grazie solo a @ ASCII!


chiedo se questo è permesso, dal momento che non si include <?phpciò che ?>chiude. sembra anche che vada bene se $oè la stringa vuota
solo ASCII il

@ Solo ASCII, hai ragione, funzionerà anche una stringa vuota (con un po 'più di lamentela). Non sono sicuro della regola sull'uso dei tag di chiusura e riapertura, lo aggiornerò per rimanere sempre aggiornato. Grazie!
640 KB

Si noti che le regole per questa sfida dicono "Tutti gli output possibili devono avere ancora una probabilità diversa da zero", questo non è possibile con la randfunzione PHP , in quanto è possibile avere un testo di input che richiede più casuale della dimensione dell'interiore usa seed rand, quindi tecnicamente la tua risposta non riesce a soddisfare questa condizione in tutte le situazioni
Ferrybig

@Ferrybig Sono d'accordo sul fatto che l'eredità PHP / libc randnon sia utile per molto, tuttavia tutte le versioni supportate / di produzione di PHP (7.1+) usano Mersenne Twister RND ( mt_rand) internamente per una generazione casuale di numeri. Ti preoccupi che questo non sia sufficientemente casuale per questa sfida?
640 KB

mt_randutilizza internamente anche un sistema di numeri pseudo casuali e presenta anche dei limiti. Supponendo che PHP sia compilato con numeri a 64 bit (e che il seed, utilizzato per rando mt_randaccetta questo intervallo completo) genererebbe output univoci per parole della lunghezza massima di 13 caratteri o inferiore. Abbastanza limitante se me lo chiedi
Ferrybig

1

Carbone , 10 9 byte

↑Eθ◧ι⊕‽Lθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: 1 byte salvato grazie solo a @ ASCII. Spiegazione:

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

Come sottolinea solo ASCII, è possibile spostare le lettere in modo casuale verso l'alto anziché verso il basso per lo stesso effetto (tranne per il fatto che potrebbe esserci spazio bianco in più nella parte inferiore anziché nella parte superiore). Stampare una serie di caratteri verso l'alto equivale a stampare normalmente una stringa, quindi il riempimento sfalsa ogni carattere verticalmente di un numero casuale.


chiedo se la stampa invece funzionerebbe?
ASCII il

1

05AB1E (legacy) , 9 byte

εIgÝΩú}ζ»

Immettere come stringa o elenco di caratteri (o va bene).

Provalo online.

Alternativa a 9 byte molto più lenta:

gDÝsãΩúζ»

Inserisci come un elenco di caratteri.

Provalo online.

Entrambi usano la versione legacy di 05AB1E, poiché la nuova versione richiede un esplicito €Sprima diζ ..

Spiegazione:

ε       # 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)

gD¸s∍ÝδΩStavo pensando sulla falsariga di ma è più lungo ... e ooo ... questo non funziona nemmeno nel nuovo 05AB1E;).
Magic Octopus Urn,

1

C (gcc) , 131 byte

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;}

Provalo online!


Suggerisci R[j=i%l]?32:s[j]));invece diR[j]?32:s[j]))j=i%l;
ceilingcat

1

Julia, 69 byte

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

Questo definisce una funzione fche accetta a Stringo Vector{Char}e restituisce aMatrix{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

Esempio:

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

Questo potrebbe sicuramente essere migliore; le mie abilità nel golf sono piuttosto arrugginite.

Provalo online!



1

PowerShell , 108 102 98 byte

-4 byte grazie a mazzy

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

Provalo online!

Fondamentalmente itera 1..lengthdue volte la stringa, una volta per ottenere posizioni di riga casuali per ciascun personaggio, e una seconda volta per costruire effettivamente ogni riga usando quegli indici. Capire come farlo in un colpo solo è dove si trovano i grandi risparmi di byte.



0

SmileBASIC 3, 62 byte

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


0

Python - 92 byte

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

Devi includereimport random
MilkyWay90 il

@ MilkyWay90 d'oh
Maltysen

1
È possibile salvare 1 byte utilizzando from random import*invece.
orthoplex,

Penso map(None,...che non funzioni in Python 3, quindi dovresti specificare Python 2 nel tuo titolo.
orthoplex,

0

K (oK) , 20 byte

Soluzione:

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

Provalo online!

Spiegazione:

+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 , 140 131 byte

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)))

Provalo online!


0

Python 3, 208 byte

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 un elenco di scelte casuali, quindi crea un elenco di colonne con spazi vuoti ovunque tranne che nell'indice specificato da ciascuna scelta casuale. Le colonne vengono trasposte in righe e stampate con nuove righe tra di loro.

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.