측면도에서 주사위 값 결정


52

주사위의 왼쪽과 오른쪽 값을 정수 (1-6)로 가져 와서 맨 위에 값을 반환하는 프로그램이나 함수를 작성하십시오.

주사위 레이아웃 :

    +---+
    | 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
    | 6 |
    +---+

  ,^.
<´ 5 `>  <-- Top value
|`._,´|
.6 | 4,  <-- Side values
 `.|,´

입력 6 4하면이 반환 5됩니다.

순서가 중요합니다 :

2 3 -> 1
3 2 -> 6

프로그램이 유효하지 않은 입력 값으로 작동하지 않아도됩니다.

내장 된 텍스트 인코딩 또는 압축 풀기 루틴 또는 기본 인코딩 또는 크기 축소와 유사한 것을 사용하는 명백한 접근 방식 (모든 조합에 테이블 사용)을 권장하지 않습니다. 준비 라이브러리 기능을 사용하지 않는 한 테이블 사용은 여전히 ​​허용되며 자체 압축 해제도 허용됩니다.

참고로 다음은 모든 조합 (예 : 가능한 모든 입력 및 출력)에 대한 표입니다.

23, 35, 42, 54 -> 1
14, 31, 46, 63 -> 2
12, 26, 51, 65 -> 3
15, 21, 56, 62 -> 4
13, 36, 41, 64 -> 5
24, 32, 45, 53 -> 6

가장 짧은 코드가 승리하고 표준 허점이 적용됩니다.


그래서 모든 조합으로 테이블을 사용할 수 있습니다-1 ^^?
dwana

예, 테이블을 사용할 수 있습니다. 그러나 내장 압축 루틴을 사용하여 더 작게 만들 수는 없습니다.
user694733

답변:


59

파이썬, 30

lambda a,b:a^b^7*(2<a*a*b%7<5)

조회가 없으며 비트 강타가 있습니다.

반대쪽면은 서로 3 비트 보완되는 쌍으로 제공되므로 7과 XOR이됩니다.

1,6
2,5
3,4

한 세트에서 두면이 주어지면 다른 세트에서면을 가져오고 싶습니다. 의 경우 (1,2,3)XOR ( ^) 로이 작업을 수행 할 수 있습니다 . 따라서 ^최대 3 비트 보수까지 올바른 답을 제공합니다 x^7. 조건부로을 보완 할 수 있습니다 x^7*_.

보수 (XOR with 7)를 취할지 여부를 결정하기 위해 삼중 항이 오른쪽 규칙을 위반하는지 확인합니다. 즉, 그 a,b순서는 역순으로 진행됩니다.

1,6
2,5
3,4

각 줄을 세 가지 범주 중 하나로 취급합니다. 각 줄의 요소는 음수 모드 7이므로를 수행하여 "해시"할 수 있습니다 x*x%7.

1,6 -> 1
2,5 -> 4
3,4 -> 2

각 라인은 4 모듈로 7을 곱하여 주기적으로 이전의 라인에서 얻습니다. 따라서이 관계가 (b,a)다음을 보완할지 여부를 결정하는지 여부를 확인할 수 있습니다 a*a%7==b*b*4%7.

이것은 모듈로 7이 a**2 * b**(-2)같은지 확인하는 것과 같습니다 4. 모듈로 6과 b**6같으 므로 1이는에 해당합니다 a**2 * b**4. 다른 가능한 값은 2 (사례 확인)이므로 3과 비교하여 값이 4인지 확인할 수 있습니다.


CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
최적화

min(a,7-a)을 수행 하여 문자를 절약 할 수는 a^7*(a>3)있지만 아직 짧은 방법이 있어야한다고 생각합니다. 어떤 아이디어?
xnor

오, 거기에 a/4*7^a...
xnor

11
나는 주사위 얼굴 비트 가이 속성을 가지고 있다는 것을 결코 깨닫지 못했습니다. 좋은 것!
user694733

1
@ user694733 6은 2의 거듭 제곱 아래 2라는 것이 매우 유감스럽게 생각됩니다.
xnor

64

양변 ab가 주어지면 제 3 변에 대해 좋은 다항식 모듈로 7이 있습니다.

3(a3bab3)mod7

또는 인수 분해

3ab(a2b2)mod7

모듈로 7은 {0,1,2,3,4,5,6}의 나머지에 매핑됩니다.

Math SE answer 에서 왜 작동하는지 설명 하지만 누락 된 명확한 주장이 있다고 생각합니다. 작동하는 유일한 다른 2 항 다항식은

(3a5b5a3b)mod7

원래 비트 bash 를 산술 연산 으로 변환 하여 찾은 다음 더 좋은 것을 찾기 위해이 형식의 다항식을 무차별 검색했습니다.

이 포트를 좋아하는 언어로 자유롭게 추가하십시오. 이것은 CW 게시물입니다.

Synthetica의 J, 9

7|3***+*-

게시물 보기

Dyalog APL, 9 by ngn (Adám에서 오타 수정)

7|3×××+×-

위의 답변에서 명백히 도난당했습니다.

TI-Basic, 14 팀 Timtech

7fPart((A³B-AB³)/21

Pyth, 16 by FryAmTheEggman

M%*3-*H^G3*^H3G7

g두 값 의 함수 를 정의합니다 .

Peter Taylor (구 다항식)의 Golfscript, 18

~1$*.5?3*@.*@*- 7%

Martin Büttner (Peter 's GolfScript에서 이식)의 18 세 CJam (구 다항식)

l~1$*_5#3*@_*@*m7%

Mathematica, Martin Büttner의 20

Mod[+##(#-#2)3##,7]&

예, 그것은 단항 플러스이며, 단항 플러스를 사용하지 않는 더 짧은 방법은 없습니다.

dc, 21by Toby Speight

sb7+d3^lb*rlb3^*-3*7%

a차이가 항상 양수인지 확인하려면 7을 추가 해야합니다 (dc에 서명 된 %연산자가 있음).

줄리아, 24 23, Martin Büttner

f(a,b)=3a*b*(a^2-b^2)%7

CoffeeScript, 28 26 rink.attendant.6

x=(a,b)->3*a*b*(a*a-b*b)%7

JavaScript (ES6), 28 26 by rink.attendant.6

x=(a,b)=>3*a*b*(a*a-b*b)%7

기본적으로 CoffeeScript와 동일합니다.

xnor의 Python 28

lambda a,b:3*a*b*(a*a-b*b)%7

배쉬, 31

특별한 것은 없습니다 :

echo $[3*($1**3*$2-$1*$2**3)%7]

또는 대안 적으로 :

echo $[3*$1*$2*($1*$1-$2*$2)%7]

더 길지만 흥미있는 또 다른 접근법 .

Nim, 36 by Sillesta

proc(x,y:int):int=3*x*y*(x*x-y*y)%%7

rink.attendant.6에 의한 Java 7, 46 44

int f(int a,int b){return(a*a-b*b)*a*b*3%7;}

Kevin Cruijssen의 Java 8, 25 23

a->b->(a*a-b*b)*a*b*3%7

rink.attendant.6에 의해 PHP, 49 47

function x($a,$b){echo($a*$a-$b*$b)*3*$a*$b%7;}

배치, unclemeat 52

set/aa=(3*(%1*%1*%1*%2-%1*%2*%2*%2)%%7+7)%%7
echo %a%

CMD는 기본적으로 실제 계수를 지원하지 않으므로 음수를 처리 할 수 ​​없습니다 %%7+7)%%7.

LESS ( 파라 메트릭 믹스 인 ), 62 60 rink.attendant.6

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a-@b*@b),7);content:~"'@{r}'"}

아래 내 게시물을 참조하십시오 .

05AB1E, 10 8 Emigna (케빈 크루이 센이 2 바이트)

nÆs`3P7%

