Играть в игру Dice Cricket

12

Dice Cricket - игра, в которую я познакомился, будучи ребенком, и с тех пор использовал ее как способ скоротать время. Я не смог найти страницу Википедии, поэтому я объясню правила ниже.

Правила игры в крикет

посылка

Dice Cricket - игра, похожая на выигрыш в игре в крикет, когда вы смотрите ее, но вместо того, чтобы наблюдать и записывать результат, вы бросаете кубик и записываете результат.

Результаты заносятся в таблицу, как показано внизу.

дисплей

Dice Cricket использует специальный дисплей, чтобы показать всю информацию, происходящую.

В таблице 11 строк. Каждый ряд представляет собой тесто. Расположение строки объяснено ниже.

+------+------------------------------+---------+-----+
| Name |    Runs                      | How Out |Score|
+------+------------------------------+---------+-----+
  • Имя: имя должно быть строкой, состоящей исключительно из букв, прописных или строчных
  • Работает: жидкое тесто может столкнуться с 30 шарами. Каждый мяч может быть одним из 1 2 4 6 . /. Это будет объяснено более подробно ниже
  • How Out: способ, которым тесто было вне. Может быть любой изBowled, LBW (Leg Before Wicket), Caught, Retired or Not Out
  • Оценка: сумма всех чисел в Runs

Как работает игра

В игре всегда есть 2 игрока на поле. Первый игрок по умолчанию является текущим бэттером, а второй - в «выключенном» бэттере.

Игра состоит из «шаров»: каждый мяч в крикетном матче представлен броском костей. Каждый бросок выполняет свою команду:

  • 1, 2, 4 и 6 дают бэттеру столько очков. Если выброшено 1, текущее тесто становится «выключенным» тестом, а «отключенное» тестом становится текущим
  • 3 - «точечный шар», означающий, что ничего не происходит. Он представлен в Runsразделе как a .и имеет значение 0. A 0не может использоваться для его представления.
  • 5 это калитка. Если выброшено 5, текущее тесто «вне». Это означает, что к /сериям добавляется a, и с этого момента тесто больше не может забивать пробеги. Затем жидкое тесто заменяется следующим жидким тестом. В How Outразделе представлен случайный выбор возможных способов выхода:Bowled, LBW, Caught

Пример для калитки (это просто для ясности, это не так, как ее вывод)

player a is on 4,6,2,6,4
player b is on 6,4,2,6,6
player c hasn't batted
player a is current batter

WICKET!!!

player a is on 4,6,2,6,4,/
player b in on 6,4,2,6,6
player c is on NOTHING
player c is current batter

Каждые 6 шаров переключаются две колотушки; текущее тесто становится «выключенным» тестом, а «выключенное» тесто становится текущим тестом

Если Runsсекция заполнена (30 шаров), жидкое тесто отсутствует, и How Outсекция установлена ​​на Retired. А / не помещается в конце Runsкоробки.

Actual Challenge (да, все, что было правилами игры)

Ваша задача состоит в том, чтобы вывести заполненную таблицу (как пример в конце), учитывая список имен. Содержимое вывода должно содержать только таблицу и / или начальные или конечные пробелы.

правила

  • Стандартные лазейки запрещены
  • Все 11 игроков должны иметь что-то в Runsразделе.
  • Только 1 игрок может быть Not Out. Любой другой не вышедший на пенсию игрок должен иметь право выбора[Bowled, LBW, Caught]
  • Имена могут быть любой длины от 1 до 6, соответствующей регулярному выражению A-Za-z
  • Последняя строка в таблице должна быть итоговой строкой (см. Пример)
  • Вам не нужно никоим образом выравнивать текст в таблице, но разделители строк и столбцов должны быть выровнены.

пример

