Zadanie
- Weź jeden znak Unicode jako dane wejściowe.
- Wyprowadza program w tym samym języku, który również przestrzega tej specyfikacji, ale który nie zawiera znaku wejściowego.
- Jeśli twój program jest uruchamiany z wejściem a , a następnie program wyjściowy jest następnie uruchamiany z wejściem b , wówczas program, który wysyła, ZEZWALA zawierać znak a . Jednak b nadal nie może pojawiać się w tym programie. Innymi słowy, tylko wejście do najnowszej wersji programu jest zabronione.
- Niezależnie od tego, co może powiedzieć tytuł, obowiązują standardowe zasady quine.
Najkrótszy program wygrywa. Program musi mieć co najmniej jeden bajt.
Przykład
Jeśli programem jest ABCD. (# to komentarz)
> 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
Gdzie slangi
jest tłumacz dla fikcyjnego języka.
code-golf
restricted-source
quine
Akangka
źródło
źródło
e
.e
, ale Gadsby to robi.Odpowiedzi:
CJam,
45413835 bajtówJeśli znak wejściowy nie jest żadnym ze znaków
"$&)+,/:?HOX\_`el{}
, program wypisuje następującą, nieco zmodyfikowaną wersję samego siebie. Wypróbuj online!W przeciwnym razie program wydrukuje następującą, zaciemnioną wersję modyfikacji. Wypróbuj online!
Pamiętaj, że niektórych znaków nie można wydrukować. Wypróbuj online!
Jak to działa
W pierwszym możliwym programie wyjściowym unikamy używania go,
~
aby móc go używać w innym programie. Dlatego zamiast_~
zmodyfikowanego programu kończy się znakOX$_?
, który działa w następujący sposób.Wreszcie w pozostałym programie wyjściowym
opakowuje wszystkie znaki w tablicę, dlatego wypycha następujący ciąg.
If-
odejmuje 18 od każdego kodu znakowego, popychając ciągktóry
~
ocenia.źródło
JavaScript (ES6),
356340327308303263Teraz używa
Function`...```
do drugiego programu:Funkcja pakuje się w jeden z trzech możliwych programów:
Pierwszy program wywołuje
eval
literał łańcuchowy zawierający kod funkcji, a każdy znak jest zastępowany wartością ósemkową.Drugi program przekierowuje przeglądarkę na
javascript:
adres URL zawierający kod funkcji z zakodowanym adresem URL każdego znaku. To jedyny sposób, w jaki mógłbym ocenić kod bez użycia nawiasów. Unika także liter w „eval”.Ostatni program jest boleśnie długi. Buduje kod funkcji, dodając po jednym (
+9-8
), aby uzyskać kod każdego znaku. Ma to na celu uniknięcie używania cyfr ósemkowych.Właściwy program jest indeksowany poprzez wyszukiwanie starannie skonstruowanego ciągu znaków wejściowych:
Oto niepoddana testom wersja. Może nie działać z powodu nowych linii w źródle.
źródło
function f(){ ... };f()
może być(f=_=>{ ... })()
. Oto przykład: es6fiddle.net/iiz2nq0lf=(_=prompt())=>...;f()
. Dane wejściowe są przechowywane jako_
.Function`[code]`.call``;
pracy zamiast przekierowywać? Oto działający przykład: es6fiddle.net/ij023v49 (Widzisz? Nieevil()
! Erm, mam na myślieval()
...)this
obiektem będzie ten pusty ciąg szablonu. Zależy to odFunction
konstruktora, który umożliwia tworzenie funkcji zamiast uruchamianiaeval()
. Funkcja będzie miała kod zawarty w pierwszym parametrze. Używam go bardzo często, aby uzyskać prawdziwywindow
, przy użyciuFunction('return this')()
. Ponieważ nie możesz użyć()
, nadużyłem trochę uprzejmości ES6, próbując wypluć użyteczną funkcję, bez której możesz uruchomić()
. W tym celu potrzebujesz.call()
metody, która wywołuje funkcję z nowymthis
obiektem.