Tentukan nilai dadu dari tampilan samping

52

Tulis program atau fungsi yang akan mengambil nilai dadu kiri dan kanan sebagai bilangan bulat (1-6) dan mengembalikan nilai di atas.

Tata letak dadu:

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

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

Jadi memasukkan 6 4akan kembali 5.

Urutan itu penting:

2 3 -> 1
3 2 -> 6

Program tidak harus bekerja dengan nilai input yang tidak valid.

Untuk mencegah pendekatan yang jelas (menggunakan tabel dengan semua kombinasi), menggunakan pengkodean teks bawaan apa pun atau de / kompresi rutin atau pengkodean basis atau hal lain yang mirip dengan mengurangi ukuran tidak diperbolehkan. Perhatikan bahwa menggunakan tabel masih diperbolehkan dan menggulirkan dekompresi Anda sendiri juga diizinkan, asalkan itu tidak dilakukan menggunakan beberapa fungsi perpustakaan siap.

Untuk tujuan referensi, inilah tabel semua kombinasi (yaitu semua input dan output yang mungkin):

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

Kode terpendek menang, dan celah standar berlaku.

pengguna694733
sumber
jadi saya bisa menggunakan tabel dengan semua kombinasi - 1 ^^?
dwana
Ya, Anda bisa menggunakan tabel. Tetapi Anda tidak dapat menggunakan rutin kompresi bawaan untuk membuatnya lebih kecil.
user694733

Jawaban:

59

Python, 30

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

Tidak ada pencarian, hanya sedikit bashing.

Wajah-wajah yang berlawanan datang berpasangan yang saling melengkapi tiga-bit, yang berarti bahwa mereka XOR ke 7.

1,6
2,5
3,4

Diberi dua wajah dari satu set, kami ingin mendapatkan wajah dari set lainnya. Untuk (1,2,3), kita bisa melakukan ini dengan XOR ( ^). Jadi, ^berikan jawaban yang tepat hingga komplemen tiga bit, artinya x^7. Kami dapat melengkapi dengan x^7*_.

Untuk memutuskan apakah akan mengambil pelengkap (XOR dengan 7), kami memeriksa apakah triplet melanggar aturan tangan kanan. Itu berarti, itu a,bberjalan dalam urutan siklik terbalik

1,6
2,5
3,4

memperlakukan setiap baris sebagai salah satu dari tiga kategori. Karena elemen di setiap baris adalah negatif mod 7, kita dapat "hash" dengan melakukan x*x%7.

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

Setiap baris diperoleh dari siklis sebelumnya dengan mengalikannya dengan 4 modulo 7, sehingga kita dapat memeriksa apakah hubungan ini berlaku untuk (b,a)untuk memutuskan apakah untuk: a*a%7==b*b*4%7.

Ini sama dengan memeriksa apakah, modulo 7, a**2 * b**(-2)sama dengan 4. Karena b**6sama dengan 1modulo 6, ini setara dengan a**2 * b**4. Karena nilai lain yang mungkin adalah 2 (dengan memeriksa kasus), kami dapat memeriksa apakah 4 dengan membandingkan dengan 3.

Tidak
sumber
CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
Pengoptimal
Saya bisa menyelamatkan char dari min(a,7-a)dengan melakukan a^7*(a>3), tetapi saya merasa harus ada cara yang lebih singkat. Ada ide?
xnor
Ooh, ada a/4*7^a...
xnor
11
Saya tidak pernah menyadari bahwa bit wajah dadu memiliki properti ini. Yang bagus!
user694733
1
@ user694733 Ternyata sangat kebetulan bahwa 6 adalah dua di bawah kekuatan dua.
xnor
64

Ada modulo 7 ekspresi polinomial yang bagus untuk sisi ketiga diberikan dua sisi a dan b .

3(Sebuah3b-Sebuahb3)mod7

atau diperhitungkan

3Sebuahb(Sebuah2-b2)mod7

Modulo 7 memetakan sisanya di {0,1,2,3,4,5,6}.

