introduzione
In questa sfida, il tuo compito è scrivere un programma che decida se due alberi sono isomorfi. Un albero indica un grafico aciclico diretto in cui ogni nodo ha esattamente un bordo in uscita, tranne la radice, che non ne ha. Due alberi sono isomorfi se uno può essere trasformato nell'altro rinominando i nodi. Ad esempio, i due alberi (dove ogni bordo punta verso l'alto)
0 0
/|\ /|\
1 3 4 1 2 5
|\ /|
2 5 3 4
sono facilmente visti come isomorfi.
Codifichiamo un albero come un elenco L
di numeri interi non negativi nel modo seguente. La radice dell'albero ha un'etichetta 0
e ha anche dei nodi 1,2,...,length(L)
. Ogni nodo i > 0
ha un fronte in uscita verso L[i]
(usando l'indicizzazione basata su 1). Ad esempio, l'elenco (con gli indici indicati sotto gli elementi)
[0,0,1,3,2,2,5,0]
1 2 3 4 5 6 7 8
codifica l'albero
0
/|\
1 2 8
| |\
3 5 6
| |
4 7
Ingresso
I tuoi input sono due elenchi di numeri interi non negativi, forniti nel formato nativo o nella tua lingua. Codificano due alberi nel modo sopra specificato. Puoi assumere le seguenti condizioni al riguardo:
- Non sono vuoti.
- Hanno la stessa lunghezza.
- Ogni elenco
L
soddisfaL[i] < i
per tutti gli indici (basati su 1)i
.
Produzione
La tua produzione deve essere un valore veritiero se gli alberi sono isomorfi e un valore falso in caso contrario.
Regole e punteggio
È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard. Non ci sono limiti di tempo, ma gli built-in che decidono l'isomorfismo dell'albero o del grafico non sono consentiti.
Casi test
Istanze sincere
[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]
Casi falsi
[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]