Penormalkan solusi Pentomino 6x10

19

Seperti yang Anda paling mungkin sekarang, ada 2339 solusi untuk teka-teki pentomino dalam kisi 6x10. Ada skema pelabelan yang berbeda untuk 12 pentomino, dua di antaranya ditunjukkan pada gambar di bawah ini:

masukkan deskripsi gambar di sini

Kredit gambar: Wikipedia

Untuk keperluan tugas saat ini kami akan mengatakan bahwa solusi pentomino yang dinormalisasi adalah solusi yang menggunakan skema pelabelan kedua (Conway's).

Contoh:

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

Bagian dengan 5 kotak berturut-turut dilambangkan dengan huruf O, sesuai dengan skema. Hal yang sama berlaku untuk semua bagian.

Tugas:

Diberikan solusi untuk pentomino 6x10 di mana potongan diberi label dengan sheme acak, menormalkannya sehingga semua potongan diberi label dalam skema label Conway. Anda perlu mengenali potongan-potongan itu dan menandai setiap kotak dari potongan tertentu dengan simbol dari potongan itu.

Memasukkan:

Solusi yang akan dinormalisasi, dalam format apa pun yang nyaman bagi Anda, misalnya:

  • String multiline

  • Daftar string

  • Daftar daftar karakter

dan seterusnya

Keluaran:

Solusi yang sama (semua posisi dan orientasi potongan dipertahankan), tetapi setiap bagian diberi label sesuai dengan skema pelabelan Conway. Catatan: Output HARUS DICETAK sebagai kotak karakter 6x10. Jalur dan spasi baris baru dan tertinggal diizinkan. Anda juga dapat mencetak spasi di antara karakter (tetapi bukan baris kosong), seperti pada contoh di atas.

Kasus uji:

1. Masukan:

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

Keluaran:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2. Input:

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

Keluaran:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

Kriteria menang:

Solusi terpendek dalam byte di setiap bahasa menang. Jangan berkecil hati dengan bahasa golf. Penjelasan algoritma dan implementasi dipersilahkan.

Galen Ivanov
sumber
@KevinCruijssen Terima kasih! (Saya tidak memeriksa pertanyaan yang terkait dengan tetromon)
Galen Ivanov

Jawaban:

12

APL (Dyalog Classic) , 54 53 50 byte

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

Cobalah online!

Hitung invarian untuk setiap pentomino di input: ukur (∆x, ∆y) dari masing-masing kotak ke pusat gravitasinya, ambil abs (∆x) dan abs (∆y), jumlah komponen x dan secara terpisah y komponen, dan kalikan dua jumlah. Ini memberikan 12 hasil berbeda. Kemudian, cari indeks masing-masing invarian pentomino dalam koleksi yang diurutkan dari semua invarian. Ganti 0 dengan 'O', 1 dengan 'X', 2 dengan 'R', dll.

ngn
sumber
Terima kasih atas jawaban cepat dan penjelasannya, +1 dari saya! Maksud saya solusi dicetak secara eksplisit sebagai kisi 6x10. Saya mengubah deskripsi, perbarui solusi Anda - Saya minta maaf atas ketidaknyamanan ini.
Galen Ivanov
@ GalenIvanov tapi ... itu adalah kotak . Hasil tes saya "ok" daripada mencetak hasilnya - mungkin itu terlalu membingungkan?
ngn
Ya, saya bingung dengan tes.
Galen Ivanov
3
sekarang mereka mencetak hasilnya sebelum memvalidasi itu
ngn
4

Jelly , 37 byte

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

Program lengkap mengambil daftar string (karena kita harus mencetak - jika tidak menghapus trailing Ydan Anda memiliki monad mengambil daftar daftar angka atau karakter yang mengembalikan daftar daftar karakter).

Cobalah online!

Bagaimana?

Saya percaya ini bekerja menggunakan kategorisasi yang sama dari pentominos sebagai solusi APL ngn , meskipun dengan cara yang sedikit berbeda (saya juga tidak tahu APL jadi saya tidak yakin seberapa mirip metode ini di luar kategorisasi).

(Perhatikan bahwa “æṂ⁾+’Œ?¤+78Ọhanya satu byte yang disimpan “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
Jonathan Allan
sumber
2

Bahasa Wolfram (Mathematica) , 103 byte

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

Mengambil input sebagai daftar daftar karakter.

Cobalah online!

Gagasan utama di sini adalah bahwa untuk setiap karakter dalam input, kami menemukan koordinat tempat terjadinya, mengambil kurtosis, dan menjumlahkan koordinatnya. Ini memberi kita invarian untuk setiap bagian.

(Kurtosis adalah beberapa operator yang sebagian besar tidak relevan dari statistik - kuncinya adalah bahwa itu invarian di bawah terjemahan, sedangkan refleksi dan rotasi mungkin paling banyak mengubah urutan koordinat. Kami menjumlahkan koordinat, sehingga invarian tidak pernah berubah.)

Pokoknya, terlepas dari invarian aneh, solusi ini mirip dengan yang lain: kami mengurutkan karakter dan potongan dengan masing-masing invarian, lalu mengganti setiap karakter dengan karakter yang sesuai "UPSWZVRTQXYO": potongan, diurutkan berdasarkan jumlah kurtosis.

Akhirnya, ""<>Riffle[...,"\n"]adalah kode print-as-a-grid.

Misha Lavrov
sumber
+1 untuk mengetahui operasi yang bahkan tidak pernah saya dengar dan gunakan dengan baik
Black Owl Kai
Upaya pertama saya pada solusi sudah Sort@Varianceada Tr@Kurtosis, dan mungkin lebih banyak orang telah mendengar varian. Tetapi Tr@Variancetidak berfungsi karena beberapa pentomino (seperti P dan X) memiliki jumlah x-varians dan y-varians yang sama. Jadi saya mencari dokumentasi yang lebih menarik dari dokumentasi Mathematica.
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])

Cobalah online!

Mengambil string multi-line dengan baris baru yang tertinggal dan melakukan enam daftar pemahaman bersarang.

Versi Tidak Serigala

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)
Black Owl Kai
sumber