온라인으로 사용해보십시오.

Haskell, 31 27 25, 일반 표시 이름

a#b=3*a*b*(a*a-b*b)`mod`7

온라인으로 사용해보십시오!

Excel, 27 by Wernisch

=MOD(3*(A1^3*B1-A1*B1^3),7)

Taylor Scott의 Excel VBA, 25

?3*[A1^3*B1-A1*B1^3]Mod 7

Reffu에 의해 Forth (gforth) 41

: f 2>r 2r@ * 2r@ + 2r> - 3 * * * 7 mod ;

온라인으로 사용해보십시오!

Kevin Cruijssen의 C #, 23

a=>b=>(a*a-b*b)*a*b*3%7

1
FWIW, (ab)**5 % 7 == (ab)**-1 % 7 == a^b^7모두를위한 a, b에서 1..6와 같은 그 a != ba+b != 7.
피터 테일러

@PeterTaylor 사실, 나는 **5모듈로 7을 뒤집기위한 프록시로 그 표현을 찾았습니다 .
xnor

2
나는이 놀라운 다항식의 "왜"에 대해 잠을 잃었습니다. 아마도 math.SE 사람들이 도울 수 있습니다. math.stackexchange.com/questions/1101870/…
디지털 외상

1
나는 math.SE에 대한 파생을 썼습니다 : math.stackexchange.com/a/1101984/24654
xnor

