Berapa nilai matriks dadu saya?

21

Memasukkan

Matriks biner non-kosong yang terdiri dari matriks 3x3 diletakkan berdampingan.

Tugas

Tugas Anda adalah mengidentifikasi pola dadu yang valid (seperti dijelaskan di bawah) di antara sub-matriks 3x3. Setiap pola yang valid bernilai nilai dadu yang sesuai. Pola tidak valid bernilai 0.

Keluaran

Jumlah nilai dadu yang valid.

Pola dadu

1:(0,0,00,1,00,0,0)2:(1,0,00,0,00,0,1)atau(0,0,10,0,01,0,0)3:(1,0,00,1,00,0,1)atau(0,0,10,1,01,0,0)4:(1,0,10,0,01,0,1)5:(1,0,10,1,01,0,1)6:(1,0,11,0,11,0,1)atau(1,1,10,0,01,1,1)

Contoh

Output yang diharapkan untuk matriks berikut adalah 14 karena berisi dadu 5 , 6 dan 3 , diikuti oleh pola yang tidak valid (dari kiri ke kanan dan dari atas ke bawah).

(1,0,1,1,1,10,1,0,0,0,01,0,1,1,1,11,0,0,0,0,00,1,0,0,1,00,0,1,0,1,0)

Aturan

  • Baik lebar dan tinggi matriks dijamin kelipatan 3.
  • Anda harus mengabaikan sub-matriks yang tidak selaras dengan benar pada kisi (lihat case uji ke-3). Lebih formal dan dengan asumsi 0-indexing: koordinat sel kiri atas dari masing-masing sub-matriks yang dipertimbangkan adalah dalam bentuk .(3x,3y)
  • Ini adalah .

Uji kasus

// 0
[ [ 1,0,0 ],
  [ 0,0,1 ],
  [ 1,0,0 ] ]

// 2
[ [ 0,0,1 ],
  [ 0,0,0 ],
  [ 1,0,0 ] ]

// 0 (0 + 0)
[ [ 0,0,1,0,1,0 ],
  [ 0,0,0,1,0,0 ],
  [ 0,0,1,0,1,0 ] ]

// 9 (3 + 3 + 3)
[ [ 1,0,0,0,0,1,1,0,0 ],
  [ 0,1,0,0,1,0,0,1,0 ],
  [ 0,0,1,1,0,0,0,0,1 ] ]

// 6 (6 + 0)
[ [ 1,0,1 ],
  [ 1,0,1 ],
  [ 1,0,1 ],
  [ 1,0,1 ],
  [ 1,0,0 ],
  [ 1,0,1 ] ]

// 14 (5 + 6 + 3 + 0)
[ [ 1,0,1,1,1,1 ],
  [ 0,1,0,0,0,0 ],
  [ 1,0,1,1,1,1 ],
  [ 1,0,0,0,0,0 ],
  [ 0,1,0,0,1,0 ],
  [ 0,0,1,0,1,0 ] ]

// 16 (1 + 2 + 3 + 4 + 0 + 6)
[ [ 0,0,0,1,0,0,1,0,0 ],
  [ 0,1,0,0,0,0,0,1,0 ],
  [ 0,0,0,0,0,1,0,0,1 ],
  [ 1,0,1,1,1,1,1,0,1 ],
  [ 0,0,0,1,0,1,1,0,1 ],
  [ 1,0,1,1,1,1,1,0,1 ] ]
Arnauld
sumber

Jawaban:

5

Python 3 , 195 189 byte

-6 byte terima kasih kepada @ Jo King

