Сделай дождь персонажей

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 или вернуть как результат функции.
  • Допустимы либо полная программа, либо функция.
  • Допускается любое количество посторонних пробелов, при условии, что символы выстроены в линию соответствующим образом (например, не стесняйтесь использовать прямоугольник).
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
AdmBorkBork
источник
2
Думал, что это будет включать анимацию, когда я прочитал название. У нас была анимационная версия этого?
лохматый
@ Shaggy Не то чтобы я видел или смог найти.
AdmBorkBork
«Любое количество посторонних пробелов является приемлемым» - включает ли это пробел?
Джонатан Аллан
Я знаю, что у нас был один, основанный на коде Matrix, но удачи найти его с этими двумя ключевыми словами! Вы не возражаете, если я Sandbox идея?
лохматый
Каков максимальный размер ввода ответов, которые необходимо реализовать? Я вижу, что многие люди используют случайные функции, которые используют «псевдослучайный» в backendground, и некоторые входные слова больше, чем размер начального числа, используемого в этих генераторах, и они потерпят неудачу. «Все возможные выходные данные должны снова иметь ненулевая вероятность появления ". ограничение, которое вы указали
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,,"")}

Попробуйте онлайн!

Ввод в виде строки; пишет в стандартный вывод.

Giuseppe
источник
Вы можете сохранить байт, используя 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):' '))

Попробуйте онлайн!

Arnauld
источник
Я думаю, что вы могли бы сохранить один байт, не отрицая троичное выражение.
ортоплекс
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()реализацию, которая имеет внутреннее состояние и, следовательно, не может генерировать уникальный вывод.
Ferrybig
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

Попробуйте онлайн .

Maltysen
источник
4

J , 30 19 байт

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

Попробуйте онлайн!

Конор О'Брайен
источник
1
0|:]{.~"+_1-#?#за 15 байтов
Гален Иванов
@GalenIvanov Мне нравится эта идея, но поскольку сделка с диадой происходит без повторений, диапазон результатов не будет охватывать весь спектр возможностей. Например, невозможно, чтобы 2 буквы случайно упали на одну и ту же высоту.
Иона
@ Конор, Вы можете сделать 0|:]{.~"+_2-#?@##для 17 байтов, не изменяя поведение вашего ответа.
Иона
1
@Джона Да, верно. Я понял это и нашел другое 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

Попробуйте онлайн!

Луис Фелипе Де Иисус Муньос
источник
1
8 байт
лохматый
lol @Shaggy. Некоторое время назад я получил такой же ответ, просто добавляю объяснение. В любом случае спасибо c:
Луис Фелипе Де Иисус Муньос
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 байт (ошибка на стороне правил), спасибо только @ ASCII!

640 КБ
источник
интересно, если это разрешено, так как вы не включаете, <?phpчто ?>закрывается. также кажется, что это нормально, если $oпустая строка
только ASCII
@ ASCII-only, вы правы, также будет работать пустая строка (с небольшим количеством жалоб). Я не уверен, что решение об использовании закрывающих и повторно открывающих тегов, я обновлю его, чтобы оставаться на подъеме и повышении. Спасибо!
640KB
Обратите внимание, что правила для этой задачи гласят: «Все возможные выходные данные должны снова иметь ненулевую вероятность появления», это невозможно с помощью randфункции PHP , так как вы можете иметь входной текст, который требует больше случайного, чем размер внутреннего seed rand использует, так что технически ваш ответ не может удовлетворить это условие во всех ситуациях
Ferrybig
@Ferrybig Я согласен с тем, что устаревший PHP / libc randдля многих бесполезен, однако все поддерживаемые / производственные версии PHP (7.1+) используют Mersenne Twister RND ( mt_rand) внутри для генерации случайных чисел. Вы обеспокоены тем, что это не является достаточно случайным для этой задачи?
640KB
mt_randтакже использует внутреннюю систему псевдослучайных чисел, а также имеет ограничения. Предполагая, что PHP скомпилирован с 64-битными числами (и что начальное число, используемое randили mt_randпринимающее этот полный диапазон) будет генерировать уникальные выходные данные для слов длиной до 13 символов или короче. Довольно ограниченно, если вы спросите меня
Ferrybig
1

Древесный уголь , 10 9 байт

↑Eθ◧ι⊕‽Lθ

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 1 байт сохранен благодаря @ ASCII-only. Объяснение:

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

Как указывает только ASCII, вы можете перемещать буквы случайным образом вверх, а не вниз для того же эффекта (за исключением того, что может быть дополнительный пробел внизу, а не вверху). Печать массива символов вверх эквивалентна обычной печати строки, поэтому заполнение затем просто смещает каждый символ по вертикали на случайную величину.

Нил
источник
Интересно, будет ли работать печать вместо?
Только для ASCII
1

05AB1E (legacy) , 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

C (gcc) , 131 байт

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

Попробуйте онлайн!

gastropner
источник
Предлагаю R[j=i%l]?32:s[j]));вместоR[j]?32:s[j]))j=i%l;
floorcat
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которая принимает Stringили Vector{Char}возвращает a 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

Пример:

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

Это, безусловно, может быть лучше; мои навыки игры в гольф довольно ржавые.

Попробуйте онлайн!

Алекс А.
источник
1

Perl 5 -F , 50 49 байтов

-1 от @DomHastings

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

Попробуйте онлайн!

Xcali
источник
Здорово, на самом деле работает! : P Вы также можете сэкономить пару байтов map$_||$",@$_!
Дом Гастингс
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строки дважды, один раз, чтобы получить случайное расположение строк для каждого символа, и второй раз, чтобы фактически построить каждую строку, используя эти индексы. Выяснение того, как сделать это за один раз, - это большая экономия байтов.

Veskah
источник
0

SmileBASIC 3, 62 байта

LINPUT T$L=LEN(T$)CLS
FOR I=0TO L-1LOCATE,RND(L+1)?T$[I];
NEXT
snail_
источник
0

Python - 92 байта

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])
Maltysen
источник
Вы должны включитьimport random
MilkyWay90
@ MilkyWay90 d'oh
Maltysen
1
Вы можете сохранить 1 байт, используя from random import*вместо этого.
ортоплекс
Я думаю, map(None,...что не работает в Python 3, поэтому вы должны указать Python 2 в заголовке.
ортоплекс
0

K (ок) , 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
streetster
источник
0

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

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

Попробуйте онлайн!

CyborgOctopus
источник