Братський тренажер


73

У братів з ордену св. Гольфа Лаконічного є традиція декламувати коротку молитву, коли вони бачать, що хтось зробив знак хреста . Через високий рівень гріха, що вимірюється серед туристів останнім часом, вони встановили відеоспостереження в монастирі, і вони найняли вас, щоб допомогти їм зберегти старі традиції в епоху ШІ.

Ваше завдання - проаналізувати вихід із програмного забезпечення для відстеження пальців монахинь і розповісти, скільки молитов належить. Вхід - це матриця, що містить цілі числа від 0 до 4. 1,2,3,4 представляють положення пальців у послідовні моменти часу. 0 являє собою не пальці.

Єдиний Правдивий Шлях ТМ хреститися є:

.1.
3.4
.2.

("." відповідає будь-якій цифрі). Однак через невизначеність обертання камери та присутність в натовпі благочестивих східно-православних братів (чий єдиний шлях ТМ знаходиться в зворотному боковому напрямку), вам слід також порахувати всі обертання та роздуми:

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

Одна цифра може бути частиною декількох хрестів. Допоможіть монахам визначити, скільки разів має їх ШІ .pray(), порахувавши, скільки присутніх вищезазначених підматриць 3x3. Напишіть програму або функцію. Візьміть інформацію в будь-якій розумній зручній формі.

Заповітні справи:

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

"Блаженний найкоротший із найкоротших, бо він завойовує царство обручених". -Книга святого Гольфуса 13:37

"Не використовуй лазівки, бо вони - злі твори Люцифера". -Питання до Мета 13: 666

Невелика візуалізація людей, що роблять хрест


Дякую @Tschallacka за візуалізацію.


57
+1 за вірші наприкінці, вони добре посміялися: D
HyperNeutrino

6
Чи може одна цифра бути частиною декількох хрестів?
Мартін Ендер

9
О, милий Ісусе, ти зробив симулятор братів.
Magic Octopus Urn

1
Чому пов'язана перша "T"?
JakeGould

4
@JakeGould Так, щоб пов’язати це питання з тим питанням, до якого призводить "T".
Ерік Аутгольфер

Відповіді:


19

Грим , 20 байт

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

Спробуйте в Інтернеті!

Дуже буквальна реалізація специфікації:

  • n` змусити Grime рахувати кількість підпрямокутників вхідних даних, які дають збіг.
  • .\1./\3.\4/.\2. визначає квадрат 3х3:

    .1.
    3.4
    .2.
    

    Де .може бути будь-який персонаж.

  • oO- це модифікатор орієнтації, який дозволяє цьому прямокутнику з'являтися в будь-якому обертанні чи відображенні. vВикористовується для зниження oїй пріоритет , так що нам не потрібні круглі дужки навколо площі.

7
Правильно для перших двох тестів, з розширенням для останнього. Я думаю, це повинно бути нормальним, якщо програма в принципі правильна і обмежена лише ресурсами.
ngn

FYI: Я щойно перевіряв останній тестовий випадок, і він мені добре підходив.
3D1T0R

16

Равлики , 17 16 байт

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

Спробуйте в Інтернеті!

Пояснення

Aзмушує Равлики рахувати кількість можливих відповідних шляхів у всьому введенні. oзадає вихідний напрямок у будь-якому ортогональному напрямку (замість просто на схід). Сам шаблон є у другому рядку:

\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.

7

Haskell, 108 102 93 байт

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

Спробуйте в Інтернеті!

Без регексу. Збірна модель

.t.
l.r
.b.

у верхньому лівому куті матриці візьміть 1if (l*r-1)*(t*b-1)==11і рекурсивно перейдіть праворуч (drop .l.) та down (drop перший рядок). Якщо візерунок не може бути узгоджений (у правій чи нижній межі), зробіть a 0. Підсумуйте всі результати.

Редагувати: -9 байт завдяки @xnor.


Я збирався запропонувати 2^(l*r)+2^(t*b)==4100перевірити цифри, але, здається, обидва наші рішення підмануті 2,6замість 3,4.
XNOR

@xnor, але номери обмежені до0..4
Οurous

3
@ Οurous Спасибі, я це пропустив. Тоді арифметичні вирази можна оптимізувати ще більше, як (l*r-1)*(t*b-1)==11.
xnor

7

Perl, 70 байт

Включає +2 для 0p

Наведіть вхідну матрицю як блок цифр без пробілів на STDIN:

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

Обертає хрест обертанням цифр


6

Сітківка , 92 83 байт

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

Спробуйте в Інтернеті! Пояснення:

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

Подивіться на всі квадрати розміром 3х3. Погляд ззаду фіксує відступ двічі, щоб його можна було збалансувати у другому та третьому рядках. Вхід вважається прямокутним, тому нам не потрібно перевіряти, що групи врівноважуються. Потім знімають нижню / верхню середню клітинку та ліву / праву середню клітинку.

/../_O`.

