Монстр симулятор


73

У братьев из Ордена Святого Гольфа Краткого есть традиция повторения короткой молитвы всякий раз, когда они видят, что кто-то делает знак креста . Из-за высокого уровня греха, измеренного среди туристов в последнее время, они установили видеонаблюдение в монастыре, и они наняли вас, чтобы помочь им сохранить старые традиции в эпоху ИИ.

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

ТМ One True Way для скрещивания себя:

.1.
3.4
.2.

(«.» соответствует любой цифре). Однако из-за неопределенности относительно поворота камеры и присутствия благочестивых восточно-православных братьев в толпе (чья One True Way TM находится в противоположном боковом направлении), вы должны также учитывать все повороты и отражения:

.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
О, милый Иисус, ты сделал симулятор Friar.
Магическая урна с осьминогом

1
Почему первая буква «Т» связана?
JakeGould

4
@JakeGould Чтобы связать этот вопрос с вопросом, к которому ведет буква «Т».
Эрик Outgolfer

Ответы:


19

Грязь , 20 байтов

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

Попробуйте онлайн!

Очень буквальная реализация спецификации:

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

    .1.
    3.4
    .2.
    

    Где .может быть любой персонаж.

  • oOявляется модификатором ориентации, который позволяет этому прямоугольнику появляться при любом повороте или отражении. vИспользуется для снижения oей приоритет , так что нам не нужны круглые скобки вокруг площади.

7
Правильно для первых двух тестов, segfault для последнего. Я думаю, что это должно быть хорошо, если программа в принципе верна и ограничена только ресурсами.
августа

К вашему сведению: я только что проверил последний контрольный пример, и он прошел нормально для меня.
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и рекурсивно идите вправо (опускание .l.) и вниз (опускание первой строки). Если шаблон не может быть сопоставлен (справа или снизу), сделайте a 0. Суммируйте все результаты.

Изменить: -9 байт благодаря @xnor.


Я собирался предложить , 2^(l*r)+2^(t*b)==4100чтобы проверить номера, но это , кажется , как наши решения обманным путем 2,6на месте 3,4.
xnor

@xnor, но номера ограничены0..4
Feburous

3
@ Спасибо, я скучал по этому. Тогда арифметические выражения можно оптимизировать еще больше, например (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

Retina , 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 Что я действительно хочу, так это символ ø;)
H.PWiz

@ngn У меня есть×∘⌽∘⊖⍨
H.PWiz

это короче:(⌽×⊖)
НГН

О, это умно, вы переместили селфи (... ⍨) слева от ⊢/другого -1. Я не думал об этом. В этой ситуации вы не должны доверять мне.
августа


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.