Pentomino 6x10 솔루션 노멀 라이저


19

지금 가장 가능성이 높은 것처럼 6x10 그리드에 펜토미노 퍼즐에 대한 2339 개의 솔루션이 있습니다. 12 개의 펜토미노에는 다양한 라벨링 체계가 있으며 그 중 두 가지가 아래 이미지에 나와 있습니다.

여기에 이미지 설명을 입력하십시오

이미지 크레디트 : Wikipedia

현재 작업의 목적을 위해 표준화 된 펜토미노 솔루션은 두 번째 라벨링 체계 (Conway 's)를 사용하는 솔루션이라고합니다.

예:

O O O O O S S S Z Z
P P R R S S W W Z V
P P P R R W W Z Z V
U U X R T W Y V V V
U X X X T Y Y Y Y Q
U U X T T T Q Q Q Q

O구성표에 따라 행에 5 개의 사각형이있는 조각은 문자로 표시됩니다 . 모든 조각에 대해서도 마찬가지입니다.

직무:

6x10 펜토미노에 대한 솔루션으로 조각에 임의의 sheme으로 레이블이 지정되면 모든 조각이 Conway의 레이블 지정 체계에 레이블이 지정되도록 정규화하십시오. 조각을 인식하고 조각의 기호로 특정 조각의 각 사각형을 표시해야합니다.

입력:

다음과 같이 편리한 형식으로 정규화 할 솔루션입니다.

  • 여러 줄 문자열

  • 문자열 목록

  • 문자 목록

등등

산출:

동일한 솔루션 (모든 조각 위치 및 방향이 유지됨)이지만 각 조각은 Conway의 레이블 구성표에 따라 레이블이 지정되었습니다. 참고 : 출력은 6x10 문자 그리드로 인쇄해야합니다. 선행 및 후행 줄 바꿈 및 공백이 허용됩니다. 위의 예와 같이 문자 사이에 공백을 인쇄 할 수도 있습니다 (빈 줄은 아님).

테스트 사례 :

1. 입력 :

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

산출:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2. 입력 :

45ookkkk00
455ooogk00
4a55gggdd0
4aaa3gnnd.
4am333ndd.
mmmm3nn...

산출:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

우승 기준 :

각 언어에서 가장 짧은 바이트 단위의 솔루션이 이깁니다. 골프 언어에 낙심하지 마십시오. 알고리즘 및 구현에 대한 설명을 환영합니다.



@KevinCruijssen 감사합니다! (나는 tetromonoes와 관련된 질문을 확인하지 않았습니다)
Galen Ivanov

답변:


12

APL (Dyalog Classic) , 54 53 50 바이트

⍴⍴{'OXRYTPZQUWSV'[⌊5÷⍨⍋⍋,{×/+⌿↑|(⊢-+/÷≢)⍸⍵}¨⍵=⊂⍵]}

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

입력에서 각 펜토미노에 대한 불변량을 계산합니다. 각 제곱에서 무게 중심까지의 측정 (∆x, ∆y), abs (∆x) 및 abs (∆y)를 취하고 x 성분을 합산하고 별도로 y 성분과 두 합을 곱합니다. 이것은 12 개의 뚜렷한 결과를 제공합니다. 그런 다음 모든 불변량의 정렬 된 모음에서 각 펜토미노 불변량의 인덱스를 찾으십시오. 0을 'O', 1을 'X', 2를 'R'등으로 바꿉니다 .


빠른 답변과 설명 감사합니다. +1 솔루션을 6x10 그리드로 명시 적으로 인쇄해야했습니다. 설명을 변경했습니다. 솔루션을 업데이트하십시오. 불편을 끼쳐 드려 죄송합니다.
Galen Ivanov

@GalenIvanov 그러나 ... 그것은 격자 입니다. 내 테스트는 결과를 인쇄하는 대신 "확인"을 출력합니다. 너무 혼동 스럽습니까?
ngn

예, 테스트에 혼란 스러웠습니다.
Galen Ivanov

3
이제 결과를 검증하기 전에 결과를 인쇄합니다
ngn

4

젤리 , 37 바이트

ŒĠZÆmạƊ€ḅı§AỤỤị“æṂ⁾+’Œ?¤+78Ọ,@FQṢƊyⱮY

문자열 목록을 취하는 전체 프로그램 (우리가 인쇄해야하기 때문에-그렇지 않으면 후행을 제거하고 Y숫자 목록 또는 문자 목록을 반환하는 문자 목록을 취하는 모나드가 있습니다).

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

어떻게?

나는 이것이 약간 다른 방식 으로도 ngn의 APL 솔루션 과 동일한 펜토미노 분류를 사용하여 작동한다고 생각합니다 ( APL 도 모르기 때문에이 방법이 분류를 넘어 얼마나 유사한 지 확실하지 않습니다).

(참고 “æṂ⁾+’Œ?¤+78Ọ 1 바이트 절약 만 가능합니다 “XRPTZWUYSVQO”!)

ŒĠZÆmạƊ€ḅı§AỤỤị“æṂ⁾+’Œ?¤+78Ọ,@FQṢƊyⱮY - Main Link: list of lists of characters L
ŒĠ                                    - group multidimensional indices by value
      Ɗ€                              - last three links as a monad for €ach i.e. f(x):
  Z                                   -   transpose x
   Æm                                 -   mean (vectorises) (i.e. the average of the coordinates)
     ạ                                -   absolute difference with x (vectorises) (i.e. [dx, dy])
         ı                            - square root of -1 (i)
        ḅ                             - convert from base (vectorises) (i.e a list of (i*dx+dy)s)
          §                           - sum each
           A                          - absolute value (i.e. norm of the complex number)
            Ụ                         - grade up (sort indices by value)
             Ụ                        - grade up (...getting the order from the result of A back,
                                      -              but now with one through to 12)
                       ¤              - nilad followed by links as a nilad:
               “æṂ⁾+’                 -   base 250 literal = 370660794
                     Œ?               -   permutation@lex-index = [10,4,2,6,12,9,7,11,5,8,3,1]
              ị                       - index into
                        +78           - add seventy-eight
                           Ọ          - cast to characters (character(1+78)='O', etc...)
                                 Ɗ    - last three links as a monad (i.e. f(L)):
                              F       -   flatten
                               Q      -   de-duplicate
                                Ṣ     -    sort
                            ,@        - pair (with sw@pped @rguments) (giving a list of 2 lists)
                                   Ɱ  - Ɱap across L with:
                                  y   -   translate i.e. swap the letters as per the the pair)
                                    Y - join with new lines
                                      - implicit print