lambda m:sum({16:1,257:2,68:2,273:3,84:3,325:4,341:5,455:6,365:6}.get(int(''.join(str(e)for c in m[3*i:][:3]for e in c[3*j:][:3]),2),0)for i in range(len(m)//3)for j in range(len(m[0])//3))

Cobalah online! (189) Cobalah secara online! (195)

Versi yang dapat dibaca manusia:

# 3x3 part matrix to dice, beginning at coordinates 3*i, 3*j
def single_matrix_to_dice(matrix, i, j):
    # Example: matrix = [[0, 0, 0], [0, 1, 0], [0, 0, 0]], i=0, j=0 (result is 1)

    matrix_string = ''.join(
        str(e) for column in matrix[3*i:3*i+3] 
        for entry in column[3*j:3*j+3]
    ) # Slicing the matrix so that only the valid entries remain, here '000010000'

    # Interpreting the matrix string as binary number, here 16
    binary_number = int(matrix_string,2)

    # binary representations of all valid dice rolls
    dct = {16:1,257:2,68:2,273:3,84:3,325:4,341:5,455:6,365:6}

    return dct.get(binary_number, 0)

def f(matrix):
    return sum(
        single_matrix_to_dice(matrix, i, j) for i in range(len(m)//3) 
        for j in range(len(m[0])//3))
    ) # len(m)/3 would generate a float, so len(m)//3 is used
Black Owl Kai
sumber
Saya ingin tahu apakah Anda dapat mempersingkat ini sedikit dengan melakukan operasi yang sama pada transpos matriks juga. Dengan begitu Anda bisa menghapus semua entri duplikat di peta Anda yang masing-masing menambah 6 byte. Hanya perlu menambahkan langkah transpose dalam <18 byte
Easton Bornemeier
188 byte .
Jonathan Frech
Singkirkan kedua instance //3dan gunakan '0'+''.join...untuk menyimpan dua byte :)
Jonathan Allan
... gabungkan dengan penghitungan untuk menyimpan dua lagi: di sini
Jonathan Allan
2
165 byte .
Jonathan Frech
5

R , 134 byte

function(m,d=dim(m)/3-1){for(a in 0:d)for(b in 0:d[2])F=F+sum(y<-m[1:3+a*3,1:3+b*3])*sum(y*2^(8:0))%in%utf8ToInt("āDđTŅŕLJŭ");F}

Cobalah online!

Saya perhatikan saya memiliki ide yang sama tentang @eteira

Sejarah:

  • 171 : -10 bytes berkat @JayCe!
  • 161 : -3 byte terima kasih kepada @Giuseppe!
  • 158 : -13 byte disimpan!
  • 145 : -2 byte terima kasih kepada @Giuseppe!
  • 143 : -6 byte disimpan!
  • 137 : -3 bytes berkat @JayCe!
menggali semua
sumber
1
simpan 5 byte dengan mengompresi daftar angka - tautkan dengan contoh yang terlalu panjang untuk dikirim sebagai komentar
JayCe
1
3 byte lebih banyak menggunakandim
JayCe
1
Ada sepasang kurung tambahan (2^(8:0))yang bisa dihapus.
Giuseppe
1
Saya menambahkan lupa ke catoutput dari intToUtf8: save 3 bytes
JayCe
4

Perl 6 , 113 105 97 94 byte

{sum (|@_[*;^3+3*$_]for ^@_[0]).rotor(9).map:{"@āđŅŕLJ@@DT@@ŭ".ords.first(:2[$_],:k)%7}}

Cobalah online!

Membagi matriks menjadi sub matriks 3x3, mengubah sembilan 1 dan 0 menjadi basis 2 dan kemudian mengindeksnya ke dalam daftar bilangan bulat untuk nilai.

Penjelasan:

{  #Start anonymous code block
  sum   # Sum of all
     (|@_[*;^3+3*$_]   # Get the n*3 to n*3+3th elements in every sub-list
           for ^@_[0]) # For n in the range 0 to width (divide by 3 to avoid warnings)
     .rotor(9)  # Split this list into groups of 9 (split the dice up)
     .map:{     # And map each die to 
        "@āđŅŕLJ@@DT@@ŭ".ords  # In the list of integers
           .first(      # The first appearance of 
               :2[$_],  # The dice converted from a list of 0s and 1s to base 2
                 :k     # Returning the index
             )%7        # And modulo by 7 to get the alternate versions of 2, 3 and 6
          }
}
Jo King
sumber
4

Jelly ,  29 28 byte

-1 terima kasih kepada Tn. Xcoder (gunakan untuk mengganti ṢṪ)

s€3ZẎs3µZU,ƊṀṙ1FḄ“°€⁼-Ḍ?‘i)S

Tautan monadik.

Cobalah online! Atau jalankan tes .

Bagaimana?

s€3ZẎs3µZU,ƊṀṙ1FḄ“°€⁼-Ḍ?‘i)S - Link: list of lists of 1s and 0s
s€3                          - split each into threes
   Z                         - transpose
    Ẏ                        - tighten
     s3                      - split into threes -> the sub-matrices in column-major order
       µ                  )  - for each sub-matrix, say D:
           Ɗ                 -   last three links as a monad:
        Z                    -     transpose D
         U                   -     reverse each -> D rotated a quarter turn clockwise
          ,                  -     pair with D
            Ṁ                -   get the maximum of the two orientations
             ṙ1              -   rotate left by one (to ensure FḄ will yield integers <256 for all non-zero valued D)
               F             -   flatten
                Ḅ            -   convert from binary
                         i   -   first 1-based index in (0 if not found):
                 “°€⁼-Ḍ?‘    -     code-page indices list = [128,12,140,45,173,63]
                           S - sum

Misalnya ketika sub-matriks adalah:

[[1,0,1],
 [1,0,1],
 [1,0,1]]

Kemudian ZU,Ɗhasilkan:

[[[1, 1, 1],
  [0, 0, 0],
  [1, 1, 1]],   ...which has maximum (Ṁ):    ...and after ṙ1:
 [[1, 0, 1],                   [[1, 1, 1],         [[0, 0, 0],
  [1, 0, 1],                    [0, 0, 0],          [1, 1, 1],
  [1, 0, 1]]]                   [1, 1, 1]]          [1, 1, 1]]

... yang diratakan menjadi [0, 0, 0, 1, 1, 1, 1, 1, 1], yang, mengkonversi dari biner, 63yang merupakan entri keenam dalam daftar indeks halaman kode “°€⁼-Ḍ?‘( ?menjadi byte 3Fdi halaman kode Jelly )

Jonathan Allan
sumber
mungkin berfungsi sebagai ganti ṢṪ-1.
Tn. Xcoder
... ya itu akan (saya pikir saya menabung menggunakan M>. <). Dapatkah sesuatu yang pintar dilakukan dengan ŒṪsaya bertanya-tanya ...
Jonathan Allan
3

Japt -x , 36 byte

Sekarang semakin menarik. Saya yakin bisa bermain golf lebih

ò3 ®®ò3Ãy f@"0ıtŵġdťƍǧ"øºXm¬¬Í+H)d
c

