Зробіть це дощовими персонажами


31

Натхненний цим міні-викликом для чату.

Давши рядок як вхідний (лише символи для друку ASCII), виведіть рядок з літерами "дощить" вниз. Кожна літера має бути випадковим числом рядків вниз (випадковим між 0і довжиною рядка, кожен з яких має нульову ймовірність), і лише один символ на стовпчик. Усі можливі виходи повинні знову мати нульову ймовірність виникнення.

Це, мабуть, трохи заплутано, тож ось приклад (взятий із цього CMC):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Зверніть увагу, як Hодин пробіл вниз, dнуль вниз, і lloвсі трапляються в рядку. rНайдальший вниз, в 9, але по - , як і раніше менше , ніж довжина рядка від верхньої частини. Це лише один приклад, є десятки інших можливостей для введення Hello World.

Іншими прикладами можуть бути:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Введення та вихід можуть бути надані будь-яким зручним методом .
  • Вхід гарантується не порожнім (тобто ви ніколи не отримаєте ""як вхід).
  • Ви можете роздрукувати його до STDOUT або повернути його як результат функції.
  • Прийнятна або повна програма, або функція.
  • Будь-яка кількість сторонніх пробілів є прийнятною до тих пір, поки символи належним чином вишикуються (наприклад, сміливо прокладайте як прямокутник).
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

2
Думав, що це буде включати анімацію, коли я читаю заголовок. У нас була анімована версія цього?
Кудлатий

@Shaggy Не те, що я бачив або міг знайти.
AdmBorkBork

"Будь-яка кількість сторонніх пробілів є прийнятною" - це включає провідну лінію пробілів?
Джонатан Аллан

Я знаю, у нас був такий, який базується на коді Матриці, але вдало знайдемо його з цими двома ключовими словами! Ви не заперечуєте, якщо я пісочницю ідею?
Кудлатий

Які відповіді щодо максимального розміру вводу потрібно реалізувати? Я бачу, що багато людей використовують випадкові функції, які використовують "псевдовипадкові" на бекграунд, і певні вхідні слова перевищують розмір насіння, який використовується в цих генераторах, і вони не зможуть "Усі можливі результати повинні знову мати ненульова ймовірність виникнення. " обмеження, яке ви вказали
Ferrybig

Відповіді:


5

R , 104 байти

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

Спробуйте в Інтернеті!

Введення як рядок; пише в stdout.


Ви можете зберегти байт, використовуючи scan(,'')та вкладаючи купу дзвінків, але, чесно кажучи, я дуже віддаю перевагу функціональному підходу, цей інший є огидним за мінімальний приріст. Хоча, можливо, іскри деякі ідеї. Спробуйте в Інтернеті!
Кримінально-

Я думаю, що sample(l,,T)достатньо замість sample(l,l,T)(-1 байт).
Робін Райдер

4

JavaScript (ES6), 72 байти

Вводиться як список символів. Повертає матрицю символів.

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

Спробуйте в Інтернеті!


Я думаю, ти міг би зберегти один байт, не зважаючи на потрійний вираз.
ортоплекс

2
@orthoplex Це не спрацювало, тому (0|'A') === (0|undefined)що інші листи більше не гарантовано відображатимуться в останньому рядку. (Так, в основному, це все одно, що |!a[y+1]було знято зовсім.)
Арнольд,

Google каже, що Math.random()повертає число в [0, 1), тому не міг Math.random()<.5стати Math.random()>0?
неділя2004

@ nedla2004 Теоретично так. На практиці я думаю, що дуже ймовірно, що реалізація PRNG не може повернути рівно (не кажучи вже про достатнє закриття 0 , так що всі конфігурації насправді мають шанс виникнути). Оскільки ми визначаємо мову шляхом її реалізації, я особисто вважаю, що вона недійсна. 0 0
Арнольд

Для якої платформи ви створили свій JavaScript? Оскільки виклик має унікальну вимогу і не визначає максимальний вхід, це дійсно має значення, оскільки більшість платформ використовують math.random()реалізацію, яка має внутрішній стан, і тому не може генерувати унікальний вихід.
Феррібіг

4

Pyth - 9 байт

Список вихідних рядків.

.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

Спробуйте в Інтернеті .


4

J , 30 19 байт

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

Спробуйте в Інтернеті!


1
0|:]{.~"+_1-#?#за 15 байт
Гален Іванов

@GalenIvanov Мені подобається ця ідея, але оскільки угода про діадію відбувається без повторення, діапазон результатів не охоплюватиме всі можливості. наприклад, неможливо, щоб дві літери випадковим чином опустилися на ту саму висоту.
Йона

@Conor, Ви можете зробити 0|:]{.~"+_2-#?@##17 байт, не змінюючи поведінки своєї відповіді.
Іона

1
@Jonah Так, правильно. Я зрозумів це і мав ще 17-байтне рішення.
Гален Іванов

4

Japt , 8 байт

-1 байт від @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

Спробуйте в Інтернеті!



lol @Shaggy Я отримав таку ж відповідь деякий час тому, я просто додав пояснення. Все одно дякую c:
Luis felipe De jesus Munoz

3

APL (Dyalog Unicode) , 16 байт SBCS

Функція анонімного мовчання

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

 довжина струни

1+ один додав до цього

≢⍴ "довжина" копій цього

∘? випадкові цілі числа в діапазоні 1… ті, а потім…

∘- заперечуйте, а потім…

⊢↑¨⍨ візьміть, ніж багато елементів з кожного символу, прокладки зліва пробілами

∘↑ змішайте список рядків у матрицю, оббиваючи пробілами праворуч

 переносити

Спробуйте в Інтернеті!


2

Japt , 8 байт

yÈùUÊö Ä

Спробуй це

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

Желе , 10 байт

³LŻX⁶x;)z⁶