1
APL 열차를 다음과 같이 다시 작성할 수 있습니다 7|3×××+×-.
ngn

9

CJam, 43 28 바이트

전체 테이블 기반 접근 방식이 더 짧을 지 모르겠지만 다음과 같습니다.

l_~^56213641532453s@S-#)g7*^

같은 입력

2 3

산출:

1

이것은 두 얼굴 중 올바른 얼굴과 xnor의 xors 접근 방식을 결정하기 위해 이전 알고리즘을 혼합 한 것입니다.

여기에서 온라인으로 사용해보십시오


이것이 어떻게 작동하는지 설명해 주시겠습니까? ep1024와 같은 아이디어?
user694733

@ user694733 전혀 아닙니다. 설명이 추가되었습니다.
Optimizer

예, 시간을 보았습니다. 그가 설명하기 때문에 비슷한 지 궁금하고 CJam이 어떻게 작동하는지 전혀 모른다.
user694733

@Optimizer CJam도 시작하고 싶습니다. 튜토리얼 등을 알려주는 일반적인 방향은 무엇입니까? 몇 가지 예를 보았지만 설명이 거의 없습니다. (
Teun Pronk

위의 링크에는 몇 가지 예와 언어 키워드에 대한 설명이있는 기본 웹 사이트 링크가 있습니다. 그 외에는 기존 답변에서 배우려면 cjam 키워드로 여기를 검색하십시오.
Optimizer

5

최소, 62 바이트

이 게시물 의 알고리즘을 사용합니다 .

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a+6*@b*@b),7);content:~"'@{r}'"}

정수 값을 사용하면 더 짧을 수 있지만 표시 content하려면 변수 interpolation 이 필요한 CSS 속성 을 사용해야했습니다 .

그럼에도 불구하고 CSS 골프 전처리 언어가 코드 골프에 자주 사용되는 것은 아닙니다!

일부 HTML과 함께 사용하려면 다음을 수행하십시오.

p::after { .x(1, 3); }
<p>Number on top: </p>

4

Pyth, 30 바이트

K"23542 31463 12651 "h/x+K_Kz6

. (예 사이에는 공간이 입력으로 두 자리가 필요 23없다 2 3).

설명:

안에있는 두 자리 시퀀스는 맨 위에 23542있는 두면을 나타냅니다 1. 마찬가지로 314632 등의 경우.이 문자열을 반대로하면에 대한 시퀀스가 ​​제공 4됩니다 6.

이 코드는 문자열에서 조회를 수행 "23542 31463 12651 15621 36413 24532"하고 색인을 6으로 나누고 증가하여 상단이 무엇인지 결정합니다.

