Rzuć kostką ASCII

16

W tym wyzwaniu polegającym na grze w musisz wygenerować ascii-art losowego rzutu kostką.

lubię to:

   ________
  /\       \
 /  \   6   \
{ 4  }-------}
 \  /   5   /
  \/_______/

Proszę to zanotować:

   ________
  /\       \
 /  \   3   \
{ 4  }-------}
 \  /   5   /
  \/_______/

jest nieprawidłowym wyjściem, ponieważ nie jest to możliwy wynik na kości

Istnieją 6(faces that could be up)*4(faces that could be the left face after the top is determined)*1(faces that could be the right face after the other two are determined)= 24 możliwości rzutów kostką.

Twój program musi wypisać jeden z tych rzutów matryc w postaci sztuki ascii (modelowanej jak ta poniżej, z xy i zs zastąpionymi liczbami) jak wyżej, przy czym każde wyjście ma> 0 prawdopodobieństwa wystąpienia, ale prawdopodobieństwa nie muszą być równe (w przeciwieństwie do prawdziwego życia mogą to być podstępne kości). Twój program nie może wygenerować nieprawidłowego rzutu ani rzutu innego niż matryca. Twój program musi mieć prawdopodobieństwo 1 wypuszczenia prawidłowego rzutu

Pamiętaj, że twoja kość niekoniecznie musi być kością praworęczną, jak pokazano na pierwszym obrazku. (prawo- i leworęczni opisują sieć kości)

right-handed die
   ________
  /\       \    net
 /  \   z   \     _|4|_ _
{ x  }-------}   |6|2|1|5|
 \  /   y   /      |3|
  \/_______/


left handed die
   ________
  /\       \    net
 /  \   y   \     _|3|_ _
{ x  }-------}   |6|2|1|5|
 \  /   z   /      |4|
  \/_______/

Jeśli twoja kość jest leworęczna, poniższe wyniki są prawidłowe, ale nie, jeśli twoja kość jest praworęczna:

   ________
  /\       \
 /  \   2   \
{ 1  }-------}
 \  /   3   /
  \/_______/

Chociaż możesz wybrać leworęczny lub praworęczny, twoja kość musi być spójna: nie może zmieniać się z lewej na prawą lub odwrotnie

poniżej znajduje się lista prawidłowych wyników dla matrycy. Pozycje XYZ znajdują się na powyższych zdjęciach:

X-Y-Z
-----
5-4-1
1-5-4
4-1-5

5-6-4
4-5-6
6-4-5

5-3-6
6-5-3
3-6-5

5-1-3
3-5-1
1-3-5

2-6-3
3-2-6
6-3-2

2-4-6
6-2-4
4-6-2

2-1-4
4-2-1
1-4-2

2-3-1
1-2-3
3-1-2

znowu jest to , więc im mniej bajtów, tym lepiej

Zniszczalna cytryna
źródło
4
Solvery mogą być zainteresowane formułą dla trzeciej powierzchni kości, biorąc pod uwagę dwie pozostałe.
xnor
@ xnor i jako taki uważam, że jest to mocny argument, że to pytanie jest duplikatem
Digital Trauma
1
Nie znam jednak żadnej sztuki ASCII do narysowania sześcianu w tej projekcji. Jednak przy tak niewielkich rozmiarach nie wiem, czy da się lepiej niż kodowanie w językach takich jak Python.
xnor
@ xnor rzeczywiście, nawet jeśli zawiera około 7 i 8 sekwencji znaków.
Jonathan Allan,

Odpowiedzi:

8

Python 3, 197 196 192 bajtów

from random import*;c=choice;r=range(1,7);u=c(r);l=c(list(set(r)-{u,u^7}));print(r'''   ________
  /\       \
 /  \%4d   \
{ %d  }-------}
 \  /%4d   /
  \/_______/'''%(u,l,3*u*l*(u*u-l*l)%7))

Przetestuj to ideonie

Praworęczny (zmień na lewy, zamieniając u*u z l*lna ostatnim wierszu)

Zobowiązany do pokonania - ale przejdźmy kości toczenia westchnienie - zwłaszcza, że wszystkie moje próby Golf ASCII wyjątkiem będzie surowy i za pomocą formatowania wszystko udało się zapisać bajtów starej szkoły;
- wszelkie dalsze wskazówki dotyczące gry w golfa dla n00b są mile widziane.

Jonathan Allan
źródło
1
Możesz zapisać 1 bajt za pomocą from random import*i c=choice.
acrolith
@daHugLenny - czy nie mogłem teraz przegapić tej białej przestrzeni przed *; ta!
Jonathan Allan,
1
Witamy w PPCG! Miły pierwszy post!
GamrCorps,
Dzięki @GamrCorps - Chciałem zrobić coś od jakiegoś czasu ... teraz mam przedstawiciela Mogę opublikować sensowne rozwiązanie chronionego pytania ...: D
Jonathan Allan
2
Zamiast mieć 3 spacje, a następnie %dużyj %4dzamiast tego, a wypełnisz je odpowiednio dla Ciebie. Być może będziesz w stanie wykorzystać go również do innych części kości.
Wartość tuszu
5

