프라이어 시뮬레이터


31

당신의 임무는 음식 조각에 반죽의 효과를 모델링하는 것입니다. 빵 껍질의 3 개의 층을 추가하십시오.

[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0], // in
 [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0],
 [0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
                   |
                   V
[[0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,2,1,2],
 [0,0,2,1,2,2,0,0,0,0,0,0,0,2,2,0,2,0],
 [0,0,2,1,1,1,2,0,0,0,0,0,2,1,1,2,0,0],
 [0,0,0,2,1,2,0,0,0,0,0,2,1,1,2,1,2,0],
 [0,0,0,0,2,0,0,0,0,0,0,0,2,1,1,1,2,0],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0]]
                   |
                   V
[[0,0,3,2,3,3,0,0,0,0,0,0,0,3,3,2,1,2],
 [0,3,2,1,2,2,3,0,0,0,0,0,3,2,2,3,2,3],
 [0,3,2,1,1,1,2,3,0,0,0,3,2,1,1,2,3,0],
 [0,0,3,2,1,2,3,0,0,0,3,2,1,1,2,1,2,3],
 [0,0,0,3,2,3,0,0,0,0,0,3,2,1,1,1,2,3],
 [0,0,0,0,3,0,0,0,0,0,0,0,3,2,2,2,3,0]]
                   |
                   V
[[0,4,3,2,3,3,4,0,0,0,0,0,4,3,3,2,1,2], // out
 [4,3,2,1,2,2,3,4,0,0,0,4,3,2,2,3,2,3],
 [4,3,2,1,1,1,2,3,4,0,4,3,2,1,1,2,3,4],
 [0,4,3,2,1,2,3,4,0,4,3,2,1,1,2,1,2,3],
 [0,0,4,3,2,3,4,0,0,0,4,3,2,1,1,1,2,3],
 [0,0,0,4,3,4,0,0,0,0,0,4,3,2,2,2,3,4]]

약간의 시각 자료 :

입력은 프라이어를 나타내는 부울 행렬입니다. 기름은 0, 음식은 1입니다. 함수 또는 프로그램은 1 주위에 3, 2, 3으로 3 개의 레이어를 추가해야하므로 일부 0을 덮어 씁니다. 반죽은 도넛 (구멍이있는 음식) 및 부서짐 (절연 음식 "픽셀")을 포함하여 모든 모양 또는 크기의 음식에 수평 및 수직으로 (대각선이 아닌) 붙어 있으며 프라이어의 경계로 제한됩니다. 배터의 초기 층은 빵 껍질로 변하고 후자의 영향을받지 않습니다.

즉, 먼저 1-von-Neumann 이웃에있는 모든 0을 2로 바꾼 다음 2-von-Neumann 이웃에있는 모든 0을 3으로 바꾸고 마지막으로 4 초와 3 초 따라서, 숫자 2,3,4는 맨해튼 거리보다 가장 가까운 1 셀까지의 1보다 큰 수량을 나타냅니다.

프라이어는 최소 3 x 3 크기이며 적어도 하나의 음식을 포함합니다. I / O는 융통성이 있습니다. 언어에 적합한 매트릭스 형식을 사용하십시오. 여분의 공백이 허용되고 코드가 짧을수록 허점이 발생합니다.

더 많은 테스트 :

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

 [[3,2,1], // out
  [3,2,2],
  [2,1,2]]

 -

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

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

약간의 시각 자료 :


시각화에 감사드립니다. @Tschallacka.


4
연습 예제를 제공해 주시겠습니까? 또는 왜 2, 3 또는 4 사용할 때 나에게 분명하지 않다 (I 불분명으로 VTC을 거라고하지만 지금 망치를 가지고 난 것처럼 소수에 보이는)
얽히고 설킨

1
@Shaggy 제 이해는 숫자가 "계층"을 식별한다는 것입니다. 1D 예 : 000010000000212000003212300043212340
georgewatson

