오염 된 사각형


17

소개

숫자로만 구성된 다음 사각형을 관찰하십시오 0 - 9.

1034
4167
8414
3542

이 사각형의 외부 껍질은 다음과 같습니다.

1034
4  7
8  4
3542

그것은 0을 포함하므로 외부 쉘 을 벗겨 내야합니다.

16
41

이 사각형의 외부 껍질은 다음과 같습니다.

16
41

0을 포함 하지 않으므로 오염되지 않은 사각형입니다. 따라서 기본적으로 오염되지 않은 사각형 의 정의 는 사각형의 외부 껍질 에 0 이 없는 경우 입니다.

작업

합리적인 형식으로 숫자의 제곱 (음수가 아닌 정수만 포함)이 주어지면, 적당한 형식으로 외부 쉘을 지속적으로 벗겨 냄으로써 가장 큰 오염되지 않은 사각형 을 출력 합니다.

테스트 사례

테스트 사례 1 :

Input         Output

1234          1234
2345          2345
3456          3456
4567          4567

테스트 사례 2 :

Input         Output

123           123
204           204
346           346

테스트 사례 3 :

Input         Output

101           1
010           
101           

테스트 사례 4 :

Input         Output

000           (none)
000
000

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!


예제를 만들 수 없습니까 416\n841\n354\n(왼쪽 하단)?
Leaky Nun

글쎄, 당신은 " 오염되지 않은 가장 큰 광장 "이라고
말함

오류가 허용됩니까?
Leaky Nun

@KennyLau 마지막 테스트 사례를 의미합니까? 예, 출력되지 0않거나 그와 같은 것이면 가능합니다.
Adnan

2
"수의 제곱"은 "자리의 제곱"으로 더 잘 표시 될 것입니다.
Mego

답변:


6

젤리 , 19 16 바이트

Fœ^F}P
ḊṖZµ⁺⁸ßç?

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인 .

작동 원리

ḊṖZµ⁺⁸ßç?  Main link. Argument: M (2D list)

Ḋ          Dequeue; remove the first row.
 Ṗ         Pop; remove the last row.
  Z        Zip; transpose rows with columns.
   µ       Combine the chain to the left into a link.
    ⁺      Copy the link, executing it twice.
           The copy removes the first and last column and restores the orientation.
       ç?  If the helper link returns a non-zero integer:
     ⁸       Return M unmodified.
      ß      Else, recursively call the main link on the "peeled" M.


Fœ^F}P     Helper link. Arguments: P ("peeled" M), M (unmodified)

F          Flatten P.
   F}      Flatten M.
 œ^        Perform multiset symmetric difference, removing the elements of P from
           the elements of M, respecting multiplicities, leaving precisely the
           elements of the outer shell.
     P     Return the product of the remaining elements.

8

자바 스크립트, 105 97 바이트

@Patrick Roberts 덕분에 8 바이트가 절약되었습니다!

l=a=>a.slice(1,-1)
p=a=>l(a).map(l)
c=a=>a.join``.replace(/[^0]/g,"")
s=a=>c(p(a))<c(a)?s(p(a)):a

기능을 정의 s입력으로 정수의 2D 배열을 제공 할 때 정수의 2D 배열을 반환하는 .

작동 원리

  • 함수 l: 주어진 배열a , 첫 번째 인덱스와 마지막 인덱스가없는 복사본을 반환합니다.

  • 기능 p: 2D 배열이 주어지면 첫 번째 행과 마지막 행을 제거하기 위해 a호출 l한 다음 나머지 행 호출마다l 주먹 마지막 열을 제거 하였다. 양파 껍질을 벗 깁니다.

  • function c: 2D 배열이 주어지면 s a만을 포함하는 문자열을 반환합니다.0a .

  • 함수 s: 2D 배열이 주어지면에서 주어진 배열 의 벗겨진 형태 와 배열 자체를 a호출 합니다. 이 문자열을 사전 식으로 비교하여 벗겨진 양식이 원본보다 적은지 확인합니다 . 그렇다면 원본이 오염되었으므로 벗겨진 양식을 재귀 적으로 호출 하십시오. 그렇지 않으면 원본을 반환하십시오.cp0s


2
in 인수 a.length에서 제거 하고 8 바이트를 저장할 수 있습니다 . 음수 인덱스가 될 수 있습니다. endarray.slicelend
패트릭 로버츠

7

망막 , 60 57 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다. 후행 줄 바꿈이 중요합니다.

+`(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)(^.+¶|¶.+$|.?\b.?)

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

설명

후행 줄 바꿈으로 인해 정규 표현식과 일치하는 모든 항목을 찾아 `입력에서 제거합니다. 선도로 인해+ 출력 변경이 중지 될 때까지 반복적으로 수행됩니다 (정규 표현식의 일치가 중지되기 때문입니다).

정규 표현식 자체는 두 부분으로 구성됩니다.

(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)

이 부분 0은 외부 쉘 어딘가에 있는지 확인합니다 . 정규식 엔진의 "커서"를 룩백을 사용하여 문자열의 시작 부분으로 이동하면됩니다 [^_].

(?<=...^[^_]*)

그런 다음 해당 위치 0에서 첫 번째 줄, 줄 바꿈 옆 또는 마지막 줄에서 lookahead를 사용합니다 .

(?=.*0|[^_]+(¶0|0¶|0.*$))

그런 다음 실제 일치는 첫 줄 (후행 줄 바꿈 포함), 마지막 줄 (앞 줄 바꿈 포함) 또는 줄의 첫 번째 또는 마지막 문자 \b로 구성됩니다. 닻:

