Каждый всегда хочет реализовать игру жизни Конвея. Это скучно! Давайте вместо этого сделаем полицейских и грабителей!
У вас будет две команды: полицейские и грабители. Каждая команда состоит из 5 человек, каждый из которых имеет 50 единиц здоровья. Программа будет зацикливаться непрерывно. На каждой итерации будет происходить следующее:
Для каждой команды выведите первую букву (
C
для полицейских,R
для грабителей), пробел, разделенный пробелами список HP членов и новую строку. Это статус команд. После того, как оба будут сделаны, напечатайте еще одну новую строку. Например, вот как это может выглядеть в первом раунде:C 50 50 50 50 50 R 50 50 50 50 50
Выберите случайное число от 1 до 10 (включая 1 и 10). Мы позвоним по номеру
N
. ЕслиN
даже, грабители проигрывают в этом раунде; если странно, копы проигрывают.Выберите случайного члена проигравшей команды, чье HP больше 0, и вычтите
N
HP. HP членов никогда не должен появляться ниже статуса 0.Перезапустите цикл.
Игра заканчивается, когда все члены одной команды теряют все свои HP. Затем, если победят полицейские, будет напечатано следующее:
C+
R-
и если грабители победят
R+
C-
Это код гольф, поэтому выигрывает самое короткое количество персонажей.
Вот пример реализации в Python 2:
import random
cops = [50]*5
robbers = [50]*5
while any(cops) and any(robbers):
# print the status
print 'C', ' '.join(map(str, cops))
print 'R', ' '.join(map(str, robbers))
print
# pick N
N = random.randint(1, 10)
# pick the losing team (robbers if N is even, else cops)
losers = robbers if N % 2 == 0 else cops
# pick a member whose HP is greater than 0
losing_member = random.choice([i for i in range(len(losers)) if losers[i]])
losers[losing_member] -= N
# make sure the HP doesn't visibly drop below 0
if losers[losing_member] < 0: losers[losing_member] = 0
if any(cops):
# robbers lost
print 'C+'
print 'R-'
elif any(robbers):
# cops lost
print 'C-'
print 'R+'
game-of-life
.cops-and-robbers
!Ответы:
CJam, 86 байт
Я немного опоздал на вечеринку, но я привез подарок CJam! ... Эй, подожди, куда ты идешь?
Попробуйте онлайн.
объяснение
Поскольку вопросы просят подражать простому процессу, это относительно простой ответ. Возможно, один интересный выбор, который я сделал, состоял в том, чтобы здоровье обеих команд чередовалось в одном и том же списке. Преобразование в два отдельных списка стоит 3 байта, что необходимо как для отображения состояния здоровья, так и для проверки, проиграла ли команда. Но (я думаю) это компенсируется 2 байтами, сохраненными при инициализации, и гораздо более простой логикой нанесения ущерба.
источник
R - 201
источник
rep(which(x>0),2)
отличие от всегоwhich(x>0)
?sum(R*C)
иsum(R)*sum(C)
это не одно и то же. Например, вы не захотите выйти, если C = c (0,0,0,10,10) и R = c (10, 10, 10, 0, 0). В этом случае я сохраняю, присваиваяS=sum
. 3) Проблема вsample
том, что если первый аргумент является одним числом, напримерsample(5, 1)
, тогда он будет таким же, как и при выполненииsample(1:5, 1)
: вместо постоянного возврата5
он будет возвращать любое число из1
в5
. Таковsample(rep(x, 2), 1)
мой трюк для того, чтобы всегда выбирать число средиx
даже в том случае, когдаlength(x)
есть1
.APL (Дьялог) (101)
Объяснение:
S←2 5⍴50
: в начале установитеS
матрицу 5 на 2, где каждое значение равно 50. Верхний ряд матрицы представляет полицейских, второй ряд представляет грабителей.J←∨/S>0
: для каждой строки матрицы запомните, являетсяJ
ли какой-либо из HP больше нуля.→6/⍨~∧/J
: если в обеих командах нет живых участников, переходите к строке 6. (конец)⎕←3↑'CR',0⌈S
: для каждого значения в матрице выведите максимум и 0, добавьте «C» к первой строке и «R» ко второй и добавьте третью (пустую) строку.N←?10
: получить случайное число в интервале [1,10] и сохранить его вN
.L←1+~2⊤N
: установитьL
(проигравшая команда),1
если число было нечетным, и2
если оно было четным.M←(0<S[L
...;])/⍳5
: получить индексы живых членов этой команды и сохранить их вM
M[?⍴M
...]
: выберите случайное значение изM
S[L;M
...]-←N
: вычестьN
из значения выбранного члена команды→2
: перейти к строке 2 (тест для живых членов)⎕←'CR',⍪'+-'⌽⍨J⍳0
: вывести окончательный статус, поставив+
перед выигравшей командой и-
перед проигравшей.Образец вывода
источник
Рубин, 184
источник
Mathematica,
246241 байтВозможно, будет дальше в гольф ...
источник
PHP - 416 байт
Я новичок в гольфе, и хотя этот вызов будет достаточно легким, чтобы попробовать его. Итак, вот что я придумала.
С объяснением:
источник
!= 0
и заменив проверку на равенство нулю оператором not (!array_sum($r)
).C
390384371 байтМой первый гольф, если есть какие-то возможные улучшения, просто скажите мне :)
версия для гольфа:
несколько неглёвая версия:
редактировать: я нашел способ немного сократить его и исправил небольшую ошибку
источник
for(j=0;j<10;j++)
) более короткой версией (for(j=10;--j;)
).Пакет - 396 байт
Я не знаю, считается ли это технически, так как он фактически не выбирает случайного члена команды , чье здоровье больше 0 . Он просто выбирает случайного члена, и если вычитание здоровья генерирует число меньше 0, то число становится 0 ..
источник
Javascript: 410
источник
Октава,
182 177 158145 байт145:
Я прекратил проверку, если стрельба персонажа выше нуля - это было бы важно, если бы мы были вынуждены отображать состояние в каждом ходу - здесь мы просто случайно пропускаем одно случайное число из RNG, делая его более случайным.
Также заменили
с короче
[примечание - это печать 'C + R-' без перевода строки - это исправлено в 145-байтовой версии]
158:
Degolfed:
Я изменил
repmat(50,5,2)
наrepmat(5)
- поэтому у нас теперь матрица 5х5 вместо 5х2 (дополнительные 3 столбца не влияют на алгоритм). Я также нашел способ сжать вывод.177:
Degolfed:
По сути, мы создаем матрицу 5x2, где первый столбец - копы, а второй - грабители:
sum
Функция , когда один аргумент применяется делает сумму по столбцам, так что изначально:Когда один из них достигает нуля,
prod(sum(t))
оценка обнуляется, прерывая цикл. Затем мы можем проверить, кто выиграл, проверяя, чьи суммы в столбце равны нулю.источник