กำหนดค่าลูกเต๋าจากมุมมองด้านข้าง


52

เขียนโปรแกรมหรือฟังก์ชั่นซึ่งจะใช้ค่าซ้ายและขวาของลูกเต๋าเป็นจำนวนเต็ม (1-6) และส่งคืนค่าที่อยู่ด้านบน

เค้าโครงลูกเต๋า:

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

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

ดังนั้นป้อนจะกลับมา6 45

คำสั่งซื้อเป็นสิ่งสำคัญ:

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

ใช่คุณสามารถใช้ตาราง แต่คุณไม่สามารถใช้รูทีนการบีบอัดในตัวเพื่อทำให้เล็กลงได้
694733

คำตอบ:


59

Python 30

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

ไม่มีการค้นหาเพียงทุบตีเล็กน้อย

ใบหน้าตรงข้ามมาเป็นคู่ที่ประกอบกันสามบิตซึ่งหมายความว่าพวกเขาแฮคเกอร์ถึง 7

1,6
2,5
3,4

เมื่อได้รับสองหน้าจากหนึ่งชุดเราต้องการรับหน้าจากอีกชุดหนึ่ง สำหรับ(1,2,3)เราสามารถทำได้ด้วย XOR ( ^) ดังนั้นจะให้คำตอบที่เหมาะสมขึ้นอยู่กับส่วนประกอบสามบิตหมาย^ เรามีเงื่อนไขสามารถเติมเต็มโดยx^7x^7*_

ในการตัดสินใจว่าจะใช้ส่วนประกอบ (XOR กับ 7) หรือไม่เราจะตรวจสอบว่า triplet ละเมิดกฎทางขวาหรือไม่ นั่นหมายความว่าa,bจะเป็นไปตามลำดับย้อนกลับของ

1,6
2,5
3,4

รักษาแต่ละบรรทัดเป็นหนึ่งในสามประเภท เนื่องจากองค์ประกอบในแต่ละบรรทัดจะเนกาทีฟ mod 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ตั้งแต่b**6เท่ากับ1modulo 6 a**2 * b**4นี้จะเทียบเท่ากับ เนื่องจากค่าที่เป็นไปได้อื่น ๆ คือ 2 (โดยการตรวจสอบกรณี) เราสามารถตรวจสอบว่ามันเป็น 4 โดยเปรียบเทียบกับ 3



ฉันสามารถประหยัดถ่านmin(a,7-a)โดยการทำa^7*(a>3)แต่ฉันรู้สึกว่าควรจะมีวิธีที่สั้นลง ความคิดใด ๆ
xnor

โอ้โหมีa/4*7^a...
xnor

11
ฉันไม่เคยรู้เลยว่าลูกเต๋าใบหน้าบิตมีคุณสมบัตินี้ ทำได้ดีนี่!
694733

1
@ user694733 มันทำงานออกมาอย่างโชคดีที่ 6 เป็นสองต่ำกว่าพลังของทั้งสอง
xnor

64

มีการแสดงออกของพหุนามโมดูโลดีเป็น 7 ด้านที่สามได้รับทั้งสองฝ่ายและข

3(a3-a3)พอควร7

หรือแยกตัวประกอบ

3a(a2-2)พอควร7

modulo 7 จะจับคู่กับส่วนที่เหลือใน {0,1,2,3,4,5,6}

ฉันอธิบายว่าทำไมมันถึงได้ผลในคำตอบ Math SEนี้ แต่ฉันคิดว่าอาจมีข้อโต้แย้งที่สะอาดกว่าที่ฉันคิดถึง พหุนามแบบสองเทอมอื่น ๆ ที่ใช้ได้คือ

(3a55-a3)พอควร7

ซึ่งฉันพบในตอนแรกด้วยการแปลงบิต bashingของฉันเป็นการดำเนินการทางคณิตศาสตร์จากนั้นทำการค้นหาแบบ brute-force เพื่อค้นหาชื่อพหุนามในแบบฟอร์มนี้เพื่อหาสิ่งที่ดีกว่า

