Entscheiden Sie über das Vorhandensein von Gesamtbestellungen

8

In dieser Aufgabe betrachten wir Arrays positiver Ganzzahlen wie diese:

3 18 321 17 4 4 51 1 293 17

Die Eingabe umfasst ein Paar solcher Arrays mit beliebiger, möglicherweise unterschiedlicher positiver Länge. Bestimmen Sie, ob eine Gesamtordnung ≤ XN × N , wobei N die Menge positiver Ganzzahlen ist, so existiert, dass beide Eingabearrays in Bezug auf ≤ X in Ordnung sind . Beachten Sie, dass (A ≤ X B ∧ B ≤ X A) ↔ A = B gelten muss, dh zwei Zahlen werden unter ≤ X genau dann als gleich angesehen, wenn sie dieselbe Zahl sind.

Zum Beispiel, wenn die Eingabe das Array-Paar war

7 2 1 1 4 12 3
9 8 7 2 5 1

dann solltest du herausfinden, ob eine Gesamtordnung ≤ X existiert, so dass

7 ≤ X 2 ≤ X 1 ≤ X 1 ≤ X 4 ≤ X 12 ≤ X 3

und

9 ≤ X 8 ≤ X 7 ≤ X 2 ≤ X 5 ≤ X 1.

Ihre Übermittlung kann eine Unterroutine oder ein Programm sein, das / das zwei Arrays (wie oben angegeben) von Eingaben auf implementierungsdefinierte Weise empfängt, berechnet, ob eine Gesamtreihenfolge ≤ X vorhanden ist , die die oben genannten Anforderungen erfüllt, und einen Wert zurückgibt, der "Ja" oder einen anderen darstellt Wert für "Nr." Die Auswahl dieser Werte ist beliebig, bitte dokumentieren Sie sie.

Sie können davon ausgehen, dass die Eingabearrays jeweils nicht mehr als 2 15 - 1 Elemente enthalten und dass jedes ihrer Elemente im Bereich von 1 bis einschließlich 2 15 - 1 liegt. Möglicherweise müssen alle Arrays durch einen konstanten Sentinel außerhalb des oben genannten Bereichs wie 0 abgeschlossen werden. Bitte geben Sie an, welcher Sentinel benötigt wird. Sie können die Längen der Arrays als zusätzliche Eingabe benötigen, wenn die Länge nicht aus den Arrays selbst abgeleitet werden kann (z. B. in Sprachen wie C). Zusätzlich zum Verbot von Standardschlupflöchern dürfen Sie keine topologischen Sortierroutinen verwenden.

Diese Herausforderung ist Code Golf. Die Einreichung mit der geringsten Anzahl von Zeichen gewinnt.

FUZxxl
quelle
2
Könnten Sie zur Erleichterung aller einige Beispiele für Ein- / Ausgänge zum Testen erstellen?
Orlp
1
Kann eine Liste paradox sein und Schleifen selbst haben?
Jimmy23013
@ user23013 ja.
FUZxxl
@orlp Sicher. Gib mir bitte etwas Zeit.
FUZxxl
1
@orlp Gleichheit sollte nicht durch die unterschiedliche Reihenfolge berührt werden, aber lassen Sie mich einen Absatz hinzufügen.
FUZxxl

Antworten:

4

Pyth, 28 22

L.AmqdSdmfhTmxhkbek^b2

Erstellt eine Funktion y, die Sie mit einem Tupel aufrufen können, das die beiden Arrays enthält. Gibt "True" zurück, wenn eine Gesamtbestellung vorhanden ist, andernfalls "False".

Ein Hilfsprogramm, das die obige Funktion mit stdin definiert und aufruft:

L.AmqdSdmfhTmxhkbek^b2y,rw7rw7 

Probieren Sie es hier aus.

Wir lesen zuerst beide Arrays. Dann werden wir alle Kombinationen beider Arrays erstellen. Dann nehmen wir für jede Kombination an, dass das erste Array maßgeblich ist, und prüfen, ob es mit dem zweiten Array übereinstimmt.

orlp
quelle
Ist die positive ganze Zahl für jede echte Ausgabe gleich? Es ist die Absicht der Spezifikation, dass es eine Ganzzahl gibt, die "Ja" darstellt, und eine Ganzzahl, die "Nein" darstellt .
FUZxxl
@FUZxxl Jetzt tut es.
Orlp
Ich denke, Sie dürfen Eingaben machen, wie Sie möchten, was viele Zeichen sparen würde. Receives two arrays ... in an implementation-defined way.Sie können mindestens 7 Zeichen speichern.
isaacg
@isaacg Danke, ich kann aber nur 6 speichern, weil ich ein Lambda verwenden muss - ich muss entweder eine Unterroutine oder ein Programm geben.
Orlp
2

GolfScript, 25 Bytes

:A{:a;A{.a--.{a?}$=!},},!

Versuchen Sie diesen Code online.

Nimmt ein Array von zwei (oder mehr!) Arrays auf dem Stapel auf; Gibt 1 (true) zurück, wenn jedes Paar von Eingabearrays eine kompatible Gesamtreihenfolge hat, oder 0 (false).

