Niech postacie padają

31

Zainspirowany tym mini-wyzwaniem na czacie.

Biorąc pod uwagę ciąg znaków (tylko znaki drukowalne ASCII), wypisz ciąg znaków z literami „pada” w dół. Każda litera musi być losową liczbą linii w dół (losowo między0 i długością łańcucha, z których każda ma niezerowe prawdopodobieństwo) i tylko jeden znak na kolumnę. Wszystkie możliwe wyjścia muszą ponownie mieć niezerowe prawdopodobieństwo wystąpienia.

To może być trochę mylące, więc oto przykład (wzięty z tej CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Zwróć uwagę, że wartość Hjest o jedno miejsce w dół, dwartość o zero w dół, a llowszystko się zgadza. rJest najdalej w dół, co 9, ale nadal jest mniejsza niż długość łańcucha z dala od góry. To tylko jeden przykład, istnieje wiele innych możliwości wprowadzania danych Hello World.

Inne przykłady mogą być:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dane wejściowe są gwarantowane jako niepuste (tzn. Nigdy nie otrzymasz ""jako danych wejściowych).
  • Możesz wydrukować go do STDOUT lub zwrócić jako wynik funkcji.
  • Dopuszczalny jest pełny program lub funkcja.
  • Dopuszczalna jest dowolna ilość obcych białych znaków, pod warunkiem, że znaki odpowiednio ustawią się w linii (np. Nie krępuj się padać jak prostokąt).
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
2
Myślałem, że będzie to wymagało animacji, gdy czytam tytuł. Czy mieliśmy animowaną wersję tego?
Kudłaty
@Shaggy Nie widziałem ani nie mogłem znaleźć.
AdmBorkBork
„Dowolna ilość obcych białych znaków jest dopuszczalna” - czy obejmuje to wiodącą linię białych znaków?
Jonathan Allan
Wiem, że mieliśmy jeden oparty na kodzie Matrix, ale powodzenia w znalezieniu go z tymi 2 słowami kluczowymi! Nie masz nic przeciwko, jeśli pomyślę o piaskownicy?
Kudłaty
Jakie odpowiedzi maksymalnego rozmiaru wejściowego należy wprowadzić? Widzę, że wiele osób korzysta z losowych funkcji, które używają „pseudolosowego” w zapleczu, a niektóre słowa wejściowe są większe niż rozmiar zarodka używanego w tych generatorach, i zawiodą „Wszystkie możliwe wyniki muszą ponownie mieć niezerowe prawdopodobieństwo wystąpienia. ” ograniczenie, które określiłeś
Ferrybig

Odpowiedzi:

5

R 104 bajty

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

Wypróbuj online!

Wprowadź jako ciąg; pisze na standardowe wyjście.

Giuseppe
źródło
Możesz zaoszczędzić bajt, używając scan(,'')i zagnieżdżając kilka wywołań, ale szczerze mówiąc, zdecydowanie wolę podejście funkcyjne, ten drugi jest ohydny dla minimalnego wzmocnienia. Może jednak zrodzić kilka pomysłów. Wypróbuj online!
CriminallyVulgar
Myślę, że sample(l,,T)wystarczy sample(l,l,T)(-1 bajt).
Robin Ryder
4

JavaScript (ES6), 72 bajty

Pobiera dane wejściowe jako listę znaków. Zwraca macierz znaków.

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

Wypróbuj online!

Arnauld
źródło
Myślę, że można uratować jeden bajt, nie negując wyrażenia potrójnego.
orthoplex
2
@orthoplex To nie działałoby, ponieważ (0|'A') === (0|undefined)i pozostałe litery nie będą już gwarantowane w ostatnim rzędzie. (Więc w zasadzie jest tak, jakby |!a[y+1]został całkowicie usunięty.)
Arnauld
Google twierdzi, że Math.random()zwraca liczbę w [0, 1), więc nie możesz Math.random()<.5zostać Math.random()>0?
nedla2004
@ nedla2004 Teoretycznie tak. W praktyce, myślę, że to jest bardzo prawdopodobne, że realizacja (y) PRNG nie można ewentualnie powrócić dokładnie (nie mówiąc już wystarczająco blisko 0 jest tak, że wszystkie konfiguracje faktycznie mają szansę wystąpić). Ponieważ definiujemy język na podstawie jego implementacji, osobiście uważam, że jest on zatem nieprawidłowy. 0 0
Arnauld
Dla jakiej platformy stworzyłeś swój JavaScript? Ponieważ wyzwanie ma wymóg unikatowości i nie określa maksymalnego wejścia, ma to naprawdę znaczenie, ponieważ większość platform korzysta z math.random()implementacji, która ma stan wewnętrzny, a zatem nie może wygenerować unikalnego wyniku.
Ferrybig
4

Pyth - 9 bajtów

Wyświetla listę linii.

.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

Wypróbuj online .

Maltysen
źródło
4

J , 30 19 bajtów

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

Wypróbuj online!

Conor O'Brien
źródło
1
0|:]{.~"+_1-#?#za 15 bajtów
Galen Iwanow
@GalenIvanov Uwielbiam ten pomysł, ale ponieważ umowa z diadem trwa bez powtórzeń, zakres produktów nie obejmuje pełnego zakresu możliwości. np. losowe upuszczenie dwóch liter na tę samą wysokość nie będzie możliwe.
Jonasz
@ Conor, Możesz zrobić 0|:]{.~"+_2-#?@##dla 17 bajtów bez zmiany zachowania odpowiedzi.
Jonasz
1
@Jonah Tak, racja. Zrozumiałem to i miałem kolejne 17-bajtowe rozwiązanie.
Galen Iwanow
4

Japt , 8 bajtów

-1 bajt z @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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
1
8 bajtów
Kudłaty
lol @Shaggy Otrzymałem tę samą odpowiedź jakiś czas temu, właśnie dodałem wyjaśnienie. Dzięki i tak c:
Luis Felipe De Jesus Munoz
3

APL (Dyalog Unicode) , 16 bajtów SBCS

Anonimowa ukryta funkcja prefiksu

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

 długość sznurka

1+ jeden do tego dodany

≢⍴ kopie tego „długości”

∘? losowe liczby całkowite z zakresu 1… te, a następnie…

∘- negować, a następnie…

⊢↑¨⍨ zabierz więcej niż wiele elementów z każdej postaci, dopełniając po lewej stronie spacjami

∘↑ wymieszaj listę ciągów w macierz, dopełnianie ze spacjami po prawej stronie

 transponować

Wypróbuj online!

Adám
źródło
2

Japt , 8 bajtów

yÈùUÊö Ä

Spróbuj

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
Kudłaty
źródło
2

Galaretka , 10 bajtów

³LŻX⁶x;)z⁶

