Simulator Friar

73

Para saudara lelaki dari ordo St Golfus yang Ringkas memiliki tradisi melafalkan doa singkat setiap kali mereka melihat seseorang membuat tanda salib . Karena tingginya tingkat dosa yang diukur di antara para wisatawan baru-baru ini, mereka telah memasang CCTV di biara, dan mereka telah mempekerjakan Anda untuk membantu mereka menjaga tradisi lama tetap hidup di zaman AI.

Tugas Anda adalah menganalisis keluaran dari perangkat lunak pelacakan jari para biarawan dan memberi tahu berapa banyak doa yang jatuh tempo. Input adalah matriks yang berisi bilangan bulat antara 0 dan 4. 1,2,3,4 mewakili posisi jari pada saat-saat bersamaan. 0 mewakili non-jari.

The One True Way TM untuk menyilangkan diri adalah:

.1.
3.4
.2.

("." cocok dengan angka apa pun). Namun, karena ketidakpastian tentang rotasi kamera dan kehadiran saudara-saudara Ortodoks Timur yang saleh di antara orang banyak (yang One True Way TM berada di arah yang berlawanan), Anda juga harus menghitung semua rotasi dan refleksi:

.4. .2. .3. .1. .3. .2. .4.
1.2 4.3 2.1 4.3 1.2 3.4 2.1
.3. .1. .4. .2. .4. .1. .3.

Satu digit dapat menjadi bagian dari banyak persilangan. Bantu para biarawan menentukan berapa kali AI mereka harus .pray()dengan menghitung berapa banyak dari para pendatang 3x3 di atas hadir. Tulis program atau fungsi. Ambil input dalam bentuk apa pun yang wajar dan praktis.

Kasus-kasus wasiat:

// in
[[0,4,2,0],
 [1,3,2,4],
 [2,3,1,0]]

// out
2

// in
[[4,3,3,2,4,4,1,3,2,2],
 [0,3,0,2,1,1,2,3,2,3],
 [0,3,1,3,2,4,3,3,1,1],
 [4,3,2,3,2,4,1,4,2,3],
 [0,4,2,3,4,0,2,3,2,4],
 [2,1,0,0,2,0,0,1,2,4],
 [4,0,3,1,3,2,0,3,2,3],
 [1,4,3,3,1,4,0,1,4,4],
 [0,2,4,3,4,3,1,3,0,4],
 [3,0,1,0,4,0,3,3,3,3]]

// out
3

