Scopri il modello di blocco Android


26

Diciamo che hai visto il tuo amico inserire la sua password nel proprio telefono Android. Non ricordi come hanno fatto il modello ma ricordi come appare il modello. Essendo l'amico preoccupato che sei, vuoi sapere quanto è sicura la loro password. Il tuo compito è calcolare tutti i modi in cui è possibile realizzare un modello particolare.

Come funzionano i modelli Android

I motivi sono disegnati su una griglia di nodi 3x3. In uno schema si visita una serie di nodi senza mai alzare il dito dallo schermo. Ogni nodo che visitano è collegato al nodo precedente da un bordo. Ci sono due regole da tenere a mente.

  • Non è possibile visitare alcun nodo più di una volta

  • Un bordo non può passare attraverso un nodo non visitato

Nota che, sebbene in genere sia molto difficile da eseguire e quindi non molto comune nelle combinazioni di blocchi Android reali, è possibile muoversi come un cavaliere . Cioè, è possibile spostarsi da un lato a un angolo non adiacente o viceversa. Ecco due esempi di modelli che utilizzano tale mossa:

Ecco una gif animata che viene eseguita.

Risolvere uno schema

Un modello tipico potrebbe assomigliare a questo:

Con un modello semplice come questo, ci sono due modi in cui due disegnano il modello. Puoi iniziare da una delle due estremità libere e viaggiare attraverso i nodi evidenziati verso l'altro. Mentre questo è vero per molti modelli, in particolare quelli che gli esseri umani impiegano in genere, questo non è vero per tutti i modelli.

Considera il seguente modello:

Esistono due soluzioni immediatamente riconoscibili. Uno a partire in alto a sinistra:

E uno a partire dal centro in basso:

Tuttavia, poiché una linea è autorizzata a passare attraverso un punto una volta che è già stata selezionata, esiste un motivo aggiuntivo che inizia in alto al centro:

Questo particolare modello ha 3 soluzioni ma i modelli possono avere ovunque tra 1 e 4 soluzioni [citazione necessaria] .

Ecco alcuni esempi di ciascuno:

1.

2.

3.

4.

I / O

Un nodo può essere rappresentato come numeri interi compresi tra zero e nove inclusi, i loro equivalenti di stringa o i caratteri da a a i (o da A a I). Ogni nodo deve avere una rappresentazione univoca da uno di questi set.

Una soluzione sarà rappresentata da un contenitore ordinato contenente le rappresentazioni dei nodi. I nodi devono essere ordinati nello stesso ordine in cui vengono passati.

Un modello sarà rappresentato da un contenitore non ordinato di coppie di nodi. Ogni coppia rappresenta un bordo che inizia collegando i due punti nella coppia. Le rappresentazioni dei motivi non sono uniche.

Prenderai una rappresentazione di pattern come input tramite metodi di input standard e otterrai tutte le possibili soluzioni che creano lo stesso pattern tramite metodi di output standard.

Puoi presumere che ogni input avrà almeno una soluzione e collegherà almeno 4 nodi.

Puoi scegliere di usare un contenitore ordinato al posto di uno non ordinato, se lo desideri o se sei costretto dalla selezione della lingua.

Casi test

Con i nodi disposti nel seguente schema:

0 1 2
3 4 5
6 7 8

Lascia che {...}sia un contenitore non ordinato, [...]sia un contenitore ordinato ed (...)essere una coppia.

I seguenti ingressi e uscite devono corrispondere

{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}

Un album imgur di tutti i casi di test come immagini può essere trovato qui . I motivi sono in soluzioni blu in rosso.

punteggio

Questo è il codice golf. Vince il minor numero di byte.


1
Bella domanda, mi chiedevo spesso lo stesso in privato. :)
ThreeFx

Risponderai a questo in Brainflak? Ora che sarebbe impressionante. : P
DJMcMayhem

Qual è uno schema che può essere risolto solo in un modo? Penso che tu ne abbia almeno 2 semplicemente invertendo banalmente le frecce.
ThreeFx,

@DJMcMayhem Ci proverò ma non posso fare nessuna promessa
Wheat Wizard

