Нормалізатор розчину Pentomino 6x10


19

Як ви, мабуть, зараз, у сітці 6x10 є 2339 варіантів головоломки pentomino. Для 12 пентоміно є різні схеми маркування, дві з них показані на зображенні нижче:

введіть тут опис зображення

Кредит зображення: Вікіпедія

Для цілей поточного завдання ми скажемо, що нормалізований розчин пентоміно - це рішення, яке використовує другу схему маркування (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

Шматок з 5 квадратами підряд позначається літерами Oза схемою. Те саме стосується всіх творів.

Завдання:

Враховуючи рішення пентоміно 6х10, в якому шматки позначені випадковою схемою, нормалізуйте його так, щоб усі шматки були позначені у схемі маркування Конвея. Вам потрібно розпізнати шматки та позначити кожен квадрат певного твору символом шматка.

Вхід:

Рішення потрібно нормалізувати у будь-якому зручному для вас форматі, наприклад:

  • Багаторядковий рядок

  • Список рядків

  • Список списків символів

і так далі

Вихід:

Це ж рішення (всі позиції та орієнтація шматочків збережені), але кожен шматок позначений відповідно до схеми маркування 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 Дякую! (Я не перевіряв на питання, пов'язані з тетромононами)
Гален Іванов

Відповіді:


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 від мене! Я мав на увазі рішення бути явно надрукованим у вигляді сітки 6х10. Я змінив десерт, будь ласка, оновіть ваше рішення - вибачте за незручності.
Гален Іванов

@GalenIvanov але ... це сітка . Мої тести виводять "нормально", а не друкувати результат - можливо, це занадто заплутано?
ngn

Так, мене збентежили тести.
Гален Іванов

3
тепер вони друкують результат перед його підтвердженням
1818

4

Желе , 37 байт

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

Повна програма зі списком рядків (тому що ми повинні надрукувати - інакше видаліть трейлінг, Yі у вас є монада, яка бере список списків чисел або символів, який повертає список списків символів).

Спробуйте в Інтернеті!

Як?

Я вважаю, що це працює, використовуючи ту саму категоризацію pentominos, що і APL-рішення Ngn , хоча і дещо іншим чином (я також не знаю APL, тому я не впевнений, наскільки подібний метод є поза категоризацією).

(Зверніть увагу, що “æṂ⁾+’Œ?¤+78Ọце лише однобайтове збереження “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

Мова Вольфрама (Mathematica) , 103 байти

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

Вводиться як список списків символів.

Спробуйте в Інтернеті!

Основна ідея тут полягає в тому, що для кожного символу на вході ми знаходимо координати, де він відбувається, беремо куртоз і підсумовуємо його координати. Це дає нам інваріант для кожного твору.

(Куртоз є деяким, головним чином, неактуальним оператором зі статистики. Ключовим є те, що він є інваріантним під перекладом, тоді як відображення та обертання можуть змінювати порядок координат максимум. Ми підсумовуємо координати, тому інваріант ніколи не змінюється.)

У будь-якому випадку, крім дивного інваріанта, це рішення подібне до інших: ми сортуємо символи та фігури за кожним інваріантом, а потім замінюємо кожен символ відповідним символом "UPSWZVRTQXYO": шматочки, відсортовані за сумою куртозу.

Нарешті, ""<>Riffle[...,"\n"]це код друку як сітки.


+1 за те, що я знав операцію, про яку я навіть ніколи не чув і не використовував її
Чорна сова Кай

Моя перша спроба рішення була Sort@Varianceна місці Tr@Kurtosis, і, напевно, більше людей чули про розбіжність. Але Tr@Varianceце не працює, оскільки кілька пентоміно (такі як P і X) мають однакову суму x-дисперсії та y-дисперсії. Тому я переглянув документацію Mathematica для чогось більш фантастичного.
Міша Лавров

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

Спробуйте в Інтернеті!

Візьме багаторядковий рядок із заднім рядком та робить шість вкладених списків.

Безгольова версія

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.