Saya menjelaskan mengapa ini bekerja dalam jawaban Math SE ini , meskipun saya pikir mungkin ada argumen yang lebih bersih yang saya lewatkan. Satu-satunya polinomial dua-istilah lain yang berfungsi adalah

(3Sebuah5b5-Sebuah3b)mod7

yang awalnya saya temukan dengan mengubah bit-bashing saya menjadi operasi aritmatika, kemudian melakukan pencarian dengan kekerasan melalui polinomial dari bentuk ini untuk menemukan yang lebih bagus.

Silakan menambahkan port ini ke dalam bahasa favorit Anda; ini adalah posting CW.

J, 9 oleh Synthetica

7|3***+*-

Lihat posting saya

Dyalog APL, 9 oleh ngn (salah ketik diperbaiki oleh Adám)

7|3×××+×-

Dicuri dari jawaban J terang-terangan.

TI-Basic, 14 oleh Timtech

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

Pyth, 16 oleh FryAmTheEggman

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

Menentukan fungsi gdua nilai.

Golfscript, 18 oleh Peter Taylor (polinomial lama)

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

CJam, 18 oleh Martin Büttner (porting dari Peter's GolfScript) (polinomial lama)

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

Mathematica, 20 oleh Martin Büttner

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

Ya, itu plus unary, dan tidak, tidak ada cara yang lebih pendek yang tidak menggunakan plus unary.

dc, 21 oleh Toby Speight

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

Saya harus menambahkan 7 untuk amemastikan perbedaan selalu positif (dc memiliki %operator yang ditandatangani ).

Julia, 24 23 oleh Martin Büttner

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

CoffeeScript, 28 26 oleh rink.attendant.6

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

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

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

Intinya sama dengan CoffeeScript.

Python 28, oleh xnor

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

Bash, 31

Tidak ada yang spesial:

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

atau sebagai alternatif:

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

Pendekatan lain (lebih lama tapi mungkin menarik) .

Nim, 36 oleh Sillesta

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

Java 7, 46 44 oleh rink.attendant.6

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

Java 8, 25 23 oleh Kevin Cruijssen

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

PHP, 49 47 oleh rink.attendant.6

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

Batch, 52 tidak terdaftar

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

CMD tidak mendukung modulus true secara asli (jadi tidak dapat menangani angka negatif) - karenanya %%7+7)%%7.

KURANG (sebagai campuran parametrik ), 62 60 oleh rink.attendant.6

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

Lihat posting saya di bawah ini .

05AB1E, 10 8 oleh Emigna (-2 bytes oleh Kevin Cruijssen)

