Es gab einige Herausforderungen, die das Verdoppeln des Quellcodes betrafen: hier und hier . Die Aufgabe, die wir hier haben, ist etwas schwieriger, sollte aber in fast jeder Sprache machbar sein.
In dieser Herausforderung nehmen Sie eine beliebige positive ganze Zahl auf. Ihr Programm muss diese ganze Zahl doppelt ausgeben . Wenn Ihr Quellcode verdoppelt wird, nimmt er eine positive Ganzzahl auf und gibt sie im Quadrat aus .
Wie wird Ihr Quellcode verdoppelt? Nun, Sie können es nach Ihren Wünschen haben . Das heißt, können Sie Ihren Quellcode aufgeteilt in Strings von Bytes oder Zeichen (oder Token in Zeichen übersetzten langs) von jeder gleich lang Sie wollen , und wiederholen Sie die einzelnen Blöcke zweimal hintereinander.
Für ein erstes Programm von ABCDEFGHIJKL
(Länge 12) sind hier alle möglichen Doppelprogramme:
Chunk length | Doubled source code
-------------+-------------------------
1 | AABBCCDDEEFFGGHHIIJJKKLL
2 | ABABCDCDEFEFGHGHIJIJKLKL
3 | ABCABCDEFDEFGHIGHIJKLJKL
4 | ABCDABCDEFGHEFGHIJKLIJKL
6 | ABCDEFABCDEFGHIJKLGHIJKL
12 | ABCDEFGHIJKLABCDEFGHIJKL
Beachten Sie, dass dies bedeutet, dass Programme mit Primlängen nur auf zwei Arten verdoppelt werden können: jedes Zeichen wird verdoppelt oder das vollständige Programm wird zweimal wiederholt.
Regeln:
- Code muss ein vollständiges Programm oder eine vollständige Funktion sein.
- Standardlücken sind verboten.
- Standard-E / A-Methoden sind zulässig.
- Alle Zeichen / Bytes, einschließlich Leerzeichen und Zeilenumbrüchen, werden in der Länge des Codes gezählt und tragen zu Chunks bei.
- Sie können davon ausgehen, dass die Eingabe und das Quadrat durch den Int / Integer-Typ Ihrer Sprache dargestellt werden können.
- Sie dürfen keinen abschließenden Zeilenvorschub oder ein anderes Zeichen annehmen.
- Geben Sie Ihre Blockgröße in der Überschrift nach der Byteanzahl an.
- Das ist Code-Golf , also sind kürzere Programme besser! Wenn zwei Programme die gleiche Länge haben, gewinnt das Programm, das die kleinere Blocklänge verwendet. (Wenn Sie ein längeres Programm haben, das eine kleinere Blocklänge verwendet, lohnt sich auch das Posten!)
- Wenn für Ihr Programm eine zweite Eingabe / Zeile erforderlich ist, können Sie keine Annahmen zu deren Wert treffen. Insbesondere sollte Ihr Programm funktionieren, wenn die zweite Eingabe leer, dieselbe wie die erste oder eine andere Ganzzahl ist. Wenn Ihr Programm keine zweite Eingabe / Zeile benötigt, können Sie diese Einschränkung ignorieren.
quelle
.0
am Ende)?5 -> 10
:; Doppelcode5 -> 25 25
.Antworten:
Perl 5 , 8 Bytes (Blockgröße 4)
Probieren Sie es online aus oder probieren Sie die doppelte Version .
Unary
~
ist das bitweise Negieren, also ist das zweimalige Anwenden ein Noop. Das Basisprogramm multipliziert also einfach$_
(die implizite Input-Output-Variable) mit 2.Binär
~~
ist Smartmatch, das einen Booleschen Wert zurückgibt.~~+2~~+2
analysiert als(~~+2) ~~ (+2)
. Da 2 gleich 2 ist, ergibt dies true (1). Somit multipliziert das verdoppelte Programm zuerst mit$_
1 und multipliziert dann mit sich$_
selbst.quelle
05AB1E , 4 Byte ( Blockgröße 2 oder 4)
Versuchen Sie es online oder doppelt als einzelner 4-Byte-Block oder doppelt als zwei 2-Byte-Blöcke .
quelle
Python 3 , 26 Bytes (Blockgröße 13)
Probieren Sie es online!
Verdoppelt:
Diese Lösung wird von @Grimy bereitgestellt.
Python 3 ,
323028 Bytes (Blockgröße161514)Probieren Sie es online!
-4 Bytes dank @negativeSeven
Verdoppelt:
Probieren Sie es online!
Die Funktion nutzt die einzigartige Blockregel dieser Herausforderung.
quelle
Befunge-98 (FBBI) , 8 Bytes ( Blocklänge 2)
Probieren Sie es online!
Probieren Sie es online! (verdoppelt)
Mit Ausnahme des Kontrollflusses wird das erste Programm ausgeführt
&:+q
(Eingabe, Stapelanfang duplizieren, Hinzufügen, Beenden mit Rückkehrcode) und das zweite Programm wird ausgeführt (Eingabe, Stapelanfang&:*+q
duplizieren, Multiplizieren, Hinzufügen (Summen mit impliziter 0), Beenden mit Rückkehrcode Code)quelle
Hexagony , 14 Bytes ( Blockgröße 14)
Erweitert:
Probieren Sie es online!
Verdoppelt
Erweitert:
Probieren Sie es online verdoppelt!
Hexagony befindet sich in dieser Herausforderung in einer etwas seltsamen Position, da es nicht viel schwieriger ist, die Aufgabe tatsächlich zu erfüllen, als einfach die beiden einzelnen Programme schreiben zu können. Das Golfspielen erwies sich jedoch als ziemlich schwierig.
Diese Lösung ist die triviale Idee in der kürzesten Form, die ich finden könnte, aber ich vermute, dass es kürzere, klügere Antworten gibt. Diese Version setzt sehr naiv zwei Werte auf den Eingang und summiert oder multipliziert sie, je nachdem, ob die Quelle verdoppelt wird. Die einzige Wiederverwendung von Code ist die
"+
die der Kopiercode für das doppelte Programm so kurz wird, dass er in den nicht verwendeten Platz des ursprünglichen Programms passt.Ich vermute, dass die Verwendung der IP-Änderungsanweisungen
[]
das Isolieren der Teile erleichtert, aber eine wirklich ideale Lösung wird viel Code zwischen den beiden wiederverwenden. Ich habe ein Hilfsprogramm erstellt , um den Hexagony-Quellcode zu verdoppeln. Beachten Sie, dass nachfolgende No-Ops entfernt werden. Wenn Sie also Platzhalter-No-Ops am Ende haben möchten, geben Sie einfach ein anderes Zeichen ein und ändern Sie es anschließend wieder. Es kann verschiedene Chunk-Größen verarbeiten, obwohl ich noch keinen Code für die Ausgabe jedes möglichen Programms geschrieben habe (Hexagony bietet sich an, um die volle Chunk-Größe zu verwenden).quelle
Hexagony , 12 Bytes ( Blockgröße 4)
Probieren Sie es online!
Formatiert:
Und verdoppelt , dann formatiert:
Grundsätzlich wird dabei die erste Kante auf die Eingabe und dann die zweite Kante auf eine der beiden
2
oder eine Kopie der Eingabe festgelegt. Anschließend werden diese beiden Kanten mit der dritten Kante multipliziert, gedruckt und beendet. Die Liste der ausgeführten Anweisungen ist geradeund
Der einzige Unterschied ist das
+
Überschreiben2
des zweiten Programms.quelle
JavaScript (ES6),
2422 BytesTrotz seines ungewöhnlichen Formats ist dies die Definition einer anonymen Funktion, die entweder direkt aufgerufen oder einer Variablen zugewiesen werden kann.
Probieren Sie es online!
Probieren Sie es online doppelt aus!
Wie?
Das Anwenden des Unären
+
auf eine Funktion wird als Versuch interpretiert, sie zu einer Zahl zu zwingen, und führt zu NaN . Daher ist die Führung+(g=x=>x*x)
in beiden Versionen falsch.Auf der anderen Seite führt das Anwenden der Binärdatei
+
zwischen zwei Funktionen zu einer Zeichenfolge. Daher(x=>x*2)+(g=x=>x*x)
ist in der doppelten Fassung wahr.quelle
Perl 6 , 8 Bytes (Blockgröße 1)
Probieren Sie es online! Probieren Sie es doppelt aus!
Ein Whatever / HyperWhatever-Lambda, das eine Zahl annimmt und eine Zahl für das erste Programm und eine Singleton-Liste für das zweite Programm zurückgibt. Grundsätzlich wird dabei die exakt gleiche Logik beibehalten, mit der Ausnahme, dass der Multiplikationsoperator (
*
) durch den Exponentialoperator (**
) ersetzt wird.Das Whatever-Literal (verwirrenderweise auch durch a dargestellt
*
) wird zu einem HyperWhatever (**
) verdoppelt, das im Grunde dasselbe ist, außer dass es Listen überlagert . Das Leerzeichen wird benötigt, um das Whatever-Literal von der Multiplikation zu trennen, und wird beim Verdoppeln ignoriert. Anstelle von nur2
(was sich verdoppeln würde22
) verwenden wir eine Liste mit zwei Elementen, die in einem numerischen Kontext mit 2 bewertet werden. Das<>
kann zu einer Liste mit Interpolation verdoppelt werden, und die beiden darin enthaltenen Elemente werden verdoppelt, aber keines dieser Elemente ändert die Länge der Liste.quelle
Runenverzauberungen , 9 Bytes (Blockgröße 3)
Probieren Sie es online!
Probieren Sie es doppelt aus!
Die
3?
nächsten 3 Anweisungen werden übersprungen, was zu einer (ausgeführten) Anweisung führti3?...:+@
. Wenn es verdoppelt wird, wird ausgeführt,i3?...:*@
wobei.
die 3 NOP-Anweisungen dargestellt werden.@
ist "ganzen Stapel drucken und beenden."quelle
C # (Visual C # Interactive Compiler) / Javascript, 22 Byte, Blockgröße 11
Probieren Sie es online!
quelle
=
to-
. Gute Antwort!Brain-Flak ,
4830 Bytes (Blockgröße 10)Probieren Sie es online! Probieren Sie es doppelt aus!
Dies dauert im Grunde genommen drei Schritte, und wenn verdoppelt, werden diese Schritte jeweils zweimal ausgeführt. Das anfängliche Programm ist:
Für eine Eingabe
n
in ein ungetrübtes Programm ergibt sich:Für das Doppelprogramm:
quelle
Brain-Flak , 76 Bytes, 76 Bytes
Probieren Sie es online!
Verdoppelt (mit Zeilenvorschub zur Verdeutlichung)
Probieren Sie es online!
Hier ist eine Version, die ein komplexeres Verdopplungsverfahren verwendet. Es sind 5 Blöcke der Größe 15 vorhanden. Der Code beträgt hier 46 Byte, ist jedoch aufgrund der erforderlichen Auffüllung wesentlich länger.
10590 Bytes, 15-Byte-StückeProbieren Sie es online!
Verdoppelt (mit Zeilenumbrüchen zur Verdeutlichung)
Probieren Sie es online!
quelle
Cubix ,
18 bis14 Byte (Blocklänge9 bis7)Beachten Sie das nachfolgende Leerzeichen. Probieren Sie es online!
Verdoppelt:
Auch hier gibt es ein Leerzeichen. Probieren Sie es online!
Erläuterung
Die Hauptidee ist, dass durch das Verdoppeln des Codes der Würfel größer wird und der Befehlszeiger an einem anderen Symbol beginnt. Da das Additionsprogramm nicht auf einen Würfel der Seitenlänge 1 gelegt werden kann, beträgt die Seitenlänge 2. Außerdem muss sich der doppelte Code auf einem Würfel der Seitenlänge 3 befinden, sodass der doppelte Code mindestens 25 Byte betragen muss . Dies bedeutet, dass der Code mindestens 13 Byte lang sein muss. Somit kann maximal 1 Byte mehr gespeichert werden.
Nun zum eigentlichen Code. Die erste Beobachtung ist, dass die Oberseite (dh die ersten 4 Zeichen) vom Additionsprogramm nicht verwendet werden. Wenn das fünfte Zeichen die IP-Adresse um den Würfel widerspiegelt, können wir außerdem zwei weitere Zeichen freigeben. Wir werden diese Zeichen verwenden, um das Quadrierungsprogramm zu platzieren.
quelle
Mornington Crescent , 656 Bytes (Blockgröße 328)
Nur um der Theorie mehr Gewicht zu verleihen, dass dies in fast jeder Sprache gelöst werden kann ...
(Der abschließende Zeilenumbruch ist wichtig)
Probieren Sie die Single-Version! ... oder ... Probieren Sie die doppelte Version!
Dies war eine besonders knifflige Herausforderung in Mornington Crescent, da das Programm eine solch starre Struktur haben muss. Es ist auch wichtig zu beobachten, wo die Verdopplung stattfinden würde, da das Teleportieren zwischen Stationen in London illegal ist.
Die Theorie hier ist einfach: In der Einzelversion wird 'Bounds Green' mit einer zufälligen Zeichenfolge gefüllt, in der doppelten Version wird sie mit der quadrierten Eingabe gefüllt. Nachdem der Block beendet ist, verdoppeln beide Versionen die 'Eingabe', aber in der verdoppelten Version des Codes wurde die Eingabe durch 0 ersetzt.
Dieses Ergebnis wird an Bounds Green zurückgegeben, das zweimal eine max () -Operation ausführt, bevor das Ergebnis in die Ausgabe übernommen wird. In der Single-Version bleibt die Verdopplung unverändert (Int und String werden nur hin und her geschaltet), in der Double-Version wird jedoch die 0 durch das bereits in Bounds Green gespeicherte quadrierte Ergebnis ersetzt.
Wenn meine Erklärung nicht gut genug war, empfehle ich Ihnen, London zu besuchen und die beiden Routen selbst auszuprobieren.
quelle
JavaScript (Node.js) ,
15 bis12 Byte (Blockgröße: 6)Probieren Sie es online!
Einzelfall:
Doppel fall:
Scheint auch in C # und Java zu funktionieren, wenn
=>
auf->
?quelle
R ,
423528 Bytes (Blockgröße 4)Jetzt mit einem kleineren Teil und ohne Fehler. Ich habe auch eine längere Lösung mit Blockgröße 3; siehe unten.
Ich glaube nicht, dass es möglich ist, eine R-Antwort mit Blockgröße 1 oder 2 zu schreiben. Ich werde jedem, der mir das Gegenteil beweist, gerne ein Kopfgeld geben.
Probieren Sie es online!
Das
#
ist für Kommentare in R. Die 3. Zeile besteht nur aus Leerzeichen, die einen Block aus Zeilenvorschub + 2 Leerzeichen + Zeilenvorschub bilden, so dass der vorherige und der nächste Block keinen Zeilenvorschub haben können.Verdoppelt wird es:
Probieren Sie es online!
Die Einzelversion berechnetn2× 4 = 2 n ; Die doppelte Version berechnetn2× n2× 4 = n2 .
Hier ist eine etwas längere Lösung, jedoch mit Blockgröße 3:
R , 39 Bytes (Blockgröße 3)
Probieren Sie es online!
Verdoppelt:
Probieren Sie es online!
Beachten Sie, dass Giuseppe eine andere R-Antwort mit einem Block von 30 Bytes hat.
quelle
R ,
5930 Bytes (Blockgröße5930)Probieren Sie es online!
Dank an Robin Ryder , der dies inspiriert hat; erhöht sich
F
jedes Mal, und die Funktionf
wählt den entsprechenden Ausgang aus.Das ist nicht sonderlich interessant, aber zweifellos wird etwas ausgeklügeltes ausgedacht, das die Blockgröße manipuliert.Wie erwartet, hat Robin Ryder dieses Modell entwickelt, das sowohl kürzer als auch gut manipuliert ist.quelle
PowerShell , 22 Byte (Blockgröße 11)
Probieren Sie es online aus .
Verdoppelt:
Diese Lösung basiert auf der @ ShieruAsakoto- Lösung .
@ Grimy- Lösung , die in PowerShell konvertiert wurde, 26 Byte (Blockgröße 13)
Probieren Sie es online aus .
Verdoppelt:
quelle
Perl 5 (
-p
),2215 Bytes-7 Bytes dank Grimy
TIO
quelle
$_*=/@F/?2:$_/4;
Kohle , 13 Bytes
Probieren Sie es online! Erläuterung: Die vordefinierte leere Liste ist falsch, sodass die Eingabe mit 2 multipliziert wird. Wenn der zweite Durchgang verdoppelt wird, wird die leere Zeichenfolge in die Liste verschoben, sodass die Eingabe stattdessen mit sich selbst multipliziert wird. Probieren Sie es online! In ausführlicher Syntax entspricht dies
Multiprint(Cast(Times(Cast(q), Ternary(u, Cast(q), 2)))); Push(u, w);
.quelle
Python 3,
5653 BytesMeine Python-Fähigkeiten saugen ein bisschen, so kann auf jeden Fall Golf gespielt werden. Basierend auf der Python-Antwort in der " Herausforderung Ich die Quelle, du verdoppelst die Ausgabe! " .
Stücklänge 53.
Probieren Sie es online oder doppelt aus .
quelle
Java 8, 62 Bytes
Brockenlänge 62.
Probieren Sie es online oder doppelt aus .
Erläuterung:
In Java sind die verfügbaren Kommentare
// comment
und/* comment */
. Die hier kombiniert werden, um bestimmte Teile zu überschreiben. Sehen Sie, wie diese Kommentare dank der Java-Hervorhebung funktionieren:Das verdoppelte Programm hat eine benutzerdefinierte
Byte
Klasse und ihren Wert erstelltSIZE=9
, wodurch die Standardklassejava.lang.Byte
und ihr Wert überschrieben werdenSIZE=8
.quelle
Japt ,
75 BytesVersuchen Sie es | Verdoppelt
²
drückt 2 auf das Array von EingabenN
undj
entfernt und gibt das Element am Index zurückJ=-1
(dh das neu eingefügte)2
) und multipliziert die Eingabe durch das.Wenn es verdoppelt wird, wird es
J
mit multipliziert2
, sodass das Element am Index-2
(dh die Eingabe) mit zurückgegebenj
und als Multiplikator verwendet wird.quelle
Gelee ,
86 Bytes (Blocklänge 3)Probieren Sie es online!
Verdoppelt
quelle
Schöne Lösung: Lua , 66 Bytes (Blockgröße 66 Bytes)
Probieren Sie es online! (Verdopple es selbst, es ist nicht so schwer)
Oh ja, ziemlich sicher, dass es eine kürzere Lösung dafür gibt, aber es ist das Beste, was ich auf diese Weise finden konnte. Nehmen Sie die Eingabe als erstes Argument.
Kurze Erklärung: Das ganze Geschäft mit
a
ist für alle offensichtlich, während der zweite Teil mitx
interessanter ist. Grundsätzlich erstelle ich eine Tabelle (oder aktualisiere eine vorhandene im zweiten Durchgang) mit Finalizer (__gc
Metamethode), die beim Beenden des Programms aufgerufen wird.Lahme Lösung: Lua , 60 Bytes (Blockgröße 30 Bytes)
Probieren Sie es online!oder Versuchen Sie es verdoppelt!
Kleiner und mit besserem Chunking, aber letztendlich langweilig und lahm ohne clevere Tricks. Ich bin mir ziemlich sicher, dass zu diesem Thema keine Kommentare erforderlich sind.
quelle
J ,
15109 BytesProbieren Sie es online!
Doppelversion: Probieren Sie es online!
f : g
Erstellt ein Verb, das ausgeführt wird,f
wenn es mit einem Argument undg
mit zwei Argumenten aufgerufen wird. Unser Programm wird also doppelt+:
mit der Originalquelle ausgeführt und*-:
wenn die Quelle verdoppelt wird.Dies funktioniert, weil ein Zug von zwei Verben in J zu einem Hook wird und somit
f f
ausgeführt wird alsy f (f y)
y die ursprüngliche Eingabe. Außerdem*-:
ist es selbst ein "dyadischer Haken", der durch Multiplizieren*
des linken Arg mit der Hälfte funktioniert-:
des rechten Args . Das linke Argument ist die ursprüngliche Eingabe, und das rechte Argument ist die doppelte Eingabe. Dadurch wird das Quadrat der ursprünglichen Eingabe erzeugt.ursprüngliche Antwort
J , 15 Bytes
Probieren Sie es online!
Doppelte Version: Probieren Sie es online!
In der Einzelversion haben wir ein einzelnes Verb, das Agenda verwendet
@.
, um die if ... then-Logik auszuführen: Wenn das Argument gleich sich selbst ist=~
, nehmen Sie das Argument und verdoppeln Sie es(+:@[)
.Wenn wir den Code jedoch verdoppeln, erhalten wir einen J-Hook. Nenne das Verb
f
und die Eingabey
. Dannf f
läuft der Hook so ab:Dies bedeutet, dass jetzt die ursprüngliche Eingabe das linke und die rechte das doppelte Argument ist. Da diese nicht gleich sein werden,
=~
wird diesmal false zurückgegeben, und jetzt werden wir die andere Abzweigung der Agenda ausführen, dh*:@]
"Quadrieren des richtigen Arguments". Und da~
die Eingaben eines dyadischen Verbs umgekehrt werden, ist das rechte Argument die ursprüngliche Eingabe.quelle
Python 3 , 60 Bytes
Stückgröße 6.
Keine gute Lösung, aber es funktioniert. Dies ist eine so einzigartige Herausforderung, dass Sie wirklich aus einer anderen Perspektive denken.
Probieren Sie es online!
Verdoppelt:
Probieren Sie es online!
quelle
Kaskade , 13 Bytes (Blockgröße 13)
Probieren Sie es online!
Probieren Sie es doppelt aus!
Das war ziemlich schwierig. Der Grundgedanke dabei ist, die Eingabe multipliziert mit
2
für das erste Programm zu drucken und die zu ersetzen2
durch eine Kopie der Eingabe für das zweite .Erläuterung:
Der ausgeführte Teil des ersten Programms sieht so aus
Das verdoppelte Programm fügt im Grunde das erste
]
bis zum Ende der letzten Zeile hinzu, so dass das Programm das umschließt und nicht das&
. Das macht es zuquelle
Zsh , 30 Bytes ( Blockgröße 10)
Probieren Sie es online! Probieren Sie es doppelt aus!
Missbraucht die Tatsache, dass
$var
in$[$var]
zuerst erweitert und dann im arithmetischen Kontext ausgewertet wird.Wenn jemand etwas dagegen unternehmen möchte, ist dies die
24/8
Lösung, die mir am nächsten kommt (Ausgabex^2+2
bei Verdoppelung).quelle