고정 불변 지문


15

우리가 어떤 polyomino 를 가지고 있고 그것들을 유일하게 식별하고 싶다고 상상 하지만, polyominos는 회전 될 수 있기 때문에, 그것들을 맹목적으로 해싱하면 조각에 대한 동일한 지문과 그 회전 (일반적으로)을 우리에게주지 않을 것입니다.

예를 들어 L-tetromino가 있다면

x
x
xx

우리는 다음과 같은 지문을 갖기를 원합니다.

         xx
  x       x      xxx
xxx  ,    x  or  x

참고 : 평면에서의 회전 만 허용하므로 (즉, 단면 폴리오 미노 임) 다음 폴리오 미노는 다른 것입니다.

 x
 x
xx 

도전

이 과제의 과제는 Boolean / valued matrix / list / string / list of list / string / .. 를 사용하는 지문 인식 기능 / 프로그램을 구현하는 것입니다 . polyomino를 인코딩하고 문자열을 반환합니다. 폴리오 미노. 가능한 모든 회전에 대해 지문이 동일해야합니다 (일반적으로 4).미디엄×0,1

입출력

  • 미디엄1, N 1 및 (즉, 빈 polyomino 없음)1
  • 이 가능한 작다 는 것을 보장 합니다 (즉, 모든 은 과 에 맞게 다듬어집니다)미디엄,0미디엄
  • 당신은 입력이 보장된다
    • 단순히 연결
    • 구멍이 없다
  • 출력은 polyomino의 가능한 모든 회전에 대해 동일한 문자열이어야합니다.

다음은 등가 클래스입니다. 각 클래스마다 지문이 동일해야하며 두 개의 개별 클래스에서 나오는 두 개의 폴리오 미노의 경우 서로 달라야합니다.

예에서 L-teminomino의 회전 :

[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]

J- 테트로 미노 :

[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]

폴리 노 미노 단위 :

[[1]]

줄 :5×1

[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]

코너 :2×2

[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]

W- 펜토미노 :

[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]


항상 ""빈 문자열을 출력 하면 모든 요구 사항이 충족 되었습니까?
Daniel Wagner

@DanielWagner : " 두 개의 별개의 클래스 [지문] 에서 나온 두 개의 polyominos에 대해 [[..] ]이 달라야합니다. "-아니요, 유효하지 않습니다.
ბიმო

배열의 가능한 모든 회전을 일관되게 정렬하여 출력 합니까?
Shaggy

1
@Shaggy : 예, 모든 기준을 충족합니다.
ბიმო

답변:


7

파이썬 2 , 48 바이트

f=lambda l,z=5:z and max(l,f(zip(*l)[::-1],z-1))

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

목록 비교 측면에서 네 회전 중 가장 큰 회전을 사용합니다. FlipTack의 솔루션을 기반으로 합니다 .

이 코드는 Python 2의 기능을 사용하여 다른 유형의 객체를 비교합니다. 의 기본 사례 값은 목록보다 작기 때문에 0무해 max합니다. 또한 zip입력이 목록의 목록 인 동안 튜플 목록을 생성하지만 튜플이 목록보다 크므로 입력 목록 목록은 결코 경쟁자가 아닙니다. 그렇기 때문에 우리는 4가 아닌 5 번 회전하여 초기 목록의 튜플 라이즈 버전으로 돌아갑니다. (허용되는 입력 형식 인 경우 튜플 목록을 작성해도 효과가 있습니다.)


4

파이썬 3 , 63 바이트

def f(m):M=[];exec("m=[*zip(*m[::-1])];M+=m,;"*4);return min(M)

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

사전 최소값으로 회전을 찾아서 인쇄합니다.

람다 형식은 동일한 바이트 수로 제공됩니다.

lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M[-4:])

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


로 다시 쓰면 lambda58 세가 lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M)됩니다.. exec항상을 반환 하기 때문에 작동 합니다 None.
nedla2004

@ nedla2004 한 번만 실행할 수 있으며 M이미 채워진 것처럼
피하다

