Імітуйте гру в Craps


18

Craps - це досить проста гра в кубики, яку часто грають в казино. Навіть якщо ви не азартний гравець (чого я не є), це все-таки досить цікава гра. Ось правила:

На початку гри в Craps є те, що називається раунд виходу . Гравець накручує два d6s (шість-шматок) та додаються два ролики. Якщо результат дорівнює 7 або 11, людина автоматично перемагає (це відомо як природне ). Якщо результат 2, 3 або 12, людина автоматично програє (це відомо як вистригання ). В іншому випадку результат встановлюється як точка для точкового раунду.

Після цього починається точковий раунд. Під час точкового раунду гравець повинен постійно перекочувати 2 d6, поки людина не скочує 7 або свою точку з попереднього раунду. Якщо людина котить 7, вона програє. Якщо вони перекочують свою точку, вони виграють.

Виклик

Реалізуйте просту програму, яка імітує гру в калачі. Якщо під час раунду виїзду людина викочує натуральну або ганчірну, програма повинна вивести "Natural:" або "Crapping out:" з подальшим викруткою, а потім вийти. В іншому випадку він повинен вивести "Точку:", а потім точку. Потім, під час точкового раунду, він повинен виводити кожен шматок, до досягнення 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 Whoa, старий виклик. Так, це було б добре. Я думаю, що попередження було здебільшого просто для того, щоб люди зрозуміли, що рівномірний розподіл між [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 сепаративно!
Jeroen

6

Пітон 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: #". У виході є пробіл.
Селео

Добренько. Я вже не дуже використовую Python, тому я не був впевнений у тому, як це працює.
спагето

Я переграв ваш код аж до 198 в Python 3, що на 192 в Python 2. Чи хочете ви пропозиції, або я повинен розмістити власну відповідь?
lirtosiast

@ThomasKwa Якщо ви вкладете в неї купу роботи, опублікуйте її як окрему відповідь, щоб ви могли отримати кілька представників.
Селео

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>дозволено використання, однак? Оскільки це не працюватиме в консолі (як нова лінія). Повідомте мене, якщо це заборонено, і це змінить мій код.

EDIT (16-8-16): Після покращення кодегольфу я помітив деякі можливі вдосконалення. Це все ще працює за допомогою інтерфейсу командного рядка. Замінено </br>жорстким входом.


Натуральним написано "Натуральний", а не "Природний".
Kritixi Lithos

Змінив це. Дякую
Jeroen

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раунду. Theprevious 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")}

Безумовно

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.