Xác định giá trị xúc xắc từ góc nhìn bên


52

Viết chương trình hoặc hàm sẽ lấy giá trị bên trái và bên phải của súc sắc làm số nguyên (1-6) và trả về giá trị trên đầu.

Bố trí súc sắc:

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

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

Vì vậy, nhập liệu 6 4sẽ trở lại 5.

Thứ tự là quan trọng:

2 3 -> 1
3 2 -> 6

Chương trình không phải làm việc với các giá trị đầu vào không hợp lệ.

Để không khuyến khích cách tiếp cận rõ ràng (sử dụng bảng với tất cả các kết hợp), không được phép sử dụng bất kỳ quy trình mã hóa hoặc khử / nén văn bản dựng sẵn hoặc mã hóa cơ sở hoặc bất kỳ điều gì khác tương tự để giảm kích thước. Lưu ý rằng việc sử dụng bảng vẫn được cho phép và việc giải nén của riêng bạn cũng được cho phép, miễn là nó không được thực hiện bằng cách sử dụng một số chức năng thư viện sẵn sàng.

Đối với mục đích tham khảo, đây là bảng gồm tất cả các kết hợp (nghĩa là tất cả các đầu vào và đầu ra có thể):

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

Mã ngắn nhất sẽ thắng và áp dụng sơ hở tiêu chuẩn.


vì vậy tôi có thể sử dụng bảng với tất cả kết hợp - 1 ^^?
dwana

Có, bạn có thể sử dụng bảng. Nhưng bạn không thể sử dụng các thói quen nén dựng sẵn để làm cho nó nhỏ hơn.
dùng694733

Câu trả lời:


59

Con trăn, 30

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

Không có tra cứu, chỉ cần bashing.

Các mặt đối diện đi theo cặp là ba phần bổ sung cho nhau, nghĩa là chúng XOR thành 7.

1,6
2,5
3,4

Cho hai khuôn mặt từ một bộ, chúng tôi muốn có được một khuôn mặt từ bộ khác. Đối với (1,2,3), chúng ta có thể làm điều này với XOR ( ^). Vì vậy, ^đưa ra câu trả lời đúng lên đến bổ sung ba bit, ý nghĩa x^7. Chúng ta có thể bổ sung có điều kiện bằng cách x^7*_.

Để quyết định có lấy phần bù hay không (XOR với 7), chúng tôi kiểm tra xem bộ ba có vi phạm quy tắc bàn tay phải hay không. Điều đó có nghĩa là, a,bđi theo thứ tự tuần hoàn ngược của

1,6
2,5
3,4

coi mỗi dòng là một trong ba loại. Vì các phần tử trong mỗi dòng là âm 7, chúng ta có thể "băm" chúng bằng cách thực hiện x*x%7.

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

Mỗi dòng được lấy từ chu kỳ trước bằng cách nhân với 4 modulo 7, vì vậy chúng tôi có thể kiểm tra xem mối quan hệ này có giữ (b,a)để quyết định có bổ sung hay không : a*a%7==b*b*4%7.

Điều này tương đương với việc kiểm tra xem, modulo 7, có a**2 * b**(-2)bằng không 4. Vì b**6bằng 1modulo 6, điều này tương đương với a**2 * b**4. Vì giá trị có thể khác là 2 (bằng cách kiểm tra các trường hợp), chúng tôi có thể kiểm tra xem đó có phải là 4 hay không bằng cách so sánh với 3.


CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
Trình tối ưu hóa

Tôi có thể tiết kiệm một char min(a,7-a)bằng cách làm a^7*(a>3), nhưng tôi cảm thấy như nên có một cách ngắn hơn. Có ý kiến ​​gì không?
xnor

Ôi, có a/4*7^a...
xnor

11
Tôi không bao giờ nhận ra rằng các bit mặt xúc xắc có thuộc tính này. Đẹp quá
dùng694733

1
@ user694733 Nó hoạt động rất tình cờ rằng 6 là hai dưới một sức mạnh của hai.
xnor

64

Có một biểu thức đa thức đẹp modulo 7 cho bên thứ ba cho hai cạnh ab .

3(một3b-mộtb3)phép chia lấy phần dư7

hoặc bao thanh toán

