Nehmen wir an, Sie müssen Stangen malen, und ein Kunde bittet Sie, eine Stange mit 4 roten und 3 gelben Abschnitten zu malen. Das geht ganz einfach wie folgt:
r y r y r y r
Mit nur gelben und roten Streifen. Angenommen, Ihr Kunde fordert Sie auf, einen Pfahl mit 2 roten, 2 gelben und 1 grünen Abschnitten zu malen . Es gibt verschiedene Möglichkeiten, wie Sie Ihre Stange bemalen können
g y r y r
y g r y r
y r g y r
y r y g r
y r y r g
g r y r y
r g y r y
r y g r y
r y r g y
r y r y g
y r g r y
r y g y r
Genauer gesagt, das sind 12 Möglichkeiten, den Mast zu bemalen. Dadurch werden mehr Farben und Bereiche in die Luft gesprengt
Wenn Ihr Kunde nun sagt, er möchte 3 rote und 1 gelbe Abschnitte, gibt es keine Möglichkeit, einen solchen Pfahl zu malen. Denn unabhängig davon, wie Sie die Abschnitte anordnen, berühren sich zwei rote Abschnitte, und wenn sich zwei rote Abschnitte berühren, werden sie zu einem einzigen roten Abschnitt.
Und das ist so ziemlich unsere einzige Regel für das Malen von Stangen
Benachbarte Abschnitte haben möglicherweise nicht dieselbe Farbe
Aufgabe
Ausgehend von einer Liste der erforderlichen Farben und Abschnitte geben Sie die Anzahl der möglichen Möglichkeiten zum Malen eines Pfostens nach Bedarf aus. Sie können Farben auf jede vernünftige Weise darstellen (Ganzzahlen, Zeichen, Zeichenfolgen), aber Sie werden niemals mehr als 255 verschiedene Farben gleichzeitig erhalten. Wenn Sie möchten, können Sie auch festlegen, dass die Farben nicht mit Namen versehen werden, und nur eine Liste der Abschnittszählungen erstellen, wenn dies einfacher ist.
Testfälle
Diese sind von Hand eher schwer zu berechnen, zumal sie größer werden. Wenn jemand einen vorgeschlagenen Testfall hat, füge ich ihn hinzu.
[4,3] -> 1
[2,2,1] -> 12
[3,1] -> 0
[8,3,2] -> 0
[2,2,1,1]-> 84
quelle
[1, 1, 1, 1, 2, 2, 2]
? Das nehme ich an.Antworten:
Mathematica, 37
44486062BytesNehmen Sie die Eingabe als eine Liste von ganzen Zahlen
{1, 1, 1, 2, 2}
. Probieren Sie es auf Wolfram Sandbox .Pattern-Matching-Methode, danke @Not a tree!
Split
Teilt eine einzelne Liste in Unterlisten aufeinanderfolgender Elemente auf, z. B.{1, 1, 2, 3, 4, 4}
in{{1, 1}, {2}, {3}, {4, 4}}
{{_}..}
ist nämlich{{_}, {_}, {_}, ...}
. Das Muster entspricht einer Liste unärer Unterlisten.Differences
Methode, 48 Bytes:Der Code
Differences
bestimmt, ob benachbarte Elemente identisch sind.Schritt für Schritt:
Permutations@#
Erzeugt alle Permutationen der Eingabeliste in eine N! * N-Liste.Differences/@
berechnet die Differenz zwischen N Elementen und liefert eine N! * (N-1) Liste.1##&@@@
berechnet die Multiplikation aller Listen. Wenn eine Liste enthält0
(zwei benachbarte Elemente sind gleich), ist das Ergebnis0
, ansonsten ungleich Null, ein N! Liste.Clip[]
verhält sich wieSign[]
, transformiere die Liste von (-inf, inf) nach [-1, 1]Tr@Abs
verwandelt sich alles-1
in1
und jetzt enthält die N! -Länge nur0
(ungültig) und1
(gültig). Also fassen wir einfach die Liste zusammen.quelle
Permutations@#~Count~Except@{___,x_,x_,___}&
.Count[Split/@Permutations@#,{{_}..}]&
37 Bytes!Gelee , 7 Bytes
Probieren Sie es online!
Nimmt Eingaben wie zB
[1,1,1,1,2,2,2]
für[4,3]
. Der[8,3,2]
Testfall dauert zu lange, um mit TIO ausgeführt zu werden.Wie es funktioniert
quelle
Œ!QIẠ€S
Arbeit? Probieren Sie es online!P
beliebige Atom wegen seiner Einfachheit.P€
anstattẠ€
würde immer noch funktionieren.05AB1E , 7 Bytes
Probieren Sie es online!
-1 Danke an nmjcman101 für eine andere Antwort.
quelle
Mathematica, 50 Bytes
Probieren Sie es in Mathematik oder in der Wolfram Sandbox aus !
Nimmt Eingaben wie in den Testfällen vor - z
{4,3}
bedeutet "4 rote Streifen, 3 gelbe Streifen".Dies ist eine naive Implementierung einer Formel, die ich hier gefunden habe . "Naiv" bedeutet "Ich habe keine Ahnung, wie die Mathematik funktioniert, bitte frag mich nicht nach einer Erklärung ..."
quelle
Python 3.5 , 65 Bytes
Probieren Sie es online!
quelle
Ruby 2.4, 47 Bytes
Die Eingabe ist eine Liste von Zeichen: für den Testfall
[4,3]
, kann eingegeben werden%w[a a a a b b b]
,"1111222".chars
oder eine andere Array Formatierungsmethode , die in Ruby gültig ist.Benötigt 2.4 für
Enumerator#uniq
(frühere Versionen hatten es nur für dieArray
Klasse verfügbar ). Als solches fügt die TIO-Verbindung 5 Bytes hinzu, um den Permutations-Enumerator zuerst über in ein Array zu konvertierento_a
, da sie die obige Funktion nicht hat.Probieren Sie es online!
quelle
R, 72 Bytes
Erzeugt die Funktion
Nimmt Eingaben in das Formular
[1,1,1,1,2,2,2]
gemäß dem Kommentar von Erik the Outgolfer vor. Verwendetcombinat
diepermn
Funktion von 's , um eine Liste aller Permutationen zu erstellen und dannunique
alle eindeutigen Einträge abzurufen.sapply
wendet dann auf alle Einträge die folgende Funktion an:Welches bewertet zu
Beachten Sie, dass dies
x
nicht mit demx
Eingang der großen Funktion identisch ist . Die Verwendung eines anderen Zeichens in dieser Funktion würde täuschenpryr::f
dass die große Funktion ein anderes Argument benötigt.Wie auch immer, wenn eine Permutation gegeben, nimmt diese Funktion die Differenz zwischen dem Vektor:
2 1 3 4 2 1 -> -1 2 1 -2 -1
.!
konvertiert Nicht-FALSE
Nullen in und Nullen inTRUE
, so dass der Vektor wirdFALSE FALSE FALSE FALSE FALSE
. Summiere das, um zu prüfen, ob es irgendwelcheTRUE
s gibt (TRUE
würde bedeutendiff=0
-> zwei gleiche fortlaufende Zahlen). Wir können dies erneut invertieren!
, um einen Booleschen Wert zu erhalten, der angibt, ob die Permutation aufeinanderfolgende Werte enthält oder nicht.Durch Summieren über diese Booleschen Werte erhalten wir die Gesamtzahl der Permutationen, bei denen dies nicht der Fall ist.
Funktioniert nicht für den
[8,3,2]
Testfall, da zum Speichern dieser Permutationen ein Vektor von 46 GB erforderlich ist.quelle
Jelly , 11 Bytes
Probieren Sie es online!
quelle
Python 2 ,
14089 BytesDas Eingabeformat ist
'aaaabbb'
für den Testfall[4,3]
.Probieren Sie es online!
quelle
Schale , 8 Bytes
Probieren Sie es online! Übernimmt Eingaben im Format
"aaabb"
für[3,2]
. Zeitüberschreitung beim längsten Testfall.Erläuterung
Hier gibt es nichts Besonderes, nur die eindeutigen Permutationen zu zählen, bei denen alle Gruppen benachbarter Elemente die Länge 1 haben.
quelle
Ruby,
8476 BytesEine rekursive Lambda-Funktion. Untersucht jede mögliche Farbe und führt eine rekursive Baumsuche durch, wobei die Häufigkeit gezählt wird, mit der alle Streifen verwendet werden.
Erklärung (für alte Version):
quelle
x=p
als Ausgangsbedingung?p
fungiertnil
in diesem Fall als Alias für und sollte die Prüfung erfüllen, für die es verwendet wird.MATL ,
118 BytesEingabeformat ist
[1 1 1 1 2 2 2]
für[4 3]
usw.Läuft nicht mehr genügend Speicher für den letzten Testfall.
Probieren Sie es online!
Erläuterung
quelle