โปรดเพิ่มพอร์ตของสิ่งนี้เป็นภาษาที่คุณชื่นชอบ; นี่คือโพสต์ CW

J, 9 โดย Synthetica

7|3***+*-

ดูโพสต์ของฉัน

Dyalog APL, 9 โดย ngn (แก้ไขโดยAdám)

7|3×××+×-

ขโมยโจ๋งครึ่มจากคำตอบ J ข้างต้น

TI-Basic, 14 โดย Timtech

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

Pyth, 16 โดย FryAmTheEggman

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

กำหนดฟังก์ชั่นgของสองค่า

Golfscript, 18 โดย Peter Taylor (พหุนามเก่า)

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

CJam, 18 โดย Martin Büttner (ถ่ายจาก GolfScript ของปีเตอร์) (พหุนามเก่า)

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

Mathematica, 20 โดย Martin Büttner

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

ใช่นั่นคือข้อดีและไม่ไม่มีวิธีที่สั้นกว่าที่ไม่ใช้เครื่องหมายบวก

dc, 21 โดย Toby Speight

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

ฉันต้องเพิ่ม 7 ลงไปaเพื่อให้แน่ใจว่าความแตกต่างเป็นค่าบวกเสมอ (dc มีตัว%ดำเนินการที่ลงชื่อ)

Julia, 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 โดย rink.attendant.6

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

เป็นหลักเช่นเดียวกับ CoffeeScript

Python 28 โดย xnor

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

Bash, 31

ไม่มีอะไรพิเศษ:

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

หรืออีกทางหนึ่ง:

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

อีกวิธีหนึ่ง

Nim, 36 โดย Sillesta

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

Java 7, 46 44 โดย rink.attendant.6

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

Java 8, 25 23 โดย Kevin Cruijssen

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

PHP, 49 47 โดย rink.attendant.6

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

รุ่นที่ 52 ลุง

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

CMD ไม่สนับสนุนโมดูลัสที่แท้จริงโดยกำเนิด (จึงไม่สามารถจัดการกับตัวเลขติดลบ) - %%7+7)%%7เพราะฉะนั้น

น้อย (เป็นตัวแปรมิกซ์อิน ) 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 bytes โดย Kevin Cruijssen)