// in
[[3,2,3,1,0,3,4,2,1,1,1,1,4,0,1,3,1,1,2,1,1,3,0,1,0,1,1,0,0,1,0,3,4,0,1,1,2,3,1,2,4,1,0,2,3,0,2,4,3,2],
 [2,4,1,1,0,3,0,2,4,2,3,2,1,3,0,2,3,2,4,4,4,3,2,1,1,3,2,1,2,3,2,4,0,3,1,4,4,1,1,0,1,1,0,2,2,3,1,2,0,2],
 [3,4,0,0,4,4,0,3,4,4,1,3,2,1,3,2,3,2,2,0,4,0,1,2,3,0,4,3,2,2,2,0,3,3,4,4,2,2,1,4,4,1,3,1,1,2,0,1,1,0],
 [1,4,2,2,2,1,3,4,1,1,2,1,4,0,3,2,2,4,1,3,3,0,4,1,1,0,0,1,2,2,1,3,4,0,4,1,0,1,1,0,2,1,3,1,4,4,0,4,3,2],
 [4,4,2,0,4,4,1,1,2,2,3,3,2,3,0,3,2,1,0,3,3,4,2,2,2,1,1,4,3,2,1,1,4,3,4,2,4,0,1,0,2,4,2,2,0,3,3,0,3,2],
 [4,3,3,1,3,1,1,3,3,1,0,1,4,3,4,3,4,1,2,2,1,1,2,1,4,2,1,1,1,1,1,3,3,3,1,1,4,4,0,0,3,3,1,4,4,3,2,3,3,0],
 [1,4,1,4,0,0,1,3,1,2,2,1,1,2,3,3,2,0,3,4,3,2,1,2,2,3,3,1,4,2,1,1,4,1,3,2,0,0,0,1,2,4,1,1,3,0,4,2,3,1],
 [2,2,3,0,0,4,2,1,2,3,1,2,4,1,0,1,0,2,4,1,3,4,4,0,0,4,0,4,4,2,0,0,2,2,3,3,4,1,0,3,2,1,0,1,1,0,3,0,3,2],
 [1,2,4,3,4,3,1,2,2,3,0,1,2,4,4,4,3,1,2,3,4,3,3,2,0,0,2,0,3,4,4,2,3,2,0,2,4,3,0,0,0,4,4,0,4,4,0,3,3,3],
 [4,4,1,2,0,2,2,0,0,3,2,3,2,3,4,1,0,2,3,0,3,2,1,1,4,3,0,2,3,1,0,4,1,2,4,1,1,4,4,4,2,2,2,3,0,1,0,3,0,1],
 [4,0,3,0,2,2,0,3,2,2,2,4,0,4,0,1,0,1,4,3,3,2,3,1,2,2,4,4,0,3,2,3,1,4,1,0,3,2,3,2,2,0,1,2,4,0,3,0,4,4],
 [0,4,0,1,0,2,3,2,1,3,1,1,2,0,3,2,1,4,0,1,4,4,1,3,4,4,1,0,4,1,0,3,4,0,3,2,4,3,3,3,3,1,2,2,3,3,3,1,3,4],
 [3,4,1,2,1,1,1,0,4,0,1,1,0,4,1,3,1,1,2,0,2,1,4,1,4,4,3,2,0,3,0,3,0,1,1,2,1,3,0,4,4,2,2,2,1,3,4,1,1,1],
 [3,0,1,4,2,0,0,3,1,1,1,4,4,0,2,2,0,4,0,3,1,0,2,2,4,4,4,0,4,4,4,4,4,4,3,0,4,4,4,1,2,4,4,3,0,0,4,0,4,2],
 [2,0,1,2,1,1,3,0,3,1,0,4,3,1,2,1,1,3,0,1,2,4,2,1,2,3,4,2,4,4,2,2,3,4,0,0,1,0,0,4,1,3,3,4,1,2,1,3,3,2],
 [4,0,2,0,3,1,2,1,1,1,1,2,3,0,3,1,0,4,3,0,0,0,2,0,1,4,0,2,1,3,4,2,2,4,2,3,1,2,0,2,0,2,4,0,1,2,3,4,1,3],
 [3,0,2,4,2,0,3,4,3,2,3,4,2,0,4,1,0,4,3,3,1,0,2,2,2,1,3,3,1,1,0,3,3,0,3,2,1,1,0,1,2,2,0,4,4,2,0,1,3,1],
 [0,4,4,4,0,3,0,3,0,2,2,0,1,2,3,3,4,3,0,4,1,2,3,3,0,2,2,3,0,0,0,2,4,2,3,4,2,3,4,0,2,0,1,1,3,4,2,2,4,4],
 [2,1,2,3,4,3,1,2,0,0,0,0,0,0,3,4,3,3,1,2,2,1,3,4,1,2,4,0,1,4,1,0,0,0,2,1,1,1,3,0,0,3,1,1,4,2,1,3,4,1],
 [1,0,3,0,2,1,4,2,3,3,1,1,3,4,4,0,1,2,1,3,0,3,1,1,3,0,2,4,4,4,2,3,1,4,3,4,0,1,4,1,1,1,4,0,0,2,3,4,0,4]]

// out
8

"Terpujilah yang terpendek dari yang terpendek, karena itu memenangkan kerajaan upvotes." -Buku St Golfus 13:37

"Janganlah kamu menggunakan celah, karena itu adalah perbuatan jahat dari Lusifer." -Letter ke Meta 13: 666

Visualisasi sedikit orang membuat salib


Terima kasih @Tallallacka untuk visualisasi.

ngn
sumber
57
+1 untuk ayat-ayat di akhir, mereka memberi saya tawa yang bagus: D
HyperNeutrino
6
Bisakah satu digit menjadi bagian dari banyak persilangan?
Martin Ender
9
Ya Tuhan Yesus, kamu benar-benar membuat simulator Friar.
Magic Gurita Guci
1
Mengapa "T" pertama terhubung?
JakeGould
4
@JakeGould Agar dapat menghubungkan pertanyaan ini dengan pertanyaan, "T" mengarah ke.
Erik the Outgolfer

Jawaban:

19

Grime , 20 byte

