Betrachten Sie ein Array von Ganzzahlen:
[1, 0, 9, 1, 3, 8]
Es gibt viele Möglichkeiten, diese Liste in aufeinanderfolgende Unterlisten zu unterteilen. Hier sind drei:
A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]
Wir werden eine Partition Y aufrufen und eine andere Partition X verfeinern, wenn X von Y erhalten werden kann, indem einige seiner Unterlisten wieder zusammengefügt werden.
Dies B
ist eine Verfeinerung von A
: Wenn wir die ersten beiden und die letzten beiden Unterlisten wieder zusammenfügen, erhalten wir A
. Aber es C
ist keine Verfeinerung von A
: Wir müssten das 9
und das aufteilen, um uns davon 1
zu erholen A
. Außerdem ist jede Partition eine triviale Verfeinerung ihrer selbst.
Beachten Sie, dass wir zu keinem Zeitpunkt Unterlisten oder Elemente neu anordnen dürfen.
Die Herausforderung
Bei zwei gegebenen Partitionen (Listen von Listen von ganzen Zahlen) X
und Y
bestimmen Sie, ob Y
eine Verfeinerung von X
.
Sie können davon ausgehen, dass die Partitionen nur ganze Zahlen von 0
bis 9
einschließlich enthalten. Sie dürfen das nicht annehmen X
und Y
sind Partitionen derselben Liste (wenn dies nicht der Fall ist, sind sie auch keine Verfeinerungen voneinander). X
und / oder Y
leer sein, aber niemals leere Unterlisten enthalten.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Eingabe kann in einem beliebigen geeigneten Zeichenfolge- oder Listenformat erfolgen. Da es sich bei den Elementen nur um einstellige Ganzzahlen handelt, können Sie ein Trennzeichen in den Unterlisten weglassen, aber sicherstellen, dass führende 0
s möglich sind. Sie können wählen, X
und Y
in umgekehrter Reihenfolge zu nehmen .
Die Ausgabe sollte wahr sein, wenn Y
es sich um eine Verfeinerung handelt, X
und ansonsten falsch .
Ihr Code muss in der Lage sein, jeden der folgenden Testfälle in 1 Sekunde auf einem vernünftigen Desktop-Computer zu lösen. (Dies ist lediglich eine Überprüfung der geistigen Gesundheit, um einfache Brute-Force-Lösungen zu vermeiden.)
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
Jeder Testfall steht in einer eigenen Zeile, geschrieben als X Y
. Ich verwende die Array-Notation im GolfScript / CJam-Stil, um etwas horizontalen Platz zu sparen:
Wahrheit:
[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Falsch:
[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihre Punktzahl verbessern, können Sie alte Punkte in der Überschrift behalten, indem Sie sie durchstreichen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Verwandte Herausforderungen
quelle
[[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]]
oder[["109" "138"] ["1" "09" "13" "8"]]
wäre ein akzeptables Eingabeformat?Antworten:
CJam,
13109 BytesProbieren Sie es online im CJam-Interpreter aus .
Vielen Dank an @ MartinBüttner, der das geniale Eingabeformat von @ edc65 vorgeschlagen hat .
Vielen Dank an @ jimmy23013 für die Verbesserung des Eingabeformats und das Ausschalten von 3 zusätzlichen Bytes.
I / O
Eingang
Unterlisten werden durch
;
und von einander getrennt durch,
:Ausgabe
Wie es funktioniert
Bei Zeichenfolgen unterschiedlicher Länge
.-
verbleiben Zeichen im Array, die nicht den ganzen Zahlen 0 oder 15 entsprechen können.quelle
;
als Trennzeichen ...ll.m27m0-!
.,
und;
sind beide gemeinsame Array-Syntax (und keine von ihnen wird von CJam verwendet). Vielen Dank!Pyth, 19 Bytes
Probieren Sie es online aus: Vorführ- oder Testgeschirr
Ich benutze Pyths Tupel / Listen-Format als Eingabe. Ersetzen Sie einfach die Leerzeichen der Testfälle durch Kommas.
Erläuterung:
Da der Pseudocode immer noch etwas verwirrend ist, werde ich den Algorithmus anhand einer Beispieleingabe demonstrieren.
Der
.u+NYdY
Teil berechnet alle fortlaufenden Unterlisten, die das erste Element enthalten.B
ist eine Verfeinerung derA
, wenn jede fortlaufende Unterliste vonA
auch eine fortlaufende Unterliste von istB
(es gibt nur eine Ausnahme).Also überprüfe ich einfach, ob die Menge der fortlaufenden Unterlisten von
A
eine Teilmenge der Menge der fortlaufenden Unterlisten vonB
(gF_m.u+NYdYQ
) ist.Die einzige Ausnahme ist, wenn die erste Eingabeliste weniger Elemente enthält als die zweite Eingabeliste. Zum Beispiel
<Fm.u+YdYQ
würdeTrue
für die Eingabe zurückkehren[[1]],[[1],[2]]
.Deshalb überprüfe ich auch, ob die verbundenen Listen auch gleich sind
&...qFsMQ
.quelle
JavaScript ( ES6 ), 67,
70Bearbeite 3 Bytes, die dank @apsillers gespeichert wurden
Führen Sie das folgende Snippet in Firefox aus, um es zu testen
quelle
OK
und benannt habenKO
.C, 69
75Eine Funktion mit 2 Zeichenfolgenparametern, die 0 oder 1 zurückgibt.
Parameterformat: durch Leerzeichen ('') getrennte Unterliste, durch Komma getrennte Listenelemente.
Beispiel:
"1,0,9 1,3,8"
"1,0 9,1,3,8"
Weniger golfen
Test Ideone (veraltet)
quelle
Haskell, 76 Bytes
Rückgabe
True
oderFalse
. Anwendungsbeispiel:[[1,0,9],[1,3,8]] # [[1,0],[9]]
->False
.Einfacher rekursiver Ansatz: Wenn die ersten Elemente übereinstimmen, fahren Sie mit den Endpunkten fort. Beginnen Sie ansonsten von vorne, aber verketten Sie die beiden Elemente am Anfang der zweiten Liste. Basisfälle sind: beide Listen leer ->
True
; beide Listen mit einem Element -> vergleichen; nur eine Liste leer ->False
.quelle
CJam, 19 Bytes
Probieren Sie es online aus.
I / O
Eingang
Ausgabe
Idee
Jede Partition kann eindeutig identifiziert werden, indem die folgenden zwei Eigenschaften beachtet werden:
Die Liste, die durch Verketten aller Unterlisten erstellt wurde.
Die "Schnittpunkte", einschließlich der Extreme der Liste.
Wir können beide Kriterien zu einem kombinieren, indem wir jeden Schnittpunkt durch die Unterliste der Elemente vom Schnittpunkt bis zum Ende der Liste ersetzen.
Um zu überprüfen, ob eine bestimmte Partition feiner ist als eine andere, müssen wir nur überprüfen, ob die wie oben dargestellte gröbere Partition eine Teilmenge der feineren ist und ob die größten Listen beider Partitionen übereinstimmen.
Code
Für die Eingabe aus dem E / A-Beispiel gilt der Stapel
vor der Ausführung
-!
.Beachten Sie, dass das erste Element jedes Arrays ein Leerzeichen am Ende enthält. Dadurch wird sichergestellt, dass die vollständige Liste der ersten Eingabe mit der vollständigen Liste der zweiten Eingabe verglichen wird.
quelle
CJam, 24 Bytes
Algorithmus
Hier verwenden wir einfach einen gierigen Algorithmus, um zu sehen, ob erste
N
Unterlisten der zweiten Liste zusammengeführt werden können, um die erste Unterliste der ersten Liste zu bilden. Sobald diesN
gefunden ist, entfernen wir die erstenN
Unterlisten aus der zweiten Liste und die erste Unterliste aus der ersten Liste und wiederholen den Vorgang.Wenn die zweite Liste eine Verfeinerung der ersten war, sollten im Idealfall 2 leere Listen auf dem Stapel verbleiben. Wir prüfen das nur und drucken,
1
ob das der Fall ist. In jeder anderen Kombination erhalten wir, nachdem wir die Unterlisten der zweiten Liste vollständig durchlaufen haben, keine zwei leeren Listen. Daher0
wird für solche Fälle ein gedruckt.Code-Erweiterung
Probieren Sie es hier online aus oder führen Sie die komplette Testsuite hier aus
quelle
C,
120114 BytesIch habe in letzter Zeit nicht viel Golf gespielt, also dachte ich, ich würde es ausprobieren.
Wir definieren eine Funktion,
R(char* s, char* t)
die zurückgibt,1
wennt
es sich um eine verfeinerte Partition von handelts
, und0
ansonsten.s
undt
werden in dem Format erwartet, in dem[DDDD...][DDDD...]...
jedesD
Element ein anderes einstelliges Element ist.Testcode:
Oben wird Folgendes gedruckt:
Zumindest scheint es zu funktionieren.
quelle
Haskell,
525053 BytesGanz anders als meine andere Lösung . Verwendet dasselbe clevere Eingabeformat wie die Antwort von @ edc65 , dh Elemente werden mit
,
und Listen mit getrennt.
Anwendungsbeispiel:
"1,0,9,1,3,8" # "1,0,9 1,3,8"
->True
.Der zweite Parameter ist eine Verfeinerung des ersten, wenn sie an jeder Position gleiche Elemente haben oder der erste ist
,
. Ich muss an..
beide Parameter ein eindeutiges End-Token (-> ) anhängen , dazipWith
der längere Parameter abgeschnitten wird und beispielsweise"1,2,3" # "1,2"
auch wäreTrue
.quelle
(\a b->a==b||a>b)
ist einfach(>=)
."."
anstatt zu".."
arbeiten hinzufügen ?"2"#"1"
weil die funktionen nur"."
wird nicht funktionieren, denn es wäre ein falsch positiv geben für"2,1" # "2"
welche zuerst erweitern würde"2,1." # "2."
und dann durch abgeschnittenzipWith
zu"2," # "2."
. Ein Komma in der ersten Zeichenfolge stimmt mit allem überein.Mathematica, 65 Bytes
quelle
Mathematik mit regulären Ausdrücken macht Spaß!
ES6 Javascript, 53 Zeichen
Vintage Javascript, 70 Zeichen
Verwendet dasselbe Eingabeformat wie die Antwort von edc65 .
Vollständige Demo mit allen Testfällen hier.
quelle
Mathematica, 55 Bytes
Dies definiert eine unbenannte Funktion, die die beiden Partitionen in einer einzigen Liste in umgekehrter Reihenfolge (dh
Y
erste,X
zweite) aufnimmt.Erläuterung
Dadurch wird überprüft, ob beide Partitionen tatsächlich Partitionen derselben Liste sind.
Dies ist eine gelungene Form meines Ansatzes in dieser Frage über Mathematica.SE , die diese Herausforderung inspiriert hat. Grundsätzlich wird eine Partition als eine Anzahl von Indizes definiert, in die Teilungen eingefügt werden, und dies überprüft, ob alle Teilungspositionen
X
auch in erscheinen,Y
indem die Längen der Unterlisten akkumuliert werden.quelle
Python 2,
6851 BytesVielen Dank an xnor für die erheblichen Byteeinsparungen!
Anonyme Funktion, die zwei Zeichenfolgen der Form annimmt
"1,0,9 1,3,8"
(aus der C-Antwort von edc65 entnommen ) undTrue
oder zurückgibtFalse
. Neue Version mitmap(None)
funktioniert nicht mehr in Python 3.Testsuite:
Vorherige 92-Byte-Lösung, bei der die Eingabe folgendermaßen erfolgt
"109 138"
:quelle
None
eine Nummer hat , der andere Index jedoch eine Nummer hat, da eri==j or"0">i>j
nicht enthalten kann.i==','
. Auf diese Weise können Sie die Tests so kombinieren, wie es der Fall sein könntei in[',',j]
(was wir nicht könneni in ','+j
) .j
None
b
an dieser Stelle eine Nummer ist?" ... zu vergessen, dass dies mit diesem Eingabeformat nicht möglich ist.