(Basierend auf diesem Math.SE-Problem , das auch einige Grafiken enthält)
Ich habe einen Stock, der ungefähr so aussieht:
Ich möchte, dass es so aussieht:
Ich bin jedoch kein erfahrener Maler. Bevor ich also ein so ehrgeiziges DIY-Projekt beginne, möchte ich sicherstellen, dass ich nicht über den Kopf komme.
Ihr Programm sollte mir sagen, wie viele Schritte zum Malen dieses Sticks erforderlich sind. Bei jedem Schritt wird ein durchgehender Bereich mit einer Volltonfarbe angestrichen, mit der vorherige Farbschichten abgedeckt werden. Für das obige Beispiel könnte ich die linke Hälfte blau, die rechte Hälfte rot und dann die zwei getrennten grünen Bereiche für insgesamt 4 Schritte malen (das Grün wird nicht durchgehend gemalt).
Hier ist es in ASCII:
------
bbb---
bbbrrr
bgbrrr
bgbrgr
Es gibt verschiedene Möglichkeiten, diesen Stift zu bemalen und das gleiche Ergebnis zu erzielen. Mich interessiert allerdings nur die Zeitschätzung, die vier Schritte umfasst.
Tor
Ihr Programm sollte die Mindestanzahl von Schritten ausgeben, die zum Malen eines Sticks mit einem bestimmten Farbschema erforderlich sind. Das Malschema wird in Form einer Zeichenfolge dargestellt, während die Ausgabe eine Zahl ist. Das ist Code Golf. Kürzeste Sendung gewinnt.
Eingang
Ihr Programm erhält das Farbschema für einen Stick in Form einer Buchstabenfolge. Jeder eindeutige Buchstabe (Groß- und Kleinschreibung beachten) steht für eine eindeutige Farbe.
YRYGR
grG
GyRyGyG
pbgbrgrp
hyghgy
Ausgabe
Diese Zahlen entsprechen der geringsten Anzahl von Schritten, die zum Bemalen der Stifte erforderlich sind.
4
3
4
5
4
Erklärungen
So bin ich zu den oben genannten Zahlen gekommen. Ihr Programm muss dies nicht ausgeben:
-----
YYY--
YRY--
YRYG-
YRYGR
---
g--
gr-
grG
-------
GGGGGGG
GyyyGGG
GyRyGGG
GyRyGyG
--------
pppppppp
pbbbpppp
pbbbrrrp
pbgbrrrp
pbgbrgrp
------
-yyyyy
-ygggy
hygggy
hyghgy
Bearbeiten: Ich werde mehr Testfälle hinzufügen, wenn sie sich als schwierigere Testfälle herausstellen.
Antworten:
GolfScript,
827267 ZeichenZiemlich schnell für ein GolfScript-Programm, Beispiele:
Der verwendete Algorithmus durchläuft die Farben rekursiv von links nach rechts gemäß den folgenden Anweisungen:
Andernfalls nehmen Sie die Zielfarbe des jetzt ganz linken Teils (dh die erste nicht in der gewünschten Farbe).
...
Nehmen Sie das Minimum all dieser Zahlen und addieren Sie 1 (für den aktuellen Schritt). Geben Sie dies als die optimale Anzahl von Schritten zurück.
Dieser Algorithmus funktioniert, weil der linke Teil sowieso auf einmal gezeichnet werden muss. Warum also nicht sofort - auf jede mögliche Weise.
quelle
n!
Schritte zu sein;) (aber vielleicht ist dies die wahre Komplexität, keine Ahnung).JavaScript:
187BytesAngenommen, wir dürfen nur die Ein- und Ausgabe für eine Funktion haben (bitte)!
157 Bytesdurch weitere hässliche Optimierung (was ein Teil des Punktes ist, und ich fand es unglaublich lustig):135 Bytes Ich habe festgestellt, dass die Länge der Eingabe eine Obergrenze ist und ich jetzt keine trivialen Fälle mehr separat behandeln muss.
Testfälle:
Erweiterte Version:
Berechnen Sie für jedes Zeichen der Eingabe die Länge des Musters, wenn Sie diese Farbe zuerst malen. Dies geschieht, indem wir so tun, als würden wir diese Farbe malen und dann aus den Bits, die nicht diese Farbe haben, Unterabschnitte erstellen und die Malmethode rekursiv aufrufen. Der kürzeste Weg wird zurückgegeben.
Beispiel (
YRYGR
):Versuchen Sie es zunächst
R
. Dies gibt uns die UntergruppenY
undYG
.Y
wird trivial in einem Rutsch gemalt.Für
YG
: Versuchen SieG
,Y
ist trivial, Länge2
. Versuchen SieY
,G
ist trivial, Länge 2.YG
ist also Länge2
.Das Malen
R
gibt uns also zuerst1 + 1 + 2 = 4
Dann versuche es
G
. Dies gibt uns die UntergruppenYRY
undR
.R
ist trivial.Für
YRY
:Versuchen Sie
Y
:R
ist trivial, Länge2
. Versuchen SieR
:Y
undY
sind die beiden Gruppen, Länge3
.YRY
ist Länge2
.Malen
G
zuerst gibt1 + 1 + 2 = 4
Dann versuche es
Y
. Dies gibt den UntergruppenR
undGR
.R
trivialGR
ist die Länge2
.Y
ist Länge4
Diese Implementierung würde dann R und Y erneut prüfen, um die Codelänge zu verringern. Das Ergebnis für
YRYGR
ist daher4
.quelle
m
irgendwo verloren."abcacba"
.m
war nur eine Abkürzung fürword.length
:) @Howard Du hast recht, ich muss das überdenken.Python, 149 Zeichen
Ich benutze
?
, um einen Bereich zu markieren, der eine beliebige Farbe haben kann.D
wählt eine zusammenhängende Region des Sticks aus, die nur eine einzige Farbe enthält (plus möglicherweise einige?
s), färbt diese Region zuletzt, ersetzt diese Region durch?
s und sucht erneut nach allen vorherigen Schritten.Exponentielle Laufzeit. Gerade noch schnell genug, um die Beispiele in einer angemessenen Zeit (ein paar Minuten) zu erstellen. Ich wette mit Memo könnte es viel schneller sein.
quelle
Python 3 - 122
Es scheint zu funktionieren, aber ich bin immer noch nicht zu 100% sicher, dass diese Methode immer die Mindestanzahl von Schritten findet.
quelle
CoffeeScript -
183 247 224 215207Demo auf JSFiddle.net
Ungolfed-Version mit Debug-Code und Kommentaren:
quelle
hyghgy
. Hier steht 5, aber es sollte 4 sein. (Es wird jedoch das korrekte Ergebnis von 4 für zurückgegeben.hyghgyh
)Haskell, 143 Zeichen
Dadurch werden alle möglichen Umschreibungen bis zur Länge der Zeichenfolge versucht und es wird eine gefunden, die das Eingabemuster erstellt. Unnötig zu sagen, exponentielle Zeit (und dann einige).
quelle
Eine einfache erste Suche. Es wird nichts in die Warteschlange gestellt, was bereits gesehen wurde. Es funktioniert in weniger als einer Sekunde für alle Beispiele, aber 'pbgbrgrp', was tatsächlich eine volle Minute dauert :(
Jetzt, da ich etwas habe, das funktioniert, werde ich daran arbeiten, etwas schneller und kürzer zu finden.
Python -
300296quelle
Haskell,
11886 ZeichenTestläufe:
Diese Methode ist gar nicht so ineffizient!
quelle