2

볼프람 언어 (수학) , 103 바이트

""<>Riffle[(t=#)/.Thread[SortBy[Union@@t,Tr@Kurtosis@Position[t,#]&]->Characters@"UPSWZVRTQXYO"],"\n"]&

문자 목록으로 입력을받습니다.

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

여기서 주요 아이디어는 입력의 각 문자에 대해 발생하는 좌표를 찾고 첨도를 취하고 좌표를 합산한다는 것입니다. 이것은 우리에게 각 조각에 대한 불변성을 제공합니다.

첨도는 통계와 관련이 거의없는 연산자입니다. 핵심은 변환시 변하지 않는 반면 반사와 회전은 좌표의 순서를 최대로 바꿀 수 있다는 것입니다.

어쨌든 이상한 불변량을 제외 하고는이 솔루션은 다른 것과 유사합니다. 우리는 문자와 조각을 각 불변에 따라 정렬 한 다음 각 문자를 "UPSWZVRTQXYO" : 조각, 첨도 합계로 정렬.

마지막으로 ""<>Riffle[...,"\n"]그리드로 인쇄 코드입니다.


내가 들어 본 적이없는 작업을 알고 그것을 잘 활용하기위한 +1
Black Owl Kai

솔루션에 대한 나의 첫 번째 시도는를 Sort@Variance대신 Tr@Kurtosis했고 아마도 더 많은 사람들이 분산에 대해 들었습니다. 그러나 Tr@Variance여러 펜토미노 (예 : P 및 X)에 동일한 x- 분산과 y- 분산의 합이 있으므로 작동하지 않습니다. 그래서 나는 더 멋진 것에 대한 Mathematica의 문서를 살펴 보았습니다.
Misha Lavrov

2

파이썬 2 , 191 바이트

def y(o):print"".join(['XPRTWZUYSVQO\n'[[w for v,w in sorted([sum(abs(u-sum(t)/5)for t in[[complex(r%11,r/11)for r,q in enumerate(o)if q==p]]for u in t),p]for p in o)].index(x)/5]for x in o])

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

후행 줄 바꿈이있는 여러 줄 문자열을 가져오고 6 개의 중첩 된 목록 이해를 수행합니다.

언 골프 버전

def pentomino_normalizer(input_string):
    # input_string is a multi-line string with a trailing newline

    results = []  # For saving the results of the for loop
    for current_char in input_string:
        # current_char = p in the golfed version

        # The python data type complex stores a real and a imaginary value and
        # is used for storing the x and y coordinates.
        # In the end, the positions list contains a complex number for every
        # occurence of current_char in the string
        # positions_list = t in the golfed version
        positions_list = [complex(i % 11, i / 11) for i, c
                          in enumerate(input_string) if c == current_char]
        # average_pos is the midpoint of all occurences of current_char, 
        # to get rid of translations
        average_pos = sum(positions_list)/5
        # Calculates a value for each tile that is invariant under 
        # translations and rotations,
        # simply the sum of all the distances between the midpoint
        # and the positions
        invariant = sum(abs(pos - average_pos) for pos in positions_list)

        # Saves the invariant value to a list
        results.append(invariant, current_char)

    # This new list contains the characters occuring in the string, sorted
    # by the invariant value. Because this was done with each char in the 
    # input string, this lists contains every value five times and also 
    # contains six newlines
    # at the end of the list
    sorted_results = [w for v, w in sorted(results)]

    # This code snippet maps each char from the input string to its according
    # output and prints to stdout
    chars = ['XPRTWZUYSVQO\n'[sorted_results.index(c)/5] for c in input_string]
    print "".join(chars)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.