n`.\1./\3.\4/.\2.voO

Cobalah online!

Implementasi spec yang sangat literal:

  • n` buat Grime menghitung jumlah subrektifangles dari input yang menghasilkan kecocokan.
  • .\1./\3.\4/.\2. mendefinisikan kotak 3x3:

    .1.
    3.4
    .2.
    

    Di mana .bisa karakter apa saja.

  • oOadalah pengubah orientasi yang memungkinkan persegi ini muncul dalam rotasi atau refleksi. Yang vdigunakan untuk menurunkan os diutamakan sehingga kita tidak perlu tanda kurung di sekitar alun-alun.
Martin Ender
sumber
7
Benar untuk dua tes pertama, segfault untuk yang terakhir. Saya kira ini harus baik-baik saja asalkan program pada prinsipnya benar dan hanya dibatasi oleh sumber daya.
ngn
FYI: Saya baru saja menguji test case terakhir dan itu berjalan baik untuk saya.
3D1T0R
16

Siput , 17 16 byte

Ao
\1.=\2o=\3b\4

Cobalah online!

Penjelasan

Amembuat Snail menghitung jumlah kemungkinan jalur yang cocok di seluruh input. omenetapkan arah awal ke arah ortogonal mana pun (bukan hanya ke arah timur). Pola itu sendiri ada di baris kedua:

\1    Match a 1.
.     Match an arbitrary character (the one in the centre).
=\2   Check that the next character ahead is a 2, but don't move there.
o     Turn to any orthogonal direction. In practice, this will only be one
      of the two directions from the centre we haven't checked yet.
=\3   Check that the next character ahead is a 3.
b     Turn around 180 degrees.
\4    Match a 4 in that direction.
Martin Ender
sumber
7

Haskell, 108 102 93 byte

f((_:t:x):w@((l:q@(_:r:_)):(_:b:z):_))=sum$f((t:x):q:[b:z]):f w:[1|(l*r-1)*(t*b-1)==11]
f _=0

Cobalah online!

Tidak ada regex. Pencocokan pola

.t.
l.r
.b.

di sudut kiri atas matriks, ambil 1jika (l*r-1)*(t*b-1)==11dan secara rekursif pergi ke kanan (drop .l.) dan ke bawah (drop baris pertama). Jika polanya tidak dapat dicocokkan (di perbatasan kanan atau bawah) ambil a0 . Jumlahkan semua hasil.

Edit: -9 bytes berkat @xnor.

nimi
sumber
Saya akan menyarankan 2^(l*r)+2^(t*b)==4100untuk memeriksa nomor, tetapi tampaknya kedua solusi kami ditipu oleh 2,6di tempat 3,4.
xnor
@ xnor, tetapi angkanya dibatasi untuk0..4
Feburous
3
@ Berair Terima kasih, saya melewatkan itu. Kemudian ekspresi aritmatika dapat lebih dioptimalkan, seperti (l*r-1)*(t*b-1)==11.
xnor
7

Perl, 70 byte

Termasuk +2 untuk 0p

Berikan matriks input sebagai blok digit tanpa spasi di STDIN:

perl -0pe '$_=map{/.$/m+y/1-4/3421/;/(?=1.{@{-}}(3.4|4.3).{@{-}}2)/sg}($_)x4'
0420
1324
2310
^D

Putar salib dengan memutar digit

Ton Hospel
sumber
6

Retina , 92 83 byte

L$v`(?<=((.))*).(.)..*¶(?<-1>.)*(.).(.).*¶(?<-2>.)*.(.)
$6$3$4$5
/../_O`.
1234|3412

Cobalah online! Penjelasan:

L$v`(?<=((.))*).(.)..*¶(?<-1>.)*(.).(.).*¶(?<-2>.)*.(.)
$6$3$4$5

Cari semua kotak 3x3 yang tumpang tindih. Terlihat di belakang menangkap indentasi dua kali sehingga dapat diseimbangkan pada baris kedua dan ketiga. Input diasumsikan persegi panjang sehingga kami tidak perlu memeriksa bahwa saldo grup. Sel tengah bawah / atas dan sel tengah kiri / kanan kemudian ditangkap.

/../_O`.

Urutkan setiap pasang sel ke dalam urutan.

1234|3412

Hitung pola valid yang tersisa.

Neil
sumber
5

Jelly , 26 byte

Z3Ƥṡ€3ẎµFḊm2ṙ-s2Ṣ€ṢFµ€ċ4R¤

Cobalah online!

Penjelasan

