Учитывая два списка бросков костей для битвы в Риск, ваша программа или функция должны выводить, сколько войск теряет каждый игрок.
Фон
Вам не нужно читать это, потому что это просто фон. Перейдите к подзаголовку «Задача», чтобы продолжить без изменений.
В игре Risk один игрок может атаковать другого игрока (на самом деле это необходимо для победы). Исход битвы определяется броском костей. Каждое сражение происходит как последовательность под-сражений, в которых каждый игрок может потерять 2свои части армии.
В под-битве каждый защитник и атакующий бросают по несколько кубиков, число которых может меняться в зависимости от обстоятельств, не связанных с этим испытанием. Самый ценный кубик атакующего сравнивается с самым ценным кубиком защитника. Если кубик атакующего выше, чем кубик защитника, он теряет одну фигуру. В противном случае атакующий теряет одну фигуру.
Затем, если у обоих игроков есть по крайней мере два кубика, сравниваются вторые по величине кубики двух игроков. Опять же, если кубик атакующего выше, чем кубик защитника, он теряет одну фигуру. В противном случае атакующий теряет одну фигуру.
(Защитник выигрывает связи. Если и защитник, и атакующий бросают 4, то атакующий теряет фигуру.)
В этом под-сражении из статьи в Википедии кости атакующего окрашены в красный цвет, а кости защитника - в белый. Самый высокий из кубиков атакующего есть, 4а самый высокий - у защитника 3. Так как нападающий был выше, защитник теряет фигуру. Второй по величине 3для атакующего и 2для защитника. Поскольку атакующий снова оказался выше, защитник теряет еще одну фигуру. Таким образом, в этом под-сражении атакующий не теряет фигуры, а защитник теряет 2фигуры.
Обратите внимание, что третьи по величине произведения не сравниваются. Это связано с тем, что у защитника не более двух кубиков в одной под-битве, поэтому нет ни одной третьей по величине фигуры для сравнения.
задача
Принимая во внимание несортированные броски костей (целые числа в диапазоне от 1 до 6 включительно) как атакующего, так и защитника в под-битве риска в любой удобной форме, выведите количество армейских фигур, которые проиграл каждый игрок. Вывод может быть в любой удобной форме, если он имеет разные выходы, чтобы указать пять возможностей. Вы должны указать, что эти разные выводы в вашем вопросе.
Выход определяется следующим образом: Начните с def=0и atk=0. Если наибольшее значение в списке бросков костей атакующего больше, чем наибольшее значение в списке бросков костей защитника, то увеличивается def. В противном случае, приращениеatk .
Если оба списка бросков костей имеют длину по крайней мере 2, то: если второе по величине значение списка бросков костей атакующего больше второго по значению списка, то увеличивается defи иначе увеличивается atk.
Наконец, программа или функция должны вывести уникальный идентификатор для каждой из следующих 5 возможностей вывода:
╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 1 ║ 0 ║
║ 0 ║ 1 ║
║ 2 ║ 0 ║
║ 1 ║ 1 ║
║ 0 ║ 2 ║
╚═══╩═══╝
пример
Защитник: [3, 2]
Атакующий: [2, 4, 1]
Макс защитника 3и Макс атакующего 4. 4>3, Поэтому def=1
вторых Защитнику 2и второй атакующего является 2. Not(2>2)так atk=1. Выход может быть [1,1].
Тестовые случаи
Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]
Пример реализации
Python 2 или 3
def risk(atk_rolls,def_rolls):
# set the rolls in descending order, e.g. [5,3,2]
atk_rolls = sorted(atk_rolls,reverse = True)
def_rolls = sorted(def_rolls,reverse = True)
# minimum length.
minlen = min(len(atk_rolls),len(def_rolls))
atk_lost = 0
def_lost = 0
# compare the highest-valued rolls
if atk_rolls[0]>def_rolls[0]:
def_lost += 1
else:
atk_lost += 1
if minlen == 2:
# compare the second-highest-valued rolls
if atk_rolls[1] > def_rolls[1]:
def_lost += 1
else:
atk_lost += 1
return [def_lost, atk_lost]
Характеристики
- Входные данные могут быть приняты в любой форме, которая четко кодирует только броски защитника и броски атакующего.
- Вывод может быть в любой форме, которая обеспечивает уникальный вывод для каждой из пяти возможностей, перечисленных выше.
- Броски защитника - это список
1или2целые числа в наборе[1,2,3,4,5,6]. Роллы атакующие представляют собой список1для3целых чисел в наборе[1,2,3,4,5,6]. - Поскольку это код-гольф , выигрывает самый короткий код на каждом языке ! Вы не дайте ответы на языках гольфа отговорить вас от проводки ответов на других языках.

