У вас есть монета, которая производит 0
или 1
. Но вы подозреваете, что монета может быть предвзятой , то есть вероятность 0
(или 1
) не обязательно равна 1/2.
Хорошо известна процедура «преобразования» Необъективное монету в справедливой монеты (т.е. для получения результатов с равной вероятностью), как это было предложено фон Неймана, состоит в следующем. Производить (не перекрывающиеся) блоки двух бросков монет, пока два значения блока не будут различаться; и вывести первое значение в этом блоке (второе значение также подойдет, но для целей этой задачи мы выбираем первое). Интуитивно, 1
может быть, более вероятно, чем 0
, но 01
и 10
будет одинаково вероятным.
Например, входные данные 1110...
отбрасывают первый блок, а затем производят 1
из второго блока ...
Эта процедура дорогая , потому что несколько монетных монет потребляются для получения одного результата.
Соревнование
Возьмите конечную последовательность нулей и единиц, представляющих броски исходной монеты, и выведите максимальное количество результатов в соответствии с описанной выше процедурой, пока не будут использованы все входные данные.
Последний блок может быть неполным, если количество входных значений нечетное. Например, входная последовательность 11111
не даст результата (первые два блока имеют одинаковые значения, а третий блок не завершен).
правила
Вход может иметь любое неотрицательное количество значений, не обязательно положительное или четное.
Формат ввода может быть:
- массив нулей и единиц;
- строка нулей и единиц с необязательным разделителем.
Выходной формат может быть:
- строка нулей и единиц с разделителями или без них;
- массив нулей и единиц;
- строки, содержащие один ноль или единицу, разделенные символом новой строки;
- любой подобный, разумный формат, который подходит вашему языку.
Код гольф. Побеждает несколько байтов.
Контрольные примеры
Вход и выход здесь предполагаются как строки.
Input --> Output
'1110' --> '1'
'11000110' --> '01'
'1100011' --> '0'
'00' --> ''
'1' --> ''
'' --> ''
'1101001' --> '0'
'1011101010' --> '1111'
Ответы:
Желе, 6 байт
Попробуйте онлайн!
Как это работает
источник
Сетчатка ,
1614 байтПопробуйте онлайн!
объяснение
Это довольно просто. Код определяет одну подстановку регулярных выражений, заменяя все (не перекрывающиеся) совпадения
(.)\1|(.)?.
чем-либо, что захватила вторая группа. Это объединяет три разных случая в один:Если две повторяющиеся цифры равны, мы удаляем их из строки (поскольку группа 2 не используется).
В противном случае, если мы можем сопоставить два символа, удалите второй, заменив оба из них на первый. Если это не так, группа
?
пропустит:Это происходит только в том случае, если есть непарный конечный символ, который также удаляется.
источник
Лабиринт ,
2112 байтРедкий пример компактной программы Лабиринт, которая также не имеет никаких операций.В|
предыдущей версии это было совершенно ненужным, и удаление его в значительной степени уменьшило размер программы. На самом деле, лаборатория бьет сетчатку!Попробуйте онлайн!
Нижний левый
"
угол также может быть пробелом, но наличие его там значительно упрощает объяснение.объяснение
Это немного сложнее, поэтому оно сопровождается изображениями. Но сначала быстрый пример:
Настроить
Программа начинается в верхнем левом углу
"
, что является запретом. Затем мы выполняем:Таким образом, в стеке остается один ноль, что достаточно для пустых целей в Лабиринте.
Чтение ввода и завершения
,
читает символ из ввода, возвращая 48 или 49 для0
или1
соответственно, и -1 в EOF. Поскольку это ненулевое значение, в любом случае мы превращаемся в:
, который дублирует вершину стека.Это
:
тупик, поэтому мы оборачиваемся и выполняем,
еще раз. Теперь , если последний вход был EOF, то повернуть налево и заканчиваться@
, иначе мы повернуть направо, со стеком выглядит как[a a b]
(гдеa
,b
являются два символа).Интерпретация броска монеты
Если мы не завершили работу, наш следующий шаг - снова выполнить
$
(побитовый xor). Это дает 0, если входные символы были одинаковыми, 1 в противном случае. Затем мы умножаемa
на этот результат, давая либо 0, либоa
. Поскольку*
это соединение, это значение верхнего стека определяет, что будет дальше.В случае 0 мы идем прямо и выполняем три
"
неоперации перед выполнением(
декремента. Подобно настройке, это заставляет нас поворачиваться и выполнять"*$
, оставляя нас готовыми читать больше символов.Иначе, в
a
случае, мы поворачиваем направо на соединении, такa
как положительно (48 или 49)..
выводит символ, оставляя стек пустым, и(
уменьшает вершину стека, поворачивая 0 к -1. Еще раз, это заставляет нас повернуть налево, выполняя"*$
как в настройке, также оставляя нас готовыми читать больше ввода.источник
(
затем.
, выводит символ 255 (-1 по модулю 256). Так что, начиная с этогоCJam,
108 байтПроверьте это здесь.
объяснение
Это очень простое решение: в каждой паре удалите все экземпляры последнего символа. Повторяющиеся и непарные конечные цифры будут удалены, как и вторая цифра в любой паре неравных цифр:
Это оставляет только цифры, которые мы ищем. Вот как код вычисляет это:
Когда список автоматически печатается в конце программы, пустые строки просто опускаются.
источник
Perl,
191817 байтРешение @Martin Büttner Retina обеспечило 2-байтовое усиление
Включает +1 для
-p
Запустите с вводом на STDIN, например,
perl -p fair.pl <<< 11000110
fair.pl
:Здесь не так много объяснений, поскольку это (косвенный) перевод спецификации:
(.)\1
Если первые 2 цифры совпадают, отбросьте их.\K.
В противном случае первые две цифры отличаются. Keep (\K
) первый.?\K.
За исключением того, что первое не.
является обязательным. Это допускает одно совпадение в конце строки, которое затем отбрасывается, поскольку сохраненная часть пустаисточник
Mathematica, 36
38байт-2 после кражи функции @ LegionMammal978 для определения, является ли список из 2 элементов {0,1} или {1,0}
Предполагается, что аргументом будет список целых чисел.
источник
Гексагония ,
2321 байтРазвернутая:
Это завершается с ошибкой, но сообщение об ошибке отправляется на STDERR.
Попробуйте онлайн!
Судя по количеству зеркал, было бы почти возможно установить его в длину стороны 3, но мне пока не повезло.
объяснение
Вот обычная диаграмма, созданная с помощью Timwi HexagonyColorer :
Программа использует только три края памяти, обозначенные здесь как A , B и C (диаграмма любезно предоставлена EsotericIDE Тимви ):
Казнь начинается по синему пути. Это
/
просто зеркала, которые перенаправляют указатель инструкций (IP), фактический код:,
Установит край , чтобы-1
вместо кода символа , если мы попали EOF. Поскольку мы увеличиваем оба входа, они не меняются, равны они или нет, но превращают EOF в0
.Мы используем по модулю для проверки на равенство, потому что это либо
1
или49
(положительно) для неравных символов и0
для равных символов. Это также служит концом программы, потому что, когда у нас есть0
от EOF, попытка деления на ноль вызовет ошибку.Теперь
<
отличает нули от положительных результатов. Сначала просто: если символы равны, IP выбирает красный путь._
является зеркалом,\
также является зеркалом, но игнорируется и>
отклоняет IP, так что он оборачивается по краям и начинается сверху снова. Однако на этой итерации роли A , B и C меняются местами циклически ( теперь C принимает на себя роль A и т. Д.).Если символы отличаются, вместо этого берется зеленый путь. Это немного грязнее. Сначала он перепрыгивает через no-op с помощью
$
, затем оборачивается к/
левому краю, затем переходит от второй к последней строке справа налево и, наконец, повторно вводит интересную часть исходного кода в{
. Это практически линейный фрагмент кода, который я объясню через секунду, прежде$
чем IP заставит IP перепрыгнуть через, чтобы>
снова объединить два пути.Вот этот линейный кусок кода:
Обратите внимание, что в этом случае роли ребер для следующей итерации также меняются местами циклически, но при этом B принимает роль A и так далее.
источник
Haskell,
714429 байтЭкстремальный гольф от Nimi .
источник
> <> , 11 байт
> <> очень хорошо подходит для таких задач, как «читайте за символ» :) Попробуйте онлайн!
Все это происходит в цикле, так как указатель инструкции оборачивается, как только достигает конца строки.
источник
>
или<
Python, 42 байта
Веселье с рекурсией и побитовым XOR. Принимает список 1 и 0 в качестве ввода.
источник
JavaScript (ES6), 33 байта
Как это работает
источник
Прелюдия , 12 байт
Предполагается, что интерпретатор читает и печатает символы. Вы можете попробовать это онлайн. Но этот интерпретатор печатает целые числа, поэтому для каждого
0
вы получите48
и для каждого1
вы получите49
вместо этого (и перевод строки).объяснение
Очень редко вы можете написать нетривиальную программу в одной строке в Prelude (потому что Prelude требуется более одной строки для завершения по Тьюрингу).
источник
Perl,
2721 байтДобавлен байт для
-n
флага.Тест:
Спасибо @TonHospel за 6 байтов!
источник
say grep$_-chop,/../g
Befunge 93 , 16 байт
Однострочник для компактности. Протестировано с использованием этого онлайн-переводчика .
Последняя часть использует тот факт, что выталкивание из пустого стека Befunge-93 дает 0 .
Если
a != b
мы выполняемВ противном случае, если
a == b
мы выполняем:источник
Pyth,
109 байтовАлгоритм беззастенчиво украден из желейного ответа Денниса .
источник
Python 2, 48 байт
Попробуйте онлайн
Спасибо Деннису и Вольте за указание на вещи, которые я пропустил
источник
zip(*[iter(n)]*2)
Mathematica,
4139 байтМенее сложный и короче, чем другой ответ. Коробка является транспонированным персонажем.
источник
JavaScript (ES6), 33 байта
Скучный порт Retina ответ.
источник
sed,
3433 байтаТест:
источник
fold(1)
команды разбить на пары. Это также вышло в 34!fold -s2|sed 's+01+0+p;s+10+1+p;d'
fold -s2
равносильно тому, чтобыfold -2
сделать эти 33 байта ... и это то, к чему я только что применил чистое решение sed. : Ps/../& /g;s/00\|11\|.\b\| //g
Лабиринт , 31 байт
Не такой короткий и аккуратный, как решение Sp3000, но я подумал, что все равно опубликую это как другой подход:
объяснение
Первый цикл просто
который читает по два символа за раз (
"
без опций). После EOF,
вернется-1
, но проверяет только EOF для каждого второго символа. Это означает, что в любом случае вершина стека будет тогда,-1
а значение ниже будет-1
или каким- либо символьным кодом, который нас не волнует, потому что это бросок непарной монеты.Затем
)*
поворачивает-1
и значение ниже , в один ,0
который нам нужно) , чтобы избавиться от этих двух значений и б) правильно войти в следующий цикл. Этот следующий цикл простоКоторый сдвигает все значения во вспомогательный стек. Это необходимо, потому что мы хотим начать обработку пар, которые мы читаем первыми. Теперь последний цикл:
Значение
)
Just увеличивает некоторое фиктивное значение, чтобы оно было положительным, а указатель инструкции поворачивался на север.{
перетаскивает первую цифру следующей пары и:
дублирует ее. Теперь, когда мы закончим обработку, это будет0
из нижней части вспомогательного стека. В противном случае это либо48
или49
. В случае нуля мы выходим из цикла и завершаем работу@
, в противном случае IP поворачивается на восток.{
останавливает другую цифру текущей пары.$
берет XOR между ними. Если это 0, то есть оба равны, IP просто продолжает двигаться на юг,;
сбрасывает ноль, и IP поворачивает на запад в следующей итерации. Если XOR был1
, то есть они отличались, IP поворачивается на запад, сбрасывает1
с;
и печатает первую цифру с.
.источник
MATL ,
1198 байтВвод и вывод - это числа, разделенные переводами. Завершает с ошибкой (разрешено по умолчанию), когда все входы были использованы.
Попробуйте онлайн!
Старый подход, 11 байтов
Ввод - это строка. Выходные данные - числа, разделенные символами новой строки.
Попробуйте онлайн!
источник
Рубин, 46 байт
Это отделяет
l[0]
,l[1]
аl[2..{end}]
такжеa
,b
иc
. Затем он создает строку сa
ifa!=b
или''
иным образом,f[c]
если ifc[0]
существует или''
иным образом.Ungolfed:
источник
брейкфук, 33 байта
По сравнению с Java это очень компактно, однако, я боюсь, что ответчик брейнфук-гольфист. И не стесняйтесь упоминать, если есть ошибка. Предполагая, что EOF равно 0, вход не содержит недопустимый ввод, ячейка изначально равна нулю, а диапазон значений ячейки является конечным и циклическим. Никаких других предположений нет.
Объяснение:
Карта памяти
инструкция
источник
Mathematica, 41 байт
Анонимная функция, которая вводит и выводит списки нулей и единиц.
источник
#&@@a
на 1 байт корочеa[[1]]
.RuleDelayed
.Transpose
:(Pyth, 10 байт
Тестирование
источник
!q
на ,n
а затем фильтр сfnFT
помощьюnF#
. (обhMnF#cz2
этом я и подумал, когда увидел вызов, но вы достаточно близки, чтобы я не мог опубликовать его отдельно)1
C 66 байтов
Если предположить,
sizeof(int) == sizeof(char *)
«умное» решение -
8481 байтРаботает на машине с прямым порядком байтов, предполагая, что
short
это 2 байта. Ввод передается в качестве аргумента. Программа перебирает пары символов и печатает 0 для 0x3130 и 1 для 0x3031. На big-endian результат будет обратным (замените48|c&1
на,49^c&1
чтобы это исправить).источник
C 57 байт
Мы предварительно копируем символ из ввода
p
в результатr
, но передвигаемr
указатель только в том случае, если он отличается от следующего символа. Если нет, то мы перезапишем его в следующей непревзойденной паре илиNUL
в конце.Тестовая программа:
Тестовый вывод:
источник
Befunge-93 , 40 байт
Вы можете попробовать это здесь . Вставьте код в поле под кнопкой «показать», нажмите «показать», определите ввод, нажмите «запустить». Мы используем кнопку «шаг», чтобы увидеть, как работает программа.
источник
DOS / Windows Batch,
201162 байтаНапример, ввод - это строка, разделенная пробелом
1 0 0 1 1
. Начните с cmd, иначе экран сразу выйдетисточник
пчелиный воск ,
4535 байтЯ мог бы сыграть в гольф на 10 байтов - неплохо.
Я взял чтение полной цепочки бросков монет , что делает программу довольно большой. Простое чтение по одному целых чисел сделало бы программу меньше - может быть, около 22 байт или около того - но также очень неудобно для использования.
Примеры:
Мой пчелиный воск GitHub хранилище.
Мои примеры пчелиного воска на Розетте.
источник