Давайте посмотрим, насколько хорош ваш выбор языка на выборочной случайности.
С учетом 4 -х символов, A
, B
, C
, и D
, или строка 4 символов в ABCD
качестве входных данных , вывод одного из символов со следующими вероятностями:
A
должен иметь шанс 1/8 (12,5%) быть выбраннымB
должен иметь шанс 3/8 (37,5%) быть выбраннымC
должен иметь шанс 2/8 (25%) быть выбраннымD
должен иметь шанс 2/8 (25%) быть выбранным
Это соответствует следующей схеме машины Плинко :
^
^ ^
^ ^ ^
A B \ /
^
C D
В вашем ответе должна быть предпринята искренняя попытка соблюдения описанных вероятностей. Достаточно правильного объяснения того, как вероятности вычисляются в вашем ответе (и почему они уважают спецификации, не учитывая проблемы псевдослучайности и больших чисел).
счет
Это код-гольф, поэтому побеждает меньше байтов на каждом языке !
ceil(abs(i - 6)/ 2.0)
сопоставит индекс с0-7
индексом0-3
с соответствующим распределением (0 111 22 33
) для этой задачи ...Ответы:
Lean Mean Bean Machine ,
554342 байта-13 байт благодаря Алексу Варге
Надеюсь, вы, ребята, не возражаете, чтобы я ответил на свой вопрос всего через 2 часа, но я очень сомневаюсь, что кто-то еще планировал опубликовать ответ в LMBM.
Это буквально отражает макет Plinko, показанный в OP, перевернутый горизонтально, чтобы сократить ненужные пробелы.
источник
Желе , 6 байт
Монадическая ссылка, содержащая список из четырех символов и возвращающая одну с описанным распределением вероятности.
Попробуйте онлайн!
Как?
источник
ṁ
!Cubix ,
3924222119 байтПосмотреть в онлайн переводчике!
Это соответствует следующей сети кубов:
Объяснение реализации случайного распределения
Cubix - это язык, на котором указатель команд перемещается по граням куба, выполняя команды, с которыми он сталкивается. Единственной формой случайности является команда
D
, которая отправляет IP в случайном направлении: равные шансы с1/4
каждой стороны.Однако мы можем использовать это для генерации правильных взвешенных вероятностей: используя
D
дважды. ПервыйD
имеет1/4
заголовок ко второмуD
. Эта секундаD
, однако, имеет два направления, заблокированных стрелками (> D <
), которые отправляют указатель команды обратно в,D
чтобы выбрать другое направление. Это означает, что оттуда есть только два возможных направления, каждое из которых имеет1/8
общий шанс. Это может быть использовано для генерации правильного символа, как показано на схеме ниже:(Обратите внимание, что в реальном коде стрелка справа заменяется зеркалом,
|
)Код Объяснение
Указатель инструкций начинается справа от символа
i
лицом вправо. Он выполняет этоi
, беря первый символ в качестве ввода, а затем переходит кD
, начиная случайный процесс, показанный выше.Char A: В случае, когда первый
D
отправляет нас на восток, а второй на юг, нам нужно напечатать символ A. Он уже находится в стеке от первогоi
. Выполнено следующее:\
- Отразите IP, чтобы он направлялся на востокi;
- Возьмите ввод, затем вставьте его снова (без операции)U
- Выполните разворот, повернув IP влево дваждыo
- Вывести TOS, символ A@
- прекратить программуСимвол B: если первый или второй направлен на
D
север, нам нужно сгенерировать символ B, который будет следующим входом. Оба пути выполняют следующие команды:^
- Направляйся на север<
- Идите на запад, оборачиваясь к ...i
- Возьмите другой ввод, символ Bo
- Вывести TOS, символ B;
- Pop TOS@
- прекратить программуChar C: Если первый
D
отправляет нас на запад, выполняется следующее:i
- Возьмите другой ввод, символ Bi
- Возьмите другой ввод, символ Co
- Вывод TOS, символ C@
- прекратить программуChar D: Если первый
D
отправляет нас на юг, выполняется следующее:i
- Возьмите другой ввод, символ B..
- Два ноутаi
- Возьмите другой ввод, символ C|
- Это зеркало отражает восток-запад, но IP движется на север, поэтому мы проходим через него.^
- Это соединяется с путем, выбранным для символа B. Однако, поскольку мы уже взяли два ввода, четвертый символ (символ D) будет напечатан.источник
Python , 50 байт
Безымянная функция, принимающая и возвращающая строки (или списки символов).
Попробуйте онлайн!
Как?
random.choice
выбирает случайный элемент из списка, поэтому функция формирует строку с правильным распределением, то есть заданным"ABCD"
,"ABCD"[:2] = "AB"
плюс,"ABCD"[1:]*2 = "BCD"*2 = "BCDBCD"
который есть"ABBCDBCD"
.источник
R , 31 байт
Читает символы из
stdin
разделенных пробелами.sample
рисует случайные выборки из своего первого входа в количестве второго входа (so1
), (необязательный аргумент замены), с весами, заданными последним аргументом.Попробуйте онлайн!
Попробуйте это
n
раз!Для последнего кода я выбираю
n
время (установленноеn
в заголовке) с заменой,T
равной rue (по умолчанию это false), табулирую результаты и делю на,n
чтобы увидеть относительные вероятности входных данных.источник
PHP, 28 байт
Беги как труба с
-nR
.01112233
в базе-45551
в десятичном формате ...источник
7030
среди моих личных любимых.Java 8,
5344 байтаЭто
Function<char[], Character>
.Попробуйте онлайн! (это тестовая программа работает вышеприведенной функции 1000000 раз и выводит экспериментальные вероятности выбора
A
,B
,C
иD
).Основная идея здесь , чтобы найти какой - то способ отображения
0-7
на0-3
такое , что0
появляется1/8
раз,1
появляется3/8
раз,2
появляется2/8
раз, и3
появляется2/8
раз.round(abs(k - 6) / 2.0))
работает для этого, гдеk
случайное целое число в диапазоне[0,8)
. Это приводит к следующему отображению:Что, как вы можете видеть, результаты в показателях
0 111 22 33
, которые производят требуемые вероятности1/8
,3/8
,2/8
и2/8
.Но ждать! Как в мире
-~Math.abs(k-6)/2
достигается тот же результат (опять же, гдеk
случайное целое число в диапазоне[0,8]
)? Это довольно просто на самом деле ...(x+1)/2
(целочисленное деление) это то же самое , какround(x/2)
иx + 1
в то же самое-~x
. Хотяx+1
и-~x
имеют одинаковую длину, в вышеуказанной функции ее лучше использовать,-~x
поскольку она-~
имеет приоритет и, следовательно, не требует скобок.источник
Math.abs
также принимает удваивается как параметр):s->s[-~(int)Math.abs(Math.random()*8-6)/2]
( 42 байта ).APL, 14 байтов
Ввод в виде строки.
Как?
1 3 2 2\⊢
- повторите каждую букву х раз ('ABCD'
→'ABBBCCDD'
)⊃
- взять элемент по индексу ..(?8)
- случайный 1-8источник
⎕U2378
.Древесный уголь , 11 байт
Попробуйте онлайн! Ссылка на подробную версию кода, хотя она вам вряд ли понадобится;
‽
выбирает случайный элемент,⟦⟧
создает список, и переменные - это те, которые получают соответствующие входные буквы (в обратном порядке, потому что мне так хотелось).источник
Pyth ,
87 байтовИспользует тот же алгоритм, что и в моем ответе на Python.
Попробуй это здесь!
Pyth ,
108 байтИспользует тот же алгоритм, что и ответ Джонатана Аллана на Python.
Попробуй это здесь!
объяснение
O
- берет случайный элемент строки, сделанный добавлением (с+
):<Q2
- первые два символа строки.*2t
Удвойте полную строку (*2
) за исключением первого символа (t
).Применяя этот алгоритм для
ABCD
:<Q2
беретAB
.*2t
беретBCD
и удваивает этоBCDBCD
.+
соединяет две строки:ABBCDBCD
.O
принимает случайный характер-2 благодаря Leaky Nun (второе решение)
-1 благодаря мнемонике (первое решение)
источник
>Q1
становитсяtQ
, что становитсяt
.*2
с+
и использованием неявного ввода дважды.y
вместо этого подумал , что не работает для строк ...Желе , 8 байт
Попробуйте онлайн!
Выньте
X
чтобы увидеть"ABBBCCDD"
.X
Выбирает случайный элемент.источник
C # (.NET Core) ,
7655 байтПопробуйте онлайн!
Мой первый ответ написан прямо на TIO с помощью моего мобильного телефона. Уровень повышен!
Объяснение: если исходная строка - «ABCD», функция создает строку «ABCDBBCD» и берет из нее случайный элемент.
источник
JavaScript 35 байт
Принимает строку в
ABCD
качестве входных данных, выводитA
1 / 8th времени,B
3 / 8ths того времени,C
1/4 - ое время, иD
1/4 - ое время.объяснение
источник
05AB1E , 5 байтов
Попробуйте онлайн!
объяснение
источник
> <> ,
252219 байтПопробуйте онлайн! Или посмотрите на рыбную площадку !
Краткий обзор> <>: это двумерный язык с рыбой, которая плавает по коду, выполняя инструкции по ходу дела. Если он достигает края кода, он переносится на другую сторону. Рыба начинается в верхнем левом углу, двигаясь вправо. Случайность сложна в> <>: единственная случайная инструкция
x
, которая произвольно устанавливает направление рыбы вверх, вниз, влево и вправо (с равной вероятностью).В начале программы рыба читает два символа ввода
i_i
(каждыйi
читает символ из STDIN в стек и_
является горизонтальным зеркалом, которое рыба теперь игнорирует). Затем он достигаетx
.Если
x
рыба отправляет рыбу вправо, она читает еще один символ (третий), печатает его с помощьюo
и останавливает с помощью;
. Левое направление аналогично: рыба читает еще два символа (так что мы до четвертого), оборачивается вправо, печатает четвертый символ и останавливается. Если рыба всплывает, она оборачивает и печатает второй символ, прежде чем отражается/
и останавливается. Если он плавает вниз, он отражается слева/
и ударяет другогоx
.На этот раз два направления просто отправляют рыбу назад
x
(справа со стрелкой<
и вверх с зеркалом_
). Следовательно, у рыбы есть 1/2 шанс избежать этогоx
в каждом из двух других направлений. Влево печатает верхний символ в стеке, который является вторым, но вниз сначала меняет местами два элемента в стеке$
, поэтому в этом направлении печатается первый символ.Таким образом, третий и четвертый символы печатаются с вероятностью 1/4 каждый; первый символ имеет вероятность 1/2 х 1/4 = 1/8; а второй символ имеет вероятность 1/4 + 1/2 x 1/4 = 3/8.
источник
05AB1E , 8 байтов
Попробуйте онлайн!
источник
MATL ,
1210 байтПопробуйте онлайн! Или запустите его 1000 раз (слегка измененный код) и проверьте, сколько раз появляется каждый символ.
объяснение
Изменения в модифицированном коде:
1000:"Gl3HH4$vY"1Zr]vSY'
1000:"...]
это цикл для повторения1000
раз.G
обеспечивает ввод данных в начале каждой итерации.v
необходимо заменить4$v
на конкатенацию только верхних4
чисел.v
объединяет1000
результаты в вектор,S
сортирует их иY'
кодирует по длине прогона. Это дает четыре буквы и количество раз, когда они появились.источник
05AB1E , 6 байтов
Попробуйте онлайн!
объяснение
Работает как для списков, так и для строк.
источник
C (gcc) ,
5049 байтовПопробуйте онлайн!
источник
ABCD
Это пример ввода, ваш код должен принимать 4 символа (или строку длиной 4) в качестве входных данныхРубин,
34332927 байтСохранено 2 байта благодаря @Value Inc
Введите как четыре символа
построить массив
[B,B,C,D,A,B,C,D]
и сэмплировать его.попробуйте это онлайн!
попробуйте это
n
раз! (Я преобразовал это в функцию, чтобы повторить это проще, но алгоритм тот же)источник
$*
это псевдоним дляARGV
.Pyth, 7 байт
Тестирование
O8
генерирует случайное число от 0 до 7.| ... 1
применяет логическое или с 1, преобразовывая 0 в 1 и оставляя все остальное таким же. Число на этом этапе составляет 1 2/8 от времени и 2, 3, 4, 5, 6, 7 или 8 1/8 времени.@z
Индексы во входную строку в этой позиции. Индексация выполняется по модулю длины строки, поэтому 4 индекса в позиции 0, 5 в позиции 1 и так далее.Вероятности:
Положение 0: случайное число 4. 1/8 времени.
Положение 1: случайное число 0, 1 или 5. 3/8 времени.
Положение 2: случайное число 2 или 6. 2/8 времени.
Положение 3: Случайное число 3 или 7. 2/8 времени.
источник
Javascript,
3130 байт / 23 байтУвидев более ранний ответ Javascript от asgallant, я задумался о JS. Как он сказал:
Мой это:
Объяснение:
Из
Math.random()*8&7
него разбивается следующее:Версия 2, 23 байта
Но потом спасибо Арно, который отправил после меня, когда он сказал:
что, если это действительно разрешено, привело меня к:
в котором
new Date%8
используется та же таблица разбивки, что и выше.И
%8
также может быть&7
; выбирайте. Еще раз спасибо, Арно.источник
нгн / апл, 10 байт
?2 4
случайным образом выбирает пару чисел - первое среди 0 1 и второе среди 0 1 2 3⌈/
это «максимальное уменьшение» - найти большее число⎕a
это прописные буквы алфавита[ ]
индексированиеобратите внимание на график для max (a, b), когда a∊ {0,1} и b∊ {0,1,2,3}:
если a и b выбраны случайно и независимо, мы можем заменить 0123 = ABCD, чтобы получить желаемое распределение вероятностей
источник
Python 3 ,
64 5551 байт-9 байт благодаря @ovs
Попробуйте онлайн!
объяснение
random.choice()
получает случайный символ String, в то время как(s*2)[1:]+s[1]
создаетBCDABCDB
для вводаABCD
, который имеет 1/8A
с, 2/8C
с, 2/8D
с и 3/8B
с.источник
random.choice
55 байт:lambda s:choice((s[0]+s[1:]*3)[:8])
choice()
что.QBIC , 27 байт
объяснение
источник
> <>, 56 байт
Попробуйте онлайн!
источник
Чип , 60 байт
Попробуйте онлайн!
Каждый из трех
?
производит случайный бит. В первом цикле эти биты запускаются через переключатели выше (/
и\
), чтобы определить, какое значение мы собираемся вывести из этой таблицы:(где
_
может быть либо0
или1
). Затем мы идем вдоль ввода по мере необходимости, распечатывая и заканчивая, когда достигается правильное значение.Большой алфавитный шарик в конце копируется оптом из программы cat, это решение просто подавляет вывод и завершает работу, чтобы получить желаемый эффект.
источник
Рубин, 32 байта
Довольно просто ..?
Попробуйте онлайн!
источник
Applesoft,
29упс, 32 байтаНебольшой «ретрокомпьютерный» пример. Терпите меня, я новичок в этом. Я понимаю, что то, что обозначено как «вход», не должно быть подсчитано байтами. Как указано в OP, ввод будет дан как «ABCD». (Первоначально я не осознавал, что мне нужно указать получаемый ввод, который добавил 4 байта, в то время как остальные оставляли в байте.)
Термины INPUT, RND, PRINT и MID $ каждый кодируются внутренне как однобайтовые токены.
Сначала X присваивается случайное значение в диапазоне 0 <X <4. Это используется для выбора одного из символов из I $ в соответствии с (X <.5) + X + 1. Значение позиции символа принимается как усеченная оценка выражения. X <.5 добавляет 1, если X было меньше, чем .5, в противном случае добавьте 0. Результаты X разбиты следующим образом:
источник
Common Lisp , 198 байт
Попробуйте онлайн!
Удобочитаемый:
источник