Те из вас, кто любит Numberphile, знакомы с доктором Джеймсом Граймом, который описал на своем канале нетранзитивную игру в кости .
Игра состоит из трех 6-гранных кубиков:
- Die 1: 3,3,3,3,3,6
- Die 2: 2,2,2,5,5,5
- Die 3: 1,4,4,4,4,4
Два игрока выбирают кубик для использования. Они бросают их, и высшие умирают, побеждает лучше всех.
Вероятно, умирает 1 удар, умирает 2 с вероятностью> 50%. Точно так же, умирают 2 удара, умирают 3, и, что интересно, умирают 3 удара, умирают 1.
Написать программу взятия 1
, 2
или в 3
качестве входных данных. Это указывает на штамп, выбранный пользователем. Затем программа выбирает кубик, который побьет пользователя, и выводит результаты 21 броска, и " Computer/User wins with x points
"
правила
- Code-golf, голосует за нарушение порядка
- Вы должны использовать RNG (или лайки), чтобы фактически симулировать броски костей.
- Я не слишком строг в отношении формата вывода. Это нормально, пока вы показываете кубики, как-то разделяете 21 бросок (в отличие от того, как вы разделяете кубики в одном броске) и выводите это предложение выше.
- Ввод может быть stdin, аргумент командной строки, с экрана и т. Д.
пример
вход
1
Вывод
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 6
1 3
4 3
4 3
1 3
4 3
1 3
4 3
4 3
4 3
4 3
4 6
Computer wins with 16 points
Здесь пользователь выбирает кубик 1, и его броски показываются в правом столбце. Программа выбирает die 3 и бьет его.
|Z-21×X
что не меняет количество символовR - 228
Пример выполнения:
источник
summary.factor
сtable
, экономя 9 символов.Mathematica
208172166159Пробелы добавлены для ясности
источник
Рубин 1.8, 165
getc
получает входное значение ascii (только ruby 1.8), которое по модулю 3 совпадает с целочисленным значением.s
начинается в 21, поэтомуs.times{code}
будет выполнятьсяcode
21 раз и возвращать 21. На каждой итерации цикл либо добавляет, либо вычитает 1 из s в зависимости от того, кто выиграл, поэтому мы можем увидеть, кто выиграл, посмотрев,s
оказался ли он ниже 21. До сих пор аккуратно , но тогда мне нужно неуклюжее выражение,[s/=2,21-s].max
чтобы извлечь фактическое количество очков. Я давно хотел сделать арифметику с возвращаемым значением<=>
, так что я все равно счастлив.источник
Mathematica
234247Код
Применение
объяснение
n
это число 1, 2 или 3, соответствующее кубику игрока. Поскольку n также определяет (но не равен) матрицу компьютера, мы можем сгенерировать все возможные броски костей, когда n = 1, n = 2, n = 3. Мы также можем определить их соответствующие вероятности.Изучите данные сразу после
RandomChoice
:Если игрок тянет кубик 1, единственными возможными исходами являются следующие 4 пары
{{3, 1}, {3, 4}, {6, 1}, {6, 4}}
Соответствующие вероятности этих пар
{5, 25, 1, 5}/36
, это,{5/36, 25/36, 1/36, 5/36}
RandomChoice[<data>, 21]
выводит 21 бросок двух кубиков.источник
C,
205191Читает выбор пользователя из стандартного ввода.
источник
for(c=51-getchar(p=0);
,printf("%ser wins
), перезаказ выражение ,r
чтобы начать с(
и экономией пространства.(c+1)%3
->-~c%3
, сделатьp
статический (инициализируется 0), удалить{}
послеfor
(;
->,
внутри них), использоватьp<11?:
дважды внутриprintf
вместо назначенияp,q
.s,q
в циклеprintf
, и увеличиватьp
впоследствии, тем самым сохраняя скобки. Также изменитеc
назначение на использование%3
или%7
, задав другой порядок 0,1,2.фактор
С включает в себя: 388
Без: 300
Да, Фактор на самом деле не тот язык, который можно использовать при игре в гольф, но это приятно.
источник
Python 182
источник
R 206
источник