Input:
['Fred', 'Sonya', 'David', 'Ben', 'Cody', 'Hazel', 'Nina', 'Kim', 'Cath', 'Lena', 'Will']
Output:
+------+------------------------------+---------+-----+
| Name | Runs                         | How Out |Total|
+------+------------------------------+---------+-----+
|Fred  |.662/                         | Caught  | 14  |
+------+------------------------------+---------+-----+
|Sonya |1164/                         | Caught  | 12  |
+------+------------------------------+---------+-----+
|David |/                             |   LBW   |  0  |
+------+------------------------------+---------+-----+
|Ben   |424/                          |   LBW   | 10  |
+------+------------------------------+---------+-----+
|Cody  |62/                           | Bowled  |  8  |
+------+------------------------------+---------+-----+
|Hazel |/                             |   LBW   |  0  |
+------+------------------------------+---------+-----+
|Nina  |161.6226166..44261442/        | Caught  | 64  |
+------+------------------------------+---------+-----+
|Kim   |11/                           | Caught  |  2  |
+------+------------------------------+---------+-----+
|Cath  |6.21/                         |   LBW   |  9  |
+------+------------------------------+---------+-----+
|Lena  |/                             | Bowled  |  0  |
+------+------------------------------+---------+-----+
|Will  |2                             | Not Out |  2  |
+------+------------------------------+---------+-----+
|               Total Runs                      | 121 |
+-----------------------------------------------+-----+
Кэрд
источник
Песочница
caird coinheringaahing
Хех, я играл похожий вариант под названием «Ручной крикет».
полностью человек
Что определяет, когда игра заканчивается? Это когда жидкое тесто отсутствует, и больше некому его заменить?
KSmarts
@KSmarts Правильно.
caird coinheringaahing
1
@JonathanAllan Да, это не очень хорошее требование. Удалено
Caird Coneheringaahing

Ответы:

2

Python 3 , 650 621 582 572 588 байт

from random import*
h=str
c=h.center
a='+'.join(map('-'.__mul__,[0,6,30,9,5,0]))+'\n'
b=lambda x,r=6:x.ljust(r,' ')
j=''.join
t=lambda a:sum(map(int,a[:-1].replace(*'.0')))
P=print
def s(i=30):
 while i:x=choice('12.4/6');yield x;i=('/'!=x)*~-i
def f(n,T=0):
 n=[*map(b,n)]
 P(a+f'| Name | Runs{" "*25}| How Out |Total|')
 for x in n[:-1]:S=j(s());T+=t(S);P(a,x,b(S,30),c(choice(['Bowled','LBW','Caught']),9),c(h(t(S)),5),sep='|',end='|\n')
 S=j(s());P(a,n[-1],b(S,30),' Not Out ',c(h(t(S)),5),sep='|',end='|\n');P(a+f'|{15*" "}Total Runs{15*" "}       |{c(h(T),5)}|\n+{47*"-"}+{5*"-"}+')

Попробуйте онлайн!

Ну, прошло более 24 часов, и это заняло у меня около часа, чтобы взбодриться, так что я надеюсь, что я никого не FGITW, и я некоторое время не играл в гольф на Python, так что это было весело (хотя это во второй раз я ответил на один из моих собственных вопросов длинным ответом на Python)

Пожалуйста, не стесняйтесь размещать предложения по гольфу, Python не мой лучший язык для игры в гольф.

-68 байт благодаря FlipTack !

-8 байт благодаря мистеру Xcoder

+16 байт из-за ошибки

Кэрд
источник
На первый взгляд, я вижу довольно много гольфов ... 1) В одном случае вы все еще используете printвместо P. 2) sumможет напрямую взять mapобъект, не нужно конвертировать его в список. 3) Вместо того , чтобы писать в yield xдва раза, то почему бы не yield xи затем перерыв в случае необходимости? 4) T=0можно разместить внутри заголовка функции. 5) В вашей последней функции вы использовали несколько новых строк, где вы можете просто использовать одну строку с точкой с запятой, например, первые три оператора, последние три оператора и операторы в цикле for.
FlipTack
@FlipTack Хорошие гольфы, и спасибо!
Caird Coinheringaahing
Вы можете играть в гольф sзначительно ... def s(i=30):а потом while i:x=choice('12.4/6');yield x;i=('/'!=x)*~-i. Кроме того, вы звоните только o()один раз, так что нет необходимости даже объявлять его, просто используйте оператор напрямую.
FlipTack
То же самое относится к b^^
FlipTack
@FlipTack Добавлены гольфы. Благодарность!
caird coinheringaahing
0

