Codegolf — Имитировать Игру В Кости

  • Автор темы N7al3ie3ta
  • Обновлено
  • 21, Oct 2024
  • #1

Крэпс — довольно простая игра в кости, в которую часто играют в казино. Даже если вы не игрок (я не игрок), это все равно довольно интересная игра. Вот правила:

В начале игры в кости есть то, что называется публично заявить круглый. Игрок бросает два кубика d6 (шестигранный кубик), и два броска кубика суммируются. Если результат 7 или 11, человек автоматически выигрывает (это называется естественный). Если результат 2, 3 или 12, человек автоматически проигрывает (это называется облажаться). В противном случае результат устанавливается как точка для очкового раунда.

После этого точка раунд начинается. Во время раунда с очками игрок должен непрерывно бросать 2 d6, пока человек не выкинет 7 или свое очко из предыдущего раунда. Если человек выбрасывает 7, он проигрывает. Если они выкинут очко, они выиграют.

Испытание

Реализуйте простую программу, имитирующую игру в кости. Если во время раунда выхода человек выбрасывает натуральный результат или выпадение кости, программа должна вывести «Естественный:» или «Выпадение:», после чего следует бросок кубика и затем выйти. В противном случае он должен вывести «Point:», за которым следует точка. Затем, во время раунда очков, он должен выводить каждый бросок кубика до тех пор, пока не будет достигнута цифра 7 или точка. Если человек выигрывает, он должен вывести

 
 
 Point: 5
3
7
Don't Pass
 
; if they lose it should output Point: 9 4 8 11 9 Pass .

Эталонная реализация

Отличный, 277 байт

Crapping out: 3

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

Примеры результатов

Natural: 7

def a={return Math.random()*6+1};int b=a()+a();(b<4||b==12)?{println"Crapping out: "+b}():{(b==7||b==11)?{println"Natural: "+b}():{println"Point: "+b;for(;;){int x=a()+a();println x;(x==7)?{println"Don't Pass";System.exit(0)}():{if(x==b){println"Pass";System.exit(0)}}()}}()}()

"Don't Pass"

и

"Pass"

Это так, поэтому побеждает самый короткий код.

(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это соревнование никоим образом не направлено на пропаганду азартных игр. Помните, казино всегда выигрывает.)

#код-гольф #код-гольф #игра #случайный

N7al3ie3ta


Рег
05 Jul, 2012

Тем
83

Постов
189

Баллов
614
  • 26, Oct 2024
  • #2

Рубин 164

Довольно просто. Интересные особенности:

Случаи выпадения резюмируются как

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 "Don't " 
and the remaining natural cases are summarised as {:}≠...?\.6? .

Исходная строка хранится в R}}6'RA6'RA2++{{B͍ Roll 2, sum, return >00B:7=S:b={+?\ Entry, make first roll, compare to 7 and 11. "Natural: "@ If true, print "Natural: " and the value, else go down \:2=}:3=}:c={{++?/ Compare to 2, 3, and 12. "Crapping out: "@ If true, print "Crapping out: " and the value, else go up \$:$" :tnioP"\ Print "Point: " and value (IP is travelling RTL) /ak$00B:$ Print newline, roll, print :7≠э\ Compare to 7 \"Don't "R"Pass"ak$$; If equal, print a newline and "Don't Pass" {:}≠ ?\ Else compare to initial roll. R"Pass"ak$$; If equal, print a newline and "Pass" 6?......ak$00B Else return to roll loop by printing a newline and rolling again (. are skipped instructions) and further rolls are taken only if this is later alphabetically than the single letter (что происходит только для 'RA .)

R}}6'RA6'RA2++{{B͍ 00B:7=S:b={+?\"Natural: "@> pping out: "@\:2=}:3=}:c={{++?/"Cra {:}≠ ?\ 6?;$$k\/ak$00B:$:7≠э\ "Don't "R"Pass"a/\$:$" :tnioP"\ ||answer||

Питон 3, 190 байт

p|K?}J+OS6OS6,7 11"Natural"?}J[2 3 12)"Crapping out"k"Point"+": "JI!KW!}Z,7JIq7=Z +OS6OS6=K"Don't "))+K"Pass

Это основано на Ответ Селео; Я заменил некоторые длинные условные выражения магическим числом, которое кодирует LUT для каждого числа, повторно использовал переменную и проделал еще несколько разных игр. Еще есть место для гольфа; возможно и ниже 170.

Я не пробовал использовать Python 2, поэтому не знаю, будет ли он короче.

 

Lord_Alucard


Рег
15 Dec, 2005

Тем
75

Постов
198

Баллов
593
  • 26, Oct 2024
  • #3

С99, 366 312 293 277 байт

Это мой первый пост здесь, поэтому я предполагаю, что его можно значительно улучшить.

r=sum(sample(6,2,T)) if (r%<4) { cat("Crap Out",r) } else if (r%%4==3) { cat("Natural",r) } else { cat("Point",r) while (T) { q = sum(sample(6,2,T)) cat("",q) if (q==7) { cat(" Don't") break } if (q>r) break } cat(" Pass") }

Расширенная версия

r=sum(sample(6,2,T));if(r%<4)cat("Crap Out",r)else if(r%%4==3)cat("Natural",r)else{cat("Point",r);while(T){cat("",q<-sum(sample(6,2,T)));if(q==7){cat(" Don't");break};if(q>r)break};cat(" Pass")}

Как видите, здесь имеется значительная избыточность, от которой, скорее всего, можно избавиться.

Спасибо @Mego за помощь в уменьшении размера.

 

BenImmerienal35


Рег
25 Oct, 2024

Тем
80

Постов
189

Баллов
639
  • 26, Oct 2024
  • #4