Сортуйте кожну пару комірок за порядком.

1234|3412

Порахуйте решту дійсних шаблонів.


5

Желе , 26 байт

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

Спробуйте в Інтернеті!

Пояснення

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 байти завдяки Джонатану Аллану (2) та містеру Xcoder (3) (об'єднано)


@ngn lol крапка має бути під D. Мої погані, виправлені.
HyperNeutrino

Збережіть 2 байти, скориставшись ( ...Fµ€ċ4R¤а ...Ḍµ€ċ1234також зауважте, що їх 1234можна було замінити ⁽¡ḋна збереження)
Джонатан Аллан

26 байт , використовуючи Z3Ƥзамість ṡ3Z€і ⁼J$µ€Sзамість Ḍµ€ċ1234.
Містер Xcoder

@JonathanAllan о здорово, спасибі
HyperNeutrino

5

Java 8, 135 133 131 байт

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 байти завдяки @tehtmi за коротшу формулу: (l*r-1)*(t*b-1)==11до~(l*r)*~(t*b)==39

Пояснення:

Спробуйте в Інтернеті.

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

1
Коротша формула: ~(l*r)*~(t*b)==39( ~Мабуть, у Haskell немає 1-байтового )
tehtmi

3

Лушпиння , 23 байти

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

Спробуйте в Інтернеті!

Пояснення

#ö§&¦ḣ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.

3

Dyalog APL , 30 29 28 27 26 байт ( SBSC )

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

Спробуйте в Інтернеті!


дуже добре! ⌽∘⊖×⊢може бути коротшим на 2 байти, ви можете здогадатися, як?
ngn

@ngn Я дуже хочу такий символ, як ø;)
H.PWiz

@ngn у мене×∘⌽∘⊖⍨
H.PWiz

це коротше:(⌽×⊖)
пн.

О, це розумно, ви перемістили селфі (... ⍨) ліворуч ⊢/на ще -1. Я про це не думав. У цій ситуації ви не повинні мені кредитувати.
ngn


2

Чистота , 255 ... 162 байт

Не вигідно часто використовувати фільтри малюнків у розуміннях, але в цьому випадку це так.

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]

Спробуйте в Інтернеті!

Визначає функцію $, взяття [[Int]]та повернення Int.

Він спочатку генерує всі симетрії матриці m(перетворюється через f), приймає tailsз неї три або більше рядків і синхронно перевіряє, скільки з перших трьох наборів стовпців з tailsкожного ряду відповідають шаблону хреста.

Це еквівалентно підрахунок числа упорядкованого tails-of- tailsвідповідності шаблону [[_,1,_:_],[3,_,4:_],[_,2,_:_]:_]- який , в свою чергу , логічно такі ж , як перевірка , якщо для кожного осередку в матриці, що клітина є верхнім лівим кутом повороту будь-якого хреста.


2

Python 3, 120 118 байт

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

Спробуйте в Інтернеті!

Використовує той факт, що добуток протилежних пар чисел у хресті має бути відповідно 2 та 12, і порівнюється з набором, щоб охопити всі різні орієнтації. Приймає вхід як двовимірний масив цілих чисел.


1
вам не доведеться рахувати f=рахунок
пн.

2

Japt -x , 39 38 33 байт

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

Спробуйте в Інтернеті!

-1 байт завдяки @Shaggy.

-5 байт завдяки @ETHproductions шляхом рефакторингу масиву.

Розпаковано та як це працює

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

Там повинні ще бути краще , щоб перевірити на хресті ...


Ви можете зберегти байт, замінивши перевірку рівності в кінці на e[2C].
Кудлатий

Чи можете ви позбутися від 2в ë2?
Олівер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.