Cobalah online!

Luis felipe De jesus Munoz
sumber
2

Retina 0.8.2 , 90 byte

+`(...)(.+¶)(...)(.+¶)(...)
$1¶$3¶$5¶$2$4
¶

M!`.{9}
G`111000111|(101){3}|(.)0(.0).0\3\2
1

Cobalah online! Penjelasan:

+`(...)(.+¶)(...)(.+¶)(...)
$1¶$3¶$5¶$2$4

3×33×n

¶

M!`.{9}

Gabungkan semua balok dan kemudian bagi menjadi 9 kolom.

G`111000111|(101){3}|(.)0(.0).0\3\2

Hanya menjaga dadu pola berlaku (dua pola 6, maka salah satu pertandingan nomor dari 0ke 5, meskipun 0tentu saja tidak akan memberikan kontribusi pada hitungan di bawah.)

1

Hitung pip pada dadu yang valid.

Neil
sumber
1

Ruby , 151 byte

->m{m.each_slice(3).flat_map{|r|r.transpose.each_slice(3).map{|d|" \x10āđŅŕLJ  DT  ŭ".chars.map(&:ord).index(d.flatten.join.to_i 2)&.%7}-[p]}.sum}

Cobalah online!

Seorang lambda menerima array int 2d (atau string, saya kira). Mengambil inspirasi dari jawaban Jo King . Saya merasa seperti memotong dadu dari matriks input membutuhkan banyak ruang, jadi saya mungkin kalah besar. Untungnya, berurusan dengan nils hanya membuat saya kehilangan beberapa byte.

Tidak Disatukan:

->m{
  m.each_slice(3).flat_map{|r|             # Split into groups of 3 rows
    r.transpose.each_slice(3).map{|d|      # Split into groups of 3 columns
      " \x10āđŅŕLJ  DT  ŭ".chars.map(&:ord) # [0,16,257,273,325,341,455,0,0,68,84,0,0,365]
        .index(                            # Find in that array
          d.flatten.join.to_i 2            #   the die flattened into a bitstring (nil if not found)
        )&.%7                              # Safe-modulo 7 (leaves nils as nil)
    }-[p]                                  # Remove nils
  }.sum                                    # Add 'em up
}
benj2240
sumber
1

Clojure, 197 byte

#(apply +(for[R[range]i(R 0(count %)3)j(R 0(count(% 0))3)](case(apply +(map *(iterate(partial * 2)1)(for[x(R 3)y(R 3)]((%(+ i x))(+ j y)))))16 1 257 2 68 2 273 3 84 3 325 4 3 4 1 5 455 6 365 6 0)))

Saya harus datang dengan sesuatu yang lebih pintar.

NikoNyrh
sumber
1

Python 2 , 159 byte

f=lambda a:a>[]and sum(u'ȀāDđTŅȀŕȀLJŭ'.find(unichr(int(J(J(map(str,r[i:i+3]))for r in a[:3]),2)))/2+1for i in range(0,len(a[0]),3))+f(a[3:])
J=''.join

Cobalah online!

Kiat tip kepada Jonathan Frech untuk pendekatan pengkodean unicode.

Chas Brown
sumber