Game perjudian Festival Pertengahan Musim Gugur


11

Besok adalah festival Pertengahan Musim Gugur, dan dengan semangat liburan itu, saya akan memperkenalkan permainan judi yang kami (orang-orang dari Xiamen ) mainkan selama liburan!

Aturan

Permainan ini dimainkan dengan enam dadu 6 sisi. Kombinasi angka yang berbeda memiliki peringkat yang berbeda, dengan penekanan khusus pada merangkak dan yang. Tugas Anda adalah menulis program / fungsi yang akan memberi peringkat pada tangan, diberi gulungan 6 dadu. Berikut adalah peringkatnya (Saya telah sedikit memodifikasi / menyederhanakan aturan):

jajaran

Saya kira hanya orang China yang dapat melakukan tantangan ini! Oke, baiklah, berikut ini beberapa penjelasan bahasa Inggris.

  • 0: 4 merangkak dan 2 yang.
  • 1: 6 merangkak.
  • 2: 6.
  • 3: 6 dalam bentuk apa pun kecuali empat dan satu.
  • 4: 5 merangkak.
  • 5: 5 dalam bentuk apa pun kecuali untuk merangkak.
  • 6: 4 merangkak.
  • 7: Lurus. (1-6)
  • 8: 3 merangkak.
  • 9: 4 dalam bentuk apa pun kecuali 4.
  • 10: 2 merangkak.
  • 11: 1 empat.
  • 12: Tidak ada.

Memasukkan

6 angka, array 6 angka, atau string 6 angka yang mewakili nilai dari 6 dadu gulungan dari 1-6

Keluaran

Program / fungsi Anda dapat mengembalikan / menampilkan apa pun untuk menunjukkan peringkat, selama setiap peringkat ditunjukkan oleh satu output dan sebaliknya. Ex. Menggunakan angka 0-12, 1-13, dll.

Contoh (Menggunakan 0-12 sebagai output)

[1,1,1,1,1,1]->2
[1,4,4,4,1,4]->0
[3,6,5,1,4,2]->7
[1,2,3,5,6,6]->12
[3,6,3,3,3,3]->5
[4,5,5,5,5,5]->5

Ini adalah kode-golf, sehingga jumlah byte terpendek menang!


