Advent Challenge 6: Transport Dock Relabeling!


9

<< Precedente Successivo >>

Grazie alla comunità PPCG, Babbo Natale è riuscito a ordinare i suoi regali nell'ordine corretto per trasferirsi nel molo di trasporto. Sfortunatamente, i segni del molo di trasporto sono rotti, quindi non sa dove mettere tutti i regali! I regali sono tutti raggruppati e non secondo le loro gamme, che Babbo ammette sarebbe stata un'idea migliore.

Ora, dati i presenti nell'ordine ordinato, determinare tutte le possibili configurazioni di intervallo minimo che porterebbero il presente nell'ordine corretto. Ossia, trova tutte le configurazioni di intervallo minimo in modo tale che l'ordinamento dei regali secondo l'algoritmo in Challenge # 5 non cambierebbe l'ordine.

Sfida

Una configurazione di intervallo minima è un elenco di intervalli in modo che ciascuno di essi sia il più piccolo possibile. Cioè, se un intervallo è designato per coprire un sottoinsieme specifico di regali, allora il minimo e il massimo dell'intervallo devono essere uguali a quelli del sottoinsieme. In altre parole, la riduzione di qualsiasi intervallo nella copertina causerebbe che non sia più una copertura.

La sfida è trovare tutte le possibili configurazioni di portata minima che si applicherebbero alle dimensioni attuali. Facciamo un esempio:[3, 1, 2, 5, 4, 7, 6]

C'è un caso banale, che è quello di prendere la portata dell'intera configurazione attuale. In questo caso, [[1, 7]]sarebbe una soluzione.

Per esempi con elementi unici, un altro caso banale sarebbe [[3], [1], [2], [5], [4], [7], [6]](perché non è necessario ordinare gli intervalli).

Per questo esempio, lo vediamo anche [[1, 3], [4, 7]]e [[1, 3], [4, 5], [6, 7]]funzionerebbe, così come [[1, 3], [5], [4], [6, 7]]e [[1, 3], [4, 5], [7], [6]].

La risposta finale per [3, 1, 2, 5, 4, 7, 6]sarebbe [[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]].

Specifiche di formattazione

L'input verrà fornito come un elenco semplice di numeri interi positivi all'interno dell'intervallo di numeri supportato ragionevole della tua lingua in qualsiasi formato ragionevole. L'input può contenere elementi duplicati. L'output dovrebbe essere fornito come un elenco 3D di numeri interi positivi in ​​qualsiasi formato ragionevole.

Ogni intervallo nell'output (che si trova al secondo livello) può essere rappresentato come [min, max], [num]se si tratta di un intervallo a valore singolo o come l'intero intervallo stesso, ma il formato di output deve essere coerente. Specificare se si desidera utilizzare un formato di output ragionevole leggermente diverso.

I valori duplicati devono essere coperti da un singolo intervallo nell'output; vale a dire, non è possibile sovrapporre due intervalli nell'output.

La soluzione può restituire gli intervalli in qualsiasi ordine e questo non deve essere deterministico.

Regole

  • Si applicano scappatoie standard
  • Questo è quindi vince la risposta più breve in byte
  • Nessuna risposta sarà accettata

Caso di prova per un elenco con elementi duplicati:

2 3 2 4 -> [[[2, 3], [4]], [[2, 4]]]

Implementazione di riferimento

L'intestazione è il collegamento.

Nota: ho tratto ispirazione per questa serie di sfide da Advent Of Code . Non ho affiliazione con questo sito

Puoi vedere un elenco di tutte le sfide della serie guardando la sezione "Linked" della prima sfida qui .

Buon golf!

Risposte:


3

Mathematica, 106 byte

sSelect[MinMax/@s~TakeList~#&/@Join@@Permutations/@IntegerPartitions@Tr[1^s],Unequal@@Join@@Range@@@#&]


Provalo online!

Martin ha salvato 16 byte


3

Brachylog , 17 16 byte

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

Funziona anche su liste con duplicati. Gli intervalli sono rappresentati dagli elenchi di elementi che contengono. Provalo online!

Spiegazione

L'idea è quella di spezzare l'elenco in blocchi e trasformare i blocchi in intervalli, quindi verificare che non si sovrappongano.

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

JavaScript (ES6), 166 164 byte

Modifica: versione aggiornata che ora supporta i duplicati

Stampa i risultati direttamente sulla console nel formato [min, max] .

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

Casi test


0

Python 2 , 179 byte

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

Provalo online!

Emette un elenco di intervalli completi.

Fortemente ispirato dall'implementazione di riferimento.

Crea tutte le partizioni, quindi intervalli di min / max per ogni partizione. Un elenco di intervalli è valido se nessun valore appare più di una volta nell'elenco.


sum(l,[]) appiattisce un elenco di elenchi e mi consente di verificare la presenza di duplicati:

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Pyth , 17 byte

f{IsTmm}hSkeSkd./

Provalo qui!

Ora va molto meglio. Emette tutti gli intervalli. Vedi la cronologia delle revisioni per la versione precedente (a 31 byte sconcertanti).

Come funziona

f {IsTmm} hSkeSkd./ ~> Programma completo.

               ./ ~> Elenco partizioni.
     m ~> Mappa usando una variabile d.
      md ~> Mappa su d usando una variabile k.
        hSk ~> Il minimo di k.
           eSk ~> Il massimo di k.
       } ~> Intervallo intero compreso.
f ~> Filtra quelli ...
   sT ~> Che, quando appiattito,
 {I ~> Sono invarianti rispetto alla deduplicazione.
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.