Pentomino 6x10 normalizzatore soluzione


19

Come probabilmente ora, ci sono 2339 soluzioni per il pentomino in una griglia 6x10. Esistono diversi schemi di etichettatura per i 12 pentomini, due di questi sono mostrati nell'immagine qui sotto:

inserisci qui la descrizione dell'immagine

Credito d'immagine: Wikipedia

Ai fini del presente compito diremo che una soluzione pentomino normalizzata è una soluzione che utilizza il secondo schema di etichettatura (Conway).

Esempio:

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

Il pezzo con 5 quadrati di fila è indicato con lettere O, secondo lo schema. Lo stesso vale per tutti i pezzi.

Compito:

Data una soluzione al pentomino 6x10 in cui i pezzi sono etichettati con uno sheme casuale, normalizzalo in modo che tutti i pezzi siano etichettati nello schema di etichettatura di Conway. Devi riconoscere i pezzi e contrassegnare ogni quadrato di un particolare pezzo con il simbolo del pezzo.

Ingresso:

La soluzione da normalizzare, in qualsiasi formato che è conveniente per te, ad esempio:

  • Una stringa multilinea

  • Un elenco di stringhe

  • Un elenco di elenchi di caratteri

e così via

Produzione:

La stessa soluzione (tutte le posizioni e l'orientamento dei pezzi conservati), ma ogni pezzo etichettato secondo lo schema di etichettatura di Conway. Nota: l'output DEVE essere STAMPATO come una griglia di caratteri 6x10. Sono consentiti spazi e linee guida iniziali e finali. Puoi anche stampare uno spazio tra i caratteri (ma non le righe vuote), come nell'esempio sopra.

Casi test:

1. Ingresso:

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

Produzione:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2. Ingresso:

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

Produzione:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

Criteri vincenti:

Vince la soluzione più breve in byte in ogni lingua. Non lasciarti scoraggiare dalle lingue del golf. Le spiegazioni degli algoritmi e delle implementazioni sono benvenute.



@KevinCruijssen Grazie! (Non ho controllato le domande relative ai tetromoni)
Galen Ivanov,

Risposte:


12

APL (Dyalog Classic) , 54 53 50 byte

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

Provalo online!

Calcola un invariante per ciascun pentomino nell'input: misura (∆x, ∆y) da ciascuno dei suoi quadrati al suo centro di gravità, prendi abs (∆x) e abs (∆y), somma i componenti x e separatamente y componenti e moltiplica le due somme. Questo dà 12 risultati distinti. Quindi, trova l'indice di ogni invariante di pentomino nella raccolta ordinata di tutti gli invarianti. Sostituisci 0 con 'O', 1 con 'X', 2 con 'R', ecc.


Grazie per la risposta rapida e la spiegazione, +1 da parte mia! Volevo dire che la soluzione doveva essere esplicitamente stampata come una griglia 6x10. Ho cambiato la descrizione, ti preghiamo di aggiornare la tua soluzione - mi dispiace per l'inconveniente.
Galen Ivanov,

@GalenIvanov ma ... è una griglia . I miei test hanno prodotto "ok" invece di stampare il risultato - forse è troppo confuso?
ngn,

Sì, ero confuso dai test.
Galen Ivanov,

3
ora stampano il risultato prima di validarlo
ngn

4

Gelatina , 37 byte

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

Un programma completo che prende un elenco di stringhe (perché dobbiamo stampare - altrimenti rimuovi il finale Ye hai una monade che prende un elenco di elenchi di numeri o caratteri che restituisce un elenco di elenchi di caratteri).

Provalo online!

Come?

Credo che questo funzioni usando la stessa categorizzazione di pentominos della soluzione APL di ngn , anche se in modo leggermente diverso (non conosco nemmeno APL, quindi non sono sicuro di quanto il metodo sia simile alla categorizzazione).

(Nota che “æṂ⁾+’Œ?¤+78Ọè solo un salvataggio di un 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

Wolfram Language (Mathematica) , 103 byte

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

Accetta input come un elenco di elenchi di caratteri.

Provalo online!

L'idea principale qui è che per ogni personaggio nell'input, troviamo le coordinate in cui si verifica, prendiamo la curtosi e sommiamo le sue coordinate. Questo ci dà un invariante per ogni pezzo.

(La curtosi è un operatore per lo più irrilevante dalle statistiche - la chiave è che è invariante sotto la traduzione, mentre la riflessione e la rotazione potrebbero cambiare l'ordine delle coordinate al massimo. Sommiamo le coordinate, quindi l'invariante non cambia mai.)

Ad ogni modo, a parte lo strano invariante, questa soluzione è simile alle altre: ordiniamo i personaggi e i pezzi per ogni invariante, quindi sostituiamo ogni personaggio con il carattere corrispondente di "UPSWZVRTQXYO": i pezzi, ordinati per somma di kurtosi.

Infine, ""<>Riffle[...,"\n"]è il codice di stampa come griglia.


+1 per conoscere un'operazione di cui non ho mai nemmeno sentito parlare e metterla a frutto
Black Owl Kai

Il mio primo tentativo di soluzione era Sort@Varianceal posto di Tr@Kurtosis, e probabilmente più persone hanno sentito parlare di varianza. Ma Tr@Variancenon funziona perché diversi pentomino (come P e X) hanno la stessa somma di varianza x e varianza y. Così ho cercato nella documentazione di Mathematica qualcosa di più fantasioso.
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])

Provalo online!

Prende una stringa multilinea con una nuova riga finale e comprende sei comprensioni di elenchi nidificati.

Versione 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.