Z3Ƥṡ€3ẎµFḊm2ṙ-s2Ṣ€ṢFµ€ċ4R¤  Main Link
 3Ƥ                         For each 3 rows
Z                           Zip the rows
   ṡ€3                      Get all arrangements of 3 consecutive columns from these rows. At this step, we have all 3x3 contiguous submatrices
      Ẏ                     Unwrap by one layer; previously grouped by rows, now ungrouped
       µ           µ€       For each 3x3 submatrix
        F                   Flatten it
         Ḋ                  Get rid of the first element
          m2                Take every second element (this only keeps the edges)
            ṙ-              Rotate right 1 element
              s2            Group into pairs; now the top and bottom are grouped and the left and right are grouped
                Ṣ€          Sort each pair
                  Ṣ         Sort the pairs
                   F        Flatten
                      ċ4R¤  Count the number of occurrences of range(4); i.e. [1,2,3,4]

-3 byte terima kasih kepada Jonathan Allan (2) dan Mr. Xcoder (3) (digabung)

HyperNeutrino
sumber
@ ngn lol titik itu dimaksudkan berada di bawah D. Buruk saya, diperbaiki.
HyperNeutrino
Hemat 2 byte menggunakan ...Fµ€ċ4R¤daripada ...Ḍµ€ċ1234(perhatikan juga yang 1234bisa diganti dengan ⁽¡ḋmenyimpan satu)
Jonathan Allan
26 byte dengan menggunakan Z3Ƥbukan ṡ3Z€dan ⁼J$µ€Sbukannya Ḍµ€ċ1234.
Tn. Xcoder
@ Jonathan
Allan
5

Java 8, 135 133 131 byte

m->{int r=0,i=0,j;for(;++i<m.length-1;)for(j=1;j<m[i].length-1;)if(~(m[i-1][j]*m[i+1][j])*~(m[i][j-1]*m[i][++j])==39)r++;return r;}

-2 byte terima kasih kepada @tehtmi untuk formula yang lebih pendek: (l*r-1)*(t*b-1)==11untuk~(l*r)*~(t*b)==39

Penjelasan:

Cobalah online.

m->{                     // Method with integer-matrix parameter and integer return-type
  int r=0,               //  Result-integer, starting at 0
      i=0,j;             //  Index integers
  for(;++i<m.length-1;)  //  Loop over the rows, skipping the first and last
    for(j=1;j<m[i].length-1;)
                         //   Inner loop over the columns, skipping the first and last
      if(~(m[i-1][j]*m[i+1][j])*~(m[i][j-1]*m[i][++j])==39)
                         //    If (-(bottom*top)-1) * (-(left*right)-1) is exactly 39:
        r++;             //     Increase the result-counter by 1
  return r;}             //  Return the result-counter
Kevin Cruijssen
sumber
1
Rumus yang lebih pendek: ~(l*r)*~(t*b)==39(Haskell ~tampaknya tidak memiliki 1 byte .)
tehtmi
3

Sekam , 23 byte

#ö§&¦ḣ4SδΛ≈↔Ċ2tΣṁoX3TX3

Cobalah online!

Penjelasan

#ö§&¦ḣ4SδΛ≈↔Ċ2tΣṁoX3TX3  Implicit input, a list of lists of integers.
                     X3  Length-3 slices.
                ṁ        Map over them and concatenate:
                    T     Transpose,
                 oX3      then get length-3 slices.
                         Now we have a list of 3x3-arrays of the (transposed) input.
#ö                       Return number of 3x3-arrays that satisfy this:
                          Take m = [[0,3,0],[2,4,1],[1,4,0]] as an example.
               Σ          Concatenate: [0,3,0,2,4,1,1,4,0]
              t           Tail: [3,0,2,4,1,1,4,0]
            Ċ2            Take every second element: c = [3,2,1,4]
  §&                      c satisfies both of the following:
    ¦                     1) It contains every element of
     ḣ4                      the range [1,2,3,4].
       Sδ                 2) If you zip c
           ↔                 with its reverse,
         Λ                   then each corresponding pair
          ≈                  has absolute difference at most 1.
                         Implicitly print the result.
Zgarb
sumber
3

Dyalog APL , 30 29 28 27 26 bytes ( SBSC )

+/∘,{12 2⍷×∘⌽⍨⊢/4 2⍴⍵}⌺3 3

Cobalah online!

