... zumindest für eine Definition von "Selbstmodifikation".
Die Aufgabe
In dieser Herausforderung ist Ihre Aufgabe , drei Saiten zu schreiben A
, B
und C
dass die folgenden Eigenschaften erfüllen.
Die Zeichenfolge
B
hat eine Länge von mindestens 1.Für jeden
n ≥ 0
ist der String ein gültiges Programm (dh ein voll lauffähiges Programm oder eine Funktionsdefinition) in der Programmiersprache Ihrer Wahl. Die hochgestellte Index Bezeichnet Wiederholung, so dass diese Mittel die Saiten , , , usw. Jedes Programm nimmt eine Zeichenkette als Eingabe und gibt einen String als Ausgabe.ABnC
AC
ABC
ABBC
ABBBC
Für alle
m, n ≥ 0
, wenn das Programm mit Eingabe ausgeführt wird , gibt es . Für Eingaben, die nicht in dieser Form vorliegen, kann das Programm alles tun, einschließlich Absturz.ABmC
ABnC
ABm*n+1C
Einige Beispiele im Format program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Regeln und Wertung
Ihre Punktzahl ist die Gesamtlänge von A
undC
, wobei eine niedrigere Punktzahl besser ist. Beachten Sie, dass während B
nicht auf die Partitur angerechnet wird, es von A
und C
wie im ersten Beispiel produziert werden muss .
Standardlücken sind nicht zulässig. Die Programme dürfen weder direkt noch indirekt auf ihren eigenen Quellcode zugreifen (es sei denn, sie erhalten ihn als Eingabe). Sie sind verpflichtet , die Saiten zu identifizieren A
, B
und C
in Ihrer Antwort in irgendeiner Weise, und ermutigt Ihre Lösung zu erklären.
quelle
Pyth, 10
Wir teilen die Quelle in zwei Zeilen auf. Die erste Zeile ist A, die zweite Zeile sind die Bs. Da A in der ersten Zeile steht,
w
druckt das erste nur A - einfach, fertig.In Pyth führende Nullen sind separate Token, also
[00)
eigentlich ist[0, 0]
. Beachten Sie, dass die erste Zeile mit endetl[
und die zweite Zeile aus besteht0000...
.l[
Zählt also tatsächlich die Anzahl der Bs in diesem Programm. Die Sekundew
liest die zweite Zeile der Eingabe ein - dies ist die Anzahl Bs der Eingabe. Ab hier ist es ein einfaches Multiplizieren, Inkrementieren und Ausgeben von so vielen Nullen.quelle
Netzhaut ,
25 bis19 BytesBeispielcode
ABC
:Der Code hat zwei Ersatzschritte:
Ändern Sie den Eingang
AB^mC
inAB^(m*n)C
von jedem WechselB
zuB^n
:]\]
Entspricht allenB
Eingaben und sonst nichts, da die Musterzeilen ausgeblendet werden]]...]]
istB^n
wechseln
B^(m*n)
zuB^(m*n+1)
vonm`^]*$
wobei die Leitung mit nur]
‚s]$0]
Hinzufügen eines zusätzlichen Paares]]
davon in einer Weise, dass diese Zeile nicht mit dem ersten regulären Ausdruck übereinstimmtIch habe der Punktzahl für das
-s
mehrzeilige Flag 3 Bytes hinzugefügt, die erforderlich sind, damit der gesamte Retina-Code in einer Datei gespeichert werden kann.2 Bytes gespart dank @ MartinBüttner.
quelle
Python 3, 51 Bytes
Anwendungsbeispiel:
Die Funktion berechnet
n*m+1
mit(1+len("xxx")*(len(s)-51))
denen esm
x
ist in der Zeichenfolge (xxx
Teil derB^m
). Das Multiplizieren der Zeichenkette"x"
mit dieser Zahl gibtB^(n*m+1)
und die Funktion nimmtA
undC
aus der Eingabe und verkettet all diese, um zu erhaltenAB^(n*m+1)C
.Der gleiche Ansatz in J:
J, 35 Bytes
quelle
CJam, 22
Beispiellauf:
was übersetzt zu
mit Eingabe als
was die folgende Ausgabe ergibt:
Wie es funktioniert :
Lässt an , welche Programme einen Blick darauf werfen
AC
undABC
wie folgt aussehen:Wir bemerken, dass
C
=B_~
Schauen
B
wir uns an, was passiert:Nun
AC
wollen wir sehen, was das Ausführen ohne Eingabe bewirkt:Wow, die Ausgabe ist
ABC
.Wir zählen grundsätzlich, wie viele
B
im Code vorhanden sind. Dann, wie viele sind in der Eingabe (mit Länge). Multipliziere sie, erhöhe sie zweimal (daC
hat sie auchB
) und hänge sie_~
an, um sie zu erhaltenC
Probieren Sie es hier online aus
quelle
Haskell , 50 Bytes
f
ist eine Funktion, die aString
.Die Zeichenfolge B ist nur ein einzelnes Leerzeichen, während C mit eins beginnt.
Probieren Sie es online!
_:b=" "
Weist alle Leerzeichen bis auf das erste im Zeichenfolgenliteral zub
, sodass dies den m B-Kopien des Programms entspricht .s
ist die Eingabezeichenfolge.a:c<-words s
Teilt es in durch Leerzeichen getrennte Wörter auf, so dass esa
zu A wird undc
eine Liste der Wörter mit C wird. Die B-Kopien werden ignoriert, dawords
mehrere Leerzeichen gedrückt werden (was der Rest des Programms vermeidet).drop 50s
ist eine Zeichenfolge mit einer Länge, die der Anzahl n von B Kopien in der Eingabe entspricht.drop 50s>>b
verkettet so viele Kopienb
mit mn Leerzeichen.unwords$a:(drop 50s>>b):c
Verbindet alle Zeichenfolgen mit Leerzeichen. Da(drop 50s>>b)
in der Liste ein zusätzliches "Wort" eingefügt ist, gibt es auch ein zusätzliches Verknüpfungsfeld, bei dem der Multiplikation automatisch +1 hinzugefügt wird.quelle
Matlab, 85
Für mich war es das erste Mal, dass ich eine solche abstrakte Herausforderung durchführte, also war es für mich eher eine Codierungsherausforderung als eine Codegolfherausforderung!
Die drei Zeichenfolgen sind ohne Anführungszeichen:
So funktioniert es: Ich teile das Eingabeargument auf Whitespace auf,
n
kann also aus der Anzahl der String-Teile ermittelt werden. B arbeitet als eine Art Zähler zu bekommenm
. Um die Antwort zu rekonstruieren, benutze ich A und C aus dem Split, wiederhole B m * n + 1 und füge die Leerzeichen mit ihrem ASCII-Wert ein, damit in C keine unerwünschten Splits auftreten.EDIT: whoops, versehentlich A + B gezählt
quelle
C (gcc) , 81 Bytes
Das Erfordernis, die Zeichenfolgen zu identifizieren, steht im Widerspruch zu unserem Willkürverhalten für illegale Eingaben, es sei denn, wir haben eher laxe Standards in Bezug auf die Identifizierung. Natürlich habe ich die Interpretation genommen, die die meisten Bytes vergießt.
Probieren Sie es online!
quelle
TI-Basic (Serie 83), 65 Byte
Segment A (33 Bytes):
Segment B:
Segment C (32 Bytes):
Ich freue mich riesig, diese quineartige Herausforderung zu finden! Die meisten Quines funktionieren in TI-Basic nicht ohne ein wenig Schummeln, da es keine Möglichkeit gibt, sich dem
"
Symbol zu entziehen . (In beiden Bedeutungen des Wortes "Escape".) Aber hier erhalten wir eine Eingabezeichenfolge über denInput
Befehl, und die Eingabe von a"
dort ist vollkommen in Ordnung.Hier gibt es immer noch einiges an TI-Basic-Schwachsinn: Eine leere Zeichenfolge ist ungültig, sodass die naive Lösung, die Zeichenfolge
"XXX...XX"
in eine Schleife einzufügen, nicht funktioniert, wenn n = 0 ist. Stattdessen berechnen wir den Wert von mn + 1 manuell und fügen die Zeichenfolge"X"
so oft ein.Die magischen Konstanten
27
und28
im Programm sind leicht aus von den Bytezähler 33 und 32, weilStr1
,sub(
undlength(
sind Zwei-Byte - Zeichen , die nur 1 auf die Länge einer Zeichenkette beizutragen.Wenn wir stattdessen Zeilenumbrüche verwenden
:
, sieht es so aus, als könnten einige Bytes eingespart werden , indem endende Anführungszeichen weggelassen werden. Dies funktioniert jedoch nicht. Zuallererst benötigen Sie einen Hex-Editor, bevor Sie das Newline-Zeichen in eine Zeichenfolge einfügen können: Sie können es nicht einfach eingeben, denn wenn Sie während einesInput
Befehls die EINGABETASTE drücken , wird die Eingabe gesendet . Als ich den Hex-Editor-Ansatz ausprobierte, kam es zu einem seltsamen Pufferüberlauffehler, der den Inhalt meines Programms veränderte. Versuchen Sie dies also nicht zu Hause mit Ihrem teuren Taschenrechner.quelle
Java 11,
13565 + 26 = 91 BytesEIN
B
C
Probieren Sie es hier online aus (TIO verfügt noch nicht über Java 11, daher wird stattdessen eine Hilfsmethode verwendet
String::repeat()
).Ungolfed:
quelle