Es funktioniert, indem jedes mögliche Paar von Eingabearrays (einschließlich jedes mit sich selbst gepaarten Arrays) durchlaufen wird, die Elemente im ersten Array nach der Position sortiert werden, an der sie im zweiten Array zum ersten Mal auftreten (wobei nicht gefundene ignoriert werden) und überprüft werden dass die resultierende Reihenfolge mit dem Original übereinstimmt.

Während dieser Code eine beliebige Anzahl von Eingabearrays aufnehmen kann, ist zu beachten, dass nur die paarweise Konsistenz überprüft wird . Beispielsweise wird für die Eingabe true zurückgegeben [[1 2] [2 3] [3 1]], da zwei der drei Arrays eine konsistente Gesamtreihenfolge haben. Das reicht jedoch für den Fall mit zwei Eingängen, was alles ist, was die Herausforderung erfordert.

Hier ist eine de-golfed Version mit Kommentaren:

:A         # save input to "A", and leave it on the stack to be looped over
{          # run this outer loop for each input array:
  :a;      #   save this array to "a" (and pop it off the stack)
  A{       #   also run this inner loop for each input array:
    .a--   #     remove all elements not in "a" from this array
    .      #     make a copy of the filtered array
    {a?}$  #     sort it by the first location of each element in "a"
    =!     #     check whether the sorted copy differs from the original
  },       #   select those arrays for which there was a difference
},         # select those arrays for which at least one difference was found
!          # return 1 if no differences were found, 0 otherwise

Ps. Es wäre möglich, ein oder zwei Bytes trivial zu speichern, indem die Eingabe direkt in der benannten Variablen angegeben werden Amuss und / oder indem das Ausgabeformat in ein leeres Array für "Ja" und ein nicht leeres Array für "Nein" geändert wird. . Das scheint mir jedoch ziemlich kitschig.

Ilmari Karonen
quelle
Das ist eine nette Idee. Vielleicht mache ich einen J-Port dieser Lösung.
FUZxxl
2

J, 36 30 26 Bytes

[:*/@,(e.~(-:/:~)@#i.)&>/~

Nennen wir die beiden Eingabelisten aund b. Die Funktion prüft (mit (e.~(-:/:~)@#i.)) ob

  • a's Elemente sortiert (in Bezug auf a) inb
  • a's Elemente sortiert (in Bezug auf a) ina
  • b's Elemente sortiert (in Bezug auf b) ina
  • b's Elemente sortiert (in Bezug auf b) inb

Die Eingabe ist eine Liste von zwei ganzzahligen Vektoren.

Ergebnis ist, 1wenn eine 0andere Bestellung vorliegt . (Laufzeit ist O (n * n).)

Verwendungszweck:

   f=.[:*/@,(e.~(-:/:~)@#i.)&>/~

   a=.7 2 1 1 4 12 3 [b=.7 2 1 1 4 12 3 1 [c=.9 8 7 2 5 1
   f a;c
1
   f b;c
0

Probieren Sie es hier online aus.

randomra
quelle
Wie kann bnicht in Bezug auf sortiert werden b?
FUZxxl
@FUZxxl zB b=1 2 1oder in meinem zweiten Beispielb=7 2 1 1 4 12 3 1
randomra
Ok ... macht irgendwie Sinn.
FUZxxl
1

Ruby, 79

!!gets(p).scan(r=/\d+/){|s|$'[/.*/].scan(r){s!=$&&~/\b#$& .*\b#{s}\b/&&return}}

Erwartet, dass die Eingabe eine zweizeilige Datei mit durch Leerzeichen getrennten Zahlen ist. Gibt truewenn eine Bestellung vorhanden ist , nilwenn es nicht der Fall ist.

Histokrat
quelle
Bitte beachten Sie das Ausgabeformat: Geben Sie einen Wert zurück, der das Vorhandensein einer Bestellung angibt , oder einen anderen Wert, der das Nichtvorhandensein angibt. Diese Werte müssen unabhängig von der Eingabe sein.
FUZxxl
Erledigt. Konnte die Spezifikation technisch mit einem Zeichen weniger erfüllen, aber zurückkehren niloder sich falseeinfach zu falsch anfühlen.
Histokrat
Rückkehr niloder falseist absolut in Ordnung.
FUZxxl
1

Haskell, 98 Bytes

import Data.List
a%b=intersect(r a)$r b
r l=map head$group l
c l=nub l==r l
x#y=c x&&c y&&x%y==y%x

Rückgabe Trueoder False. Anwendungsbeispiel: [7,2,1,1,4,12,3] # [9,8,7,2,5,1]-> True.

So funktioniert es: Entfernen Sie aufeinanderfolgende Duplikate aus den Eingabelisten (z [1,2,2,3,2] -> [1,2,3,2]. B.: Eine Reihenfolge liegt vor, wenn beide resultierenden Listen keine Duplikate enthalten und der Schnittpunkt von Liste1 und Liste2 gleich dem Schnittpunkt von Liste2 und Liste1 ist.

Nimi
quelle
Das ist eine nette Idee.
FUZxxl