Wypróbuj 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
źródło
Możemy wyprowadzić wiodącą linię spacji, więc 9 bajtów (choć wydaje mi się, że może być 8 ...)
Jonathan Allan
@JonathanAllan nie byłby równoważny zakresowi 0..(length - 1)? Pytanie określa między 0 a długością łańcucha. A może coś mi brakuje?
Nick Kennedy
O tak, zapomniałem o włączeniu - kiedy trzy dni temu zapytałem o wiodące białe znaki, jestem prawie pewien, że miałem 9, i myślę, że to nie to, co zasugerowałem powyżej ... hmm
Jonathan Allan
2

Ruby , 59 57 55 bajtów

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

Wypróbuj online!

Wejścia 1D, wyjście 2D tablica znaków.

Kirill L.
źródło
2

PHP , 88 bajtów

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

Wypróbuj online!

Lub 94 bajty przy użyciu kryptograficznej funkcji losowych liczb całkowitych PHP .

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

Wypróbuj online!

Wejście od STDIN, wyjście do STDOUT. Uruchom jako:

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

 e      r d

H      o   

         l 


    o 

-1 bajt (pusty ciąg zamiast spacji) i +1 bajt (błąd po stronie reguł) dzięki do @ ASCII!

640 KB
źródło
Zastanawiam się, czy jest to dozwolone, ponieważ nie dołączasz tego <?php, co ?>zamyka. wydaje się również w porządku, jeśli $ojest pusty ciąg
tylko ASCII
@ Tylko ASCII, masz rację, pusty ciąg znaków również będzie działał (z nieco większą skargą). Nie jestem pewien, czy orzeczenie o używaniu tagów zamykających i otwierających ponownie, zaktualizuję go, aby pozostać w górę i w górę. Dzięki!
640 KB
Zauważ, że zasady tego wyzwania mówią: „Wszystkie możliwe wyniki muszą ponownie mieć niezerowe prawdopodobieństwo wystąpienia”, nie jest to możliwe z randfunkcją PHP , ponieważ możesz mieć tekst wejściowy, który wymaga więcej losowości niż wielkość wewnętrznego seed rand używa, więc technicznie twoja odpowiedź nie spełnia tego warunku we wszystkich sytuacjach
Ferrybig
@ Ferrybig Zgadzam się, że starsze PHP / libc randnie jest zbyt przydatne, jednak wszystkie obsługiwane / produkcyjne wersje PHP (7.1+) używają Mersenne Twister RND ( mt_rand) wewnętrznie do generowania liczb losowych. Czy obawiasz się, że nie jest to wystarczająco losowe w przypadku tego wyzwania?
640 KB
mt_randkorzysta również wewnętrznie z pseudolosowego systemu liczb, a także ma ograniczenia. Zakładając, że PHP jest skompilowany z liczbami 64-bitowymi (i że seed, używany randlub mt_randakceptuje ten pełny zakres) wygenerowałby unikalne dane wyjściowe dla słów o długości do 13 znaków lub krótszej. Całkiem ograniczające, jeśli mnie zapytasz
Ferrybig
1