@ nedla2004 ...하지만 문제 M[-4:]를 설명하면 동일한 바이트 수를 얻을 수 있습니다.
FlipTack

필자가 사용한 테스트는 동일한 "해시"를 사용하여 입력을 확인하는 것이기 때문에 결코 실행되지 않았습니다. 말이 되네요
nedla2004

2

젤리 , 5 바이트

ZU$ƬṂ

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

전체 프로그램.

가능한 모든 회전을 생성하고 사전 최소값을 선택합니다.

싱글 톤리스트는 []출력에서 래핑되지 않습니다 . 단일 톤 목록이 입력에 존재하는 유일한 경우는 수직선 (단위 polyomino 포함)이 될 것입니다. ). 외부 []가 존재하지 않는 유일한 경우 는 단위 polyomino입니다.


내가 도전을 읽을 때 나는 이것이 일어날 것이라는 것을 알았다 :)
ngn


2

K (ngn / k) , 16 바이트

{a@*<a:3{+|x}\x}

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

최소 회전

{ } 인수 기능 x

{+|x}회전, 즉 반전 ( |) 및 조옮김 ( +)

3{ }\중간 결과를 보존하면서 3 회 적용; 이것은 4 회전의 목록을 반환합니다

a: 할당하다 a

< 오름차순 (정렬 오름차순 계산)

* 먼저

a@인덱스 a가와


1

Japt -g, 6 바이트

4Æ=zÃñ

시도 해봐

           :Implicit input of 2d-array U
4Æ         :Map the range [0,4)
   z       :  Rotate U 90 degrees
  =        :  Reassign to U
    Ã      :End map
     ñ     :Sort
           :Implicit output of first element

는 IS -g플래그는 필요? 정렬은 모든 초기 회전이 동일한 목록으로 끝나서 뭔가 빠진 경우가 아니라면 전체 목록이 지문처럼 잘 작동해야 함을 의미합니다.
Kamil Drakari

@ KamilDrakari, 당신은 옳을 수 있습니다-내가 말했듯이, 나는 도전을 완전히 이해 했는지 잘 모르겠습니다 . 그럼에도 불구하고 바이트를 소비하지는 않습니다.
Shaggy

@KamilDrakari : 필요하지는 않지만 바이트 수에 포함되지 않으므로 아무런 해가 없습니다.
ბიმო

1

J , 16 바이트

Shaggy 덕분에 -2 바이트

[:/:~|.@|:^:(<4)

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

J , 18 바이트

0{[:/:~|.@|:^:(<4)

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

폴리오 미노의 사전 순으로 정렬 된 회전 목록에서 첫 번째 항목을 반환합니다.

설명:

            ^:(<4)  - do the verb on the left 4 times, storing all the steps
       |.@|:        - tranpose and reverse
    /:~             - sort up the 4 matrices
  [:                - cap the fork
0{                  - take the first matrix  

@Shaggy 감사합니다!
Galen Ivanov

0

05AB1E , 10 8 바이트

3FÂø})Σ˜

@Shaggy 덕분에 -2 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

3F  }       # Loop 3 times
  Â         #  Bifurcate (short for Duplicate & Reverse) the top of the stack
            #  (which is the input-matrix implicitly the first iteration)
   ø        #  Transpose: swap rows/columns
     )      # After the loop, wrap everything on the stack in a list
      Σ˜    # Sort this list of matrices by their flattened array (and output implicitly)

참고 : 최소값을 사용 ß하거나 W암시 적으로 평탄화하면 출력 0됩니다. 그리고 정렬 {은 행렬 목록에서 작동하지 않는 것 같습니다 Σ˜. 그래서 대신 사용 합니다.


1
@Shaggy 감사합니다! :)이 경우 마지막 두 바이트는 제거 할 수 있습니다. 왜냐하면 그 }뒤에 아무것도 나오지 않으면 내재적으로 수행 되기 때문입니다.
Kevin Cruijssen

1
오늘 저는 05AB1E에 대해 배웠습니다! :) Japt에서도 마찬가지입니다.
Shaggy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.