Древесный уголь , 277 255 байт

≔E¹¹⟦⟦⟧⁰S⟧θ≔⮌θηW⊖Lη«≔⊟ηι≔‽12.4/6ζ⊞υζ⊞§ι⁰ζ≔⎇⁼ζ/⁺²‽³⁼³⁰L§ι⁰ζ¿ζ§≔ι¹ζ⊞ηι¿⊖Lη¿⁼¬﹪Lυ⁶¬εF⟦⊟η⊟η⟧⊞ηκ»”|⁴B\[⎇⁻℅↧T`⁵·5KMK⟲M≦»→´⁶_⭆∨R▷↥l⁹KG…≦”Fθ«◨⊟ι⁷◨Σ§ι⁰¦³²§⪪”(3⪪⪫⧴πZJL:∨XI±URD↗Σ9⟦FZ∕↖l⪪”⁷⊟ι◧IΣE⊟ιΣκ⁶⸿⸿»”|QºWPD⟧zNφ[v?Π'vG”◧IΣEυΣι²⁸J±¹±¹FE¹³⁻²⁷⊗ι«B⁵⁵ιB⁴⁹ι¿‹ι²⁷«B³⁹ιB⁸ι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔E¹¹⟦⟦⟧⁰S⟧θ

Прочитайте 11 имен (входные данные гибкие: JSON, разделенные пробелом или разделенные новой строкой) и создайте массив qиз 11 битеров, представленных их шарами (в виде массива), состоянием (в виде целого числа) и именем.

≔⮌θη

Создайте перевернутую копию баттеров h. Это представляет баттерс, которые не вышли. Последние два элемента - офф и текущие баттеры.

W⊖Lη«

Повторите, пока есть по крайней мере два доступных баттеров.

≔⊟ηι

Извлеките текущее тесто в i .

≔‽12.4/6ζ

Создать случайный шар в z .

⊞υζ

Добавьте его в общий список шаров, используя предопределенный пустой список u.

⊞§ι⁰ζ

Добавьте его в шары текущего теста.

≔⎇⁼ζ/⁺²‽³⁼³⁰L§ι⁰ζ

Если мяч является «а» /, тогда генерируется случайный статус 2..4, в противном случае, если это 30-й мяч бьющего, тогда установите статус в 1противном случае 0.

¿ζ§≔ι¹ζ⊞ηι

Если тесто отсутствует, сохраните его статус, в противном случае поместите тесто обратно в летучую мышь.

¿⊖Lθ¿⁼¬﹪ΣEηLκ⁶¬ζ

Если осталось как минимум два баттера, а тесто истекло или разыграно 6 шаров, то ...

F⟦⊟η⊟η⟧⊞ηκ»

... возьмите текущие и текущие баттеры и верните их в обратном порядке.

”|⁴B\[⎇⁻℅↧T`⁵·5KMK⟲M≦»→´⁶_⭆∨R▷↥l⁹KG…≦”

Распечатать заголовок.

Fθ«

Цикл над баттерс.

◨⊟ι⁷

Напечатайте название теста.

◨Σ§ι⁰¦³²

Распечатать шарики теста.

§⪪”(3⪪⪫⧴πZJL:∨XI±URD↗Σ9⟦FZ∕↖l⪪”⁷⊟ι

Напечатайте статус жидкого теста, указав в строке Not OutRetiredBowled Caught LBWразбитую на подстроки длиной 7.

◧IΣE⊟ιΣκ⁶

Напечатайте счет теста.

⸿⸿»

Перейти к началу следующей строки, кроме одной.

”|QºWPD⟧zNφ[v?Π'vG”◧IΣEυΣι²⁸

Распечатайте итог.

J±¹±¹FE¹³⁻²⁷⊗ι«B⁵⁵ιB⁴⁹ι¿‹ι²⁷«B³⁹ιB⁸ι

Нарисуйте коробки вокруг всего.

Нил
источник