3mộtb(một2-b2)phép chia lấy phần dư7

Bản đồ modulo 7 còn lại trong {0,1,2,3,4,5,6}.

Tôi giải thích lý do tại sao nó hoạt động trong câu trả lời Math SE này , mặc dù tôi nghĩ có lẽ có một đối số rõ ràng hơn mà tôi đang thiếu. Đa thức hai kỳ khác chỉ hoạt động là

(3một5b5-một3b)phép chia lấy phần dư7

mà ban đầu tôi đã tìm thấy bằng cách chuyển đổi bit bashing của mình thành các phép toán số học, sau đó thực hiện tìm kiếm vũ phu trên các đa thức của dạng này để tìm ra phép toán đẹp hơn.

Xin vui lòng thêm các cổng này vào ngôn ngữ yêu thích của bạn; đây là một bài viết CW.

J, 9 bởi Synthetica

7|3***+*-

Xem bài viết của tôi

Dyalog APL, 9 by ngn (lỗi đánh máy bởi Adám)

7|3×××+×-

Bị đánh cắp trắng trợn từ phía trên câu trả lời J.

TI-Basic, 14 bởi Timtech

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

Pyth, 16 bởi FryAmTheEggman

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

Xác định hàm gcủa hai giá trị.

Golfscript, 18 của Peter Taylor (đa thức cũ)

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

CJam, 18 của Martin Büttner (được chuyển từ Peter's GolfScript) (đa thức cũ)

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

Mathicala, 20 của Martin Büttner

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

Vâng, đó là một phép cộng đơn phương, và không, không có cách nào ngắn hơn mà không sử dụng một phép cộng đơn phương.

dc, 21 bởi Toby Speight

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

Tôi phải thêm 7 để ađảm bảo chênh lệch luôn dương (dc có %toán tử đã ký ).

Julia, 24 23 bởi Martin Büttner

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

CoffeeScript, 28 26 bởi rink.attguard.6

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

JavaScript (ES6), 28 26 bởi rink.attguard.6

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

Về cơ bản giống như CoffeeScript.

Python 28, bởi xnor

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

Bash, 31

Không có gì đặc biệt:

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

Hay cách khác:

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

Một cách tiếp cận khác (dài hơn nhưng có lẽ thú vị) .

Nim, 36 bởi Sillesta

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

Java 7, 46 44 bởi rink.attguard.6

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

Java 8, 25 23 của Kevin Cruijssen

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

PHP, 49 47 bởi rink.attguard.6

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

Mẻ, 52 chưa mở

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

CMD không hỗ trợ mô đun thực sự nguyên bản (vì vậy không thể xử lý số âm) - do đó %%7+7)%%7.

LESS (dưới dạng mixin tham số ), 62 60 bởi rink.attguard.6

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

Xem bài viết của tôi dưới đây .

05AB1E, 10 8 bởi Emigna (-2 byte bởi Kevin Cruijssen)

