이 코드 골프 챌린지에서는 무작위 다이 롤의 아스키 아트를 출력해야합니다.
이처럼 :
________
/\ \
/ \ 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
다시 이것은 code-golf 이므로 적은 바이트가 더 좋습니다.
답변
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]