Aufgabe
- Nehmen Sie ein einzelnes Unicode-Zeichen als Eingabe.
- Geben Sie ein Programm in derselben Sprache aus, die auch dieser Spezifikation entspricht, jedoch kein Eingabezeichen enthält.
- Wenn Ihr Programm mit Eingabe ausgeführt wird , ein , und dann wird das Ausgabeprogramm dann mit Eingang laufen b , dann wird das Programm es gibt ist ERLAUBT Zeichen enthalten ein . Es ist jedoch weiterhin nicht gestattet , dass b in diesem Programm erscheint. Mit anderen Worten, nur die Eingabe in die letzte Inkarnation des Programms ist verboten.
- Unabhängig von der Überschrift gelten die üblichen Regeln für Quine.
Kürzeste Sendung gewinnt. Das Programm muss mindestens ein Byte lang sein.
Beispiel
Wenn das Programm ABCD ist. (# ist ein Kommentar)
> slangi "ABCD"
A
EBCD # "FBCD" "JGGJ" "UGDKJGDJK" are all OK
> slangi "EBCD"
C
ABGD # "EBGD" "UIHDAIUTD" are all OK
> slangi "ABGD"
B
AFCD
> slangi "AFCD"
Z
ABCD
Wo slangi
ist ein Dolmetscher für eine fiktive Sprache.
code-golf
restricted-source
quine
Akangka
quelle
quelle
e
.e
, aber Gadsby tut es.Antworten:
CJam,
45413835 BytesWenn das eingegebene Zeichen keines der Zeichen ist
"$&)+,/:?HOX\_`el{}
, druckt dieses Programm die folgende, leicht geänderte Version von sich. Probieren Sie es online!Andernfalls druckt das Programm die folgende, verschleierte Version der Änderung. Probieren Sie es online!
Beachten Sie, dass einige der Zeichen nicht druckbar sind. Probieren Sie es online!
Wie es funktioniert
Im ersten möglichen Ausgabeprogramm vermeiden wir
~
es, es im anderen Programm verwenden zu können. Daher_~
endet das geänderte Programm statt mitOX$_?
, was wie folgt funktioniert.Schließlich im restlichen Ausgabeprogramm,
bricht alle diese Zeichen in ein Array ein und drückt daher die folgende Zeichenfolge.
If-
subtrahiert 18 von jedem Zeichencode und drückt die Zeichenfolgewas
~
die auswertet.quelle
JavaScript (ES6),
356340327308303263Verwenden Sie jetzt
Function`...```
für das zweite Programm:Die Funktion packt sich in eines von drei möglichen Programmen:
Das erste Programm ruft auf
eval
ein Zeichenfolgenliteral auf, das den Funktionscode enthält, wobei jedes Zeichen als Oktalwert maskiert wird.Das zweite Programm leitet den Browser zu a weiter
javascript:
URL weiter, die den Funktionscode mit jeder Zeichen-URL enthält. Dies ist die einzige Möglichkeit, Code ohne Verwendung von Klammern auszuwerten. Es entgeht auch den Buchstaben in "eval".Das letzte Programm ist schmerzhaft lang. Es baut den Code der Funktion auf, indem es einen hinzufügt (
+9-8
) erstellt, um jeden Zeichencode abzurufen. Dies dient dazu, die Verwendung von Oktalziffern zu vermeiden.Das richtige Programm wird indiziert, indem eine sorgfältig erstellte Zeichenfolge nach dem eingegebenen Zeichen durchsucht wird:
Hier ist eine ungolfed, ungetestete Version. Möglicherweise funktioniert dies nicht, da die Quelle Zeilenumbrüche enthält.
quelle
function f(){ ... };f()
kann sein(f=_=>{ ... })()
. Hier ist ein Beispiel: es6fiddle.net/iiz2nq0lf=(_=prompt())=>...;f()
. Die Eingabe wird gespeichert als_
.Function`[code]`.call``;
Sie keine Arbeit für Sie, anstatt umzuleiten? Hier ist ein funktionierendes Beispiel: es6fiddle.net/ij023v49 (Siehe? Neinevil()
! Ähm, ich meineeval()
...)this
Objekt diese leere Vorlagenzeichenfolge sein wird. Es basiert auf demFunction
Konstruktor, mit dem Sie eine Funktion erstellen können, anstatt sie auszuführeneval()
. In der Funktion ist der Code im ersten Parameter enthalten. Ich benutze es eine Menge , um die reale zu bekommenwindow
, mitFunction('return this')()
. Da Sie diese Funktion nicht verwenden können()
, habe ich die Freundlichkeit von ES6 missbraucht, um zu versuchen, eine verwendbare Funktion auszuspucken, auf die Sie verzichten können()
. Dazu benötigen Sie die.call()
Methode, die die Funktion mit einem neuenthis
Objekt aufruft .