Создайте программу для анализа выбора последовательности монет


15

В одной из головоломок в моей старой книге определена игра, в которой два игрока выбирают последовательности бросков монет, которые, по их мнению, появятся первыми, когда монета неоднократно подбрасывается. (Это были странные и четные броски кубиков, но эта маленькая деталь не имеет значения с точки зрения эквивалентности задач.)

Следует отметить, что если игрок 1 выбирает, TTTа игрок 2 выбирает HTT, то у игрока 2 есть шанс выиграть игру 7/8, поскольку единственный путь TTTможет быть достигнут раньше HTT, если все первые три броска - это хвосты.

Ваша задача - создать программу или функцию, которая будет определять вероятность того, что одна из двух выбранных последовательностей будет первой. Ваша программа будет принимать две строки ввода (или две строки в качестве аргументов), каждая из которых представляет последовательность длиной 10 или менее:

HTT
TTT

И выведите вероятность того, что первый игрок выиграет, в дробной или десятичной форме:

7/8
0.875

Самый короткий код для этого на любом языке выигрывает.


6
Всегда ли последовательности имеют одинаковую длину?
— Ури Гранта

1
@UriZarfaty Нет, не обязательно.
— Джо З.

Хотя предположительно последовательности должны быть различны (поскольку выходные данные не могут указывать связь).
— Ури Гранта

Да, последовательности должны быть разными.
— Джо З.

Более конкретно, одна не может быть терминальной подстрокой другой.
— Джо З.

Ответы:


4

Python 3 (139 136 134 132 126 115 143)

Использует алгоритм Конвея, как описано здесь . Обрабатывает все пары последовательностей, пока первая не является завершающей подпоследовательностью второй (согласно инструкциям).

def f(a,b):c=lambda x,y=a:sum((x[~i:]==y[:i+1])<<i for i in range(len(x)));return 0 if b in a else(1/(1+(c(a)-c(a,b))/(c(b,b)-c(b))),1)[a in b]

Спасибо xnor за то, что сбрил 6 байтов. Спасибо Згарбу за обнаружение ошибки с подпоследовательностями.


Текущая версия не работает для меня. Для ввода "HTT"и "TTT", oимеет значение -1и делит его на 0.
— Якуб

1
Хороший гольф! Мне нравится трюк с аргументами по умолчанию. Пара (непроверенных) советов: вы можете умножить на 2**iс <<i, а вероятность вывода можно записать как 1/(1/o + 1), в которую вы можете поместить обратную величину oнепосредственно.
— xnor

Благодарю. Хорошее место re o / (1 + o). Несколько смущен, что пропустил <<!
— Ури Гранта

@Jakube Извините, не заметил ваш комментарий! Текущая версия отлично работает для меня с "HTT" и "TTT".
— Ури Гранта

1
Это дает ненулевой ответ для HTHи T, даже если первый игрок не может выиграть. Другой ответ имеет ту же проблему.
— Згарб

3

CJam, 44 38 36 байт

Используя тот же алгоритм Конвея, что и здесь .

ll]_m*{~1$,,@f>\f{\#!}2b}/\-:X--Xd\/

Ввод - это две отдельные последовательности в две строки. Выход - это вероятность первого выигрыша за секунду. Входы не должны быть одинаковой длины

Я использую формулу для выигрыша шансов ( p) для первого игрока A как

введите описание изображения здесь

Тогда вероятность определяется как

введите описание изображения здесь

который после упрощения становится

введите описание изображения здесь

и после некоторого упрощения становится

введите описание изображения здесь


Пример ввода:

HTT
TTT

Выход:

0.875

Попробуйте онлайн здесь


Джо сказал в комментариях (после того, как это было опубликовано), что строки не обязательно имеют одинаковую длину. Тем не менее, +1, потому что я не понимаю CJam.
— mdc32

@ mdc32 исправлено, теперь на 1 байт больше :(
— Оптимизатор

Вы уже позволили мне поверить, что codegolfSE теперь поддерживает LaTeX ... = (
— flawr

@ Flawr HAHA. Извините за это :(. Это PNG-файлы из онлайн-редактора LaTeX.
— Оптимизатор

Это дает ненулевой ответ для HTHи T, даже если первый игрок не может выиграть. Другой ответ имеет ту же проблему.
— Згарб

0

Луа 211 190 184

Также используя алгоритм Конвея. Все еще новичок в Lua, так что это может быть в гольф больше наверняка.

z=io.read;e=function(s,t)r='';for d in s:gmatch"."do r=r..(d==t:sub(1,1)and 1 or 0);end;return tonumber(r,2);end;a=z();b=z();print((e(a,a)-e(a,b))/(e(b,b)-e(b,a))/(1/((1/2)^b:len())));

Ungolfed

z=io.read;
e=function(s,t)
r='';
    for d in s:gmatch"."do 
        r=r..(d==t:sub(1,1)and 1 or 0);
    end;
    return tonumber(r,2);
end;
a=z();
b=z();
print((e(a,a)-e(a,b))/(e(b,b)-e(b,a))/(1/((1/2)^b:len())));

Первая версия

z=io.read;
e=function(s,t) 
    r=0;
    for d in s:gmatch"."do 
        r=r*10;
        if d==t:sub(1,1)then r=r+1 end;
    end
    return tonumber(r,2);
end;
f=function(n,o)
    return ((e(n,n)-e(n,o))/(e(o,o)-e(o,n)))/(1/((1/2)^3));
end;
print(f(z(),z()));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.