Lass es Zeichen regnen

31

Inspiriert von dieser Chat-Mini-Challenge.

Wenn Sie eine Zeichenfolge als Eingabe angeben (nur ASCII-druckbare Zeichen), geben Sie die Zeichenfolge mit den Buchstaben "raining" aus. Jeder Buchstabe muss eine zufällige Anzahl von Zeilen nach unten sein (zufällig dazwischen)0 und die Länge der Zeichenfolge, jede mit einer Wahrscheinlichkeit ungleich Null) und nur ein Zeichen pro Spalte sein. Alle möglichen Ausgaben müssen wieder eine Wahrscheinlichkeit ungleich Null haben.

Das ist vielleicht ein bisschen verwirrend, also hier ein Beispiel (aus dieser CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Beachten Sie, wie das Heine Leerzeichen nach unten ist, die dNull nach unten ist und lloalle zufällig in einer Reihe stehen. Das rist das am weitesten unten liegende, 9ist aber immer noch weniger als die Saitenlänge von der Spitze entfernt. Dies ist nur ein Beispiel, es gibt Dutzende anderer EingabemöglichkeitenHello World .

Andere Beispiele könnten sein:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Die Ein- und Ausgabe kann auf jede bequeme Weise erfolgen .
  • Die Eingabe ist garantiert nicht leer (dh Sie werden niemals ""als Eingabe empfangen ).
  • Sie können es an STDOUT drucken oder als Funktionsergebnis zurückgeben.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Beliebig viel fremdes Leerzeichen ist akzeptabel, solange die Zeichen richtig ausgerichtet sind (z. B. können Sie die Zeichen auch als Rechtecke auffüllen).
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
AdmBorkBork
quelle
2
Ich dachte, das würde eine Animation beinhalten, als ich den Titel las. Hatten wir eine animierte Version davon?
Shaggy
@ Shaggy Nicht, dass ich gesehen oder finden konnte.
AdmBorkBork
"Jede Menge von fremden Leerzeichen ist akzeptabel" - schließt das eine führende Zeile von Leerzeichen ein?
Jonathan Allan
Ich weiß, wir haben einen basierend auf dem Matrix-Code, aber viel Glück beim Finden mit diesen 2 Schlüsselwörtern! Stört es Sie, wenn ich die Idee Sandbox?
Shaggy
Welche maximale Eingabegröße müssen Antworten implementieren? Ich sehe, dass viele Leute Zufallsfunktionen verwenden, die "pseudozufällig" im Hintergrund verwenden, und bestimmte Eingabewörter sind größer als der in diesen Generatoren verwendete Startwert, und sie schlagen fehl, wenn "Alle möglichen Ausgaben müssen wieder ein haben Nicht-Null-Wahrscheinlichkeit des Auftretens. " Einschränkung, die Sie angegeben haben
Ferrybig

Antworten:

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

Probieren Sie es online!

Eingabe als String; schreibt an stdout

Giuseppe
quelle
Sie können ein Byte sparen, indem Sie scan(,'')eine Reihe von Aufrufen verwenden und verschachteln, aber ehrlich gesagt bevorzuge ich den Funktionsansatz. Dieser andere Ansatz ist für minimalen Gewinn abscheulich. Könnte jedoch einige Ideen auslösen. Probieren Sie es online!
CriminallyVulgar
Ich denke, es sample(l,,T)reicht statt sample(l,l,T)(-1 Byte).
Robin Ryder
4

JavaScript (ES6), 72 Byte

Übernimmt die Eingabe als Liste von Zeichen. Gibt eine Zeichenmatrix zurück.

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

Probieren Sie es online!

Arnauld
quelle
Ich denke, Sie könnten ein Byte sparen, indem Sie den ternären Ausdruck nicht negieren.
Orthoplex
2
@orthoplex Das würde nicht funktionieren, da (0|'A') === (0|undefined)die verbleibenden Buchstaben nicht mehr in der letzten Zeile erscheinen. (Im Grunde ist es so, als ob |!a[y+1]es komplett entfernt wurde.)
Arnauld,
Google sagt, dass Math.random()eine Zahl in [0, 1) zurückgegeben wird, kann also nicht Math.random()<.5werden Math.random()>0?
nedla2004,
@ nedla2004 Theoretisch ja. In der Praxis ist es sehr wahrscheinlich, dass die Implementierung (en) des PRNG möglicherweise nicht genau (geschweige denn genügend 0 schließen , damit alle Konfigurationen tatsächlich eine Chance haben). Da wir eine Sprache durch ihre Implementierung definieren, halte ich sie für ungültig. 0 0
Arnauld
Für welche Plattform haben Sie Ihr Javascript erstellt? Da die Herausforderung eine Eindeutigkeitsanforderung hat und keine maximale Eingabe angibt, spielt dies eine wichtige Rolle, da die meisten Plattformen eine math.random()Implementierung verwenden, die einen internen Status hat und daher keine eindeutige Ausgabe generieren kann.
Ferrybig
4

Pyth - 9 Bytes

Gibt eine Liste von Zeilen aus.

.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

Probieren Sie es online aus .

Maltysen
quelle
4

J , 30 bis 19 Bytes

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

Probieren Sie es online!

Conor O'Brien
quelle
1
0|:]{.~"+_1-#?#für 15 Bytes
Galen Ivanov
@GalenIvanov Ich liebe diese Idee, aber da das Dyadendeal ohne Wiederholung abläuft, wird die Bandbreite der Ausgänge nicht die gesamte Bandbreite der Möglichkeiten abdecken. Zum Beispiel ist es nicht möglich, dass 2 Buchstaben zufällig auf dieselbe Höhe gefallen sind.
Jonah
@Conor, Sie können 0|:]{.~"+_2-#?@##für 17 Bytes tun, ohne das Verhalten Ihrer Antwort zu ändern.
Jonah
1
@Jonah Ja, richtig. Ich erkannte das und hatte eine andere 17-Byte-Lösung.
Galen Ivanov
4

Japt , 8 Bytes

-1 Byte von @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

Probieren Sie es online!

Luis Felipe De Jesus Munoz
quelle
1
8 Bytes
Shaggy
lol @Shaggy Ich habe die gleiche Antwort vor einiger Zeit bekommen, ich habe nur eine Erklärung hinzugefügt.
Trotzdem
3

APL (Dyalog Unicode) , 16 Byte SBCS

Anonyme implizite Präfixfunktion

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

 Länge der Zeichenfolge

1+ man fügte hinzu

≢⍴ "Länge" Kopien davon

∘? zufällige ganze Zahlen im Bereich 1 ... diese und dann ...

∘- negieren und dann ...

⊢↑¨⍨ nimm als viele Elemente von jedem Charakter und fülle links mit Leerzeichen auf

∘↑ Mischen Sie die Liste der Zeichenfolgen in eine Matrix und füllen Sie sie mit Leerzeichen auf der rechten Seite

 transponieren

Probieren Sie es online!

Adam
quelle
2

Japt , 8 Bytes

yÈùUÊö Ä

Versuch es

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
Zottelig
quelle
2

Gelee , 10 Bytes

³LŻX⁶x;)z⁶