H.Piz
sumber
Baik sekali! ⌽∘⊖×⊢bisa lebih pendek 2 byte, bisakah Anda menebak caranya?
ngn
@ ngn Apa yang benar-benar saya inginkan adalah simbol seperti ø;)
H.PWiz
@ngn saya miliki×∘⌽∘⊖⍨
H.PWiz
ini lebih pendek:(⌽×⊖)
ngn
Oh, itu pintar, Anda memindahkan selfie (... ⍨) ke kiri ⊢/untuk -1 lainnya. Saya tidak memikirkan itu. Dalam situasi ini Anda seharusnya tidak memuji saya.
ngn
2

Jelly , 36 byte

“ƒɦƈạ%ȤFE’b4s4
ṡ3µZṡ3F€µ€ẎḊm2$$€’f¢L

Cobalah online!

37 byte

Untuk beberapa alasan saya tidak dapat memindahkan tautan Ḋm2$$ke atas.

ṙ1s2I€FPA,P⁼1,24
ṡ3µZṡ3F€µ€ẎḊm2$$€Ç€S

Cobalah online!

fireflame241
sumber
2

Bersih , 255 ... 162 byte

Tidaklah bermanfaat jika sering menggunakan filter pola dalam pemahaman, tetapi dalam kasus ini, itu menguntungkan.

import StdEnv,StdLib
? =reverse
@ =transpose
t=tails
$m=sum[1\\f<-[id,@,?,?o@,@o?,@o?o@,?o@o?o@,?o@o?],[a,b,c:_]<-t(f m),[_,1:_]<-t a&[3,_,4:_]<-t b&[_,2:_]<-t c]

Cobalah online!

Menentukan fungsi $, mengambil [[Int]]dan mengembalikan Int.

Pertama-tama menghasilkan semua simetri dari matriks m(mentransformasikan melalui f), mengambil tailsyang memiliki tiga baris atau lebih, dan secara serempak memeriksa berapa banyak dari tiga set kolom pertama dari tailsmasing-masing baris sesuai dengan pola salib.

Hal ini setara dengan menghitung jumlah memerintahkan tails-of- tailspencocokan pola [[_,1,_:_],[3,_,4:_],[_,2,_:_]:_]- yang pada gilirannya secara logis sama dengan memeriksa jika, untuk setiap sel dalam matriks, sel yang sudut kiri atas setiap rotasi salib.

Suram
sumber
2

Python 3, 120 118 byte

lambda x:sum({x[i+1][j]*x[i+1][j+2],x[i][j+1]*x[i+2][j+1]}=={2,12}for i in range(len(x)-2)for j in range(len(x[0])-2))

Cobalah online!

Menggunakan fakta bahwa produk pasangan angka yang berlawanan dalam pasangan harus masing-masing 2 dan 12, dan membandingkan dengan satu set untuk mencakup semua orientasi yang berbeda. Mengambil input sebagai array bilangan bulat 2D.

Akan
sumber
1
Anda tidak perlu menghitung f=dalam skor
ngn
2

Japt -x , 39 38 33 byte

ã3 Ëmã3 y x@[XXy]®g1 ë2 ×Ãn e[2C]

Cobalah online!

-1 byte terima kasih kepada @Shaggy.

-5 byte berkat @ETHproductions dengan refactoring array.

Dibongkar & Cara kerjanya

Uã3 mD{Dmã3 y xX{[XXy]mZ{Zg1 ë2 r*1} n e[2C]

       Input: 2D Array of numbers
Uã3    Generate an array of length 3 segments of U
mD{    Map... (D = 2D array of numbers having 3 rows)
Dmã3     Map over each row of D to generate an array of length 3 segments
y        Transpose; make an array of 3x3 subsections
xX{      Map and sum... (x = 3x3 2D array of numbers)
[XXy]      Array of X and X transposed
mZ{        Map...
Zg1 ë2 r*1   Take row 1, take 0th and 2nd elements, reduce with *
}
n          Sort the array
e[2C]      Equals [2,12] element-wise?
           Implicit cast from boolean to number

       Result: 1D array of counts
-x     Sum of the result array

Ada harus tetap menjadi cara yang lebih baik untuk menguji salib ...

Bubbler
sumber
Anda dapat menyimpan byte dengan mengganti cek kesetaraan di akhir dengan e[2C].
Shaggy
Dapatkah Anda menyingkirkan 2di ë2?
Oliver