C 177

f(r){r=rand()%24;r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

W programie testowym

f(r){r=rand()%24;
r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;
printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

j;
main(){
    for(j=99;j--;puts(""))f();
}

Wyjaśnienie

r=                    \\after calculation, assign to r (in order to use only one variable.)
(5545>>r%4*3&63       \\5545 is 12651 in octal. Select 2 digts for the equator
^256-(r*2&8))         \\if 4's bit of r is 0, prepend 4=256/64. Else prepend 3 and reverse one of the faces by xoring with 7. 256-8 = 248 = 3*64+7*8.
*513                  \\now we have a 3 digit octal number. duplicate all digits by multiplying by 1001 octal.
>>r/8*3               \\rightshift 0,1 or 2 digits to rotate. 
Level River St
źródło
5

JavaScript 238 232 207 201 bajtów

var r=24*Math.random()|0,o=r%3,b=r-o,v="123513653263154214624564";console.log(`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,v[r],v[b+(o+1)%3],v[b+(o+2)%3])

który, gdy nie jest golfem, jest:

var r = 24 * Math.random() | 0,
    o = r % 3,
    b = r - o,
    v = "123513653263154214624564";
console.log(
`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,

    v[r],
    v[b+(o+1)%3]
    ,v[b+(o+2)%3]
)

Algorytm

Weź pod uwagę, że na każdym z 8 skrzyżowań narożnika matrycy wartości przecinających się matryc są ustalone, ale mogą pojawić się w dowolnym z 3 obrotów. Na przykład, patrząc w dół na narożnik „1”, „2”, „3”, matrycę można obracać wokół osi przechodzącej przez narożnik i na zewnątrz przeciwnego rogu, aby wyświetlić „1”, „2” lub „3” na szczycie ASCII art.

vtwarde kody ścianek matrycy, które przecinają się w każdym rogu, bsą przesunięciem względem początku losowego rogu i osą początkiem obrotu w danych narożnika. Grafika ASCII jest zapisywana w konsoli za pomocą ciągu console.logformatu.

traktor53
źródło
Prawdopodobnie możesz ogolić kilka bajtów, używając `cudzysłowów, które pozwalają na użycie dosłownych znaków nowej linii zamiast ciągłego pisania \n.
Neil
@Neil najbardziej ceniony, działał dobrze. Usunięto również końcowe';'
traktor53
4

TSQL 308 bajtów

DECLARE @ char(87)=(SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x)PRINT @

280 bajtów (w Server Management Studio: zapytanie - wynik na tekst)

SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x

Uwaga: usuwając wydruk i część deklarującą - i wysyłaj wynik bezpośrednio z WYBORU. Nie działałoby to jednak w skrzypcach

Skrzypce

t-clausen.dk
źródło
Może możesz zmienić, ABS(a^3*b-a*b^3)aby zapisać 4 bajty? (Nie jestem pewien - wydaje się, że działa na skrzypcach, ale zawsze daje mi tylko jeden rzut a, b, c = 5,1,3, więc mogę się mylić)
Jonathan Allan
@JonathanAllan dziękuję za komentarz. Wykładnicza jest zapisywana w TSQL POWER (a, 3). ^ ma inne znaczenie
t-clausen.dk,
4

JavaScript, 251 bajtów

r="replace";a=()=>(0|Math.random()*6)+1;b=(x,y)=>3*x*y*(x*x+6*y*y)%7;u=()=>{x=a(),y=a();z=b(x,y);if(z==0)u();return"   ________\r\n  \/\\       \\\r\n \/  \\   1   \\\r\n{ 2  }-------}\r\n \\  \/   3   \/\r\n  \\\/_______\/"[r](1,x)[r](2,y)[r](3,z);}

Połączenia za pomocą u();
Jest długi, ale jest odpowiedzią, a ja długo nie odpowiadałem.

Łysa Bantha
źródło
Brakuje spacji w lewym górnym rogu testu wyjściowego na ideone .
Jonathan Allan,
a=()=>(0|Math.random()*6)+1;powinien uratować 8
traktor53
3

Rubinowy, 150 bajtów

Wszystkie nadużycia formatowania ciągów !!!

Kredyt za formułę, która uzyskała ostatni numer, znajduje się tutaj @xnor .

u=1+rand(6)
l=([*1..6]-[u,u^7]).sample
$><<'%11s
  /\%8s
 /  \%4d%4s
{ %d  }%s}
 \  /%4d%4s
  \/%s/'%[?_*8,?\\,u,?\\,l,?-*7,3*u*l*(u*u-l*l)%7,?/,?_*7]
Wartość tuszu
źródło
Nie - podziękowania
Jonathan Allan
@JonathanAllan dziękuje za wskazanie mi odpowiedniego kredytu. W każdym razie sposób, w jaki sformatowałem tę odpowiedź, był bardziej tym, co miałem na myśli, gdy powiedziałem, że prawdopodobnie możesz lepiej wykorzystać formatowanie ciągów, aby zaoszczędzić bajty.
Wartość tuszu