На вечеринке меня познакомили с игрой LCR. Теперь это не отличная игра, так как в ней нет навыков, а есть только случайный шанс. Но это заставило меня задуматься, я мог написать это, и я сделал быструю программу на R для моделирования игры.
Правила игры изменены из Википедии, чтобы соответствовать тому, как мы играли:
Каждый игрок получает как минимум 3 фишки. Игроки по очереди бросают три шестигранных кубика, каждый из которых помечен буквами «L», «C», «R» на одной стороне и одной точкой на трех оставшихся сторонах. Для каждого броска "L" или "R" игрок должен передать один чип игроку слева или справа соответственно. «C» обозначает фишку в центре (банк). Точка не имеет никакого эффекта.
Если у игрока осталось менее трех фишек, они все еще находятся в игре, но их количество фишек - это количество кубиков, которые они бросают в свой ход, а не бросают все три. Когда у игрока ноль фишек, они в этот ход пропускают кубики, но могут получать фишки от других и соответственно делать следующий ход. Победителем становится последний игрок, поставивший фишки в центр.
Соревнование: напишите программу на выбранном вами языке, которая принимает данные о количестве игроков и количестве стартовых фишек и имитирует игру LCR, показывая состояние игры после того, как каждый игрок бросил.
Например, игра может быть выведена как:
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],
[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],
[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],
[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
ht: Джонатан Аллан
Выходные данные не должны выглядеть точно так, но должно быть легко различить бросок костей, сколько фишек у каждого игрока и сколько фишек в центре за каждый ход.
Это код гольф, поэтому выигрывает самый короткий код.
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
это?Ответы:
Emacs Lisp , 279 байт
Используйте эту функцию как
(f 4 3)
.Лучше читаемая версия:
Пример вывода:
источник
Java 8,
281277275274253 байтаВерсия, которая выводит то же состояние, когда у игрока на терне осталось 0 фишек:
Начинается с третьего игрока в массиве.
Попробуйте онлайн.
Версия, которая пропускает игроков с 0 оставшимися фишками (274 байта):
Начинается с первого игрока в массиве.
Попробуйте онлайн.
-7 байт благодаря @ OlivierGrégoire .
Пояснение (второй версии):
источник
s=0;for(int C:c)s+=C;
(21 байт) можно заменить наs=A.stream(c).sum();
(20 байт)c[i%p]-=r<3?1:0
→c[i%p]-=1-r/3
. Это сэкономит 2 байта.A
отjava.util.Arrays
. : D И, поместив его в цикл, чтобы сохранить точку с запятой, получим -2 байта. И1-r/3
это действительно правильно ( см. Здесь ). Спасибо.s=c[u=(i+r-1+p)%p]+=1-r&1-r/4
(экономит 2 байта по сравнению сs=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0
)Python 2 ,
159148 байтПопробуйте онлайн!
Печатает все фишки игроков после каждого броска
источник
n*c - sum(players)
. Если мне нужно будет явно выписать это, я будуЖеле , 39 байт
+2, чтобы исправить поведение повторения (
¡
перед ним должна стоять нилада, так что«3Ḣ$
->⁸FḢ«3
).Если мы можем определить выходные списки, которые должны вращаться, чтобы фишки принадлежали игроку, который действовал ранее слева, мы можем покончить с самым правым 6 байт на 33 байта (однако, на мой взгляд, это несколько неудобно читать).
Диадическая ссылка, принимающая количество фишек на игрока слева и количество игроков справа, которая выдает список фишек в списке игроков как в начале игры, так и после каждого хода (включая ходы, в которых 0 фишек дает пас) ,
Попробуйте онлайн!
Как?
Каждый игрок по очереди, до трех раз, в зависимости от количества своих фишек, подбрасывает монету. Когда игрок переворачивает головы, он ничего не делает, но если он переворачивает хвосты, он бросает трехсторонний кубик, теряя фишку в L, C или R. (Обратите внимание, что 0 переворачивается, когда у игрока 0 фишек, эквивалентно прохождению.)
Это повторяется пока сумма фишек игроков не станет равной 0.
Реализация поворачивает игроков влево на одно место каждый ход, а затем поворачивает полученные состояния обратно, чтобы все были выровнены, как если бы они не были.
источник
Ø.X¤?
, вложено внутри повтора-вверх-к-3-кратного инструкции,⁸«3Ḣ¤¡
.C #, 356? +13? Б
Требуется
using System;
всего +13 байт к коду, показанному ниже, если мне нужно это посчитать. В противном случае просто включите его в любой класс и позвонитеL(players, starting chips);
.Пример вывода для игры 2,2:
Менее гольф-версия:
источник
C # (интерактивный компилятор Visual C #) ,
201199 байтПопробуйте онлайн!
источник
Древесный уголь , 61 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Чередует вывод рулонов кубиков и оставшихся фишек (ни исходное количество фишек, ни количество фишек в центре не учитываются). Объяснение:
Начните с первого игрока.
Повторяйте, пока ни у кого не осталось фишек.
Бросьте до трех кубиков для текущего игрока. Эти кости обозначены 0-5, где 0-2 представляют точку, 3 - проход слева, 4 - центр, 5 - вправо.
Сложите количество фишек, которые игрок справа прошел слева, и количество фишек, которые игрок слева прошел справа, но вычтите количество фишек, которые игрок сам передал.
Переход к следующему игроку.
Выведите новые номера фишек, которыми владеют игроки.
На самом деле каждому проще одновременно бросать свои кости, что можно сделать за 50 байтов, включая печать рулонов и оставшихся фишек:
Попробуйте онлайн! Ссылка на подробную версию кода.
источник
05AB1E (legacy) ,
58504952 байтаВерсия, которая выводит то же состояние, когда у игрока на терне осталось 0 фишек (
504952 байта ):Попробуйте онлайн.
Версия, которая пропускает игроков с 0 оставшимися фишками (
585760 байт ):Попробуйте онлайн.
Оба +3 байта, используя устаревшую версию, потому что новая версия 05AB1E имеет странную ошибку. Он должен работать с
Ws\
(выдвигать минимум без выталкивания; своп; отбрасывать список), замененным наß
(всплывающий список и выдвигать минимум) и0›
(проверять, больше ли 0) заменять наd
(проверять, не неотрицательно ли / больше или равно 0) в новая версия, но по какой-то причине порядок следования изменяется после завершающего¼
! .. : S (и новая версия также очень медленная и истекает через 60 секунд до завершения результата ..>.>)Первый ввод - количество игроков, второй - количество фишек на игрока.
Пояснение (второй версии):
источник
[2, 3, 3, 3]
за которой следует[2, 2, 2, 6]
..: S Я посмотрю, смогу ли я найти причину и устранить ее. Если нет, я всегда могу удалить его и использовать только устаревшее, так как оно все равно выводит намного больше .. По какой-то причине новая версия довольно медленная со сложными циклами ..>.>counter_variable
. Я попытался воспроизвести проблему в более простом примере, но не смог. Он как-то связан с вложенными операторами if и отображениями внутри бесконечного цикла, но это определенно странно ... В любом случае, я удалил эту версию, и теперь осталась только старая (и более быстрая) версия, которая работает как задумано.