(Saya akan meletakkan ini di kotak pasir, tapi saya ingin waktunya tepat. Saya berusaha
selengkap

@Shaggy Jadi OP mengatakan bahwa output 0-12 atau 1-13 sebagai gantinya
Shieru Asakoto

@ Shaggy Seperti yang saya nyatakan dalam pertanyaan, output tidak harus sesuai dengan nomor label. Angka yang dilewati dan celah acak pada gambar sedikit menyederhanakan aturan - sebenarnya tidak ada aturan yang pasti untuk tradisi ini, ini hanya interpretasi saya.
Quintec

Bukankah seharusnya begitu [1,2,3,5,6,6]->13??
J.Doe

@ J.Apakah contoh / kasus uji menggunakan indeks sebagai hasil alih-alih nilai. Tidak seperti nilainya, nilai 10tidak dilewati.
Kevin Cruijssen

Jawaban:


2

Arang , 55 byte

≡⌈Eθ№θι⁶I⁻²⌕14§θχ⁵I⁻⁵⁼⁵№θ4⁴⎇⁼№θ4⁴§60⁼№θ1²9¹7I⁻¹²⌊⊘X²№θ4

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Tidak melewati 10. Penjelasan:

≡⌈Eθ№θι

Hitung frekuensi tertinggi dari digit mana pun.

⁶I⁻²⌕14§θχ

Jika ada 6 jenis, kurangi posisi digit dalam string 14dari 2. Ini menghasilkan 1 untuk 6 4s, 2 untuk 6 1s, dan 3 untuk 6 dari yang lainnya.

⁵I⁻⁵⁼⁵№θ4

Jika ada 5 dari jenis, maka hasilnya adalah 5 kecuali ada 5 4s, dalam hal ini 1 dikurangi.

⁴⎇⁼№θ4⁴§60⁼№θ1²9

Jika ada 4 dari jenis, maka jika ada 4 4s maka hasilnya adalah 6 kecuali ada 2 1s dalam hal ini hasilnya adalah 0, jika tidak hasilnya adalah 9.

¹7

Jika semua digit berbeda maka hasilnya adalah 7.

I⁻¹²⌊⊘X²№θ4

Kalau tidak, hasilnya adalah 12 - (4 >> (3 - # dari 4s)).


Tampaknya ini praktik terbaik untuk menerima jawaban terpendek, jadi itulah yang akan saya lakukan :) Sayangnya tidak banyak orang melihat dan meningkatkan jawaban Anda ...
Quintec

@ Quintec Itu bukan masalah; orang-orang seharusnya memilih jawaban berdasarkan kecerdikan dari algoritma atau faktor lain yang membuat mereka menghargai jawabannya.
Neil

10

JavaScript (ES6), 88 byte

a=>a.map(o=n=>[x=o[n]=-~o[n],6,,,21,9,8^o[1]][a=x<a?a:x])[5]|[,1,4,5,o[1]&2|8,2,4][o[4]]

Cobalah online! atau Uji semua kemungkinan gulungan!

Output integer sesuai dengan pemetaan berikut:

 Rank | Output       Rank | Output
------+--------     ------+--------
   0  |  31            7  |   7
   1  |  12            8  |   5
   2  |  14            9  |  21
   3  |   8           10  |   4
   4  |  11           11  |   1
   5  |   9           12  |   0
   6  |  29

Bagaimana?

metode

Output dihitung dengan melakukan bitwise OR antara:

  • F
  • M.

Pengecualian:

  • F=44b4Sebuah
  • M.=66b6Sebuah

Meja

FM.

F01234Sebuah4b56M.ATAU014581024166767141466200145810243001458102442121212121293123215999131391111136Sebuah889121381010126b141415141514141414

M.3M.3M.F=3

Contoh

M.=1F=1

6 ATAU 1=7

77

Berkomentar

a =>                   // a[] = input array, reused as an integer to keep track of the
  a.map(               //       maximum number of occurrences of the same dice (M)
    o =                // o = object used to count the number of occurrences of each dice
    n =>               // for each dice n in a[]:
    [                  //   this is the lookup array for M-bitmasks:
      x =              //     x = o[n] = number of occurrences of the current dice
        o[n] = -~o[n], //     increment o[n] (we can't have M = 0, so this slot is not used)
      6,               //     M = 1 -> bitmask = 6
      ,                //     M = 2 -> bitmask = 0
      ,                //     M = 3 -> bitmask = 0
      21,              //     M = 4 -> bitmask = 21
      9,               //     M = 5 -> bitmask = 9
      8 ^ o[1]         //     M = 6 -> bitmask = 14 for six 1's, or 8 otherwise
    ][a =              //   take the entry corresponding to M (stored in a)
        x < a ? a : x] //   update a to max(a, x)
  )[5]                 // end of map(); keep the last value
  |                    // do a bitwise OR with the second bitmask
  [                    // this is the lookup array for F-bitmasks:
    ,                  //   F = 0 -> bitmask = 0
    1,                 //   F = 1 -> bitmask = 1
    4,                 //   F = 2 -> bitmask = 4
    5,                 //   F = 3 -> bitmask = 5
    o[1] & 2 | 8,      //   F = 4 -> bitmask = 10 if we also have two 1's, 8 otherwise
    2,                 //   F = 5 -> bitmask = 2
    4                  //   F = 6 -> bitmask = 4
  ][o[4]]              // take the entry corresponding to F (the number of 4's)

5

R , 100 byte

Menyandikan skor sebagai sekelompok conditional diindeks. Lebih sederhana daripada pendekatan stringy-regex pertama saya.

Edit - bug yang diperbaiki dan sekarang peringkat semua gulungan.

function(d,s=sum(d<2))min(2[s>5],c(11,10,8,6-6*!s-2,4,1)[sum(d==4)],c(7,12,12,9,5,3)[max(table(d))])

Cobalah online!



2

Python 2 ,  148  119 byte

-27 bytes berkat ovs (1. penggunaan .countmemungkinkan a mapuntuk digunakan; 2. penghapusan redundan 0dalam slice; 3. penggunaan indaripada max4.; disingkat (F==4)*O==2menjadi F==4>O==2[sejak golf to F>3>O>1])

C=map(input().count,range(1,7))
O,F=C[::3]
print[F>3>O>1,F>5,O>5,6in C,F>4,5in C,F>3,all(C),F>2,4in C,F>1,F,1].index(1)

Cobalah online!


@ oh oh heh. hitung> _ <bagus
Jonathan Allan

Satu saran terakhir: Karena dhanya diperlukan, ini lebih pendek sebagai program lengkap .
ovs


@ovs - terima kasih untuk semua golf Anda. Menyimpan dua lainnya untuk boot.
Jonathan Allan

Harus mencintai rantai python bersyarat! Selain itu, spek sekarang tidak melewati angka 10
Quintec

1

Pyth, 60 byte

eS[@[ZhZ2 4*6hq2hJuXtHG1Qm0Q8hT)@J3*5hSJ*Tq6hJ*<3KeSJ@j937TK

Peta ke peringkat terbalik, 0-12. Coba online di sini , atau verifikasi semua uji sekaligus di sini .

Pemetaan lengkap yang digunakan adalah sebagai berikut:

12: 4 fours and 2 ones.
11: 6 fours.
10: 6 ones.
 9: 6 of any kind except fours and ones.
 8: 5 fours.
 7: 5 of any kind except for fours.
 6: 4 fours.
 5: Straight. (1-6)
 4: 3 fours.
 3: 4 of any kind except 4.
 2: 2 fours.
 1: 1 four.
 0: Nothing.

Ini bekerja dengan memetakan nilai-nilai dadu ke frekuensi, kemudian menghitung nilai beberapa aturan, dan mengambil set maksimum.

Implicit: Q=eval(input()), Z=0, T=10

JuXtHG1Qm0Q   Input mapping
 u     Q      Reduce each element of the input, as H, ...
        m0Q   ...with initial value, G, as an array of 6 zeroes (map each roll to 0)
   tH           Decrement the dice roll
  X  G1         Add 1 to the frequency at that point
J             Store the result in J

@[ZhZ2 4*6hq2hJuXtHG1Qm0Q8hT)@J3   Rule 1 - Values for sets including 4
  Z                               *0
   hZ                             *1 (increment 0)
     2                            *2
       4                          *4
              JuXtHG1Qm0Q          Input mapping (as above)
             h                     First value of the above - i.e. number of 1's
           q2                      1 if the above is equal to 2, 0 otherwise
        *6h                       *Increment and multiply by 6
                                   Maps to 12 if there are 2 1's, 6 otherwise
                         8        *8
                          hT      *11 (increment 10)
 [                          )      Wrap the 7 starred results in an array
                             @J3   Get the 4th value of the input mapping - i.e. number of 4's
@                                  Get the value at that position in the array

*5hSJ   Rule 2 - Straight
  hSJ   Smallest frequency in input mapping (first, sort, J)
        For a straight, smallest value will be 1, 0 otherwise
*5      Multiply by 5

*Tq6hJ   Rule 3 - 6 1's
    hJ   Frequency of 1's (first value from input mapping)
  q6     1 if the above == 6, 0 otherwise
*T       Multiply by 10

*<3KeSJ@j937TK   Rule 4 - 4,5,6 of a kind, other than 4's
   KeSJ          Get the max frequency from input mapping, store in K
        j937T    [9,3,7]
       @     K   Get the element at K'th position in the above (modular indexing)
 <3K             1 if 3<K, 0 otherwise
*                Multiply the previous 2 results

eS[   Wrapping it all up!
  [   Wrap all the above rules in an array
eS    Take the max value of the above, implicit print

1

Retina , 137 126 byte

4
A
O`.
^11A+
0
1+$
2
^A+
1
(.)\1{5}
3
^.A+
4
.?(.)\1{4}.?
5
^..A+
6
12356A
7
.+AAA$
8
.*(.)\1{3}.*
9
.+AA$
10
.+A$
11
.{6}
12

-11 byte terima kasih kepada @Neil .

Outputnya adalah 0-diindeks ( 0..12).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Ganti setiap 4 dengan 'A':

4
A

Urutkan semua digit input (A akan berada di belakang):

O`.

Setiap dua baris lainnya menggantikan input dengan output yang diharapkan:

Regex         Replacement  Explanation

^11A+         0            starts with "11", followed by any amount of A's
1+$           2            ends with any amount of 1s
^A+           1            starts with any amount of A's
(.)\1{5}      3            six of the same characters
^.A+          4            starts with any character, followed by any amount of A's
.?(.)\1{4}.?  5            five of the same characters,
                           with optionally a leading or trailing character
^..A+         6            starts with any two characters, followed by any amount of A's
12356A        7            literal "12356A" match
.+AAA$        8            any amount of leading characters, ending with three A's
.*(.)\1{3}.*  9            four of the same characters,
                           with optionally any amount of leading/trailing chars
.+AA$         10           any amount of leading characters, ending with two A's
.+A$          11           any amount of leading characters, ending with a A
.{6}          12           any six characters

1
Sangat pintar, tapi saya pikir Anda bisa melangkah lebih jauh dan mengganti 4dengan sesuatu di luar kisaran 1-6untuk membuatnya menyortir ke satu ujung secara otomatis (tidak yakin apakah itu membuat perbedaan yang mana Anda menyortir).
Neil

@Neil Ah, itu pintar juga! Terima kasih.
Kevin Cruijssen

1

05AB1E , 57 55 byte

4¢4@U.M¢©5-Di14¹нk2αë>Di5X-ë>i9X3*-¹1¢2Ê*ë®i7ë¹4¢o;ï12α

Port @Neil 's Charcoal menjawab , karena pendekatan awal saya sudah di 60 byte dan saya belum selesai. Namun, jawaban saya saat ini mungkin bisa golf lagi.

Input sebagai daftar digit.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

4¢              # Count the amount of 4s in the (implicit) input-list
  4@            # Check if it's larger than or equal to 4
                # (results in 1 for truthy; 0 for falsey)
    U           # Pop and store that result in variable `X`
.M              # Push the most frequent number in the (implicit) input-list
  ¢             # Pop and push the count of that number in the (implicit) input-list
   ©            # Store it in the register (without popping)
5-Di            # If the maximum count - 5 is exactly 1 (so the maximum count is 6):
    14          #  Push 14
      ¹н        #  Push the first digit of the input-list
        k       #  Get its index in 14, resulting in -1, 0, or 1
         2α     #  Take the absolute difference with 2
                #  (This covers cases 1, 2, and 3)
ë>Di            # Else-if the maximum count - 5 + 1 is exactly 1 (so the maximum count is 5):
    5           #  Push 5
     X-         #  And subtract variable `X`
                #  (This covers cases 4 and 5)
ë>i             # Else-if the maximum count - 5 + 2 is exactly 1 (so the maximum count is 4):
   9            #  Push 9
    X3*         #  Multiply variable `X` by 3
       -        #  And subtract it from the 9
        ¹1¢     #  Count the amount of 1s in the input-list
           2Ê   #  Check if it's NOT equal to 2 (1 if truthy; 0 if falsey)
             *  #  Multiply it with the 9 or 6
                #  (This covers cases 0, 6, and 9)
ë®i             # Else-if the maximum count is 1:
   7            #  Push a 7
                #  (This covers case 7)
ë               # Else (maximum count is 2 or 3):
 ¹4¢            #  Count the amount of 4s in the input-list
    o           #  Take 2 to the power this count
              #  Halve and floor it
       12α      #  And take the absolute difference with 12
                #  (This covers cases 8, 10, 11, and 12)
                # (Output the top of the stack implicitly as result)

0

Ruby , 100 byte

->a{%w(^2.*4$ 6$ ^6 6 5$ 5 4$ ^1*$ 3$ 4 2$ 1$ .).index{|b|/#{b}/=~([1,*a,4].map{|c|a.count(c)}*'')}}

Cobalah online!

Bagaimana itu bekerja:

Hitung kemunculan setiap angka dalam larik, tambahkan angka 1s dan tambahkan angka 4s.

Setelah itu, cobalah untuk mencocokkan dengan pola regex yang berbeda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.