4
감사합니다, @georgewatson; 당신이 옳은 것 같습니다. 그러나 "타자"는 음식에만 집중해야하며 초기 타자 층은 나중 의 타자에 의해 영향을받지 않는다고 언급 한 사양에서 명확 하지 않습니다 . 그것을 결정하는 유일한 방법은 테스트 사례에서 해독하는 것입니다.
얽히고 설킨

6
다음 도전은 Friar 시뮬레이터 여야합니다.
Magic Octopus Urn

5
@ngn 정말 ? (͡ ° ͜ʖ ͡ °)
Magic Octopus Urn

답변:


10

스텐실 : 1 + 14 = 15 바이트

명령 줄 인수 : 3

암호: s<×⌈/N:1+⌈/N⋄S

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

3 다음과 같은 변환을 세 번 반복하십시오.

s 여부를 경우 요정 비 비어

< 보다 작다

× 의 부호

⌈/N 폰 뉴먼 N 이웃 의 최대

: 새로운 가치는

  1+ 하나 더하기

  ⌈/N 폰 뉴먼 N 이웃 의 최대

 그밖에

  S 수정되지 않은 값이 스테이 ( S ELF)


이것이 15 바이트가 아니어야합니까 (인수의 경우 14 + 1 3)? 스텐실을 처음 보았지만 올바르게 이해하면 Dyalog APL 의 확장입니다. 이 행렬에 도움이 입니까? 또한 작은 말 : 설명의 시작 부분 Neumann에있는 작은 것 대신에 시작 부분의 대문자 N은 굵게 표시해야합니다. :)
Kevin Cruijssen

1
글쎄, 최신 합의는 단일 언어의 다양한 구성이 별도의 언어로 계산되어야한다는 것을 나타내는 것으로 보이지만, 추가 할 것입니다
Adám

1
@KevinCruijssen 스텐실 손쉬운 셀룰러 오토 마톤을위한 Dyalog APL 도구로 사용될 있지만 골프 언어로도 사용됩니다. 실제로, 공구 사용과 골프 언어 사이를 이동할 때 코드를 수정해야 할 수도 있습니다.
Adám

1
@KevinCruijssen 아니오, 대담한 최종 N 은 의도적입니다. Stencil이 무어폰 노이만 의 첫 글자와 마지막 글자를 자기 유무에 대한 니모닉으로 사용하고 비어 있지 않은 횟수와 실제 요소 목록에 대해서는 소문자와 대문자를 니모닉으로 사용 하는 설명서 를 참조하십시오 .
Adám

@KevinCruijssen 또한 Stencil은 Dyalog APL의 내장 ( Stencil 이라고 함 ) 인터페이스에 불과합니다 . 해당 설명서 도 참조하십시오 . 하나의 빌트인에 내장 된 전체 골프 언어! 실제로, 단일 Dyalog APL 내장을 기반으로 QuadR과 QuadS의 두 가지 다른 골프 언어 를 만들었습니다 .
Adám

10

자바 (8) 271 269 247 210 202 198 193 바이트

a->{for(int n=0,i,j,t,I,J;++n<4;)for(i=a.length;i-->0;)for(j=a[0].length;j-->0;)for(t=4;a[i][j]==n&t-->0;)try{a[I=t>2?i-1:t>1?i+1:i][J=t<1?j-1:t<2?j+1:j]+=a[I][J]<1?n+1:0;}catch(Exception e){}}

자바와 인덱스에 의존하는 매트릭스

입력 행렬을 새로 반환하지 않고 수정합니다.

설명:

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