(^.+¶|¶.+$|.?\b.?)

6

MATL , 26 21 바이트

t"t5LY)y5LZ)h?}6Lt3$)

입력 형식은 다음과 같습니다

[1 0 3 4; 4 1 6 7; 8 4 1 4; 3 5 4 2]

다른 4 가지 테스트 사례는

[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]
[1 0 1; 0 1 0; 1 0 1]
[1 2 3; 2 0 4; 3 4 6]
[0 0 0; 0 0 0; 0 0 0]

마지막 테스트 사례에서 프로그램 오류가 발생하지만 올바른 결과를 생성합니다 (아무 것도 아님). 알려 주신 @Dennis에게 감사드립니다!

온라인으로 사용해보십시오! . 또는 모든 테스트 사례를 확인하십시오. (랩핑 코드 포함).

설명

이것은 입력 행렬의 열 수만큼 여러 번 반복되는데, 이는 충분합니다. 각 반복에서 쉘은 해당 값에 따라 제거되거나 유지됩니다.

t            % Take a matrix as input. Duplicate
"            % For each column (i.e. repeat that many times)
  t5LY)      %   Duplicate top of the stack. Extract first and last rows
  y5LZ)      %   Duplicate the element below the top. Extract first and last columns
  h          %   Concatenate the two arrays into a row vector
  ?          %   If all its entries are non-zero: do nothing
  }          %   Else
    6Lt3$)   %     Get the central part
             % End if, end for. Implicitly display

5

Pyth, 19 바이트

.W}\0.-`H`JutCPG2HJ

테스트 스위트

.W}\0.-`H`JutCPG2HJ
.W                     While the first function returns true, apply the second
                       function, starting with the input.
           u    2H     Apply the following twice to the input:
              PG       Remove the last row
             C         Transpose
            t          Remove the first row
                       This removes the outermost shell.
          J            Save it to J
         `             Stringify the matrix
       `H              Stringify the input
     .-                Multiset difference
  }\0                  Check if there is a '0' in the resulting string.
                  J    If that succeeds, update the current value to J.
                       When it fails, return the current value.

4

자바 스크립트 (ES6), 74 바이트

f=s=>/^.*0|0\n|\n0|0.*$/.test(s)?f(s.replace(/^.*\n?|.(.*).|\n.*$/g,"$1")):s

각 행을 구분하는 줄 바꿈이있는 문자열 형식으로 입력을받습니다 (단, 줄 바꿈 줄 바꿈은 없음). 설명 : /^.*0|0\n|\n0|0.*$/오염 된 사각형과 일치하는 정규 표현식 /^.*\n?|.(.*).|\n.*$/이고 유지해야 할 부분을 제외하고 삭제해야하는 사각형 부분과 일치합니다 (.*). (이것은 줄 바꿈 문자를 앞뒤로 보는 것보다 짧습니다.)


4

펄 5, 63 + 3 = 66 바이트

$_=<>;s/\A.*\n?|^.|.$|\n.*\Z//mg while/\A.*0|0$|^0|0.*\Z/;print

-0깃발이 필요합니다 . 입력해야 하지 후행 개행 문자가 포함되어 있습니다.


3

파이크, 29 바이트

"D3lt%sBR,"2*ER3*I
/)tOmtmOr;

여기 사용해보십시오!

또한 29 바이트

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

여기 사용해보십시오!


2
두 링크 모두에서 오류가 발생합니다. "run"을 누르기 전에 무엇을해야합니까?
Luis Mendo

나는 아마 달릴 때 항상 오류가있을 것이라고 언급했을 것입니다. 출력은 어딘가에 두 번째 줄에 있습니다 (실제로 인쇄되며 오류 메시지의 일부가 아님)
Blue

2

Pyth , 31 30 바이트

L+hbeb.W!*F+1iRTs+yHyMHPtmPtdZ

테스트 스위트. (마지막 테스트 케이스 오류)

개선 : 외부 루프 추출기를 일부 기능 ( L+hbeb)으로 만들었습니다 .

이전 31 바이트 버전 :

.W!*F+1iRTs++hHm+hdedHeHPtmPtdZ

작동 방식 :

코드는 기본적으로 외부 쉘의 제품은 0이지만 껍질을 벗 깁니다.

메인 코드를 분석해 보자 (Q는 암시적임).

.W<lambda:H><lambda:Z>Q

첫 번째 람다 Q(입력) 에서 시작 while하여 두 번째 람다를 수행하십시오.

첫 번째 부분은 다음의 람다 입니다 H.

!*F+1iRTs++hHm+hdedHeH

두 번째 부분은 람다 입니다 Z.

PtmPtdZ

첫 번째 부분

!*F+1iRTs++hHm+hdedHeH

이것을 분석하자 :

s++hHm+hdedHeH

s++             Concatenate:
   hH              1. the first row
     m+hdedH       2. the first and last item of each row
            eH     3. the last row

Pyth는 prefix notation을 사용하므로 평가됩니다.

!*F+1iRT

     iRT  Convert each to integer
 *F+1     Product
!         Negate. If any element of the outer shell is zero, this would return 1.

두 번째 부분

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows

2

Mathematica, 78 바이트

NestWhile[#[[a=2;;-2,a]]&,#,Count[{#[[b={1,-1}]],#[[;;,b]]},0,3]>0&]~Check~{}&

익명 함수는 입력을 행렬로받습니다. 실행 중에 발생할 수있는 오류는 무시하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.