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


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

«Любое количество посторонних пробелов является приемлемым» - включает ли это пробел?
— Джонатан Аллан

Я знаю, что у нас был один, основанный на коде 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,,"")}

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

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


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

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


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

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



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!


интересно, если это разрешено, так как вы не включаете, <?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

Юлия, 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

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

SmileBASIC 3, 62 байта

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


0

Python - 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
— 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


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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.