a->{                            // Method with integer-matrix parameter and no return-type
  for(int n=0,i,j,t,I,J;++n<4;) //  Loop `n` in range [1, 4)
    for(i=a.length;i-->0;)      //   Inner loop over the rows
      for(j=a[0].length;j-->0;) //    Inner loop over the columns
        for(t=4;a[i][j]==n&     //     If the current cell contains the current `n`:
                t-->0;)         //      Loop `t` downwards in the range (4, 0]
          try{a[                //       Get the cell at a location relative to the current
                I=t>2?          //        If `t` is 3:
                 i-1            //         Take the cell above
                :t>1?           //        Else if `t` is 2:
                 i+1            //         Take the cell below
                :i][J=t<1?      //        Else if `t` is 0:
                 j-1            //         Take the cell left
                :t<2?           //        Else if `t` is 1:
                 j+1:j]         //         Take the cell right
              +=a[I][J]<1?      //       And if this cell contains a 0:
                 n+1:0;         //        Fill it with `n+1`
          }catch(Exception e){} //       catch and ignore ArrayIndexOutOfBoundsExceptions
                                //       (try-catch saves bytes in comparison to if-checks)


3

자바 스크립트 (ES6) 107 105 바이트

f=(m,k=1)=>k<4?f(m.map((r,y)=>r.map((v,x)=>v|[-1,0,1,2].every(d=>(m[y+d%2]||0)[x+~-d%2]^k)?v:k+1)),k+1):m

테스트 사례

댓글

f = (m, k = 1) =>                  // given the input matrix m[] and starting with k = 1
  k < 4 ?                          // if this is not the 4th iteration:
    f(                             //   do a recursive call:
      m.map((r, y) =>              //     for each row r[] at position y in m[]:
        r.map((v, x) =>            //       for each cell v at position x in r[]:
          v |                      //         if v is non-zero
          [-1, 0, 1, 2].every(d => //         or each neighbor cell at (x+dx, y+dy), with:
            (m[y + d % 2] || 0)    //           dy = d % 2 --> [-1, 0, 1, 0]
            [x + ~-d % 2]          //           dx = (d - 1) % 2 --> [0, -1, 0, 1]
            ^ k                    //           is different from k  
          ) ?                      //         then:
            v                      //           let the cell unchanged
          :                        //         else:
            k + 1                  //           set the cell to k + 1
        )                          //       end of inner map()
      ),                           //     end of outer map()
      k + 1                        //     increment k for the next iteration
    )                              //   end of recursive call
  :                                // else:
    m                              //   stop recursion and return m[]

3

파이썬 3 , 176 바이트

f=lambda a,i=-2,e=enumerate:a*i or f([[E or int((6*max(len(a)>i>-1<j<len(a[i])and a[i][j]for i,j in((r+1,c),(r-1,c),(r,c+1),(r,c-1))))**.5)for c,E in e(R)]for r,R in e(a)],i+1)

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

Xcoder 덕분에 -18 바이트 ovs
덕분에 -20 바이트


9
" 내일 아침에 일어 났을 때이 코드를 다시 살펴보면 아마 매우 멍청하게 느껴질 것입니다. "Java로 당신을 능가하기 때문에 더 좋을 것입니다. ; P
Kevin Cruijssen

1
@KevinCruijssen 무엇 D : 허용되지 않습니다. : P
HyperNeutrino에

1
Java : c – 196 bytes를 이길 수 있습니다.
Mr. Xcoder

@ Mr.Xcoder yay thanks : c : D
HyperNeutrino

@ovs 오 좋은, 타이!
HyperNeutrino 2019


3

포트란 95, 309 299 294 287 269 ​​바이트

subroutine f(a)
integer::a(:,:),s(2)
integer,allocatable::b(:,:)
s=shape(a)
allocate(b(0:s(1)+1,0:s(2)+1))
do1 k=0,3
do1 i=1,s(1)
do1 j=1,s(2)
b(i,j)=a(i,j)
if(any((/b(i+1,j)==k,b(i-1,j)==k,b(i,j+1)==k,b(i,j-1)==k/)).and.b(i,j)<1.and.k>0)b(i,j)=k+1
1 a(i,j)=b(i,j)
end

포트란은 골프 언어가 아닙니다.

  • 편집 : 이상한 구식 do 루프를 사용하여 10 바이트를 절약했습니다.
  • 편집 2 : 저장 5 바이트any()
  • 편집 3 : 불필요한 제거하여 7 바이트 저장if
  • 편집 4 : 선언을 축소하여 18 바이트를 절약했습니다 .s



1

펄, 63 바이트

에 +3 포함 0ap

perl -0ape 's/0(?=$a|.{@{-}}$a)/$a+1/seg,$_=reverse while($a+=$|-=/
/)<4'

