Bình thường hóa giải pháp Pentomino 6x10


19

Như bạn có lẽ nhất bây giờ, có 2339 giải pháp cho câu đố pentomino trong lưới 6x10. Có các sơ đồ ghi nhãn khác nhau cho 12 hình ngũ giác, hai trong số chúng được hiển thị trên hình ảnh dưới đây:

nhập mô tả hình ảnh ở đây

Tín dụng hình ảnh: Wikipedia

Đối với các mục đích của nhiệm vụ hiện tại, chúng tôi sẽ nói rằng một giải pháp pentomino được chuẩn hóa là một giải pháp sử dụng sơ đồ ghi nhãn thứ hai (Conway's).

Thí dụ:

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

Các mảnh có 5 hình vuông trong một hàng được ký hiệu bằng các chữ cái O, theo sơ đồ. Điều này cũng đúng với tất cả các mảnh.

Bài tập:

Đưa ra giải pháp cho pentomino 6x10 trong đó các mảnh được dán nhãn ngẫu nhiên, bình thường hóa để tất cả các mảnh được dán nhãn trong sơ đồ ghi nhãn của Conway. Bạn cần nhận ra các mảnh và đánh dấu mỗi ô vuông của một mảnh cụ thể bằng ký hiệu của mảnh.

Đầu vào:

Giải pháp được chuẩn hóa, ở bất kỳ định dạng nào thuận tiện cho bạn, ví dụ:

  • Một chuỗi nhiều dòng

  • Một danh sách các chuỗi

  • Một danh sách các danh sách các nhân vật

và v.v.

Đầu ra:

Cùng một giải pháp (tất cả các vị trí mảnh và hướng được bảo tồn), nhưng mỗi mảnh được dán nhãn theo sơ đồ ghi nhãn của Conway. Lưu ý: Đầu ra PHẢI được IN dưới dạng lưới 6x10 ký tự. Hàng đầu và dấu vết hàng đầu và không gian được cho phép. Bạn cũng có thể in một khoảng trắng giữa các ký tự (nhưng không phải các dòng trống), như trong ví dụ trên.

Các trường hợp thử nghiệm:

1. Đầu vào:

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

Đầu ra:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2. Đầu vào:

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

Đầu ra:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

Tiêu chí chiến thắng:

Giải pháp ngắn nhất tính theo byte trong mỗi ngôn ngữ sẽ thắng. Đừng nản lòng với các ngôn ngữ chơi gôn. Giải thích về các thuật toán và triển khai được chào đón.



@KevinCruijssen Cảm ơn bạn! (Tôi đã không kiểm tra các câu hỏi liên quan đến tetromonoes)
Galen Ivanov

Câu trả lời:


12

APL (Dyalog Classic) , 54 53 50 byte

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

Hãy thử trực tuyến!

Tính một bất biến cho mỗi pentomino trong đầu vào: số đo (x, y) từ mỗi hình vuông của nó đến trọng tâm của nó, lấy abs (x) và abs (∆y), tính tổng các thành phần x và tách riêng y các thành phần, và nhân hai khoản tiền. Điều này cho 12 kết quả khác biệt. Sau đó, tìm chỉ số của bất biến pentomino trong bộ sưu tập được sắp xếp của tất cả các bất biến. Thay 0 bằng 'O', 1 bằng 'X', 2 bằng 'R', v.v.


Cảm ơn bạn đã trả lời nhanh và lời giải thích, +1 từ tôi! Tôi có nghĩa là giải pháp được in rõ ràng dưới dạng lưới 6x10. Tôi đã thay đổi suy giảm, xin vui lòng cập nhật giải pháp của bạn - Tôi xin lỗi vì sự bất tiện này.
Galen Ivanov

@GalenIvanov nhưng ... nó là một lưới . Các thử nghiệm của tôi xuất ra "ok" thay vì in kết quả - có lẽ điều đó quá khó hiểu?
ngn

Vâng, tôi đã bối rối bởi các bài kiểm tra.
Galen Ivanov

3
bây giờ họ in kết quả trước khi xác thực nó
ngn

4

Thạch , 37 byte

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

Một chương trình đầy đủ lấy danh sách các chuỗi (vì chúng ta phải in - nếu không thì xóa dấu Yvà bạn có một danh sách lấy danh sách các số hoặc ký tự trả về danh sách các danh sách các ký tự).

Hãy thử trực tuyến!

Làm sao?

Tôi tin rằng điều này hoạt động bằng cách sử dụng cùng một phân loại pentominos như giải pháp APL của ngn , mặc dù theo một cách hơi khác (tôi cũng không biết APL vì vậy tôi không chắc phương pháp tương tự như thế nào ngoài phân loại).

(Lưu ý rằng “æṂ⁾+’Œ?¤+78Ọchỉ tiết kiệm một byte “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

Ngôn ngữ Wolfram (Mathicala) , 103 byte

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

Lấy đầu vào là một danh sách các danh sách các ký tự.

Hãy thử trực tuyến!

Ý tưởng chính ở đây là đối với mỗi ký tự trong đầu vào, chúng ta tìm tọa độ nơi nó xuất hiện, lấy kurtosis và tính tổng tọa độ của nó. Điều này cho chúng ta một bất biến cho mỗi mảnh.

(Kurtosis là một số toán tử hầu như không liên quan từ thống kê - điều quan trọng là nó bất biến trong quá trình dịch, trong khi phản xạ và xoay có thể chuyển đổi thứ tự tọa độ nhiều nhất. Chúng tôi tổng hợp tọa độ, vì vậy bất biến không bao giờ thay đổi.)

Dù sao, ngoài bất biến kỳ lạ, giải pháp này cũng tương tự như các giải pháp khác: chúng tôi sắp xếp các ký tự và các mảnh theo từng bất biến, sau đó thay thế mỗi ký tự bằng ký tự tương ứng của "UPSWZVRTQXYO": các mảnh, được sắp xếp theo tổng kurtosis.

Cuối cùng, ""<>Riffle[...,"\n"]là mã in dưới dạng lưới.


+1 để biết một hoạt động mà tôi thậm chí chưa từng nghe đến và đưa nó vào sử dụng tốt
Black Owl Kai

Nỗ lực đầu tiên của tôi về một giải pháp đã Sort@Variancethay thế Tr@Kurtosis, và có lẽ nhiều người đã nghe nói về phương sai. Nhưng Tr@Variancekhông hoạt động vì một số ngũ giác (như P và X) có cùng tổng phương sai x và phương sai y. Vì vậy, tôi đã xem qua tài liệu của Mathematica cho một cái gì đó lạ hơn.
Misha Lavrov

2

Python 2 , 191 byte

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])

Hãy thử trực tuyến!

Thực hiện một chuỗi nhiều dòng với một dòng mới và thực hiện sáu cách hiểu danh sách lồng nhau.

Phiên bản Ungolfed

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.