Рассмотрим ASCII версию механизма , сходного с бобовой машины или plinko / пачинко игры:
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
Это O
шар, который падает вниз.
- Когда он поражает
^
, есть 50-50 шансов, что он пойдет влево или вправо. - Когда он попадает в
/
, он всегда идет влево. - Когда он попадает
\
, он всегда идет правильно.
Мяч в конце концов попадает в одну из пронумерованных U
впадин в нижней части. Вопрос в том, какова вероятность того, что он окажется в каждой впадине?
Для этого конкретного случая, вероятности являются 0.0
, 0.1875
, 0.5625
, 0.125
и 0.125
, по желобам с 1 по 5 соответственно.
Вот еще один пример с 3 впадинами вместо 5. Вероятности являются 0.5
, 0.5
, и 0.0
:
O
/
^ ^
U U U
1 2 3
В этой задаче мы обобщим эту проблему для механизма с любым количеством слоев, настроенных любым способом.
Вызов
Напишите программу или функцию, которая принимает ASCII-представление структуры пирамиды механизма. (Ввод через стандартный ввод / командную строку / аргумент функции.)
Вы можете предположить, что он входит с пробелами, которые приводят его в правильную форму, например
^
\ ^
^ ^ \
\ ^ / ^
Или вы можете предположить, что он вводится без пробелов, например
^
\^
^^\
\^/^
(При желании вы можете предположить, что есть завершающий символ новой строки и / или некоторый непротиворечивый шаблон пробелов.)
Структура входной пирамиды может иметь любое количество уровней (или линий), включая ноль. Каждый уровень имеет еще один ^
, /
или \
чем последний, и есть levels + 1
впадины на день (которые не являются частью ввода).
Ваша программа / функция должна напечатать / вернуть список вероятностей того, что мяч приземлится в каждой впадине (в порядке от самой левой впадины к самой правой впадине). Это должны быть значения с плавающей запятой, которые при печати имеют по крайней мере 3 десятичных знака (лишние нули или десятичные точки не требуются; 1
подходит для 1.000
, .5
подходит для 0.500
и т. Д.). Если вы написали функцию, вы можете напечатать значения или вернуть список / массив с плавающей точкой.
Любой разумный формат печатного списка в порядке. например 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
или 0.5\n0.5\n0.0
все будет в порядке.
Примеры
0 уровней: (сводится к одному тривиальному U
)
Вход: [no input/empty string given]
Выход:1.0
1 уровень:
Вход: ^
Выход:0.5 0.5
Вход: /
Выход:1.0 0.0
Вход: \
Выход:0.0 1.0
2 уровня: (второй пример выше)
Входные данные:
/
^ ^
Выход: 0.5 0.5 0.0
3 уровня:
Входные данные:
^
^ ^
^ ^ ^
Выход: 0.125 0.375 0.375 0.125
Входные данные:
\
/ \
/ / \
Выход: 0.0 0.0 0.0 1.0
4 уровня: (первый пример выше)
Входные данные:
^
\ ^
^ ^ \
\ ^ / ^
Выход: 0.0 0.1875 0.5625 0.125 0.125
7 уровней:
Входные данные:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Выход: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
счет
Самый короткий ответ в байтах побеждает. Tiebreaker - более ранний пост.
источник
Ответы:
CJam,
50 48 45 44 4240 байтПредполагается, что входные данные будут без пробела и будут заканчиваться переводом строки. Например:
Алгоритм
Основная идея заключается в том, что вы продолжаете анализировать каждый символ (есть только 4 разных символа) и выполняете различные операции над распределением вероятности (первоначально массив, содержащий 1 элемент со значением 1). Для каждой строки входных символов (начиная с первого символа в первой строке) мы поддерживаем массив вероятностей того же размера. Каждый символ действует в соответствии с первой вероятностью из списка и выталкивает полученную пару в конец списка. После каждой строки мы суммируем пары из списка, чтобы получить точное количество элементов в качестве элементов на следующей строке.
Вот четыре символа и необходимые действия, соответствующие каждому:
^
: Когда появляется этот символ, вы разделяете текущую вероятность на две части. Например, если у нас есть это в первой строке, мы должны преобразовать[1]
в[0.5 0.5]
/
: Когда этот символ встречается, мы должны поместить<current probability> 0
вместо текущей вероятности в массиве.\
: Когда этот символ встречается, мы должны поместить0 <current probability>
вместо текущей вероятности в массиве.\n
: Когда этот символ встречается, у нас есть новая строка. Таким образом, мы группируем все пары сверху из 3 символов и суммируем их, чтобы получить вероятность каждого элемента для следующей строки. Например[0 0.5 0.25 0.25]
превращается в[0 0.75 0.25]
. Обратите внимание, что первый и последний элементы имеют неявную пару (значение 0) до и после них.Теперь нам остается только определить правильного персонажа и выполнить правильное действие. Для этого воспользуемся обычной математикой. В ASCII - коды
^
,\
,/
и\n
являются94
,92
,47
, и10
. После нескольких испытаний мы получаем это простое уравнение для преобразования этих чисел в 0, 1, 2 и 3:дает:
В массиве длиной 4 последний
4f%
будет неявным. Таким образом, мы просто делаем%13
ASCII-код символа и выбираем правильное действие из массива действий.Объяснение кода :
Попробуйте онлайн здесь
источник
Рубин 140
Функция, которая принимает в качестве входных данных строку (может быть красиво отформатирована как пирамида) и возвращает массив с плавающей точкой.
Проверьте это онлайн: http://ideone.com/kmsZMe
Довольно простая реализация. Вот это не одурачено:
источник
Рубин, 140
158байтНе продолжайте голосовать, когда есть лучшая рубиновая версия .Вот еще несколько хитростей для вас.Безымянная функция с одним аргументом. Не должно содержать пробелов. Может или не может содержать завершающий перевод строки.
Тратит 9 байтов на необходимость обработкиВсе тестовые примеры работают правильно, смотрите здесь на ideone .0 levels
(пустая строка).источник
split
, например.Pyth,
434241 байтЭто предполагает, что ввод будет без пробелов. Попробуйте онлайн: Pyth Compiler / Executor
Pyth, 40 байт (сомнительно)
Спасибо @isaacg за сохранение одного байта. Обратите внимание, что эта версия на самом деле не работала в версии Pyth, когда был задан вопрос. В компиляторе была небольшая ошибка. Несмотря на то, что в этом коде не используются новые функции Pyth (только то, что долгое время было в документации Pyth и должно было работать), это может быть неверным ответом. Решай сам.
Попробуйте онлайн: Pyth Compiler / Executor
Объяснение:
Например, если у меня есть входные вероятности
G = [0.5, 0.5, 0.0]
и строка,H = "^/^"
происходит следующее:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
источник
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 байтНичего сложного, полная программа, которая считывает строки (с пробелами или без них, просто удаляет их) из STDIN и печатает результаты, разделенные пробелами, в STDOUT.
Код Tidier с комментариями:
источник
Python 3, 113
Повторно обновляет вектор вероятности
P
в ответ на каждую строку. Этот новый вектор вероятностиQ
создается по одной записи за раз. Выполняет итерацию по новым слотам и вычисляет вклад от колышка справа от негоr
, а также вычисляет оставшийся вклад в предстоящий слот какp-r
.Ожидается, что каждая строка будет заканчиваться хотя бы одним пробелом, чтобы избежать проблемы, когда строки заканчиваются обратной косой чертой.
источник
input()
может справиться с этим.Python 3, 138 байт
Работает с любыми пробелами, поскольку они все отфильтрованы (по
if'!'<e
).Метод:
r
вероятностей достижения каких-либо препятствий и скрытых впадин под ними. Начнем с списка[1]
.0
в список для ведущей впадины. Мы решаем, является ли это первым препятствием, сравнивая его индексp
со следующим треугольным числомt*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Мы используем следующий метод:v = ord(char) mod 7 + 1
уступки^:4 /:6 \:2
v div 3 / 2
дает первую дробь (^:0.5 /:1 \:0
)v mod 3 / 2
дает вторую фракцию (^:0.5 /:0 \:1
)t + 1
элементы окончательного спискаr
.2 байта благодаря чату @ Sp3000.
источник
Perl, 78
Принимает ввод без пробелов.
Попробуй меня .
источник
TI-BASIC,
7376Принимает ввод по одной строке за раз и заканчивается, когда пробел вводится сам по себе, потому что ни разрывы строк в строках, ни пустые строки недопустимы в TI-BASIC.
Я почти уверен, что получил правильный размер (TI-BASIC маркирован, поэтому каждая команда занимает один или два байта - seq () принимает один, inString () принимает два, dim () принимает один и т. Д. I посчитал размер вручную.)
Хотя символ обратной косой черты допустим в строке, имейте в виду, что невозможно ввести его из программы, если вы не изменили свой калькулятор.
источник
Javascript - 117
Пробовал с помощью рекурсии, но это было слишком долго ...
Шляпа к xnor за идею вычитания, которая сбрила дюжину и более символов.
Ungolfed:
источник