Python 2, 226 224 байта

Первый проход, и там много кода:

#Switch using regex on $z which is... #&($x={...}) first assigns $x to a scriptblock then calls it, saving the return to $z switch -r($z=&($x={(random 6)+(random 6)+2})){ '7|11' {"Natural: $z"} '2|3' {"Crapping out: $z"} default{ "Point: $z" #Call the diceroll scriptblock until you Pass, #while pushing each roll to output do{($m=&$x)} until($m-in7,$z) "Don't "*!($m-7)+'Pass' } }

Благодаря Мего за 2 байта!

 

Demon9999


Рег
23 Feb, 2012

Тем
80

Постов
219

Баллов
649
  • 26, Oct 2024
  • #5

PHP 230 228 218 199 192 188 байт

186 байт без switch -r($z=&($x={(random 6)+(random 6)+2})){'7|11'{"Natural: $z"}'2|3'{"Crapping out: $z"}default{"Point: $z" do{($m=&$x)}until($m-in7,$z)"Don't "*!($m-7)+'Pass'}}

sub d{1+int rand 6}say$"=($p=&d+&d)<4?"Crapping out":$p%4-3?Point:Natural,": $p";if($"gt O){say$_=&d+&d until/7|$p/;say"Don't "x/7/,Pass}

Первая попытка кодового гольфа! Не уверен, используете ли вы var r=(x=>Math.floor(Math.random()*6+1)),a=r()+r();if(a<4||a==12){alert("Crapping out: "+a)}else if(a==7||a==11){alert("Natural: "+a)}else{alert("Point: "+a);while(1){var b = r()+r();if(b==a){alert("pass");break}if(b==7){alert("dont't pass");break}alert(""+b)}} would be allowed though? As this would not work in a console (as a new line). Let me know if this is not allowed and will alter my code.

РЕДАКТИРОВАТЬ (16-8-16): После того, как я стал лучше играть в кодгольф, я заметил некоторые возможные улучшения. Это по-прежнему работает с использованием интерфейса командной строки. Заменено </br> with an hard enter.

 

GeorgXII


Рег
23 Sep, 2011

Тем
76

Постов
184

Баллов
624
  • 26, Oct 2024
  • #6

Javascript 262

</br> ||answer||

Перл 5, 140 байт

<?$a=rand(1,6)+rand(1,6);$a%4==3?die("Natural: $a"):$a<4?die("Crapping out: $a"):print"Point: $a ";while(1){($b=rand(1,6)+rand(1,6))==7?die("Don't Pass"):$b==$a?die("Pass"):print"$b ";}

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

 

Rada Rey


Рег
16 Jul, 2013

Тем
72

Постов
189

Баллов
579
  • 26, Oct 2024
  • #7

PowerShell, 181 183 179 178 167 165 байт

-10 байт благодаря mazzy
-2 байта благодаря Xcali

<?

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

Развернутая версия:

from random import* r=randrange a=r(5)+r(5)+2 if a in[7,11]:print'Natural:',a elif a in[2,3,12]:print'Crapping out:',a else: print'Point:',a b=0 while b not in[7,a]:b=r(5)+r(5)+2;print b print'Pass'if b-7else"Don't pass"

Теперь, когда логика построения списков была перестроена в коммутатор, проблем стало на несколько меньше. Я думаю, что это все еще довольно хороший подход. +2 байта исправляют ошибку.

 

Igornix


Рег
06 May, 2006

Тем
65

Постов
177

Баллов
522
  • 26, Oct 2024
  • #8

Р, 197 байт

#include<stdlib.h> #include<time.h> #define r rand()%6+1 #define p printf( main(c,s){ srand(time(0)); s=r+r; int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d"; if(a) {p a,s);return 0;} p"Point:%d\n",c=s); do p"%d\n",s=r+r); while(7-s&&s-c); p(7-s)?"Pass":"Don't pass"); }

Негольфед

#include<stdlib.h> #include<time.h> #define r rand()%6+1 #define p printf( main(c,s){srand(time(0));s=r+r;int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";if(a){p a,s);return 0;}p"Point:%d\n",c=s);do p"%d\n",s=r+r);while(7-s&&s-c);p(7-s)?"Pass":"Don't pass");} ||answer||

Пиф, 108 байт

from random import* r=randrange p=print a=r(5)+r(5)+2 c=890145//3**a%3 p(['Point:','Crapping out:','Natural:'][c],a) if c<1: while 7!=c!=a:c=r(5)+r(5)+2;p(c) p(['Pass',"Don't pass"][c==7])

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

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

 

ElishachDeni65


Рег
25 Oct, 2024

Тем
80

Постов
203

Баллов
603
  • 26, Oct 2024
  • #9

Рунические чары, 151 байт

f=->{rand(6)+rand(6)+2} s=0 r=f[] print c=r<4?'Crapping out':r%4==3?'Natural':'Point',": #{r} " c>?P&&(until s==r||s==7 p s=f[]end print s==7?"Don't ":"","Pass")

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

После исправления ошибки, связанной со случайными числами (они каждый раз перезадавались Point was called, and the seed was system time, resulting in massive runs of repeated values) this works correctly.

Объяснение

Ввод ведется на второй строке, как и на первой строке до тех пор, пока ?P is a function for rolling two dice and summing them.

Поток программы с некоторыми переносами по краям и закрученными перенаправлениями, развернутыми для удобства чтения.

c

Есть только 4 инструкции NOP ( r%4==3 ) that would be very difficult to remove due to the space required on other lines (Namely the length of the r<4 нить).

 

Vova1vova1


Рег
01 Jan, 2011

Тем
83

Постов
194

Баллов
619
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно