Неперехідна гра в кубики


10

Ті з вас, кому подобається Нумефіл, були б знайомі з доктором Джеймсом Гриме, який описав неперехідну гру з кубиками на своєму каналі .

Гра складається з трьох шестигранних кісток:

  • Помер 1: 3,3,3,3,3,6
  • Помер 2: 2,2,2,5,5,5
  • Помер 3: 1,4,4,4,4,4

Два гравці вибирають штамп для використання. Вони закочують їх, і чим більше виграє, тим найкращим є.

Ймовірно, що помер 1 удар, помирає 2 з> 50% шансом. Так само вмирають 2 удари, вмирають 3, і, що цікаво, вмирають 3 удари, вмирають 1.

Написати програму взяття 1, 2або в 3якості вхідних даних. Це вказує на матрицю, яку вибирає користувач. Потім програма вибирає штамп, який би переміг користувача та видав результати 21 рулону, і " Computer/User wins with x points"

Правила

  • Код-гольф, голоси як краватка
  • Ви повинні використовувати 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 і б'є його.

Відповіді:


1

GolfScript, 112 105 символів

3,21*{..+6rand<3*+)}%3/\{)\.+-1%>2<.p~<}+,,"User
Computer"n/1$11<=" wins with "+\[.~22+]$1>~+" points"+

Запустити його в Інтернеті .

Сценарій очікує введення на STDIN, а потім друкує результат STDOUT.


4

APL ( 106 114)

'Computer' 'User'[1+X],'wins with','points',⍨|Z-21×X←11>Z←+/>/⎕←⍉↑{⍵[{?6}¨⍳21]}¨(↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]

