Rebmu : 79 Zeichen OR (37 + Länge (p1) + 2 * max (Länge (p2), Länge (p3))
Zuerst gebe ich eine 79-Zeichen-Lösung, in der gefragt wird, welche Sprachen Sie lernen müssen. (Entropie 4.0, 30 Buchstaben nicht enthalten ?
) und bietet Ihnen die Vorschläge von Rebol und [Red] :
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} pp{{[RReebdo]l}}
Eine einzigartige Taktik, die hier nicht in anderen Sprachen verfügbar ist, beruht auf der Tatsache, dass geschweifte Klammern ein asymmetrischer String-Begrenzer sind, der legal verschachtelt werden kann:
my-string: {"It's cool," said {Dr. Rebmu}, "for MANY reasons--like less escaping."}
Auf diese Weise konnte ich eine verallgemeinerte Lösung erstellen, die mühelos mit jedem Programm funktioniert, das keine Escape-Sequenzen verwendet. Die 79-Zeichen-Version war einfach genug, um eine Verknüpfung herzustellen, aber um eine beliebige Programmquelle für die Programme p2 und p3 zu enthalten, benötigen Sie die vollständige Vorlage. Hätten wir das benutzt, wären es 87 Zeichen gewesen:
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} ddoo{{pp{{[RReebdo]l}}}}
Das Muster für diese allgemeine Form ist , dass , wenn Sie drei Quelltexte von aufeinanderfolgenden Zeichen variabler Länge haben (wir verwenden ein Beispiel wie AAA
, BBBBB
, CCCCCCC
) Sie sie als etwas entlang der Linien von codieren:
DD 11 DD :do dd {dd {AAAqt}} ddoo{{BCBCBCBCBC C C}}
(Hinweis: Obwohl dieses Muster bei Programmen, die Escape-Zeichen verwenden, nicht funktioniert, ist dies kein schwerwiegender Fehler. Um eine nicht passende linke Klammer in einer durch Klammern begrenzten Zeichenfolge zu erhalten, müssen {Foo ^{ Bar}
Sie Folgendes tun: die alternative "Foo { Bar"
Saitennotation und kombinierte Fälle können durch Zusammenkleben einer Mischung aus nicht entkappten Saiten verwaltet werden.)
Also ... wie wäre es mit einem Beispiel? Sobald die allgemeine Form verfügbar war, wurde dieses 573-Zeichen-Programm in nur wenigen Minuten aus 3 früheren Code-Golflösungen zusammengestellt:
DD 11 DD: do dd {dd {rJ N 0% rN Wa1m2j S {\ x /} eZ 1 5] 3] prRJ [si ~ dSPscSqFHs] eZ 1 [s + dCa + wM2cNO]] Va | [mpAp2j] prSI ~ w { } Ls2w Wl h01tiVsb01n -1 chRVs { } hLceVn01qt} ddoo {{Brdzc [sn [{N sbeo [tIt0l1eV} 0e5gXN1 01L {5s0} C {1} 0 {0 Do5f0 0bMe1e0r0} 0]] tMw9C9 Numz Jl [paN + [KperlCJBn [[ba sWS {B noJn Nt0l] aJe] {K, j} b P {. } W enn EZ - - n [N m {G otothestoreandbuysome more}] {T akeonedownandpassitar ound} c B w P lf]]}}
Wenn jemand versuchen möchte, dieses Programm in der Sprache seiner Wahl zu schreiben, und glaubt, dass er 573 schlagen kann, lass es mich wissen. Ich werde Ihnen eine Menge Reputation einräumen, wenn Sie das tun - vorausgesetzt, Ihre Sprache ist nicht Rebmu, weil ich weiß, dass diese Programme nicht minimal sind. :-)
Dieser "verschwenderische" Abstand, den Sie am Ende erhalten, tritt auf, wenn p2 und p3 unausgeglichen sind. In diesem Fall sind jedoch alle drei Programme unterschiedlich groß, sodass für p2 / p3 keine besonders gute Paarung ausgewählt werden kann. (Ich habe diese ausgewählt, weil es keine externen Daten als Eingabe gab, wie zum Beispiel ein Labyrinth oder was auch immer, nicht, dass sie von ähnlicher Länge waren. Ich hätte zwar neue Programme schreiben können, die optimaler waren, aber ich habe genug Zeit aufgewendet und es ging darum Sie müssen keine neuen Programme schreiben ...)
Wie es funktioniert
(Hinweis: Ich habe mit einem "kreativeren" Ansatz begonnen, der nicht so geradlinig war, aber interessanter aussah. Ich habe ihn auf einen Eintrag in meinem Blog verschoben , da die Beschreibung dieses Ansatzes bereits lang ist.)
Ein Schlüssel hier ist der Trick "Eval Code as a String" wie bei einigen anderen Einträgen, er hat nur den Trumpf des asymmetrischen Zeichenkettenbegrenzers. Ich beginne mit der Erläuterung der Funktionsweise des 80-Zeichen-Falls.
Hier ist das "ganze" Programm, das die Leerzeichen an die Lesbarkeit dieses Falls anpasst:
DD 11 ; assign 11 to dd (about to overwrite again)
DD :do ; make dd a synonym for DO (a.k.a. "eval")
; eval a string as source code that ends with QUIT (QT)
dd {dd {p{Which languages must you learn?}qt}}
; we'll never get here, but whatever's here must be legally parseable
pp{{[RReebdo]l}}
Hier wird DD zu einem Synonym für DO (aka "eval"). Der Trick ist jedoch, dass beim Ausführen der halbierten Programme Code ausgeführt wird, dessen einzige Auswirkung darin besteht, D für das harmlose Literal 1 zu definieren.
Hier ist, was der Odd-Chars-Code macht, Leerzeichen wieder angepasst:
D 1 ; assign 1 to d
D d ; assign d to itself, so it's still 1
d ; evaluates to integer, no side effect
{d pWihlnugsms o er?q} ; string literal, no side effect
p {Rebol} ; print "Rebol"
Und hier ist der Even-Chars-Code:
D 1 ; assign 1 to d
D:od ; URL-literal (foo:...), no side effect
d ; evaluates to integer, no side effect
{{hc agae utyulan}t} ; string literal (well-formed!), no side effect
p {[Red]} ; print "[Red]"
Es ist tatsächlich so, dass für das nicht halbierte Programm der dd {dd {(arbitrary code)qt}}
Code ausgeführt wird, den Sie möchten. Anstelle von nur einem Aufruf müssen jedoch zwei Aufrufe ausgewertet werden. Das liegt daran, dass die geschachtelten Klammern im Interleaved-Code zwar hervorragend funktionieren, aber das Bewertungsverhalten von DO durcheinander bringen. Weil:
do {{print "Hello"}}
Lädt den String als Programm, aber das Programm ist nur die String-Konstante {print "Hello"}
. Daher benutze ich hier den Trick, meine DD (mit demselben Funktionswert wie DO) zu nehmen und zweimal auszuführen. Die Halver kauen an den verschiedenen Teilen der Saite, aber sie kauen nicht beide, wenn die Gerade / Ungerade für den Inhalt richtig ist, und weil das, was nach der Halbierung außerhalb der Saite übrig bleibt, nur die integrale Konstante ist, sind d
sie harmlos.
Mit diesem Muster ist es keine Herausforderung, das Programmverhalten zu schreiben, wenn es nicht halbiert ist - Sie können alles eingeben, solange die Zeichenlänge des Codes gerade ist (ungerade, wenn Sie das QT zählen, was QUIT ist). Wenn Sie die gerade Zahl von einer ungeraden Zahl erhalten möchten, geben Sie ein Leerzeichen ein (in meiner obigen Formel steht also für ungerade Programmlängen von p1 eine +1) . Der Trick scheint, diesen verschachtelten Code danach zu schreiben, der den Parser passieren muss, wenn er nicht halbiert wird. (Es wird wegen des QT nicht ausgeführt, aber es muss LOADable sein, bevor es ausgeführt wird.)
Dieser Fall ist trivial; pp
Lädt fine als Symbol, obwohl es undefiniert ist, und wird p
in jedem halben Programm zum Drucken aufgeteilt. Aber wir können einen anderen Trick machen, indem wir wieder ein String-Literal verwenden. Die halbierten Programme haben immer noch die normale DO-Definition, daher hätten wir auch sagen können:
ddoo{{pp{{[RReebdo]l}}}}
Wenn der Parser im ganzen Fall nur das symbolische Wort ddoo
und ein String-Literal aufnimmt, können wir zwei beliebige Programme in dieses String-Literal einbetten und den Parser nicht verärgern. Die halbierten Versionen werden nur sagen:
do{p{Rebol}}
..und...
do{p{[Red]}}
Wie gesagt, dieser Teil kommt anderen Lösungen bekannt vor, die Programme als Zeichenfolgen behandeln und bewerten. Wenn die Programme, die Sie packen, im Wettbewerb verschachtelte Zeichenfolgen enthalten, werden diese mit einem Schraubenschlüssel belegt. Hier sind die einzigen Dinge, die Sie in Schwierigkeiten bringen, die Flucht mit carets ( ^
) ..., die leicht umgangen werden können.
(Kleiner Hinweis zum Schummeln: Ich habe QT für "QUIT" als Antwort auf dieses Problem hinzugefügt. Eigentlich hatte ich die Abkürzung für "quit" vorher absichtlich entfernt ... weil ich dachte, es sei nur gut für die Konsolenbenutzung und nur für das Aufnehmen der Leerzeichen mit zwei Buchstaben, wenn es nicht in einer REPL enthalten ist. Ich füge es hinzu, weil ich sehe, dass ich mich geirrt habe, und füge es nicht speziell für diesen Fall hinzu. Vor dieser Änderung wären es jedoch 2 Zeichen länger gewesen. Als ich die Lösung zum ersten Mal veröffentlichte, gab es einen Fehler in Rebmu, der verhinderte, dass sie tatsächlich funktionierte, obwohl sie hätte funktionieren müssen ... jetzt funktioniert sie.)
x0=00;;
. Große Herausforderung!