여기에서 온라인으로 테스트하십시오.

골프 팁에 대한 @FryAmTheEggman에게 감사합니다.


일부 pyth 관련 골프 : J"23542 31463 12651 "h/x+J_Jscz)6혼란 스러울 경우 핑 (Ping) 선호 K하고 J값을 할당하는 h데는 단항 +1이며, s문자열 목록은입니다 jk. (또한 허용되는 경우 23입력 과 같은 문자열을 사용하는 것이 가장 좋습니다)
FryAmTheEggman

3

다른 조회 문자열을 사용하여 es1024와 비슷한 방법을 사용합니다.

자바 스크립트 (ES6), 73 72 61 바이트

t=(l,r)=>-~('354233146312651215623641332453'.search([l]+r)/5)

자바 스크립트 (ES5), 88 87 77 바이트

function t(l,r){return -~('354233146312651215623641332453'.indexOf([l]+r)/5)}

CoffeeScript, 71 62 바이트

그리고 재미있게, 허용되는 괄호 생략으로 인해 CoffeeScript에서 ES6로 코드가 1 바이트 더 짧습니다.

-~트릭을 사용했기 때문에 ES6과 동일한 수의 문자로 판명되었습니다.

t=(l,r)->-~('354233146312651215623641332453'.indexOf([l]+r)/5)

1
1 바이트 저장 : ''+l+r=>[l]+r
edc65

감사합니다! 다른 유형을 추가 할 때 JavaScript가 작동하는 방식
rink.attendant.6

1
예, 연산자 +는 이상합니다. 그러나 연산자는 어떻습니까? 1+Math.floor=> -~. 또한 indexOf 대신 검색하십시오.
edc65

흥미 롭군 그리고 나는 알고 search있었지만 ES6 전용입니다.
rink.attendant.6

실제로 String.prototype.searchECMAScript 3rd Edition 이후 JavaScript의 일부이므로 답변을 변경할 수 있습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
kamoroso94

3

J (9)

게시물 의 알고리즘을 사용합니다 .

7|3***+*-

함수의 트리 그래프 (일부 항목을 지울 수 있음) :

    f=:7|3***+*-
    f
7 | 3 * * * + * -
   5 !: 4 < 'f'
  ┌─ 7            
  ├─ |            
──┤   ┌─ 3        
  │   ├─ *        
  └───┤   ┌─ *    
      │   ├─ *    
      └───┤   ┌─ +
          └───┼─ *
              └─ -

데모:

   3 f 5
1
   4 f 6
2
   2 f 6
3
   2 f 1
4
   1 f 2
3
   4 f 5
6

0

PHP, 81 바이트

내 JavaScript 솔루션과 동일합니다.

function t($l,$r){echo(int)(1+strpos('354233146312651215623641332453',$l.$r)/5);}

0

루아 118

찾을 수없는 버그로 인해 마지막 버전을 복원하지 않았으며 찾을 시간이 없었습니다.

z=io.read;o={"","","34","5 2","2165","46 13",""," 31064","  5612","   2 5","    43"}a=z();b=z();print(o[a+b]:sub(a,a))

그래도 여전히 노력하고 있습니다.


나는이 테스트 여기에 , 그리고 그것을 반환 할 것 같다 42 3.
user694733

정말로 .. 이상하다. 그것을 들여다보십시오.
Teun Pronk

@ user694733 고정 :)
Teun Pronk

0

자바 스크립트 (ES6), 79 바이트

가장 짧지는 않지만 현재 답변과 다른 접근법을 시도했습니다.

f=(a,b)=>[a,b,7-a,7-b].reduce((p,v,i,r)=>p?p:'2312132'.indexOf([v]+r[i+1])+1,0)

0

루아, 89 바이트

xnor의 Python 솔루션의 간단한 포트입니다.