Пояснення:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: Велика кількість - це представлення кісток на базі 7. Ми робимо матрицю 6x5, що містить значення кубиків у порядку: 2 3 1 2 3. Попросіть користувача ввести та додати це до вектора 1 2, і виберіть ці рядки з матриці. Оскільки список кубиків зміщений, користувач тепер отримує обраний ним (праворуч), а комп'ютер - сильніший.
  • {⍵[{?6}¨⍳21]}¨: зробіть 21 рулет для кожної з цих двох кубиків.
  • ⎕←⍉↑: покладіть рулони в матричну форму і виведіть їх.
  • Z←+/>/: отримайте бал комп’ютера (кількість разів значення комп'ютера було вище, ніж у користувача)
  • X←11>Z: встановити, Xчи виграв користувач (якщо 11 перевищує бал комп'ютера).
  • 'Computer' 'User'[1+X]. Xчи перемогла користувач.
  • 'wins with','points',⍨|Z-21×X: Z- це оцінка комп’ютера, тому якщо комп'ютер переміг дисплей Z, інакше відобразити 21-Z.

Оцінка не є різницею підсумків (яка, як очікується, буде 0 для всіх пар кісток), натомість переможець кожного з 21 булочки отримує 1 бал. У прикладі користувач має 5 балів (вигравши 5 рулонів: 4-6, 1-3, 1-3, 1-3, 4-6), а комп'ютер отримує 16 очок відпочинку.
TwiNight

@TwiNight: виправлено
marinus

Негативні бали, коли користувач перемагає. Ви можете виправити, за допомогою |Z-21×Xяких не змінюється кількість символів
TwiNight

2

R - 228

d=matrix(rep(c(rep(3,5),6,2,2,2,5,5,5,1,rep(4,5)),2),6)
x=scan()
r=expand.grid(Computer=d[,x+2],User=d[,x])[sample(36,21,T),]
print(r)
s=summary.factor(names(r)[max.col(r)])
cat(names(which.max(s)),"wins with",max(s),"points\n")

Приклад виконання:

> source('ntd.R')
1: 2
2: 
Read 1 item
     Computer User
28          3    5
31          3    5
36          6    5
18          6    2
11          3    2
31.1        3    5
14          3    2
8           3    2
9           3    2
17          3    2
2           3    2
29          3    5
3           3    2
16          3    2
4           3    2
21          3    5
14.1        3    2
23          3    5
16.1        3    2
17.1        3    2
19          3    5
Computer wins with 14 points

Ви можете замінити summary.factorз table, економлячи 9 символів.
Брайан Діггс

2

Математика 208 172 166 159

Простори додані для наочності

b=Boole;{#, Row@{
         If[# > 10, "Play", "Comput"], "er wins with ",
         Max[#, 21 - #], " points"} &@ Total[b[#1 > #2] & @@@ #]} &@
   Table[1 + i + 3 b[6 Random[] > 2 i + 1],{21}, {i, {#, Mod[# + 1, 3]}}] &

Я думаю, що у висновку слід перелічити значення кожного рулону кістки.
DavidC

@ чувак так, я втратив його під час тестування. Я зробив швидку поправку просто для того, щоб м'яч працював. Пізніше подумаю, як її вдосконалити.
Доктор Белісарій

Зараз, здається, це працює нормально.
DavidC

@dude Набагато краще зараз
доктор belisarius

Дійсно приємно. +1
Mr.Wizard

1

Рубін 1,8, 165

i,s,*d=getc,21,[4]*5<<1,[3]*5<<6,[2,5]*3
puts"#{s.times{p r=[i,i-1].map{|o|d[o%3][rand 6]};s+=r[0]<=>r[1]}>s?"Human":"Computer"} wins with #{[s/=2,21-s].max} points"

getc отримує значення вхідного сигналу (тільки в рубіні 1,8), яке, на щастя, є модулем 3 до його цілого значення.

sпочинається з 21, значить s.times{code}, виконується code21 раз і повертається 21. На кожній ітерації цикл або додає, або віднімає 1 з s залежно від того, хто виграє, тож ми можемо побачити, хто переміг, побачивши, чи sзакінчився нижче 21. Охайний до цих пір. , але тоді мені потрібен незграбний вираз, [s/=2,21-s].maxщоб отримати фактичну кількість балів. Я давно хотів займатися арифметикою із зворотним значенням <=>, тому я все одно щасливий.


1

Mathematica 234 247

Код

g@n_ := {t = RandomChoice[{{5, 25, 1, 5}/36 -> {{3, 1}, {3, 4}, {6, 1}, {6, 4}}, 
         {5, 1, 5, 1}/12 -> {{2, 3}, {2, 6}, {5, 3}, {5, 6}},
         {1, 1, 5, 5}/12 -> {{1, 2}, {1, 5}, {4, 2}, {4, 5}}}[[n]], 21], 
         Row[{If[(c = Count[t, {x_, y_} /; y > x]) > 10, "Computer ", "Player "], 
         "wins with ", If[c > 10, c, 21 - c], " points"}]}

Використання

{Рулон гравця, рулон комп'ютера}

g[1]
g[2]
g[3]

результати


Пояснення

n- це число 1, 2 або 3, що відповідає матриці гравця. Оскільки n також визначає (але не дорівнює) штамп комп'ютера, ми можемо генерувати всі можливі рулони кубиків, коли n = 1, n = 2, n = 3. Ми також можемо визначити їх відповідні ймовірності.

Вивчіть дані відразу після RandomChoice:

{5, 25, 1, 5} / 36 -> {{3, 1}, {3, 4}, {6, 1}, {6, 4}}

Якщо гравець притягує смерть 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 рулон із двох кісток.


1

C, 205 191

p;r(c){return 1+c+3*(rand()%6>2*c);}main(i,c,q,s){for(c=51-getchar();++i<23;printf("%u %u\n",q,s))q=r(c),p+=(s=r(-~c%3))<q;printf("%ser wins with %u points",p<11?"Comput":"Us",p<11?21-p:p);}

Читає вибір користувача від stdin.


Деякі поради: for(c=51-getchar(p=0);, printf("%ser wins), перезаказа вираз , rщоб почати з (і економією простору.
ugoren

І багато іншого: (c+1)%3-> -~c%3, зробіть pстатичну (ініціалізовану на 0), видаліть {}після for( ;-> ,всередині них), p<11?:два рази використовуйте printfзамість призначення p,q.
ugoren

І ви можете встановити s,qцикл printfта приріст pпісля цього, тим самим зберігаючи дужки. Також змініть cзавдання на використання %3або %7, призначивши інший порядок 0,1,2.
ugoren

1

Фактор

З включає: 388

Без: 300

USING: arrays formatting io kernel math math.parser prettyprint random sequences ;
IN: N
CONSTANT: d { { 3 3 3 3 3 6 } { 2 2 2 5 5 5 } { 1 4 4 4 4 4 } }
: p ( -- ) 1 read string>number [ 3 mod 1 + ] keep [ 1 - d nth ] bi@ 2array 21 iota [ drop first2 [ random ] bi@ [ 2array . ] 2keep < ] with map [ ] count [ 11 > "Comput" "Play" ? ] [ "er wins with %d points" sprintf ] bi append print ;

Так, Фактор насправді не є мовою, яку слід використовувати при гольфі, але це приємно.


0

Пітон 182

from random import*
u=2+input()
r=[eval("int(choice(`0x1d67e987c0e17c9`[i%3::3])),"*21)for i in(u,u-1)]
U,C=map(sum,r)
print r,['Us','Comput'][U<C]+'er wins with %d points'%abs(U-C)

0

R 206

u=scan()
D=list(c(rep(3,5),6),c(2,5),c(1,rep(4,5)))
S=sample
U=S(D[[u]],21,T)
C=S(D[[(u+1)%%3+1]],21,T)
print(cbind(U,C))
W=sum(U>C)
I=(W>10)+1
cat(c("Computer","User")[I],"wins with",c(21-W,W)[I],"points")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.