ASCII 다이를 롤 6

챌린지에서는 무작위 다이 롤의 아스키 아트를 출력해야합니다.

이처럼 :

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

점에 유의하시기 바랍니다:

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

이는 다이에서 가능한 결과가 아니기 때문에 유효하지 않은 출력입니다.

거기 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)의 가능성 =.

프로그램은 위와 같이 아스키 아트 (xy와 zs가 숫자로 대체 된 모델)와 같은 다이 롤 중 하나를 출력해야하며, 각 출력은> 0 확률이 발생하지만 확률은 짝수 여야합니다 (실제와는 달리 트릭 주사위를 사용할 수 있음). 프로그램이 유효하지 않은 다이 롤 또는 비다이 롤을 출력 할 수 없습니다. 프로그램은 유효한 롤을 출력 할 확률이 1이어야합니다.

다이는 반드시 첫 번째 이미지와 같이 오른 손잡이 다이 일 필요는 없습니다. (오른손과 왼손은 주사위의 그물을 설명합니다)

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|
  \/_______/

주사위가 왼손잡이 인 경우, 다음은 유효한 결과이지만 주사위가 오른 손잡이 인 경우는 아닙니다.

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

왼손잡이 또는 오른 손잡이를 선택할 수 있지만 주사위는 일관되어야합니다. 왼쪽에서 오른쪽으로 또는 그 반대로 변경할 수 없습니다.

다음은 다이에 유효한 출력 목록입니다. XYZ의 위치는 위의 그림을 참조하십시오.

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

다시 이것은 이므로 적은 바이트가 더 좋습니다.



답변

Python 3, 197 196 192 바이트

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

이데온에서 테스트

오른 손잡이 (교환하여 왼손잡이로 전환 u*u하여 l*l마지막 줄에)

이길 수는 있지만, 주사위를 굴려 한숨을 쉰다 . 특히 원시로 돌아가고 구식 형식을 사용하지 않고 ASCII를 골프화하려는 모든 시도는 바이트를 저장하지 못했습니다.
-n00b에 대한 추가 골프 팁은 기꺼이 감사합니다.


답변

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

테스트 프로그램에서

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

설명

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.

답변

자바 238 232 207 201 바이트

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

ungolfed 때 :

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

연산

다이의 8 개의 코너 교차점에서 교차하는 다이 페이스 값은 고정되어 있지만 3 개의 회전으로 나타날 수 있습니다. 예를 들어 “1”, “2”, “3”코너를 내려다 보면서 다이는 코너를 통해 축을 중심으로 회전하고 반대쪽 코너를 벗어나 “1”, “2”또는 “3”을 표시 할 수 있습니다. ASCII 아트 위에

v하드 코너는 각 코너에서 교차 b하는 다이면을 랜덤 코너의 시작과 오프셋하고 o코너 데이터 내에서 회전의 시작을 하드 코딩합니다 . ASCII 아트는 console.log형식 문자열을 사용하여 콘솔에 작성됩니다 .


답변

TSQL 308 바이트

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 바이트 (Server Management Studio : 쿼리-결과 텍스트)

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

참고 : 인쇄 및 선언 부분을 제거하고 SELECT에서 직접 결과를 출력하십시오. 그러나 그것은 바이올린에서 작동하지 않습니다

깡깡이


답변

자바 스크립트, 251 바이트

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

사용하기 u();
그것은 길지만 답이지만, 오랫동안 대답하지 않았습니다.


답변

루비, 150 바이트

모든 문자열 형식 남용 !!!

마지막 숫자를 얻는 공식에 대한 크레딧은 @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]