L'obiettivo di questa sfida è dato un grafico aciclico diretto finito (DAG), determinare se il grafico è una riduzione transitiva .
Una breve spiegazione di cosa sono un DAG e riduzioni transitive:
Un DAG è un grafico con bordi diretti (cioè è possibile viaggiare solo in una direzione su quel bordo) in modo tale che dato qualsiasi nodo iniziale sul grafico, è impossibile tornare al nodo iniziale (cioè non ci sono cicli).
Dato qualsiasi nodo iniziale, se è possibile viaggiare verso un altro nodo finale nel grafico tramite qualsiasi numero positivo arbitrario di bordi, quel nodo finale viene definito raggiungibile dal nodo iniziale. In un DAG generale, potrebbero esserci più percorsi che possono essere presi da un nodo iniziale a un nodo finale di destinazione. Ad esempio, prendi questo grafico a diamante:
Per accedere al nodo D
da A
, è possibile prendere il percorso A->B->D
o A->C->D
. Pertanto, D
è raggiungibile da A
. Tuttavia, non esiste alcun percorso che può essere preso per arrivare al nodo a B
partire dal nodo C
. Pertanto, il nodo B
non è raggiungibile dal nodo C
.
Definire la raggiungibilità del grafico come elenco di nodi raggiungibili per ogni nodo iniziale nel grafico. Quindi, per lo stesso esempio di grafico a diamante, la raggiungibilità è:
A: [B, C, D]
B: [D]
C: [D]
D: []
Un altro grafico che ha la stessa raggiungibilità del grafico sopra è mostrato di seguito:
Tuttavia, questo secondo grafico ha più spigoli rispetto al grafico originale. La riduzione transitiva di un grafico è un grafico con il minor numero di spigoli e la stessa raggiungibilità del grafico originale. Quindi il primo grafico è la riduzione transitiva del secondo.
Per un DAG finito, la riduzione transitiva è garantita ed è unica.
Ingresso
L'input è un "elenco di elenchi", in cui l'elenco esterno ha la lunghezza del numero di vertici e ogni elenco interno è la lunghezza del numero di spigoli che escono dal nodo associato e contiene gli indici dei nodi di destinazione. Ad esempio, un modo per descrivere il primo grafico sopra sarebbe (supponendo l'indicizzazione in base zero):
[[1, 2], [3], [3], []]
È possibile iniziare l'indicizzazione del primo nodo con qualsiasi valore intero arbitrario (ad es. Indicizzazione basata su 0 o 1).
L'ingresso può provenire da qualsiasi sorgente d'ingresso desiderata (stdio, parametro funzione, ecc.). Sei libero di scegliere il formato di input esatto purché non vengano fornite ulteriori informazioni. Ad esempio, se si desidera ottenere input da stdio, è possibile che ogni riga sia un elenco di spigoli per il nodo associato. Ex.:
1 2
3
3
'' (blank line)
Gli indici in ciascun elenco di adiacenza non sono necessariamente ordinati e potrebbero esserci più spigoli che collegano due nodi (es .:) [[1,1],[]]
. Si può presumere che il grafico di input sia debolmente connesso e non contenga cicli (ovvero sia un DAG).
Produzione
L'output è veritiero se il DAG di input specificato è una riduzione transitiva e un valore falso in caso contrario. Questo può essere per qualsiasi sink desiderato (stdio, valore di ritorno, parametro di output, ecc.)
Esempi
Tutti gli esempi utilizzano l'indicizzazione basata su 0.
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
punteggio
Questo è il codice golf; vince il codice più piccolo in byte. Il codice dovrebbe essere completato in un ragionevole lasso di tempo (massimo 10 minuti su qualunque hardware tu abbia). Si applicano scappatoie standard. È possibile utilizzare qualsiasi componente incorporato desiderato.