프라이어 시뮬레이터


73

T 그는 세인트 Golfus 간결한의 순서에서 형제들은 사람이 할 볼 때마다 짧은기도를 낭송의 전통이 십자가의 기호를 . 최근 관광객들 사이에서 측정 된 높은 수준의 죄로 인해 그들은 수도원에 CCTV를 설치했으며 AI 시대에 오래된 전통을 살리기 위해 당신을 고용했습니다.

당신의 임무는 friars의 손가락 추적 소프트웨어의 출력을 분석하고 얼마나 많은기도가 예정되어 있는지 알려주는 것입니다. 입력은 0과 4 사이의 정수를 포함하는 행렬입니다. 1,2,3,4는 연속적인 순간의 손가락 위치를 나타냅니다. 0은 손가락이 아닌 것을 나타냅니다.

스스로를 횡단 하는 One True Way TM 는 다음과 같습니다.

.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 서브 매트릭이 몇 개나 있는지 계산 하여 수녀들이 AI가해야하는 횟수를 결정하도록 도와주세요 . 프로그램이나 함수를 작성하십시오. 합리적이고 편리한 형태로 입력하십시오.

유언 사례 :

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

"공포의 왕국에서 승리하기 때문에 가장 짧은 사람이 가장 축복 받았다." -St Golfus의 서적 13:37

루시퍼의 악한 행위이기 때문에 허점을 사용해서는 안된다”고 말했다. 메타에 편지 13 : 666

십자가를 만드는 사람들의 약간의 시각화


시각화 주셔서 감사합니다 @Tschallacka.


57
마지막 구절에 +1, 그들은 나에게 좋은 웃음을 주었다 : D
HyperNeutrino

6
하나의 숫자가 여러 개의 십자가의 일부가 될 수 있습니까?
Martin Ender

9
오, 예수여, 당신은 Friar 시뮬레이터를 만들었습니다.
Magic Octopus Urn

1
첫 번째 "T"가 연결된 이유는 무엇입니까?
JakeGould

4
@JakeGould이 질문을 "T"가 이끄는 질문에 연결합니다.
Erik the Outgolfer

답변:


19

Grime , 20 바이트

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

온라인으로 사용해보십시오!

스펙의 문자 그대로 구현 :

  • n` 입력을 일치시키는 입력의 서브 직사각의 수를 그레 임 카운트로 설정합니다.
  • .\1./\3.\4/.\2. 3x3 정사각형을 정의합니다.

    .1.
    3.4
    .2.
    

    .어떤 캐릭터가 될 수있는 곳 .

  • oO이 사각형을 회전 또는 반사에 표시 할 수있는 방향 수정 자입니다. 을 v낮추기 위해 사용되는 o우리는 광장 주변에 괄호가 필요하지 않도록의 우선 순위를.

7
처음 두 테스트 인 segfault는 마지막 테스트에 맞습니다. 프로그램이 원칙적으로 정확하고 리소스에 의해서만 제한되는 한 이것이 정상이라고 생각합니다.
ngn

참고 : 방금 마지막 테스트 사례를 테스트했는데 문제가 없었습니다.
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

하스켈, 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.)하고 아래로 이동하십시오 (첫 번째 행 삭제). 패턴 (오른쪽 또는 아래쪽 테두리에) 일치시킬 수없는 경우를 취할 0. 모든 결과를 합산하십시오.

편집 : @xnor 덕분에 -9 바이트.


나는 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

펄, 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

겹치는 3x3 사각형을 모두 찾으십시오. lookbehind는 들여 쓰기를 두 번 캡처하여 두 번째 및 세 번째 줄에서 균형을 잡을 수 있습니다. 입력은 직사각형으로 가정되므로 그룹의 균형을 확인할 필요가 없습니다. 그런 다음 하단 / 맨 위 중간 셀과 왼쪽 / 오른쪽 중간 셀이 캡처됩니다.

/../_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]

Jonathan Allan (2)과 Mr. Xcoder (3) 덕분에 -3 바이트 (병합)


@ngn lol 점은 아래에 있어야합니다 D. 내 나쁜, 고정.
HyperNeutrino

사용하여 2 바이트 저장 ...Fµ€ċ4R¤보다는를 ...Ḍµ€ċ1234(또한 참고가 1234에 의해 대체되었습니다 수 ⁽¡ḋ를 저장)
조나단 앨런에게

Z3Ƥ대신 ṡ3Z€⁼J$µ€S대신 사용하여 26 바이트Ḍµ€ċ1234 .
Mr. Xcoder


5

자바 (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;}

더 짧은 공식 을 위해 @tehtmi 덕분에 -2 바이트 : (l*r-1)*(t*b-1)==11to~(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 I have×∘⌽∘⊖⍨
H.PWiz

(⌽×⊖)
ngn

아, 그것은 영리합니다. 셀카 (... ⍨)를 ⊢/-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) tails3 개 이상의 행을 갖는 행을 가져 와서 tails각 행 에서 처음 3 개의 열 집합 중 몇 개가 십자가의 패턴과 일치 하는지 동 기적으로 확인합니다 .

이 순서의 숫자 카운트에 해당 tails-of- tails패턴 매칭 [[_,1,_:_],[3,_,4:_],[_,2,_:_]:_]차례로 경우 행렬에서의 각 셀에 대해, 해당 셀의 단면의 임의의 회전의 좌상 코너는, 검사 등의 논리적으로 동일 -.


2

파이썬 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 여야하며, 모든 다른 방향을 포함하도록 세트와 비교된다는 사실을 사용합니다. 입력을 정수의 2D 배열로 취합니다.


1
f=점수 를 세지 않아도됩니다
ngn

2

Japt -x , 39 38 33 바이트

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

온라인으로 사용해보십시오!

@Shaggy 덕분에 -1 바이트.

어레이를 리팩토링하여 @ETHproductions 덕분에 -5 바이트

포장 풀기 및 작동 방식

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

2에서 제거 할 수 있습니까 ë2?
Oliver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.