Magic : The Gathering 은 무엇보다도 플레이어가 생물을 나타내는 카드를 재생하여 다른 플레이어를 공격하거나 차단하여 다른 플레이어의 공격을 방어 할 수있는 거래 카드 게임입니다.
이 코드 골프 도전에서, 당신의 프로그램은 전투에서 차단하는 방법을 결정하는 매직 플레이어 대신에있을 것입니다.
각 생물에는 힘과 강인함의 두 가지 관련 속성이 있습니다. 생물의 힘은 전투에서 다룰 수있는 피해량이며, 그 인성은 파괴하는 데 필요한 피해량입니다. 힘은 항상 0 이상이고 인성은 항상 1 이상입니다.
매직 전투 중에 자신의 차례가 된 플레이어는 자신의 생물 중 일부가 상대를 공격한다고 선언합니다. 그런 다음 방어 플레이어라고 알려진 다른 플레이어는 자신의 생물을 차단 자로 지정할 수 있습니다. 생물은 전투 당 하나의 생물 만 차단할 수 있지만, 다수의 생물은 모두 동일한 생물을 차단할 수 있습니다.
차단자가 선언 된 후, 공격 플레이어는 차단 된 각 공격 생물에 대해 해당 생물이 자신을 방어하는 생물에게주는 피해 (힘과 동일)를 분배하는 방법을 결정합니다.
그런 다음 피해가 처리됩니다. 각 생물은 그 힘과 동일한 피해를 입 힙니다. 차단 된 공격 생물은 위와 같이 피해를 입 힙니다. 차단되지 않은 공격 생물은 방어 플레이어에게 피해를 입 힙니다. 생물을 막 으면 자신이 막은 생물에게 피해를 입 힙니다. 막지 않은 방어 플레이어의 생물은 피해를 입히지 않습니다. (생물을 막을 필요는 없습니다.)
마지막으로, 인성보다 크거나 같은 피해를 입은 생물은 모두 파괴되어 전장에서 제거됩니다. 생물의 인성보다 적은 피해량은 효과가 없습니다.
이 프로세스의 예는 다음과 같습니다.
힘 P와 강인도 T를 가진 생물은 P/T
Attacking:
2/2, 3/3
Defending player's creatures:
1/4, 1/1, 0/1
Defending player declares blockers:
1/4 and 1/1 block 2/2, 0/1 does not block.
Attacking player distributes damage:
2/2 deals 1 damage to 1/4 and 1 damage to 1/1
Damage is dealt:
2/2 takes 2 damage, destroyed.
3/3 takes 0 damage.
1/1 takes 1 damage, destroyed.
1/4 takes 1 damage.
0/1 takes 0 damage.
Defending player is dealt 3 damage.
방어 플레이어는 전투에서 3 가지 목표를 가지고 있습니다. 상대방의 생물을 파괴하고 자신의 생물을 보존하며 가능한 적은 피해를 입 힙니다. 또한 힘과 강인성이 더 높은 생물이 더 가치가 있습니다.
이것들을 단일 척도로 결합하기 위해, 전투에서 방어하는 플레이어의 점수는 살아남은 생물의 힘과 강약의 합에서, 상대방의 살아남은 생물의 힘과 강약의 합에서 1을 뺀 것과 같습니다. 방어 플레이어에게 입힌 피해량의 절반. 방어 플레이어는이 점수를 최대화하려고하지만 공격 플레이어는이 점수를 최소화하려고합니다.
위에 표시된 전투에서 점수는 다음과 같습니다.
Defending player's surviving creatures:
1/4, 0/1
1 + 4 + 0 + 1 = 6
Attacking player's surviving creature:
3/3
3 + 3 = 6
Damage dealt to defending player:
3
6 - 6 - 3/2 = -1.5
방어 플레이어가 위에서 설명한 전투에서 전혀 차단하지 않았다면 점수는
8 - 10 - (5/2) = -4.5
방어 플레이어를위한 최적의 선택은 차단했을 2/2
와 1/1
과를 1/4
, 그리고 차단 3/3
와 함께 0/1
. 그들이 그렇게했던 경우 만 1/4
과는 3/3
살아남을 것이고, 손상은 점수를 만들고, 방어 플레이어에 처리되지 않은 것
5 - 6 - (0/2) = -1
당신의 도전은 방어 플레이어를위한 최적의 차단 선택을 출력하는 프로그램을 작성하는 것입니다. "최적"은 상대가 당신이 어떻게 막았는지에 따라 점수를 최소화하는 방식으로 피해를 분배한다는 점에서 점수를 최대화하는 선택을 의미합니다.
이는 최대치입니다 : 각 블로킹 조합에 대한 점수를 최소화하는 데미지 분포에 대한 최대 점수입니다.
입력 : 입력은 2 개의 튜플 목록으로 구성되며, 각 2 개의 튜플은 (파워, 인성) 형식입니다. 첫 번째 목록에는 각 공격 생물 (상대방 생물)의 힘과 강인함이 포함됩니다. 두 번째 목록에는 각 생물의 힘과 강인함이 포함됩니다.
튜플과리스트는 다음과 같은 편리한 형식으로 표시 될 수 있습니다.
[[2, 2], [3, 3]]
[[1, 4], [1, 1], [0, 1]]
출력 : 출력은 (차단 생물, 막힌 생물) 형태, 즉 생물 중 하나와 그 생물 중 하나가 뒤 따르는 일련의 2- 튜플로 구성됩니다. 생물은 입력 목록에서 색인으로 참조됩니다. 인덱스는 0 또는 1 인덱스 일 수 있습니다. 다시 말하지만 편리한 형식입니다. 모든 주문은 괜찮습니다. 예를 들어, 위의 입력을 고려하여 위에서 최적의 차단 시나리오는 다음과 같이 표시 될 수 있습니다.
[0, 0] # 1/4 blocks 2/2
[1, 0] # 1/1 blocks 2/2
[2, 1] # 0/1 blocks 3/3
예 :
Input:
[[2, 2], [3, 3]]
[[1, 4], [1, 1], [0, 1]]
Output:
[0, 0]
[1, 0]
[2, 1]
Input:
[[3, 3], [3, 3]]
[[2, 3], [2, 2], [2, 2]]
Output:
[1, 0]
[2, 0]
or
[1, 1]
[2, 1]
Input:
[[3, 1], [7, 2]]
[[0, 4], [1, 1]]
Output:
[1, 0]
or
[0, 0]
[1, 0]
Input:
[[2, 2]]
[[1, 1]]
Output:
(No output tuples).
입력 및 출력은 STDIN, STDOUT, CLA, 기능 입력 / 반환 등을 통해 이루어질 수 있습니다. 표준 허점이 적용됩니다. 이것은 코드 골프입니다 : 바이트 단위의 최단 코드가 이깁니다.
사양을 명확하게하고 초기 아이디어를 제공하기 위해이 pastebin 은 Python에서 참조 솔루션을 제공합니다. 이 best_block
기능은이 문제에 대한 샘플 솔루션이며 프로그램을 실행하면보다 자세한 입력 및 출력을 제공 할 수 있습니다.