Advent Challenge 6: Transport Dock Relabeling!

9

<< Zurück Weiter >>

Dank der PPCG-Community gelang es dem Weihnachtsmann, seine Geschenke in der richtigen Reihenfolge für den Einzug in das Transportdock zu sortieren. Leider sind die Schilder des Transportdocks kaputt, sodass er nicht weiß, wo er alle Geschenke aufbewahren soll! Die Geschenke sind alle gruppiert und nicht nach ihren Sortimenten, was der Weihnachtsmann zugibt, wäre eine bessere Idee gewesen.

Bestimmen Sie nun anhand der Geschenke in der sortierten Reihenfolge alle möglichen Konfigurationen für den minimalen Bereich, die dazu führen würden, dass das Geschenk in der richtigen Reihenfolge vorliegt. Das heißt, finden Sie alle Minimalbereichskonfigurationen so, dass das Sortieren der Geschenke gemäß dem Algorithmus in Herausforderung Nr. 5 die Reihenfolge nicht ändert.

Herausforderung

Eine Minimalbereichskonfiguration ist eine Liste von Bereichen, sodass die Bereiche jeweils so klein wie möglich sind. Das heißt, wenn ein Bereich für eine bestimmte Teilmenge von Geschenken bestimmt ist, müssen das Minimum und das Maximum des Bereichs mit dem der Teilmenge übereinstimmen. Mit anderen Worten, wenn Sie einen Bereich in der Abdeckung verkleinern, wird diese nicht mehr abgedeckt.

Die Herausforderung besteht darin, alle möglichen Minimalbereichskonfigurationen zu finden, die für die gegenwärtigen Größen gelten würden. Nehmen wir ein Beispiel:[3, 1, 2, 5, 4, 7, 6]

Es gibt einen trivialen Fall, der darin besteht, den Bereich der gesamten vorliegenden Konfiguration zu erfassen. In diesem Fall [[1, 7]]wäre eine Lösung.

Bei Beispielen mit eindeutigen Elementen wäre ein weiterer trivialer Fall [[3], [1], [2], [5], [4], [7], [6]](da die Bereiche nicht bestellt werden müssen).

In diesem Beispiel sehen wir das auch [[1, 3], [4, 7]]und [[1, 3], [4, 5], [6, 7]]würden funktionieren, ebenso wie [[1, 3], [5], [4], [6, 7]]und [[1, 3], [4, 5], [7], [6]].

Die endgültige Antwort für [3, 1, 2, 5, 4, 7, 6]wäre [[[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]]].

Formatierungsspezifikationen

Die Eingabe wird als flache Liste positiver Ganzzahlen innerhalb des angemessenen unterstützten Zahlenbereichs Ihrer Sprache in einem angemessenen Format angegeben. Die Eingabe kann doppelte Elemente enthalten. Die Ausgabe sollte als 3D-Liste positiver Ganzzahlen in einem angemessenen Format angegeben werden.

Jeder Bereich in der Ausgabe (die an der zweiten Schicht) kann entweder als dargestellt werden [min, max], [num]wenn es ein Einzelwert - Bereich oder als den gesamten Bereich selbst, sondern ihr Ausgabeformat müssen konsistent sein. Bitte geben Sie an, ob Sie ein etwas anderes sinnvolles Ausgabeformat verwenden möchten.

Doppelte Werte müssen durch einen einzelnen Bereich in der Ausgabe abgedeckt werden. Das heißt, keine zwei Bereiche in der Ausgabe dürfen sich überlappen.

Ihre Lösung kann die Bereiche in beliebiger Reihenfolge zurückgeben, und dies muss nicht deterministisch sein.

Regeln

  • Standardschlupflöcher gelten
  • Dies ist also gewinnt die kürzeste Antwort in Bytes
  • Es wird keine Antwort akzeptiert

Testfall für eine Liste mit doppelten Elementen:

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

Referenzimplementierung

Der Header ist der Link.

Hinweis: Ich habe mich für diese Herausforderungsserie von Advent Of Code inspirieren lassen . Ich habe keine Verbindung zu dieser Site

Eine Liste aller Herausforderungen in der Serie finden Sie im Abschnitt "Verknüpft" der ersten Herausforderung hier .

Viel Spaß beim Golfen!

HyperNeutrino
quelle

Antworten:

3

Mathematica, 106 Bytes

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


Probieren Sie es online aus!

Martin hat 16 Bytes gespeichert

J42161217
quelle
3

Brachylog , 17 16 Bytes

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

Funktioniert auch mit Listen mit Duplikaten. Bereiche werden durch die Liste der darin enthaltenen Elemente dargestellt. Probieren Sie es online aus!

Erläuterung

Die Idee ist, die Liste in Blöcke zu unterteilen und die Blöcke in Bereiche umzuwandeln, um dann sicherzustellen, dass sie sich nicht überlappen.

{~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.
Zgarb
quelle
1

JavaScript (ES6), 166 164 Byte

Bearbeiten: aktualisierte Version, die jetzt Duplikate unterstützt

Druckt die Ergebnisse im Format [min, max] direkt auf die Konsole .

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)

Testfälle

Arnauld
quelle
0

Python 2 , 179 Bytes

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]]

Probieren Sie es online aus!

Gibt eine Liste aller Bereiche aus.

Stark inspiriert von der Referenzimplementierung.

Erstellt alle Partitionen und dann Min / Max-Bereiche für jede Partition. Eine Liste von Bereichen ist gültig, wenn kein Wert mehr als einmal in der Liste angezeigt wird.


sum(l,[]) reduziert eine Liste von Listen und ermöglicht mir, nach Duplikaten zu suchen:

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

Pyth , 17 Bytes

f{IsTmm}hSkeSkd./

Probieren Sie es hier aus!

Das ist jetzt viel besser. Gibt die gesamten Bereiche aus. Siehe den Versionsverlauf für die vorherige Version (mit erstaunlichen 31 Bytes).

Wie es funktioniert

f {IsTmm} hSkeSkd./ ~> Vollständiges Programm.

               ./ ~> Partition auflisten.
     m ~> Karte mit einer Variablen d.
      md ~> Abbildung über d mit einer Variablen k.
        hSk ~> Das Minimum von k.
           eSk ~> Das Maximum von k.
       } ~> Inklusive ganzzahliger Bereich.
f ~> Filtern Sie diese ...
   sT ~> Welche, wenn sie abgeflacht sind,
 {I ~> Sind über die Deduplizierung unveränderlich.
Mr. Xcoder
quelle