Найти результат игры войны
Когда я учился в начальной школе, была игра «Каменные ножницы», в которую мы играли во время собраний, в ожидании учителя, на переменах и т. Д. Мы называли это «Войной». Однако после некоторого поиска выясняется, что это гораздо более простой вариант «игры с дробовиком» (согласно WikiHow) . Я собираюсь назвать это «Войной», так как правила немного отличаются:
2 человека сидят напротив друг друга. Цель игры - «убить» другого игрока. Каждый ход вы можете сыграть один из 3 ходов:
Перезагрузка : у вас есть пистолет, который держит один выстрел. Это должно быть перезаряжено прежде, чем это может быть запущено каждый раз. Перезагрузка, когда у вас уже есть боеприпасы, законна, но ничего не делает. Перезагрузка была символизирована постукиванием по храму обеими руками. Каждый игрок начинает с 0 патронов.
Охрана : единственный безопасный ход. Если вы стреляете во время охраны, вы не умрете. Символом охраны было скрещивание рук на груди.
Огонь : стрелять из пистолета. Чтобы успешно стрелять, вы должны перезагрузить с момента последнего выстрела. Если ваш противник перезагружается, вы выигрываете. Если они тоже стреляют, и у вас обоих есть патроны, это ничья. Если они охраняют, вы потратили впустую боеприпасы. Хотя стрельба без боеприпасов - законный ход, он ничего не делает и оставляет вас уязвимыми, как перезарядка. Стрельба была символизирована указанием на другого игрока.
Игра была похожа на RPS, в которой каждый игрок одновременно отказывался от своего выбора (мы постукивали по ногам дважды между поворотами, чтобы поддерживать ритм друг с другом, но это не важно для вызова).
Соревнование:
Ваша задача - найти результат игры War. Это может быть функция или полная программа.
вход
Опция, которую каждый игрок выбрал каждый ход, будет представлена символом / строкой:
r : перезагрузить
г : охранник
ф : огонь
Входными данными будут список пар, строка с разделителями / неограниченной линией или что-либо еще в этих строках.
Пример ввода в Python может быть следующим: [("r", "g"), ("f", "r")]
первый игрок перезагружается, а второй игрок охраняется. Во второй ход первый игрок стреляет, а второй перезагружается. Первый игрок выигрывает в этой игре. Же вход может необязательно быть представлена в виде "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Вы можете предположить следующее:
Ввод будет соответствовать выбранному вами формату и будет содержать только допустимые символы.
Кто-то умрет в течение 100 ходов.
Однако вы не можете предполагать, что ходы заканчиваются, когда кто-то умирает.
Выход
Значение, указывающее, кто победил (или кто победил первым *
). Вы можете выбрать, что выводить для каждого сценария, но должны учитывать следующее:
Игрок 1 выигрывает
Игрок 2 выигрывает
Они убивают друг друга (рисуют)
Каждый результат должен иметь значение района и всегда должен быть одинаковым для каждого сценария.
В качестве примера: вы можете выводить, 1
когда игрок 1 выигрывает, 2
когда игрок 2 выигрывает, и 0
в случае ничьей. Затем вы должны всегда выводить, 1
когда игрок 1 выигрывает, 2
когда игрок 2 выигрывает, и 0
в случае ничьей.
Его можно вернуть или распечатать на стандартный вывод. Задний пробел в порядке.
Ясно, что единственный сценарий, который приводит к ничьей, - это если оба игрока стреляют, и у обоих есть патроны.
*
Поскольку в этом вызове ходы могут продолжаться после смерти, возможно, в конечном итоге выиграет более 1 игрока. Вам нужно найти, кто победил первым по входу.
Тестовые случаи (при условии, 1
когда выигрывает P1, 2
когда выигрывает P2 и 0
для ничьей):
"rg fr" => 1 (P1 shot P2 while they were reloading)
"rg ff" => 1 (They both shot, but only P1 had ammo)
"rr ff" => 0 (Both had ammo and shot each other)
"rr ff rr fg" => 0 (Both had ammo and shot each other. Everything after the first win is ignored)
"rr fg rf" => 2 (P2 shot P1 while they were reloading)
"rf gg rr fg rr fr" => 1
(P2 tried to shoot but didn't have any ammo, then they both guarded, then they both reloaded, then P2 blocked a shot, then they both reloaded again [but P2 still only has 1 ammo!], then P1 shoots P2 while they're reloading.
"rr gf fr rf gg rg ff" => 1
^ Player 1 wins here. The rest to the right has no effect on the output
Это код гольф, поэтому выигрывает наименьшее количество байтов!
Обратите внимание, как показывают тестовые примеры, вы должны обрабатывать «тупые» ходы. Для игрока вполне допустимо стрелять, когда у него нет боеприпасов, или перезаряжать 2 хода подряд (и накапливать только один боеприпас).
{"rff","rgf"}
?Ответы:
Сетчатка , 36 байт
Формат ввода должен быть парами, разделенными переводом строки, например
Выход -
!_
игрок 1 выигрывает,_!
если игрок 2 выигрывает, и!!
если есть ничья.Попробуйте онлайн! (Набор тестов, который использует пробел для удобства.)
Должно быть, я полностью упустил этот вызов. Я уверен, что я бы попробовал это в Retina ранее, в противном случае. :)
объяснение
Мы начинаем с маркировки «действительных» снимков, превращая первый
f
после каждогоr
в!
. Мы делаем это путем сопоставления каждогоf
из которых может найти одного иr
того же игрока, не пересекая другогоf
. Ограничить поиск доr
s на одном и том же игроке легко, всегда набирая по три символа за раз.Теперь мы отбрасываем все ходы, в которых кто-то охранял себя, потому что конечный ход не может быть одним из них.
Теперь мы сохраняем только первый ход, который содержит
!
. Если действительный выстрел случается (и мы знаем, что никто не охраняется), игра заканчивается.Наконец, нам нужно объединить строку, чтобы получить согласованные выходные данные, и мы просто делаем это, превращая не-
!
символы (или,r
илиf
) в_
.источник
Python, 139 байт
Вводит ввод в stdin в виде списка 2-символьных строк (например, ['rf', 'rr', 'rg', 'ff']). Выводит 1, если игрок 1 выигрывает, -1, если игрок 2 выигрывает, и 0 для ничьей.
Пояснение: Сначала проверяется, стрелял ли кто-нибудь из пуль, если это так, игра заканчивается. Затем мы определяем, перезаряжали ли игроки свое оружие или впустую тратят боеприпасы.
Это мой первый пост Codegolf :)
источник
JavaScript (ES6),
10810793918985 байтСохранено 4 байта с помощью Тита
Принимает ввод в виде массива из двухсимвольных строк, описывающих ходы, сыгранные каждым игроком.
Возвращает:
1
если игрок 1 выигрывает2
если игрок 2 выигрывает3
за ничьюКак это устроено
Мы поддерживаем битовую маску,
b
описывающую, у кого есть заряженная пуля:Мы используем последовательность Де Брюина
'ffrfgrrggf'
для определения всех 9 возможных комбинаций ходов. Мы используем битовые маски OR и AND для обновления вb
соответствии с комбинацией перемещений. Мы используем 3-й набор битовых масок, которые используютсяb
для определения победителяw
. (Только три выигрышные комбинации бытьff
,fr
иrf
.)Стоит отметить, что маски OR и AND могут храниться с одинаковым рисунком, смещенным на две позиции.
Контрольные примеры
Показать фрагмент кода
источник
0
(никто не был застрелен) или3
(игроки убивают друг друга) в случае ничьей. Не уверен, что это разрешено. Если нет, я могу вернутьсяw%3
.&
Маска может быть 0 дляfr,rf,ff
.'312'['0210231'[m='ffrfgrrggf'.search(c)]|'233331'[m-3]&b]
или'123'['2100231'[m='frffgrrggf'.search(c)]|'233331'[m-3]&b]
сохранить один байт; а они работают?["rr","fg","fr","rf"]
&
имеет более высокий приоритет, чем|
, поэтому изменение порядка не должно ничего менять (кроме сохранения байта). Но назначение отсутствовало в моем коде. Попробуй...'123'[b='2100231'...
.Perl 6 ,
7162 байтаРешение на основе регулярных выражений.
Принимает ввод в виде строки в форме
"rg fr"
.Три возможных выходов значения перечислений
More
(игрок 1 Won),Less
(игрок 2) вон,Same
(рисовать) - которые превращаются в эти слова при печати, или в1
,-1
,0
когда принуждают к номерам.Попробуйте онлайн!
Как это устроено
Выполняет два совпадения регулярных выражений на входе. После интерполяции два регулярных выражения:
r[..[r|g]]*.[r|f]f
- Соответствует первому удачному выстрелу игрока 2.r[..[r|g]]*..f[r|f]
- Соответствует первому удачному выстрелу игрока 1.В каждом случае он возвращает конечную позицию match (
.to
) или бесконечность, если совпадений не было.Применяет
<=>
оператор к двум конечным позициям совпадения. Возвращает значение изOrder
перечисления (More
,Less
илиSame
) в зависимости от того, больше ли первый аргумент, меньше или равен второму.источник
some number
? И действительно ли вы используете такие символы в обычном коде Perl или это только для игры в гольф?[Menu] i n f
(это называется последовательностью составления ). Однако все символы Perl 6 имеют версии ASCII - например,Inf
и∞
являются синонимами - поэтому нет необходимости использовать символы Unicode в коде Perl 6. Мне просто нравится ... :)Haskell ,
101 9187 байтПопробуйте онлайн! Инфиксная функция
#
берет две строки, представляющие действия каждого из двух игроков, и возвращает,(0,1)
если игрок 1 выигрывает,(1,0)
для игрока 2 и(0,0)
для ничьей.Пример использования:
Объяснение:
Инфиксная функция
!
преобразует последовательность действий'r'
(перезагрузка),'f'
(огонь) и'g'
(охрана) в последовательность наблюдаемых действий0
(фактический огонь),1
(бездействия) и2
(охрана), где действие огня считается только фактическим действием огня. если пуля заряжена, и в противном случае никаких действий не предпринимается . Для этого первым аргументомn
является0
то, заряжена1
ли пуля и не заряжена ли пушка. Таким образом, каждый'f'
может быть просто заменен текущимn
. (n=0
-> загружено -> фактический пожар ->0
,n=1
-> выгружено -> бездействует ->1
)Девять результирующих возможностей тогда
(0,0)
: Оба игрока стреляют и умирают, игра заканчивается.(0,1)
или(1,0)
: один игрок стреляет в другого, игра заканчивается.(0,2)
или(2,0)
: один игрок стреляет, но другой охранник, игра продолжается.(1,1)
,(1,2)
,(2,1)
Или(2,2)
: Ни один игрок стреляет, игра продолжается.Конструктивно сумма вариантов окончания игры меньше 2, а сумма вероятности продолжения каждой игры больше или равна 2. Результатом игры является первый кортеж с суммой меньше 2.
источник
Пакетный, 249 байт
Ввод осуществляется в виде пар символов для каждого хода и выводится по уровню ошибки (0 = ничья, 1 = игрок 1, 2 = игрок 2).
x
иy
следите за тем, есть ли у игрока боеприпасы, поэтому, когда оба выстрела, результат будет3-x-x-y
, если только это не 3, в этом случае мы продолжаем идти. В строке 5 я злоупотребляю парсером Batch -%1
(который является текущим ходом) подставляется перед выполнениемshift
оператора и удаляет его, поэтому мы все равно переходим к правильной метке.источник
Clojure, 168 байт
Меньше гольфа (если оба человека живы, мы используем
M
для обновления их боеприпасов и состояния жизни противника, в противном случае мы возвращаем текущий статус):Пример использования (первый элемент сообщает, жив ли игрок 1 в конце игры, второй элемент сообщает, жив ли игрок 2, 3-й и 4-й сообщают о состоянии боеприпасов, которое не имеет значения при определении победителя):
Обновление: хорошо, посмотрите на это, это
loop
имеет одинаковую длину Я считаю, чтоreduce
версию легче разрабатывать, так как вы можете легко проверить промежуточные состояния, если используетеreductions
.источник
[l1 l2 r1 r2]
(его измененные значения вlet
и его исходные значения) и этиfn
подписи.loop
. Я считаю, что это приводит к аккуратному коду. Как только мне нужно сложить более чем с 1 аккумулятором, я переключаюсь.PHP,
10710190 байтиспользуя битовую маску $ d для статуса загрузки и последовательность DeBruijn для ходов стрельбы.
принимает ввод как 2-символьные аргументы командной строки, запускается с
-nr
.сломать
fr
:: position = 1 = P1 срабатывает;rf
= позиция 2 =ff
стрельба P2, = позиция 3 = оба огняg<$m
<=>f<$m[0]
(f<$m
всегда верно, потому что есть второй символ).источник
Python, 200 байт
источник
turns
вместо простоt
, что означает, что программа намного больше, чем необходимо. Также, пожалуйста, начните с чего-то вроде#Python 2, 200 bytes
(при условии, что это 2, а длина программы 200 байт), чтобы язык, который вы используете, был понятным.Clojure,
180173 байта-7 байт, изменяя функцию на полную функцию вместо использования макроса. Это позволило мне сделать макросы внутренних функций, что немного экономит.
Это очень буквальное решение. Я схожу с ума, так как я только что написал полную версию игры, и это в основном сильно урезанная версия алгоритма, который я использовал. Вероятно, я мог бы сделать много оптимизаций, но я вполне доволен этим. См. Pregolfed код для объяснения.
источник