nÆs`3P7%

Cobalah online.

Haskell, 31 27 25 oleh Generic Display Name

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

Cobalah online!

Excel, 27 oleh Wernisch

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

Excel VBA, 25 oleh Taylor Scott

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

Keempat (gforth) 41 oleh reffu

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

Cobalah online!

C #, 23 oleh Kevin Cruijssen

a=>b=>(a*a-b*b)*a*b*3%7
xnor
sumber
1
FWIW, (ab)**5 % 7 == (ab)**-1 % 7 == a^b^7untuk semua a, bdi 1..6sehingga a != bdan a+b != 7.
Peter Taylor
@PeterTaylor Memang, saya menemukan ekspresi itu dengan menggunakan **5sebagai proxy untuk membalikkan modulo 7.
xnor
2
Saya telah kehilangan tidur karena "mengapa" dari polinomial yang menakjubkan ini. Mungkin matematika. Orang-orang SE bisa membantu. math.stackexchange.com/questions/1101870/...
Digital Trauma
1
Aku menulis derivasi pada math.SE: math.stackexchange.com/a/1101984/24654
xnor
1
Anda dapat menulis ulang kereta APL sebagai 7|3×××+×-, diucapkan: 7-sisa dari 3 kali produk dikalikan jumlah kali perbedaan (antara dua angka).
ngn
9

CJam, 43 28 byte

Tidak tahu apakah pendekatan berbasis tabel penuh akan lebih pendek, tapi begini:

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

Masukan seperti

2 3

Keluaran:

1

Ini adalah campuran dari algoritma saya sebelumnya untuk menentukan wajah yang benar dari 2 wajah dan pendekatan xnor tentang xors.

Cobalah online di sini

Pengoptimal
sumber
Bisakah Anda menjelaskan cara kerjanya? Ide yang sama seperti yang dimiliki ep1024?
user694733
@ user694733 tidak sama sekali. Penjelasan ditambahkan.
Pengoptimal
Ya, saya melihat waktu. Saya hanya ingin tahu apakah itu mirip, karena dia punya penjelasan tentang itu, dan saya tidak tahu bagaimana CJam bekerja.
user694733
@Optimizer Saya ingin memulai CJam juga, ada arahan umum yang bisa Anda tunjukkan untuk tutorial dll? Saya melihat beberapa contoh tetapi mereka hampir tidak memiliki penjelasan :(
Teun Pronk
Tautan di atas memiliki beberapa contoh dan tautan ke situs web utama yang memiliki penjelasan tentang kata kunci bahasa. Selain itu, cari di sini dengan kata kunci cjam untuk belajar dari jawaban yang ada.
Pengoptimal
5

KURANG, 62 byte

Gunakan algoritme di pos ini :

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

Bisa jadi lebih pendek jika nilai integer digunakan, tetapi untuk menampilkannya saya perlu menggunakan contentproperti CSS yang membutuhkan interpolasi variabel .

Meskipun demikian, tidak jarang bahasa preprocessor CSS digunakan untuk kode golf!

Untuk digunakan dengan beberapa HTML, Anda akan melakukan ini:

p::after { .x(1, 3); }
<p>Number on top: </p>
rink.attendant.6
sumber
4

Pyth, 30 byte

K"23542 31463 12651 "h/x+K_Kz6

Membutuhkan dua digit sebagai input, tanpa spasi di antaranya (mis. 23Tidak 2 3).

Penjelasan:

Setiap dua digit urutan yang terletak di dalam 23542mewakili dua sisi yang ada 1di atas. Demikian juga, 31463untuk 2, dll. Membalikkan string ini memberikan urutan untuk 4melalui 6.

Kode ini hanya melakukan pencarian dalam string "23542 31463 12651 15621 36413 24532", membagi indeks dengan 6, dan kenaikan untuk menentukan apa yang harus sisi atas.

Tes online di sini.

Terima kasih kepada @FryAmTheEggman untuk tips tentang bermain golf ini.

es1024
sumber
Beberapa golf yang berhubungan dengan pyth: J"23542 31463 12651 "h/x+J_Jscz)6Ping saya jika beberapa di antaranya membingungkan. Lebih suka Kdan Juntuk menetapkan nilai, hadalah unary +1, spada daftar string adalah jk. (Juga, jika diizinkan, hanya menggunakan string seperti 23sebagai input akan menjadi yang terbaik)
FryAmTheEggman
3

Mengambil pendekatan yang mirip dengan es1024 dengan string pencarian yang berbeda:

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

CoffeeScript, 71 62 byte

Dan hanya untuk bersenang-senang, kode 1 byte lebih pendek dalam CoffeeScript sebagai ES6 karena penghilangan tanda kurung yang diizinkan

Karena penggunaan -~trik, ini ternyata menjadi jumlah karakter yang sama dengan ES6.

t=(l,r)->-~('354233146312651215623641332453'.indexOf([l]+r)/5)
rink.attendant.6
sumber
1
Hemat 1 byte: ''+l+r=>[l]+r
edc65
@ edc65 Terima kasih! Oh, bagaimana JavaScript berperilaku ketika menambahkan tipe yang berbeda
rink.attendant.6
1
Ya, operator + aneh. Tapi bagaimana dengan operator ~? 1+Math.floor=> -~. Juga, cari bukan indexOf.
edc65
Menarik. Dan saya tahu tentang searchtetapi itu hanya untuk ES6.
rink.attendant.6
Sebenarnya, String.prototype.searchtelah menjadi bagian dari JavaScript sejak ECMAScript 3rd Edition, sehingga Anda dapat mengubah jawaban Anda. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
kamoroso94
3

J (9)

Menggunakan algoritma dari pos ini .

7|3***+*-

Bagan pohon fungsi (dapat menghapus beberapa hal):

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

Demonstrasi:

   3 f 5
1
   4 f 6
2
   2 f 6
3
   2 f 1
4
   1 f 2
3
   4 f 5
6
ɐɔıʇǝɥʇu
sumber
0

PHP, 81 byte

Sama seperti solusi JavaScript saya:

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

Lua 118

Harus memulihkan versi terakhir karena bug yang tidak dapat saya temukan, juga tidak punya waktu untuk mencarinya.

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

Masih mengerjakan ini.

Teun Pronk
sumber
Saya menguji ini di sini , dan tampaknya kembali 4dengan 2 3.
user694733
memang .. aneh. Aku akan melihatnya.
Teun Pronk
@ user694733 Memperbaikinya :)
Teun Pronk
0

JavaScript (ES6), 79 byte

Bukan yang terpendek tapi saya mencoba pendekatan yang berbeda dari jawaban saat ini.

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

Lua, 89 byte

Port langsung dari solusi Python 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
Mark Reed
sumber
0

Bash, 85

Ini tidak bersaing golf-bijaksana dengan polinomial sihir @ xnor. Tapi saya pikir ini adalah cara lain yang menarik untuk menghitung jawabannya:

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

Secara khusus kita tahu yang berikut tentang dadu:

  • Jika wajah kiri adalah 1 dan wajah kanan adalah 2, maka wajah atas adalah 3
  • Rotasi di sekitar titik berlawanan dengan 120 ° memberikan beberapa nilai wajah tiga kali lipat. Misalnya kita memutar {l = 1, r = 2, t = 3} setelah kita mendapatkan {l = 2, r = 3, t = 1} dan berputar lagi kita mendapatkan {l = 3, r = 1, t = 2}
  • Jumlah wajah yang berlawanan selalu 7

Menggabungkan semua hal di atas secara rekursif (menggunakan {1,2,3} hardcoded sebagai titik awal), kita dapat menghasilkan seluruh pemetaan {l, r} -> t untuk semua nilai yang mungkin. Jawaban ini mendefinisikan fungsi rekursif g () yang mengisi array penuh sehingga d [lr] = t. Fungsi rekursif awalnya disebut dengan {1,2,3} dan berulang di seluruh kubus sampai tidak ada lagi elemen array yang belum ditetapkan. Fungsi berulang ke dalam dirinya sendiri dalam dua cara:

  • dengan l dan r bertukar dan t dikurangi dari 7 (wajah berlawanan)
  • dengan {l, r, t} diputar ke {r, t, l}

Kemudian melakukan pencarian array sederhana dari nilai-nilai yang diperlukan.

Trauma Digital
sumber
0

Dyalog APL , 9 byte

Substitusi karakter terang-terangan dari solusi J ɐɔıʇǝɥʇu's J :

7|3×××+×-

Sunting: Saya kemudian memperhatikan bahwa solusi yang tepat ini disarankan oleh ngn pada 17 Jan, 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
                              └───┘

TryAPL online!

Adm
sumber
0

Julia, 26 byte

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

atau

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

atau

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

Gangguan Umum, 45 byte

(lambda(a b)(mod(* 3 a b(-(* a a)(* b b)))7))

Cobalah online!

Port solusi xnor.

Renzo
sumber
0

C # (Visual C # Interactive Compiler) , 49 byte

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

Cobalah online!

-1 byte terima kasih kepada @GB!

Input adalah string 2 karakter yang berisi digit kiri dan kanan yang terlihat.

Di bawah ini adalah solusi yang saya buat sendiri. Memanfaatkan string lookup dari jawaban JavaScript rink.attendant.6 , saya dapat mencukur 5 byte (tapi sekarang jawaban kami sangat mirip;)

C # (Visual C # Interactive Compiler) , 55 byte

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

Cobalah online!

dana
sumber
1
49 byte dengan menggunakan ("3542331463126512156236413" + x) sebagai ganti string penuh
GB