Węgiel drzewny , 10 9 bajtów

↑Eθ◧ι⊕‽Lθ

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 1 bajt dzięki tylko @ ASCII. Wyjaśnienie:

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

Jak wskazuje tylko ASCII, możesz losowo przesuwać litery w górę zamiast w dół, aby uzyskać ten sam efekt (z tym wyjątkiem, że na dole może być więcej białych znaków zamiast na górze). Drukowanie tablicy znaków w górę jest równoznaczne z normalnym wydrukowaniem łańcucha, więc dopełnienie następnie po prostu przesuwa każdy znak w pionie o losową wartość.

Neil
źródło
zastanawiam się, czy wydruk zamiast tego zadziałałby?
Tylko ASCII,
1

05AB1E (starsza wersja) , 9 bajtów

εIgÝΩú}ζ»

Wprowadź jako ciąg znaków lub listę znaków (oba są w porządku).

Wypróbuj online.

Znacznie wolniejsza 9-bajtowa alternatywa:

gDÝsãΩúζ»

Wprowadź jako listę znaków.

Wypróbuj online.

Oba używają starszej wersji 05AB1E, ponieważ nowa wersja wymaga jawnego €Sprzedζ ..

Wyjaśnienie:

ε       # 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
źródło
Myślałem tak, gD¸s∍ÝδΩale jest już dłużej ... i ooo ... to nawet nie działa w nowym 05AB1E;).
Magic Octopus Urn
1

C (gcc) , 131 bajtów

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

Wypróbuj online!

gastropner
źródło
Zaproponuj R[j=i%l]?32:s[j]));zamiastR[j]?32:s[j]))j=i%l;
ceilingcat
1

Julia, 69 bajtów

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

To określa funkcję f, która akceptuje Stringlub Vector{Char}i zwracaMatrix{Char} .

Nie golfowany:

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

Przykład:

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

Z pewnością mogłoby być lepiej; moje umiejętności gry w golfa są dość zardzewiałe.

Wypróbuj online!

Alex A.
źródło
1

Perl 5 -F , 50 49 bajtów

-1 przez @DomHastings

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

Wypróbuj online!

Xcali
źródło
Fajnie, właściwie działa! : P Za pomocą tego możesz także zapisać kilka bajtów map$_||$",@$_!
Dom Hastings,
1

PowerShell , 108 102 98 bajtów

-4 bajty dzięki mazzy

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

Wypróbuj online!

Zasadniczo iteruje 1..lengthciąg dwa razy, raz, aby uzyskać losowe lokalizacje linii dla każdego znaku, i drugi raz, aby faktycznie zbudować każdą linię przy użyciu tych wskaźników. Dowiedzenie się, jak to zrobić za jednym zamachem, jest tam, gdzie są oszczędności dużych bajtów.

Veskah
źródło
0

SmileBASIC 3, 62 bajty

LINPUT T$L=LEN(T$)CLS
FOR I=0TO L-1LOCATE,RND(L+1)?T$[I];
NEXT
ślimak_
źródło
0

Czerwony , 84 bajtów

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

Wypróbuj online!

Galen Iwanow
źródło
0

Python - 92 bajty

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])
Maltysen
źródło
Musisz dołączyćimport random
MilkyWay90
@ MilkyWay90 d'oh
Maltysen
1
Zamiast tego możesz zapisać 1 bajt from random import*.
orthoplex
Myślę, że map(None,...nie działa w Pythonie 3, więc powinieneś podać Python 2 w swoim tytule.
orthoplex
0

K (oK) , 20 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

+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
źródło
0

Python 3 , 140 131 bajtów

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

Wypróbuj online!

movatica
źródło
0

Python 3, 208 bajtów

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

Tworzy listę losowych wyborów, a następnie tworzy listę kolumn z pustą przestrzenią wszędzie oprócz indeksu określonego przez każdy losowy wybór. Kolumny są transponowane na rzędy i drukowane z nowymi liniami między nimi.

Wypróbuj online!

CyborgOctopus
źródło