Pentomino 6x10 Çözelti Normalleştirici


19

Muhtemelen şimdi olduğu gibi, 6x10 ızgarada pentomino bulmacasına 2339 çözüm var. 12 pentomino için farklı etiketleme şemaları vardır, bunlardan ikisi aşağıdaki resimde gösterilmiştir:

resim açıklamasını buraya girin

Resim kredisi: Wikipedia

Mevcut görevin amaçları doğrultusunda, normalize edilmiş bir pentomino çözeltisinin ikinci etiketleme şemasını (Conway's) kullanan bir çözüm olduğunu söyleyeceğiz.

Misal:

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

Arka arkaya 5 kare olan parça O, şemaya göre harflerle gösterilir . Aynı şey tüm parçalar için de geçerlidir.

Görev:

Parçaların rastgele bir şema ile etiketlendiği 6x10 pentominoya bir çözüm verildiğinde, tüm parçalar Conway'in etiketleme şemasında etiketlenecek şekilde normalleştirin. Parçaları tanımanız ve belirli bir parçanın her karesini parçanın simgesiyle işaretlemeniz gerekir.

Giriş:

Sizin için uygun herhangi bir biçimde normalleştirilecek çözüm, örneğin:

  • Çok satırlı bir dize

  • Dizelerin bir listesi

  • Karakter listelerinin listesi

ve bunun gibi

Çıktı:

Aynı çözüm (tüm parçaların konumları ve yönü korunur), ancak her parça Conway'in etiketleme şemasına göre etiketlenir. Not: Çıktı 6x10 karakterlik bir karakter dizisi olarak YAZDIRILMALIDIR. Baştaki ve sondaki satır ve boşluklara izin verilir. Yukarıdaki örnekte olduğu gibi, karakterler arasında boşluk da yazabilirsiniz (boş satırlar değil).

Test senaryoları:

1. Giriş:

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

Çıktı:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2. Giriş:

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

Çıktı:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

Kazanma kriterleri:

Her dilde bayt cinsinden en kısa çözüm kazanır. Golf dillerinden vazgeçmeyin. Algoritmaların ve uygulamaların açıklamaları açıktır.



@KevinCruijssen Teşekkür ederiz! (Tetromono ile ilgili soruları kontrol etmedim)
Galen Ivanov

Yanıtlar:


12

APL (Dyalog Klasik) , 54 53 50 bayt

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

Çevrimiçi deneyin!

Girişteki her pentomino için bir değişmez hesaplayın: karelerinin her birinden ağırlık merkezine kadar ölçün (∆x, ∆y), abs (∆x) ve abs (∆y) alın, x bileşenlerini toplayın ve ayrı olarak y ekleyin ve iki toplamı çarpın. Bu 12 farklı sonuç verir. Ardından, tüm değişmezlerin sıralanmış koleksiyonunda her bir pentomino değişmezinin dizinini bulun. 0 'O', 1 'X', 2 'R', vb. İle değiştirin .


Hızlı cevap ve açıklama için teşekkürler, benden +1! Çözümün açıkça 6x10 ızgara olarak basılacağı anlamına geliyordu. Çözülmeyi değiştirdim, lütfen çözümünüzü güncelleyin - Rahatsızlık için özür dilerim.
Galen Ivanov

@ GalenIvanov ama ... bu bir ızgara . Sonuçlarımı yazdırmak yerine testlerim "tamam" çıktı - belki bu çok kafa karıştırıcı?
ngn

Evet, testlerden kafam karıştı.
Galen Ivanov

3
şimdi doğrulamadan önce sonucu yazdırıyorlar
ngn

4

Jöle , 37 bayt

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

Dizelerin bir listesini alan tam bir program (yazdırmamız gerektiğinden - aksi takdirde Yizlemeyi kaldırmanız gerekir ve karakter listelerinin listesini döndüren sayı veya karakter listelerini içeren bir monadınız vardır).

Çevrimiçi deneyin!

Nasıl?

Ben bu biraz farklı bir şekilde olsa da, ngn APL çözümü ile aynı pentominos kategorisi kullanarak çalışır inanıyorum (ben de APL bilmiyorum, bu yüzden yöntem kategorizasyon ötesinde ne kadar benzer olduğundan emin değilim).

(Bunun “æṂ⁾+’Œ?¤+78Ọyalnızca bir baytlık tasarruf olduğunu unutmayın “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

Wolfram Dili (Mathematica) , 103 bayt

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

Girişi, karakter listelerinin bir listesi olarak alır.

Çevrimiçi deneyin!

Buradaki ana fikir, girişteki her karakter için, gerçekleştiği yerde koordinatları bulmamız, basıklığı almamız ve koordinatlarını toplamamızdır. Bu bize her parça için bir değişmezlik verir.

(Basıklık, istatistiklerden çoğunlukla önemsiz bir operatördür - anahtar, çeviri altında değişmezken, yansıma ve döndürme en fazla koordinat sırasını değiştirebilir. Koordinatları toplarız, böylece değişmez asla değişmez.)

Her neyse, garip değişmezden ayrı olarak, bu çözüm diğerlerine benzer: karakterleri ve parçaları her değişmeze göre sıralıyoruz, ardından her karakteri karşılık gelen karakterin yerine "UPSWZVRTQXYO"koyuyoruz: adet, basıklık toplamına göre sıralanmış parçalar.

Son olarak, ""<>Riffle[...,"\n"]ızgara olarak yazdır kodudur.


Hiç duymadığım bir operasyonu bilmek ve iyi kullanmak için +1
Black Owl Kai

Bir çözüme Benim ilk girişimi vardı Sort@Varianceyerine Tr@Kurtosisve muhtemelen daha fazla insan Varyans duymuş. Ancak Tr@Varianceişe yaramaz çünkü birkaç pentomino (P ve X gibi) x-varyans ve y-varyansın toplamına sahiptir. Bu yüzden Mathematica'nın daha meraklı bir şey için belgelerine baktım.
Misha Lavrov

2

Python 2 , 191 bayt

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

Çevrimiçi deneyin!

Sondaki satırsonu olan çok satırlı bir dize alır ve altı iç içe liste kavrama yapar.

Ungolfed Sürümü

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.