Probieren Sie es 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
quelle
Wir können eine führende Zeile von Leerzeichen ausgeben, also 9 Bytes (obwohl ich denke, dass es vielleicht eine 8 gibt ...)
Jonathan Allan
@ JonathanAllan wäre das nicht gleichbedeutend mit der Reichweite 0..(length - 1)? Die Frage gibt zwischen 0 und der Stringlänge an. Oder vermisse ich etwas?
Nick Kennedy
Oh ja, ich habe die Inklusivität vergessen - als ich vor drei Tagen nach führenden Leerzeichen gefragt habe, bin ich mir ziemlich sicher, dass ich eine 9 hatte, und ich denke, das war nicht das, was ich oben vorgeschlagen habe ... hmm
Jonathan Allan
2

Ruby , 59 57 55 Bytes

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

Probieren Sie es online!

Eingabe von 1D, Ausgabe von 2D-Zeichenfeldern.

Kirill L.
quelle
2

PHP , 88 Bytes

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

Probieren Sie es online!

Oder 94 Bytes mit den kryptografischen Zufallszahlen von PHP .

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

Probieren Sie es online!

Eingabe von STDIN, Ausgabe an STDOUT. Rennen wie:

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

 e      r d

H      o   

         l 


    o 

-1 Byte (leere Zeichenkette statt Leerzeichen) und +1 Byte (Fehler auf der Seite der Regeln) Danke an @ ASCII-only!