마지막 줄 바꿈 없이 입력 행렬을 숫자 블록으로 제공하십시오 .

001
000
010

3x3 예제의 경우. 출력 형식은 최종 개행 문자가없는 숫자 블록과 동일합니다.

당신은 같은 작은 스크립트를 사용할 수 있습니다

perl -i -0pe 's/\n*$//' <file>

좋아하는 편집기에서 수행하기 어려운 경우 파일에서 마지막 줄 바꿈을 편리하게 제거하십시오.



1

망막 , 93 87 84 바이트

1
4
3{m`(?<=^(.)*)0(?=4|.*¶(?>(?<-1>.)*)4|(?<=40|^(?(1)_)(?<-1>.)*4.*¶.*))
5
T`1-5`d

온라인으로 사용해보십시오! Kill it With Fire 에 대한 내 대답을 기반으로 합니다. 편집 : @MartinEnder 덕분에 6 9 바이트가 절약되었습니다. 설명:

1
4

모든 1을 4로 바꿉니다.

3{

나머지 프로그램을 (최대 3 회) 반복하십시오.

m`(?<=^(.)*)0(?=4|.*¶(?>(?<-1>.)*)4|(?<=40|^(?(1)_)(?<-1>.)*4.*¶.*))
5

4에 인접한 모든 0을 5로 변경하십시오.

T`1-5`d

모든 숫자를 줄이십시오.

레티 나 0.8.2 , 100 94 바이트

1
3
{m`(?<=^(.)*)0(?=3|.*¶(?>(?<-1>.)*)3|(?<=30|^(?(1)_)(?<-1>.)*3.*¶.*))
4
T`1-4`d`^[^1]+$

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

1
3

모든 1을 3으로 바꿉니다.

{

출력이 변경되지 않을 때까지 반복하십시오.

m`(?<=^(.)*)0(?=3|.*¶(?>(?<-1>.)*)3|(?<=30|^(?(1)_)(?<-1>.)*3.*¶.*))
4

3에 인접한 모든 0을 4로 변경하십시오.

T`1-4`d`^[^1]+$

1이 없으면 모든 숫자를 줄이십시오.


!대신 (입력에 표시되지 않는) 문자를 사용하여 바이트를 절약 할 수 있습니다 (?!).
마틴 엔더

@MartinEnder 감사합니다. Kill it With Fire에서도 작동합니다 (그리고 거기에있는 동안 별도의 2 바이트 골프를 발견했습니다!)
Neil

1

루비 , 183 (158) 146 바이트

->a{3.times{|n|a.size.times{|i|r=a[i];r.size.times{|j|(r[j]<1&&[i>0?a[i-1][j]:0,a[i+1]&.at(j),j>0?r[j-1]:0,r[j+1]].include?(n+1))?r[j]=n+2:0}}};a}

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

명백한 3 루프 알고리즘을 사용합니다. Ruby가 배열에 음의 색인을 생성 할 수 있다는 사실은 경계 검사를 수행 할 수있는 방법이 없다는 것을 의미합니다. 배열의 경계를 넘어 도달하면을 반환 nil하므로 음의 경계 검사 만 필요합니다. 점검 a[i+1][j]은 안전 액세스 연산자를 사용해야합니다.

또한 for 변수를 사용하여 몇 바이트를 줄였습니다 a[0].

-12 더 많은 바이트 : (3 개소) .times대신 사용하십시오 (0...x).map.

->a{
  3.times{|n|                    # For n from 0 to 2
    a.size.times{|i|             # For each row
      r=a[i];
      r.size.times{|j|           # For each column
        (r[j]<1 && [             # If the current cell is 0, and any of
            i>0 ? a[i-1][j] : 0, #     the cell to the north,
            a[i+1]&.at(j),       #     the cell to the south,
            j>0 ? r[j-1] : 0,    #     the cell to the west,
            r[j+1]               #     or the cell to the east
          ].include?(n+1)        #   are set to the previous value,
        ) ? r[j]=n+2 : 0         # Set this cell to the next value (or 0)
      }
    }
  };
  a                              # Return the modified array
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.