Faites pleuvoir des personnages

31

Inspiré par ce mini-défi de chat.

Étant donné une chaîne en entrée (caractères imprimables ASCII uniquement), sortez la chaîne avec les lettres "pleut" vers le bas. Chaque lettre doit être un nombre aléatoire de lignes vers le bas (aléatoire entre 0et la longueur de la chaîne, chacune ayant une probabilité non nulle), et un seul caractère par colonne. Toutes les sorties possibles doivent à nouveau avoir une probabilité non nulle de se produire.

C'est peut-être un peu déroutant, alors voici un exemple (tiré de ce CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Notez comment le Hest un espace vers le bas, le dzéro vers le bas et le llotout arrive à s'aligner. Le rest le plus bas, 9mais est toujours inférieur à la longueur de la corde à partir du haut. Ce n'est qu'un exemple, il existe des dizaines d'autres possibilités de saisie Hello World.

D'autres exemples pourraient être:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
  • L'entrée est garantie non vide (c'est-à-dire que vous ne recevrez jamais ""en entrée).
  • Vous pouvez l’imprimer dans STDOUT ou le renvoyer comme résultat de la fonction.
  • Un programme complet ou une fonction sont acceptables.
  • N'importe quelle quantité d'espace blanc étranger est acceptable, tant que les caractères s'alignent de manière appropriée (par exemple, n'hésitez pas à remplir comme un rectangle).
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
AdmBorkBork
la source
2
Je pensais que cela allait impliquer de l'animation quand j'ai lu le titre. En avons-nous une version animée?
Shaggy
@Shaggy Pas que j'ai vu ou que j'ai pu trouver.
AdmBorkBork
"N'importe quelle quantité d'espace blanc étranger est acceptable" - cela inclut-il une ligne principale d'espace blanc?
Jonathan Allan
Je sais que nous en avons eu un basé sur le code Matrix, mais bonne chance pour le trouver avec ces 2 mots-clés! Ça vous dérange si je Sandbox l'idée?
Shaggy
Quelle est la taille d'entrée maximale que les réponses doivent implémenter? Je vois beaucoup de gens utiliser des fonctions aléatoires qui utilisent "pseudo-aléatoire" dans le backendground, et certains mots d'entrée sont plus grands que la taille de la graine utilisée dans ces générateurs, et ils échoueront "Toutes les sorties possibles doivent à nouveau avoir un probabilité non nulle de se produire. " contrainte que vous avez spécifiée
Ferrybig

Réponses:

5

R , 104 octets

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

Essayez-le en ligne!

Entrée sous forme de chaîne; écrit à stdout.

Giuseppe
la source
Vous pouvez enregistrer un octet en utilisant scan(,'')et en imbriquant un tas d'appels mais honnêtement, je préfère largement l'approche par fonction, cette autre est hideuse pour un gain minimal. Cela pourrait cependant susciter quelques idées. Essayez-le en ligne!
CriminallyVulgar
Je pense que cela sample(l,,T)suffit au lieu de sample(l,l,T)(-1 octet).
Robin Ryder
4

JavaScript (ES6), 72 octets

Prend la saisie sous forme de liste de caractères. Renvoie une matrice de caractères.

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

Essayez-le en ligne!

Arnauld
la source
Je pense que vous pourriez économiser un octet en ne niant l'expression ternaire.
orthoplex
2
@orthoplex Cela ne fonctionnerait pas car (0|'A') === (0|undefined)et les lettres restantes ne seraient plus garanties d'apparaître sur la dernière ligne. (Donc, en gros, c'est comme si tout |!a[y+1]avait été supprimé.)
Arnauld
Google dit que Math.random()renvoie un nombre dans [0, 1), donc ne pourrait pas Math.random()<.5devenir Math.random()>0?
nedla2004
@ nedla2004 En théorie, oui. En pratique, je pense qu'il est très probable que la ou les implémentations du PRNG ne puissent pas retourner exactement (sans parler de fermer suffisamment de 0 pour que toutes les configurations aient réellement une chance de se produire). Parce que nous définissons un langage par son implémentation, je pense personnellement qu'il n'est donc pas valide. 0 0
Arnauld
Pour quelle plateforme avez-vous créé votre javascript? Étant donné que le défi a une exigence d'unicité et ne spécifie pas d'entrée maximale, cela importe vraiment, car la plupart des plates-formes utilisent une math.random()implémentation qui a un état interne et ne peut donc pas générer de sortie unique.
Ferrybig
4

Pyth - 9 octets

Affiche la liste des lignes.

.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

Essayez-le en ligne .

Maltysen
la source
4

J , 30 19 octets

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

Essayez-le en ligne!

Conor O'Brien
la source
1
0|:]{.~"+_1-#?#pour 15 octets
Galen Ivanov
@GalenIvanov J'adore cette idée, mais comme l'accord avec la dyade prend sans répétition, la gamme de sorties ne couvrira pas la gamme complète des possibilités. par exemple, il ne sera pas possible que 2 lettres tombent aléatoirement à la même hauteur.
Jonah
@Conor, vous pouvez le faire 0|:]{.~"+_2-#?@##pour 17 octets sans changer le comportement de votre réponse.
Jonah
1
@ Jonah Oui, c'est vrai. Je m'en suis rendu compte et j'ai eu une autre solution de 17 octets.
Galen Ivanov
4

Japt , 8 octets

-1 octet 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

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
1
8 octets
Shaggy
lol @Shaggy J'ai eu la même réponse il y a quelque temps, je venais d'ajouter une explication. Merci quand même c:
Luis felipe De jesus Munoz
3

APL (Dyalog Unicode) , 16 octets SBCS

Fonction de préfixe tacite anonyme

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

 longueur de chaîne

1+ on y a ajouté

≢⍴ des copies "de longueur" de cette

∘? des nombres entiers aléatoires dans la plage 1… ceux-là, puis…

∘- nier, puis ...

⊢↑¨⍨ prendre que de nombreux éléments de chaque caractère, remplissage à gauche avec des espaces

∘↑ mélanger la liste des chaînes dans la matrice, le remplissage avec des espaces à droite

 transposer

Essayez-le en ligne!

Adam
la source
2

Japt , 8 octets

yÈùUÊö Ä

L'essayer

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
Hirsute
la source
2

Gelée , 10 octets

³LŻX⁶x;)z⁶

Essayez-le en ligne!

      )    | 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
la source
Nous pouvons produire une ligne d'espaces de tête, donc 9 octets (même si j'ai l'impression qu'il peut y en avoir 8 ...)
Jonathan Allan
@JonathanAllan cela ne serait-il pas équivalent à la gamme 0..(length - 1)? La question spécifie entre 0 et la longueur de la chaîne. Ou est-ce que je manque quelque chose?
Nick Kennedy
Oh oui, j'ai oublié l'inclusivité - quand j'ai demandé il y a trois jours à propos des espaces blancs, je suis presque sûr d'avoir un 9, et je pense que ce n'était pas ce que j'ai suggéré ci-dessus ... hmm
Jonathan Allan
2

Rubis , 59 57 55 octets

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

Essayez-le en ligne!

Entrées 1D, sorties tableau 2D de caractères.

Kirill L.
la source
2

PHP , 88 octets

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

Essayez-le en ligne!

Ou 94 octets en utilisant des entiers aléatoires cryptographiques de PHP .

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

Essayez-le en ligne!

Entrée de STDIN, sortie àSTDOUT . Courir comme:

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

 e      r d

H      o   

         l 


    o 

-1 octet (chaîne vide au lieu de l'espace) et +1 octet (erreur du côté des règles) merci à @ ASCII uniquement!

640 Ko
la source
Je me demande si cela est autorisé, car vous n'incluez pas celui <?phpqui ?>ferme. semble également que ça va si $ola chaîne est vide
ASCII uniquement le
@ ASCII uniquement, vous avez raison, une chaîne vide fonctionnera également (avec un peu plus de plaintes). Je ne suis pas sûr que la décision d'utiliser des balises de fermeture et de réouverture, je vais la mettre à jour pour rester en place. THX!
640 Ko
Notez que les règles de ce défi disent "Toutes les sorties possibles doivent à nouveau avoir une probabilité non nulle de se produire", ce n'est pas possible avec la randfonction PHP , car vous pouvez avoir un texte d'entrée qui nécessite plus aléatoire que la taille de l'interne graine rand utilise, donc techniquement votre réponse ne
remplit
@Ferrybig Je suis d'accord que l'héritage PHP / libc randn'est pas très utile, cependant toutes les versions supportées / de production de PHP (7.1+) utilisent Mersenne Twister RND ( mt_rand) en interne pour une génération de nombres aléatoires. Craignez-vous que ce ne soit pas suffisamment aléatoire pour ce défi?
640 Ko
mt_randutilise également un système de nombres pseudo aléatoires en interne, et présente également des limites. En supposant que PHP est compilé avec des nombres de 64 bits (et que la graine, utilisée pour randou mt_randaccepte cette plage complète) générerait des sorties uniques pour les mots jusqu'à la longueur de 13 caractères ou moins. Assez limitant si vous me demandez
Ferrybig
1

Fusain , 10 9 octets

↑Eθ◧ι⊕‽Lθ

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Edit: 1 octet enregistré grâce à @ ASCII uniquement. Explication:

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

Comme le souligne ASCII uniquement, vous pouvez déplacer les lettres de façon aléatoire vers le haut plutôt que vers le bas pour le même effet (sauf qu'il peut y avoir un espace blanc supplémentaire en bas plutôt qu'en haut). L'impression d'un tableau de caractères vers le haut équivaut à l'impression d'une chaîne normalement, de sorte que le remplissage compense ensuite chaque caractère verticalement d'une quantité aléatoire.

Neil
la source
me demande si l'impression à la place fonctionnerait?
uniquement à l'ASCII
1

05AB1E (hérité) , 9 octets

εIgÝΩú}ζ»

Saisie sous forme de chaîne ou de liste de caractères (c'est bien).

Essayez-le en ligne.

Alternative de 9 octets beaucoup plus lente:

gDÝsãΩúζ»

Saisissez une liste de caractères.

Essayez-le en ligne.

Les deux utilisent la version héritée de 05AB1E, car la nouvelle version nécessite une explicite €Savant laζ ..

Explication:

ε       # 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
la source
Pensais dans le sens de gD¸s∍ÝδΩmais c'est plus long ... et ooo ... cela ne fonctionne même pas dans le nouveau 05AB1E;).
Magic Octopus Urn
1

C (gcc) , 131 octets

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

Essayez-le en ligne!

gastropner
la source
Suggérer à la R[j=i%l]?32:s[j]));place deR[j]?32:s[j]))j=i%l;
plafondcat
1

Julia, 69 octets

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

Ceci définit une fonction fqui accepte un Stringou Vector{Char}et retourne unMatrix{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

Exemple:

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

Cela pourrait sûrement être mieux; mes compétences de golf sont assez rouillées.

Essayez-le en ligne!

Alex A.
la source
1

Perl 5 -F , 50 49 octets

-1 par @DomHastings

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

Essayez-le en ligne!

Xcali
la source
Nice, fonctionne réellement! : P Vous pouvez également économiser quelques octets map$_||$",@$_!
Dom Hastings
1

PowerShell , 108 102 98 octets

-4 octets grâce à mazzy

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

Essayez-le en ligne!

Fondamentalement, itère 1..lengthdeux fois la chaîne, une fois pour obtenir des emplacements de ligne aléatoires pour chaque caractère, et une deuxième fois pour construire réellement chaque ligne en utilisant ces indices. Déterminer comment le faire en un seul balayage est là où se trouvent les économies de gros octets.

Veska
la source
0

SmileBASIC 3, 62 octets

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

Rouge , 84 octets

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

Essayez-le en ligne!

Galen Ivanov
la source
0

Python - 92 octets

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])
Maltysen
la source
Vous devez inclure leimport random
MilkyWay90
@ MilkyWay90 d'oh
Maltysen
1
Vous pouvez enregistrer 1 octet en utilisant à la from random import*place.
orthoplex
Je pense que map(None,...cela ne fonctionne pas en Python 3, vous devez donc spécifier Python 2 dans votre titre.
orthoplex
0

K (oK) , 20 octets

Solution:

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

Essayez-le en ligne!

Explication:

+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
streetster
la source
0

Python 3 , 140 131 octets

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

Essayez-le en ligne!

movatica
la source
0

Python 3, 208 octets

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

Crée une liste de choix aléatoires, puis crée une liste de colonnes avec un espace vide partout sauf à l'index spécifié par chaque choix aléatoire. Les colonnes sont transposées en lignes et imprimées avec des retours à la ligne entre elles.

Essayez-le en ligne!

CyborgOctopus
la source