@ThreeFx Try questo per te stesso. Perché non è possibile fermarsi su un nodo che è già stato visitato, ma è possibile passare attraverso un modello può essere reso direzionale.
Mago del grano

Risposte:


3

Python 2.7, 493 430 byte

exec("L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]IL];S=sorted;F=lambda t:''.join(str(i)It)\ndef N(x):\n s=' '.join(F(S(i))Ix)\nIL:s=s.replace(i[::2],i[:2]+' '+i[1:])\n return S(set(s.split()))\ndef P(s):\n e=0\nIL:e|=-1<s.find(i[::2])<s.find(i[1])\n return[zip(s[:-1],s[1:]),L][e]\nx=N(input());print[F(i)I__import__('itertools').permutations({iI`x`if i.isdigit()})if x==N(P(F(i)))]".replace('I',' for i in '))

La versione a riga singola avvolge il programma in exec("...".replace('I',' for i in '))modo tale che tutti i for-loops e i generatori possano essere cortocircuitati con un singolo Ie risparmi 15 byte su questa versione più leggibile:

L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]for i in L]
S=sorted;F=lambda t:''.join(str(i)for i in t)
def N(x):
 s=' '.join(F(S(i))for i in x)
 for i in L:s=s.replace(i[::2],i[:2]+' '+i[1:])
 return S(set(s.split()))
def P(s):
 e=0
 for i in L:e|=-1<s.find(i[::2])<s.find(i[1])
 return[zip(s[:-1],s[1:]),L][e]
x=N(input())
print[F(i)for i in __import__('itertools').permutations({i for i in`x`if i.isdigit()})if x==N(P(F(i)))]

Il programma accetta l'input nel modo mostrato (ad es. {(1,4),(3,4),(5,4),(8,5)}) O come elenco di stringhe (ad es. ['14','34','54','85']) (O in altri formati compatibili con Python) e restituisce l'output come un elenco di stringhe. Quindi tecnicamente abbiamo un container ordinato di container ordinati.

La funzione Nnormalizza un modello in modo che due modelli possano essere facilmente confrontati. La normalizzazione ordina le coppie che indicano i bordi (quindi '02'invece di '20'), usa la sostituzione della stringa per espandere i bordi doppi (ad esempio '02'diventa '01 12'), divide i bordi in un set per rimuovere i duplicati e ordina il risultato.

La funzione Fappiattisce tuple di ints / stringhe in stringhe, in modo da poter normalizzare i percorsi prodotti in diversi modi.

L'elenco Lcontiene tutte le righe sullo schermo.

Quindi prendiamo ogni permutazione di tutte le cifre nel modello normalizzato e calcoliamo un percorso valido o Lse non valido (che non si normalizza mai nell'elenco di coppie come farebbero i percorsi reali) o un elenco di coppie che indica che i nodi dell'ordine vengono visitati se validi. Se questo si normalizza allo stesso modello, allora abbiamo una soluzione valida e la includiamo nell'elenco finale.

Il controllo principale necessario per convalidare una permutazione come stringa sè -1<s.find(i[::2])<s.find(i[1]), che rileva un errore con una linea i. Ad esempio con la riga '210'il codice rileva un errore se si '20'verifica (ovvero l'indice è maggiore di -1) e'1' verifica dopo di esso. Non dobbiamo preoccuparci che 1 non si verifichi perché l'1 verrà visualizzato nello schema normalizzato quando non era nell'input.


NOTA: so che sostituire str(i)for i in t con map(str,t) e {i for i in`x`if i.isdigit()} con set('012345678')&set(`x`) renderebbe il codice originale più breve, ma sarebbe comunque leggermente più lungo di quello sostituito I .


2
Falsepotrebbe essere 1<0e c'è uno spazio bianco inutile a F(i) for. +1.
Yytsi,

@TuukkaX Grazie, ho il viso palmo quando ho visto che me ne sono andato False.
Linus

['012','345','678','036','147','258','048','246']può essere '012 345 678 036 147 258 048 246'.split()'per -1 byte.
Mr. Xcoder,
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.