Имитация игры в кости


18

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

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

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

Вызов

Реализуйте простую программу, которая имитирует игру в кости. Если человек выбрасывает натуральный или дурацкий во время раунда выхода, программа должна вывести «Natural:» или «Crapping out:», затем бросить кубик и затем выйти. В противном случае он должен вывести «Point:», а затем точку. Затем, во время раунда, он должен выводить каждый бросок кубика, пока не будет достигнута 7 или точка. Если человек выигрывает, он должен выходить "Pass"; если они проиграют, это должно вывести "Don't Pass".

Реализация эталона

Groovy, 277 байт

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)}}()}}()}()

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

Пример выходов

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

и

Point: 5
3
7
Don't Pass

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

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


You can't make your program shorter by picking a random number between 1 and 12 for the die roll; it must be two numbers picked between 1 and 6.- Как насчет выбора случайного значения в [1, 12] из распределения, идентичного добавлению двух равномерных случайных значений в [1, 6]?
Мего

@Mego Вау, старый вызов. Да, это было бы хорошо. Я думаю, что предупреждение было в основном просто для того, чтобы люди понимали, что равномерное распределение между [1, 12] не совпадает с 2d6. Я перепишу это немного.
спагетто

Ответы:


6

Рубин 164

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

Исключающие случаи суммируются как, r%12<4а остальные естественные случаи - как r%4==3.

Исходная строка сохраняется в cи последующие броски принимаются только в том случае, если это в алфавитном порядке позже, чем одна буква ?P(что происходит только для Point.)

f=->{rand(6)+rand(6)+2}
s=0
r=f[]
print c=r%12<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")

Любите, как вы проверяете остаток вместо 2,3,7,11 или 12 отдельно!
Йероен

6

Python 3, 190 байт

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])

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

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


1
Не хочешь объяснить, откуда у тебя это волшебное число и как оно работает?
Карл Напф

5

C99, 366 312 293 277 байт

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

#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");
}

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

Кредиты @Mego за помощь, чтобы сделать это меньше.


1
Пока он где-то компилируется, ты в порядке.
Lirtosiast

@Mego спасибо за указание, что удалось избавиться от 19 байтов.
Крис Лунам

Есть еще некоторые от избавлении от aи , bа также с использованием метода вычитания наряду с тройными операторами.
Крис Лунам

5

Python 2, 226 224 байта

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

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 байта!


Немного проблем с этим. Он не печатает «Point:», за которым следует номер, если бросок не был натуральным или дерьмовым. Кроме того, между: и числом должен быть пробел.
спагетто

Упс! Исправлено не печатание «Точка: #». На выходе есть пробел.
Celeo

Ах хорошо. Я больше не использую Python, поэтому я не был уверен, как работает.
спагетто

Я довел ваш код до 198 в Python 3, а в Python 2 - до 192. Вам нужны предложения или я должен опубликовать свой собственный ответ?
lirtosiast

@ThomasKwa Если вы вложите в него кучу работы, опубликуйте отдельный ответ, чтобы вы могли получить за него несколько представителей.
Celeo

3

PHP 230 228 218 199 192 188 байт

186 байт без <?

<?$a=rand(1,6)+rand(1,6);$a%4==3?die("Natural: $a"):$a%12<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
";}

Первая попытка кода гольф! Не уверен, что использование </br>будет разрешено, хотя? Как это не будет работать в консоли (как новая строка). Дайте мне знать, если это не разрешено и изменит мой код.

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


Природный пишется как «Природный», а не «Naturel».
Kritixi Lithos

Поменял это. Спасибо
Йерун

2

Javascript 262

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)}}


1

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

-10 байтов благодаря мази
-2 байта благодаря Xcali

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'}}

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

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

#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 байта исправления ошибки.


1
классно! сократить его до 178 байт
Маззи

Я думаю, что условие -notin (7,$z)не имеет отношения к правилу During the point round, the player must continuously roll ... the previous round. Теперь цикл заканчивается, когда $mравен 7или первый раунд.
Маззи

1
@mazzy Это вопрос формулировки в вопросе. Там только два раунда. Вы устанавливаете Очко только один раз в Come-outраунде, и это ваше целевое число на весь Pointраунд. previous roundОтносится к Come-outтур
Veskah

1
Благодарю. 168 байтов
масон

2
Вы должны быть в состоянии снять еще два, удалив 1?из вашего ребра регулярное выражение.
Xcali

0

R 197 байт

 r=sum(sample(6,2,T));if(r%%12<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")}

Ungolfed

r=sum(sample(6,2,T))
if (r%%12<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")
}


0

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

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"\

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

После исправления ошибки, связанной со случайными числами (каждый раз повторялась 'RA вызове , а в качестве начального времени использовалось системное время, что приводило к массовым прогонам повторяющихся значений), это работает правильно.

объяснение

Вступление находится на второй строке, так как первая строка до - это функция для броска двух костей и их суммирования.

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

   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)

Существует только 4 инструкции NOP ( {:}≠...?\.6?), которые будет очень трудно удалить из-за места, необходимого для других строк (а именно длины "Don't "строки).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.