640 KB
quelle
frage mich, ob das erlaubt ist, da du das nicht mit einschließt <?php, das ?>schließt. Auch scheint es in Ordnung zu sein, wenn $odie leere Zeichenfolge
ASCII - ist.
@ ASCII-only, Sie haben Recht, leere Zeichenfolge wird auch funktionieren (mit etwas mehr Beschwerde). Ich bin mir nicht sicher, ob das Verwenden von schließenden und wieder öffnenden Tags die Regel ist. Danke!
640 KB,
Beachten Sie, dass die Regeln für diese Abfrage lauten: "Alle möglichen Ausgaben müssen mit einer Wahrscheinlichkeit ungleich Null ausgegeben werden". Dies ist mit der PHP- randFunktion nicht möglich , da Sie einen Eingabetext haben können, der mehr Zufall als die Größe des internen Textes erfordert seed rand verwendet, so technisch Ihre Antwort nicht in allen Situationen diese Bedingung zu erfüllen
Ferrybig
@Ferrybig Ich bin damit einverstanden, dass das alte PHP / libc randfür vieles nicht nützlich ist, jedoch verwenden alle unterstützten / Produktionsversionen von PHP (7.1+ mt_rand) intern Mersenne Twister RND ( ) für eine Zufallszahlengenerierung. Befürchten Sie, dass dies für diese Herausforderung nicht zufällig genug ist?
640 KB,
mt_randverwendet auch intern ein Pseudozufallszahlensystem und weist auch die Einschränkungen auf. Angenommen, PHP wird mit 64-Bit-Zahlen kompiliert (und der Startwert, der für diesen gesamten Bereich verwendet wird randoder mt_randdiesen akzeptiert), würde eindeutige Ausgaben für Wörter mit einer Länge von bis zu 13 Zeichen oder weniger generieren. Ziemlich einschränkend, wenn Sie mich fragen
Ferrybig
1

Kohle , 10 9 Bytes

↑Eθ◧ι⊕‽Lθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 1 Byte dank nur @ ASCII gespeichert. Erläuterung:

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

Wie nur in ASCII angegeben, können Sie die Buchstaben für den gleichen Effekt nach dem Zufallsprinzip nach oben statt nach unten verschieben (mit der Ausnahme, dass möglicherweise unten und nicht oben ein zusätzlicher Leerraum vorhanden ist). Das Drucken eines Arrays von Zeichen nach oben entspricht dem normalen Drucken einer Zeichenfolge, sodass der Abstand jedes Zeichen nur um einen zufälligen Betrag vertikal versetzt.

Neil
quelle
Frage mich, ob das Drucken stattdessen funktionieren würde?
Nur ASCII
1

05AB1E (Legacy) , 9 Byte

εIgÝΩú}ζ»

Eingabe als Zeichenfolge oder Liste von Zeichen (entweder ist in Ordnung).

Probieren Sie es online aus.

Viel langsamere 9-Byte-Alternative:

gDÝsãΩúζ»

Eingabe als Liste von Zeichen.

Probieren Sie es online aus.

Beide verwenden die Legacy - Version von 05AB1E, da die neue Version explizit erfordert , €Sbevor die ζ..

Erläuterung:

ε       # 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
quelle
Dachte nach dem Vorbild von, gD¸s∍ÝδΩaber es ist länger ... und ooo ... das funktioniert im neuen 05AB1E nicht einmal;).
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;}

Probieren Sie es online!

Gastropner
quelle
Schlagen Sie R[j=i%l]?32:s[j]));stattdessen vorR[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)

Dies definiert eine Funktion f, die ein Stringoder akzeptiert Vector{Char}und ein zurückgibt Matrix{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

Beispiel:

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

Das könnte sicherlich besser sein; Meine Golffähigkeiten sind ziemlich rostig.

Probieren Sie es online!

Alex A.
quelle
1

Perl 5 -F , 50 49 Bytes

-1 von @DomHastings

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

Probieren Sie es online!

Xcali
quelle
Schön, funktioniert tatsächlich! : P Mit können Sie auch ein paar Bytes sparen map$_||$",@$_!
Dom Hastings
1

PowerShell , 108 102 98 Byte

-4 Bytes dank mazzy

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

Probieren Sie es online!

Grundsätzlich wird 1..lengthdie Zeichenfolge zweimal wiederholt, einmal, um zufällige Zeilenpositionen für jedes Zeichen zu ermitteln, und ein zweites Mal, um jede Zeile mithilfe dieser Indizes zu erstellen. In einem Durchgang herauszufinden, wie es geht, ist die große Byte-Einsparung.

Veskah
quelle
0

SmileBASIC 3, 62 Bytes

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

Rot , 84 Bytes

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

Probieren Sie es online!

Galen Ivanov
quelle
0

Python - 92 Bytes

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])
Maltysen
quelle
Sie müssen dieimport random
MilkyWay90
@ MilkyWay90 d'oh
Maltysen
1
Sie können 1 Byte speichern, indem Sie from random import*stattdessen verwenden.
Orthoplex
Ich denke, es map(None,...funktioniert nicht in Python 3, daher sollten Sie Python 2 in Ihrem Titel angeben.
Orthoplex
0

K (ok) , 20 Bytes

Lösung:

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

Probieren Sie es online!

Erläuterung:

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

Probieren Sie es online!

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

Erstellt eine Liste mit zufälligen Auswahlen und erstellt dann überall eine Liste mit Spalten mit Leerzeichen, außer an dem von jeder zufälligen Auswahl angegebenen Index. Die Spalten werden in Zeilen transponiert und mit Zeilenumbrüchen ausgedruckt.

Probieren Sie es online!

CyborgOctopus
quelle