nÆs`3P7%

ลองออนไลน์

Haskell, 31 27 25 โดยชื่อที่แสดงทั่วไป

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

ลองออนไลน์!

Excel, 27 โดย Wernisch

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

Excel VBA, 25 โดย Taylor Scott

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

ออกมา (gforth) 41 โดยคำสั่ง

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

ลองออนไลน์!

C #, 23 โดย Kevin Cruijssen

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 != b a+b != 7
Peter Taylor

@PeterTaylor อันที่จริงผมพบว่าการแสดงออกว่าด้วยการใช้**5พร็อกซีสำหรับ inverting โมดูโล 7.
XNOR

2
ฉันนอนไม่หลับกับ "ทำไม" ของพหุนามที่น่าทึ่งนี้ บางทีกลุ่มคนทางคณิตศาสตร์ก็สามารถช่วยได้ math.stackexchange.com/questions/1101870/…
บาดเจ็บทางดิจิตอล

1
ฉันเขียนมาเกี่ยวกับ math.SE: math.stackexchange.com/a/1101984/24654
xnor

1
คุณสามารถเขียนรถไฟ APL ใหม่เป็น7|3×××+×-: ออกเสียงได้ 7 ส่วนที่เหลือ 3 เท่าของผลิตภัณฑ์คูณผลรวมคูณความแตกต่าง (ระหว่างตัวเลขสองตัว)
ngn

9

CJam, 43 28 ไบต์

ไม่มีความคิดว่าวิธีการแบบเต็มตารางจะสั้นกว่า แต่จะไปที่:

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

ใส่เหมือน

2 3

เอาท์พุท:

1

นี่เป็นส่วนผสมของอัลกอริทึมก่อนหน้าของฉันเพื่อกำหนดใบหน้าที่ถูกต้องจาก 2 ใบหน้าและวิธีการของ xnor

ลองออนไลน์ได้ที่นี่


คุณอธิบายได้ไหมว่ามันทำงานอย่างไร แนวคิดเดียวกันกับ ep1024 มีหรือไม่
694733

@ user694733 ไม่เลย เพิ่มคำอธิบายแล้ว
เครื่องมือเพิ่มประสิทธิภาพ

ใช่ฉันเห็นเวลา ฉันแค่สงสัยว่ามันคล้ายกันเพราะเขามีคำอธิบายเกี่ยวกับเรื่องนี้และฉันไม่รู้ว่า CJam ทำงานอย่างไร
694733

@Optimizer ฉันต้องการเริ่มต้นกับ CJam ด้วยเช่นกันทิศทางทั่วไปที่คุณสามารถชี้ให้ฉันดูสำหรับการสอน ฯลฯ ได้หรือไม่ ฉันเห็นตัวอย่าง แต่พวกเขาแทบจะไม่ได้คำอธิบายใด ๆ : (
Teun Pronk

ลิงค์ด้านบนมีตัวอย่างและลิงค์ไปยังเว็บไซต์หลักที่มีคำอธิบายคำหลักภาษา นอกเหนือจากนั้นค้นหาที่นี่ด้วยคำหลัก cjam เพื่อเรียนรู้จากคำตอบที่มีอยู่
เครื่องมือเพิ่มประสิทธิภาพ

5

น้อยกว่า 62 ไบต์

ใช้อัลกอริทึมในโพสต์นี้ :

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

มันอาจจะสั้นลงถ้าค่าจำนวนเต็มถูกนำมาใช้ แต่จะได้ไปแสดงที่ฉันต้องการที่จะใช้แบบ CSS contentคุณสมบัติซึ่งจำเป็นต้องแก้ไขตัวแปร

อย่างไรก็ตามมันไม่บ่อยครั้งที่ภาษาพรีโปรเซสเซอร์ของ 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อยู่ด้านบน ในทำนองเดียวกัน31463สำหรับ 2 ท่าน, ฯลฯ กลับสตริงนี้จะช่วยให้ลำดับสำหรับการผ่าน46

โค้ดนี้ทำการค้นหาในสตริง"23542 31463 12651 15621 36413 24532"หารดัชนีด้วย 6 และเพิ่มขึ้นเพื่อกำหนดว่าด้านบนสุดจะต้องเป็นอะไร

ทดสอบออนไลน์ที่นี่

ขอบคุณ @FryAmTheEggman สำหรับเคล็ดลับในการตีกอล์ฟนี้


กอล์ฟที่เกี่ยวข้องกับ pyth: J"23542 31463 12651 "h/x+J_Jscz)6Ping ฉันถ้ามันมีบางอย่างสับสน ต้องการKและJค่ากำหนด, hเป็นเอก+1, ในรายการของสตริงคือs jk(นอกจากนี้หากได้รับอนุญาตให้ใช้สตริงเช่น23เดียวกับอินพุตจะดีที่สุด)
FryAmTheEggman

3

ใช้แนวทางคล้ายกันกับ es1024 ด้วยสตริงการค้นหาที่แตกต่างกัน:

JavaScript (ES6), 73 72 61 ไบต์

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

JavaScript (ES5), 88 87 77 ไบต์

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

CoffeeScript, 71 62 ไบต์

และเพื่อความสนุกสนานของรหัสนั้นสั้นกว่า 1 ไบต์ใน CoffeeScript เป็น ES6 เนื่องจากการไม่อนุญาตให้ใส่วงเล็บ

เนื่องจากมีการใช้-~กลอุบายสิ่งนี้จึงกลายเป็นจำนวนอักขระเท่ากับ ES6

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

1
บันทึก 1 ไบต์: ''+l+r=>[l]+r
edc65

@ edc65 ขอบคุณ! โอ้จาวาสคริปต์ทำงานอย่างไรเมื่อเพิ่มประเภทที่แตกต่าง
rink.attendant.6

1
ใช่ผู้ประกอบการ + แปลก แต่โอเปอเรเตอร์ ~ =>1+Math.floor -~รวมทั้งค้นหาแทน indexOf
edc65

น่าสนใจ และฉันรู้เกี่ยวกับsearchแต่มันเป็นเพียงสำหรับ ES6
rink.attendant.6

ที่จริงแล้วString.prototype.searchเป็นส่วนหนึ่งของ JavaScript ตั้งแต่ ECMAScript 3rd Edition ดังนั้นคุณสามารถเปลี่ยนคำตอบได้ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

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

ยังคงทำงานเกี่ยวกับเรื่องนี้แม้ว่า


ผมทดสอบนี้ที่นี่และมันดูเหมือนว่าจะกลับมาด้วย4 2 3
694733

แน่นอน .. แปลก ป่วยดูมัน
Teun Pronk

@ user694733 แก้ไขมัน :)
Teun Pronk

0

JavaScript (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

Bash, 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 °จะทำให้ได้ค่าใบหน้าเพิ่มขึ้นสามเท่า เช่นเราหมุน {l = 1, r = 2, t = 3} เมื่อเราได้ {l = 2, r = 3, t = 1} แล้วหมุนอีกครั้งเราจะได้ {l = 3, r = 1, t = 2}
  • ผลรวมของใบหน้าตรงกันข้ามอยู่เสมอ 7

การรวมการเรียกซ้ำข้างต้น (โดยใช้ {1,2,3} ฮาร์ดโค้ดเป็นจุดเริ่มต้น) เราสามารถสร้างการแมปทั้งหมดของ {l, r} -> t สำหรับค่าที่เป็นไปได้ทั้งหมด คำตอบนี้กำหนดฟังก์ชันแบบเรียกซ้ำ g () ที่เติมอาร์เรย์แบบเต็มเช่นนั้น [dr] = t ฟังก์ชันเรียกซ้ำเรียกว่าเริ่มต้นด้วย {1,2,3} และเรียกใช้ซ้ำทั่วทั้งคิวบ์จนกว่าจะไม่มีอิลิเมนต์อาร์เรย์อีกมากที่ยังไม่ได้ตั้งค่า ฟังก์ชั่นจะเรียกคืนตัวเองในสองวิธี:

  • ด้วยการสลับ l และ r และลบออกจาก 7 (ใบหน้าตรงข้าม)
  • ด้วย {l, r, t} หมุนไปที่ {r, t, l}

จากนั้นจะทำการค้นหาอาร์เรย์อย่างง่าย ๆ ของค่าที่ต้องการ


0

Dyalog APL ขนาด 9 ไบต์

การเปลี่ยนตัวอักษรที่โจ่งแจ้งของโซลูชัน Jของɐɔıʇǝɥʇuʎs :

7|3×××+×-

แก้ไข: ภายหลังฉันสังเกตเห็นว่าคำแนะนำที่แน่นอนนี้ถูกแนะนำโดย ngn เมื่อวันที่ 17 มกราคม 15

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

ลองใช้ออนไลน์!




0

C # (Visual C # Interactive Compiler) , 49 ไบต์

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

ลองออนไลน์!

-1 ไบต์ขอบคุณ @GB!

อินพุตเป็นสตริงอักขระ 2 ตัวที่มีตัวเลขหลักซ้ายและขวาที่มองเห็นได้

ด้านล่างเป็นคำตอบที่ฉันคิดขึ้นมาเอง การใช้ประโยชน์จากสตริงการค้นหาจากคำตอบ JavaScript ของ rink.attendant.6ฉันสามารถลบ 5 ไบต์ได้ (แต่ตอนนี้คำตอบของเราคล้ายกันมาก)

C # (Visual C # Interactive Compiler) , 55 ไบต์

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

ลองออนไลน์!


1
49 ไบต์โดยใช้ ("3542331463126512156236413" + x) แทนสตริงเต็ม
GB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.