nÆs`3P7%

Hãy thử trực tuyến.

Haskell, 31 27 25 theo Tên hiển thị chung

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

Hãy thử trực tuyến!

Excel, 27 bởi Wernisch

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

VBA Excel, 25 của Taylor Scott

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

Forth (gforth) 41 bởi reffu

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

Hãy thử trực tuyến!

C #, 23 của Kevin Cruijssen

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

1
FWIW, (ab)**5 % 7 == (ab)**-1 % 7 == a^b^7cho tất cả a, btrong 1..6đó a != ba+b != 7.
Peter Taylor

@PeterTaylor Thật vậy, tôi đã tìm thấy biểu thức đó bằng cách sử dụng **5như một proxy để đảo ngược modulo 7.
xnor

2
Tôi đã mất ngủ vì "tại sao" của đa thức tuyệt vời này. Có lẽ các toán học.SE folks có thể giúp đỡ. math.stackexchange.com/questions/1101870/ Mạnh
Chấn thương kỹ thuật số

1
Tôi đã viết lên một dẫn xuất về toán học.SE: math.stackexchange.com/a/1101984/24654
xnor

1
Bạn có thể viết lại tàu APL dưới dạng 7|3×××+×-, phát âm: 7 phần còn lại của 3 lần sản phẩm nhân với tổng số lần chênh lệch (giữa hai số).
ngn

9

CJam, 43 28 byte

Không có ý tưởng nếu một cách tiếp cận dựa trên bảng đầy đủ sẽ ngắn hơn, nhưng ở đây đi:

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

Nhập như

2 3

Đầu ra:

1

Đây là một hỗn hợp của thuật toán trước đây của tôi để xác định khuôn mặt chính xác trong số 2 mặt và cách tiếp cận xors của xors.

Dùng thử trực tuyến tại đây


Bạn có thể giải thích làm thế nào điều này hoạt động? Ý tưởng tương tự như ep1024 đã có?
dùng694733

@ user694733 hoàn toàn không. Giải thích thêm.
Tối ưu hóa

Vâng, tôi đã thấy thời gian. Tôi chỉ tự hỏi liệu nó có giống nhau không, bởi vì anh ta đã giải thích về nó, và tôi không biết CJam hoạt động như thế nào.
dùng694733

@Optimizer Tôi cũng muốn bắt đầu với CJam, bất kỳ hướng chung nào bạn có thể chỉ cho tôi để được hướng dẫn, v.v.? Tôi thấy một số ví dụ nhưng họ hầu như không có bất kỳ lời giải thích nào :(
Teun Pronk

Liên kết ở trên có một số ví dụ và liên kết đến trang web chính có giải thích về các từ khóa ngôn ngữ. Ngoài ra, tìm kiếm ở đây với từ khóa cjam để tìm hiểu từ các câu trả lời hiện có.
Tối ưu hóa

5

BÀI, 62 byte

Sử dụng thuật toán trong bài này :

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

Nó có thể ngắn hơn nếu giá trị số nguyên được sử dụng, nhưng để hiển thị nó, tôi cần sử dụng thuộc tính CSS contentcần nội suy biến .

Tuy nhiên, không thường xuyên sử dụng ngôn ngữ tiền xử lý CSS cho mã golf!

Để sử dụng với một số HTML, bạn sẽ làm điều này:

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

4

Bình thường, 30 byte

K"23542 31463 12651 "h/x+K_Kz6

Yêu cầu hai chữ số làm đầu vào, không có khoảng trắng ở giữa (ví dụ: 23 không 2 3).

Giải trình:

Bất kỳ chuỗi hai chữ số nằm trong 23542đại diện cho hai mặt có 1trên đầu. Tương tự như vậy, 31463cho 2, v.v. Đảo ngược chuỗi này cung cấp các chuỗi cho 4qua 6.

Mã này chỉ thực hiện tra cứu trong chuỗi "23542 31463 12651 15621 36413 24532", chia chỉ số cho 6 và tăng để xác định phía trên phải là gì.

Kiểm tra trực tuyến tại đây.

Cảm ơn @FryAmTheEggman cho lời khuyên về việc chơi golf này.


Một số golf liên quan đến pyth: J"23542 31463 12651 "h/x+J_Jscz)6Ping tôi nếu một số trong đó là khó hiểu. Thích KJgán các giá trị, hlà đơn nhất +1, strên một danh sách các chuỗi là jk. (Ngoài ra, nếu được phép, chỉ cần sử dụng một chuỗi như 23đầu vào là tốt nhất)
FryAmTheEggman

3

Thực hiện một cách tiếp cận tương tự như es1024 với một chuỗi tra cứu khác:

JavaScript (ES6), 73 72 61 byte

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

JavaScript (ES5), 88 87 77 byte

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

Cà phê, 71 62 byte

Và chỉ để giải trí, mã này ngắn hơn 1 byte trong CoffeeScript là ES6 do thiếu sót cho phép của dấu ngoặc đơn

Do sử dụng -~mánh khóe, điều này hóa ra có cùng số lượng ký tự với ES6.

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

1
Lưu 1 byte: ''+l+r=>[l]+r
edc65

@ edc65 Cảm ơn! Ôi cách JavaScript hoạt động khi thêm các loại khác nhau
rink.attguard.6

1
Có, toán tử + là lạ. Nhưng những gì về nhà điều hành ~? 1+Math.floor=> -~. Ngoài ra, tìm kiếm thay vì indexOf.
edc65

Hấp dẫn. Và tôi biết searchnhưng nó chỉ dành cho ES6.
rink.attguard.6

Trên thực tế, String.prototype.searchđã là một phần của JavaScript kể từ ECMAScript Phiên bản thứ 3, vì vậy bạn có thể thay đổi câu trả lời của mình. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/iêu
kamoroso94

3

J (9)

Sử dụng thuật toán từ bài viết này .

7|3***+*-

Biểu đồ cây của hàm (có thể xóa một số thứ):

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

Trình diễn, thuyết trình:

   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 byte

Giống như giải pháp JavaScript của tôi:

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

0

Lua 118

Phải khôi phục phiên bản cuối cùng vì một lỗi tôi không thể tìm thấy, cũng không có thời gian để tìm kiếm nó.

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

Vẫn làm việc về điều này mặc dù.


Tôi đã thử nghiệm điều này ở đây , và nó dường như trở lại 4với 2 3.
dùng694733

quả thật .. kỳ lạ. bệnh nhìn vào nó
Teun Pronk

@ user694733 Đã sửa nó :)
Teun Pronk

0

JavaScript (ES6), 79 byte

Không phải là ngắn nhất nhưng tôi đã thử một cách tiếp cận khác với các câu trả lời hiện tại.

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

Lua, 89 byte

Một cổng đơn giản của giải pháp Python của xnor.

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

Bash, 85

Điều này không cạnh tranh golf khôn ngoan với đa thức ma thuật của @ xnor. Nhưng tôi nghĩ đây là một cách thú vị khác để tính toán câu trả lời:

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

Cụ thể chúng tôi biết những điều sau đây về xúc xắc:

  • Nếu mặt trái là 1 và mặt phải là 2, thì mặt trên là 3
  • Xoay quanh các đỉnh đối diện bằng 120 ° cho thêm một số bộ ba giá trị. Ví dụ: chúng ta xoay {l = 1, r = 2, t = 3} khi chúng ta nhận được {l = 2, r = 3, t = 1} và quay lại, chúng ta sẽ nhận được {l = 3, r = 1, t = 2}
  • Tổng số các mặt đối diện luôn là 7

Kết hợp đệ quy ở trên (sử dụng {1,2,3} mã hóa cứng làm điểm bắt đầu), chúng ta có thể tạo toàn bộ ánh xạ của {l, r} -> t cho tất cả các giá trị có thể. Câu trả lời này xác định hàm đệ quy g () cư trú một mảng đầy đủ sao cho d [lr] = t. Hàm đệ quy ban đầu được gọi với {1,2,3} và đệ quy trên toàn bộ khối cho đến khi không còn phần tử mảng nào chưa được đặt. Hàm đệ quy vào chính nó theo hai cách:

  • với l và r hoán đổi và trừ đi từ 7 (mặt đối diện)
  • với {l, r, t} được xoay thành {r, t, l}

Sau đó, nó thực hiện một tìm kiếm mảng đơn giản của các giá trị cần thiết.


0

APL Dyalog , 9 byte

Thay thế nhân vật trắng trợn của giải pháp J của ıʇǝɥʇuʎs :

7|3×××+×-

Chỉnh sửa: Sau đó tôi nhận thấy rằng giải pháp chính xác này được đề xuất bởi ngn vào ngày 17, 15 tháng 1.

  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
                              └───┘

Dùng thử trực tuyến!


0

Julia, 26 byte

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

hoặc là

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

hoặc là

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


0

C # (Trình biên dịch tương tác Visual C #) , 49 byte

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

Hãy thử trực tuyến!

-1 byte nhờ @GB!

Đầu vào là một chuỗi 2 ký tự chứa các chữ số bên trái và bên phải có thể nhìn thấy.

Dưới đây là giải pháp mà tôi đã đưa ra một cách độc lập. Tận dụng chuỗi tra cứu từ câu trả lời JavaScript của rink.attguard.6 , tôi đã có thể tắt 5 byte (nhưng bây giờ câu trả lời của chúng tôi khá giống nhau;)

C # (Trình biên dịch tương tác Visual C #) , 55 byte

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

Hãy thử trực tuyến!


1
49 byte bằng cách sử dụng ("3542331463126512156236413" + x) thay vì chuỗi đầy đủ
GB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.