x=require('bit32').bxor
function(a,b)c=a*a*b%7;return x(a,x(b,2<c and c<5 and 7 or 0))end

0

배쉬, 85

이것은 @xnor의 마술 다항식과 골프와 경쟁하지 않습니다. 그러나 이것이 답변을 계산하는 또 다른 흥미로운 방법이라고 생각합니다.

g(){
((d[$1$2]))||{
d[$1$2]=$3
g $2 $1 $[7-$3]
g $2 $3 $1
}
}
g 1 2 3
echo ${d[$1$2]}

구체적으로 우리는 주사위에 대해 다음을 알고 있습니다.

  • 왼쪽면이 1이고 오른쪽면이 2이면 윗면은 3입니다.
  • 반대 정점 주위를 120 ° 회전하면 얼굴 값이 3 배 더 늘어납니다. 예를 들어 {l = 2, r = 3, t = 1}이되면 {l = 1, r = 2, t = 3}을 회전하고 다시 회전하면 {l = 3, r = 1, t = 2}가됩니다.
  • 반대면의 합은 항상 7입니다

위의 재귀를 결합하여 (시작 지점으로 {1,2,3} 하드 코딩 사용) 가능한 모든 값에 대해 {l, r}-> t의 전체 맵핑을 생성 할 수 있습니다. 이 답변은 d [lr] = t와 같이 전체 배열을 채우는 재귀 함수 g ()를 정의합니다. 재귀 함수는 처음에 {1,2,3}으로 호출되며 설정되지 않은 배열 요소가 더 이상 없을 때까지 전체 큐브 전체에서 재귀합니다. 이 함수는 두 가지 방식으로 반복됩니다.

  • l과 r이 바뀌고 7에서 t를 빼면 (반대면)
  • {l, r, t}를 {r, t, l}로 회전 한 상태

그런 다음 필요한 값의 간단한 배열 조회를 수행합니다.


0

Dyalog APL , 9 바이트

ɐɔıʇǝɥʇuʎs의 J 솔루션에 대한 명백한 문자 대체 :

7|3×××+×-

편집 : 나중에이 정확한 솔루션이 15 년 1 월 17 일 ngn에 의해 제안되었음을 알았습니다.

  the division remainder when divided by seven of
  |        three times
  |        | the product of the arguments
  |        |   times   \┌───┐
  |        |     \  ┌───┤ × 
┌────┐   ┌────┐   ┌─┴─┐ └───┘ ┌───┐
 7| ├───┤ 3× ├───┤ ×    ┌───┤ +  - the sum of the arguments
└────┘   └────┘   └─┬─┘ ┌─┴─┐ └───┘      
                    └───┤ ×  ---- times
                        └─┬─┘ ┌───┐
                          └───┤ -  - the difference between the arguments
                              └───┘

TryAPL 온라인!


0

줄리아, 26 바이트

f(a,b)=a$b$7*(2<a^2*b%7<5)

또는

f(a,b)=(3*a^5*b^5-a^3*b)%7

또는

f(a,b)=3*a*b*(a+b)*(a-b)%7


0

C # (Visual C # 대화식 컴파일러) , 49 바이트

x=>1+("3542331463126512156236413"+x).IndexOf(x)/5

온라인으로 사용해보십시오!

@GB 덕분에 -1 바이트!

입력은 보이는 왼쪽 및 오른쪽 숫자를 포함하는 2 문자열입니다.

아래는 내가 독립적으로 생각해 낸 해결책입니다. rink.attendant.6의 JavaScript 답변 에서 조회 문자열을 활용하여 5 바이트 를 줄일 수있었습니다 (그러나 이제 우리의 답변은 매우 비슷합니다.)

C # (Visual C # 대화식 컴파일러) , 55 바이트

x=>1+"42354 31463 51265 21562 41364 24532".IndexOf(x)/6

온라인으로 사용해보십시오!


1
전체 문자열 대신 ( "3542331463126512156236413"+ x)를 사용하여 49 바이트
GB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.