Спробуйте в Інтернеті!

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

Ми можемо вивести провідну лінію пробілів, тому 9 байт (хоча я відчуваю, що може бути 8 ...)
Джонатан Аллан

@JonathanAllan не був би це еквівалентно діапазону 0..(length - 1)? Питання вказує між 0 і довжиною рядка. Або я щось пропускаю?
Нік Кеннеді

О так, я забув про інклюзивність - коли я три дні тому запитав про провідну пробілу, я впевнений, що у мене було 9, і я думаю, що це було не те, що я запропонував вище ... хм
Джонатан Аллан


2

PHP , 88 байт

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

Спробуйте в Інтернеті!

Або 94 байти за допомогою функції криптографічних випадкових цілих чисел PHP .

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

Спробуйте в Інтернеті!

Вхід з STDIN, вихід на STDOUT. Виконувати як:

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

 e      r d

H      o   

         l 


    o 

-1 байт (порожній рядок замість пробілу) та +1 байт (помилка на стороні правил) thx до @ ASCII-лише!


цікаво, чи це дозволено, оскільки ви не включаєте те, <?phpщо ?>закривається. також здається, що це добре, якщо $oце порожній рядок
лише ASCII

@ ASCII тільки ви маєте рацію, порожня рядок також буде працювати (ще трохи поскаржившись). Я не впевнений, що рішення про використання тегів закриття та повторного відкриття я оновлюю, хоча й надалі залишатимуться вгору та вгору. Дякую!
640 Кб

Зауважте, що правила для цього виклику говорять: "Усі можливі виходи повинні знову мати нульову ймовірність виникнення", це неможливо з randфункцією PHP , оскільки ви можете мати текст введення, який вимагає більше випадкового, ніж розмір внутрішнього використовує насіннєвий ранд, тому технічно ваша відповідь не відповідає цій умові у будь-яких ситуаціях
Ferrybig

@Ferrybig Я погоджуюся, що застарілий PHP / libc randне дуже корисний, проте всі підтримувані / виробничі версії PHP (7.1+) використовують Mersenne Twister RND ( mt_rand) внутрішньо для генерації випадкових чисел. Ви стурбовані тим, що це не є достатньо випадковим для цього виклику?
640 Кб

mt_randтакож використовує внутрішньо псевдосистему чисельних систем, а також має обмеження. Якщо припустити, що PHP складено з 64-бітових чисел (і що насіння, яке використовується для цього цільного діапазону, randабо mt_randприймає його), дасть унікальні результати для слів довжиною до 13 символів або менше. Досить обмежуючи, якщо запитаєте мене
Феррібіг

1

Вугілля деревне , 10 9 байт

↑Eθ◧ι⊕‽Lθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Редагування: збережено 1 байт завдяки @ ASCII. Пояснення:

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

Як вказує лише ASCII, ви можете переміщати літери випадковим чином вгору, а не вниз для того ж ефекту (за винятком того, що внизу може бути зайве пробіл, а не вгорі). Друк масиву символів вгору еквівалентно нормальному друкуванню рядка, тому накладка просто компенсує кожен символ вертикально на випадкову кількість.


цікаво, чи надрукувала б роботу надрукування?
Лише ASCII

1

05AB1E (спадщина) , 9 байт

εIgÝΩú}ζ»

Введіть як рядок або список символів (або добре).

Спробуйте в Інтернеті.

Набагато повільніша 9-байтна альтернатива:

gDÝsãΩúζ»

Введіть як список символів.

Спробуйте в Інтернеті.

Обидва використовують застарілу версію 05AB1E, оскільки нова версія вимагає явного €Sпередζ ..

Пояснення:

ε       # 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∍ÝδΩале це довше ... і ооо ... це навіть не працює в новому 05AB1E;).
Чарівний восьминога Урна


1

Джулія, 69 байт

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

Це визначає функцію, fяка приймає a Stringабо Vector{Char}повертає a Matrix{Char}.

Безголівки:

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

Приклад:

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

Це, безумовно, може бути краще; мої навички гольфу досить іржаві.

Спробуйте в Інтернеті!



1

PowerShell , 108 102 98 байт

-4 байти завдяки маззі

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

Спробуйте в Інтернеті!

В основному повторюється 1..lengthрядок двічі, один раз, щоб отримати випадкові місця рядків для кожного символу, і вдруге фактично побудувати кожен рядок, використовуючи ці індекси. Зрозуміти, як це зробити за один раз, це велика економія байтів.





0

Пітон - 92 байти

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

Ви повинні включитиimport random
MilkyWay90

@ MilkyWay90 d'oh
Мальтісен

1
Ви можете зберегти 1 байт, скориставшись from random import*натомість.
ортоплекс

Я думаю, map(None,...що в Python 3 не працює, тому слід вказати Python 2 у своєму заголовку.
ортоплекс

0

K (oK) , 20 байт

Рішення:

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

Спробуйте в Інтернеті!

Пояснення:

+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

Пітон 3, 208 байт

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

Створює список випадкових виборів, потім складає список стовпців із порожнім пробілом скрізь, крім індексу, визначеного кожним випадковим вибором. Стовпчики переносяться в рядки і роздруковуються між ними нові рядки.

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.