Фон
У меня есть коллекция «носков дня недели», которые представляют собой семь пар носков, помеченных по дням недели. Когда я стираю свои носки, они оказываются в куче, и я должен расположить их в правильные пары, прежде чем положить их в шкаф. Моя стратегия - вытащить один случайный носок из кучи за раз и положить его в ящик. Всякий раз, когда на ящике есть подходящая пара носков, я связываю их и кладу в шкаф. Ваша задача - смоделировать этот случайный процесс и вернуть количество розыгрышей, необходимое для поиска первой подходящей пары.
вход
Ваш ввод - целое число N ≥ 1 . Он представляет собой «количество дней в неделе»: в стопке N пар носков, и каждая пара имеет свою метку. При необходимости вы также можете использовать начальное значение PRNG.
Выход
Ваш вывод - это количество носков, которые я должен нарисовать до того, как будет найдена первая подходящая пара. Например, если первые два носка уже образуют совпадающую пару, вывод будет 2
.
Конечно, вывод является случайным и зависит от порядка рисования. Мы предполагаем, что все порядки отрисовки одинаково вероятны , поэтому каждый раз, когда рисуется носок, выбор является равномерным и независимым от всех других вариантов.
пример
Пусть N = 3 , так что у нас всего 6 носков, помеченных AABBCC . Один из возможных вариантов «протокола рисования носков» выглядит следующим образом:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
Первая подходящая пара была найдена после рисования второго B , который был третьим носком, который нужно нарисовать, поэтому правильный вывод 3
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Ввод и вывод могут быть в любом разумном формате, включая унарный (строка 1
s).
Вы можете предположить, что встроенный в ваш язык RNG идеален. Вам не нужно фактически моделировать протокол рисования носков, если ваши выходные данные имеют правильное распределение вероятностей.
«Тестовые случаи»
Вот приблизительные вероятности всех выходов для входа N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Чтобы протестировать свое решение, вы можете запустить его, скажем, 40 000 раз и посмотреть, достаточно ли близко к нему выходное распределение.
Draw all socks. End up with an odd number.
Ответы:
Желе , 8 байт
Попробуйте онлайн! или проверьте распределение для N = 7 .
Фон
Пусть n будет количеством пар; Есть 2n отдельных носков.
Для первого розыгрыша есть 2n носков, и 0 из них приведут к совпадающей паре. Следовательно, вероятность успеха 0 / 2n = 0 .
Так как первый розыгрыш не был успешным, есть 2n - 1 на стопке носков, и один из них приведет к соответствующей паре. Следовательно, вероятность успеха равна 1 / (2n - 1) .
Если второй розыгрыш не был успешным, есть на стопке 2n - 2 носка, и 2 из них приведут к совпадающей паре. Следовательно, вероятность успеха составляет 2 / (2n - 2) .
В общем, если первые k розыгрышей были неудачными, есть в стопке 2n - k носков, и 2 из них приводят к совпадающей паре. Следовательно, вероятность успеха равна k / (2n - k) .
Наконец, если ни один из первых n розыгрышей не был успешным, на стопке будет 2n - k носков, и все они приведут к соответствующей паре. Следовательно, вероятность успеха равна n / (2n - n) = 1 .
Как это устроено
источник
Желе, 8 байт
Попробуйте онлайн!
Чтобы проверить, вот версия, которая отображает и желаемый вывод, и результат операции «Перемешать список» (чтобы увидеть, в каком порядке были нарисованы носки).
источник
Python, 66 байт
Денис придумал умный способ переставить вещи, сэкономив 5 байтов.
источник
MATL ,
1615 байтПопробуйте онлайн! Или наблюдайте эмпирическое распределение для 1000 образцов в случае N = 7 (это занимает некоторое время).
Это непосредственно генерирует случайную величину, представляющую результат, основанную на ее распределении вероятностей. Пусть N будет число пар носков, и пусть р ( К ) обозначает вероятность того, что K -го Жеребьевка прошла успешно, обусловлено тем , что к -1-й розыгрыш не был успешным. Тогда (см. Также здесь ):
Таким образом, код перебирает на максимум N +1 розыгрышей. При k-м тираже генерируется случайная величина, равная 1 с вероятностью ( k -1) / (2 * N - k ) или 0 в противном случае. Всякий раз, когда случайная величина равна 1 (ничья была успешной), процесс останавливается и выдается ток k .
источник
MATL ,
1413 байтПопробуйте онлайн! Или соблюдайте эмпирическое распределение для 4000 выборок в случае N = 7 (это занимает некоторое время).
источник
JavaScript,
7773 байтаобъяснение
источник
f=(n)=>
сn=>
(или два, если вы хотите сохранить задание, некоторые держать его , некоторые удалить его ).CJam, 17 байт
Проверьте это здесь.
источник
Python 3,
142105104 байтаБлагодаря Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ за сохранение одного байта!
Мой первый ответ:
Мой новый ответ:
Оба выхода с
NameError
ВКЛs
.источник
Р, 49
Я уверен, что должен быть лучший способ сделать это в R! Я пытался сделать что-то умнее, но это не сработало.
Редактировать: Улучшено @bouncyball, так как оно не должно быть функцией.
источник
function(N)
? использованиеN=scan();
спасло бы 2 байтаPython 2, 101 байт
источник
VBA, 61 байт
- моделирует вероятность смещения совпадения носка с учетом предыдущего отказа совпадения. В точке оценки K - это «носки в руке», поэтому номер тиража - еще один.
источник
Pyth, 14 байт
Объяснение:
источник