Mieliśmy wiele wyzwań quine , ale wiele formatów quine jest podobnych, pozwala stworzyć pewną wariancję w naszych quinesach.
Twoim zadaniem jest utworzenie wyboru programów w tym samym języku (co najmniej 2), z których wszystkie generują własny kod źródłowy, jednak żaden z tych programów nie może udostępniać żadnych znaków.
Na przykład, jeśli tworzysz program za pomocą:
printf+qw(printf+qw(%s)x2)x2
Twój następny program nie może zawierać:
%()+2finpqrstwx
i tak dalej.
Zasady
- Możesz używać znaków Unicode, ale nadal musisz zapisywać wyniki w bajtach.
- Wszystkie programy muszą spełniać wspólnotową definicję właściwego quine . Oznacza to, że pusty ciąg znaków nie jest liczony między innymi jako poprawny quine.
- Standardowe luki są zabronione.
- Funkcje lub pełne programy są dozwolone, o ile spełniają powyższą definicję.
- Języki niezależne od symboli (w tym Lenguage i Headsecks) są niedozwolone.
- Większość programów wygrywa z najkrótszym łącznym kodem jako remis.
code-challenge
restricted-source
quine
Dom Hastings
źródło
źródło
Odpowiedzi:
V ,
3, 5 quines, 46 bajtówWypróbuj online!
Hexdump:
Wyjaśnienie:
Wypróbuj online!
Hexdump:
Wyjaśnienie:
Wypróbuj online!
Hexdump:
Wyjaśnienie:
Tutaj zaczynają się funky ...
Wypróbuj online!
Hexdump:
Wyjaśnienie:
Wypróbuj online!
Hexdump:
Wyjaśnienie:
Ta odpowiedź jest wypełniona czarną magią. Quiny 1 i 4 nie są nowe, ale pozostałe 3 nie zostały nigdy wcześniej znalezione, więc ponad połowa z nich została właśnie odkryta.
źródło
normie :p
”REEEEEE--
Galaretka ,
2 3 45 quines,14 18 81 65 59 56 326 265 247 229216 bajtów3 bajty
Wypróbuj online!
Standardowy quine.
”Ṙ
jest dosłowny dla jednego znakuṘ
.Ṙ
wypisuje reprezentację ciągu, a następnie ciągṘ
zostaje domyślnie wydrukowany.4 bajty
Wypróbuj online!
⁾
rozpoczyna literał ciąg dwóch znaków iḤ
podwaja argument. Po wprowadzeniu ciąguḤ
jest mapowany na każdy znak.Ḥ
Działając w ten sposób na sznurku⁾Ḥ
daje⁾⁾ḤḤ
kod źródłowy.11 bajtów
Wypróbuj online!
Po prawej stronie
“ȮṾṖƊ}
znajduje się literał ciąguȮṾṖƊ}
. Znak zamykający ciąg jest automatycznie dodawany w EOF.Po lewej stronie literału łańcuchowego
Ɗ
zawijaȮṾṖ
się w pojedynczą monadę i}
zamienia ją w diadę, która używa właściwego argumentu, literału łańcuchowego.Ȯ
wypisuje string (ȮṾṖƊ}
),Ṿ
tworzy ciąg reprezentujący string (“ȮṾṖƊ}”
) iṖ
usuwa”
znak. Ciąg“ȮṾṖƊ}
zostaje po monadzie i jest domyślnie drukowany.38 4936 bajtówWypróbuj online!
Po raz pierwszy użyłem przestrzeni w golfie Jelly.
Lista liczb na początku zawiera
ord
resztę znaków w kodzie. Po tym:270 198 180162 bajtówWypróbuj online!
Wykorzystuje podstawowe 250 liczb i indeksów do strony kodowej Jelly. Zaoszczędzono 72 bajty, zmieniając algorytm. Używałem każdej liczby do indeksowania na stronie kodowej Jelly, ale teraz przekształcam liczbę całkowitą z powrotem na bazę 250, a następnie indeksuję na stronę kodową Jelly, zasadniczo zmniejszając o połowę liczbę literałów, których potrzebuję w pierwszym wierszu. Zmniejsza to również liczbę potrzebnych unikatowych postaci, ale nie mogę wymyślić sposobu, aby zrobić więcej quines.
Zużyłem już,
⁾“”
które tworzą literały łańcuchowe,Ọ
aØJ
które tworzą ciągi liczbowe. Nie mogę wymyślić żadnych innych sposobów tworzenia łańcuchów. Nadal mam cyfrę9
i jestem‘’
dostępny, więc jeśli istnieje inny sposób tworzenia ciągów z liczb, może być możliwe wykonanie innego quine.źródło
Haskell , 3 piny, 1119 bajtów
Quine 1, 51 bajtów
Anonimowa
IO
akcja drukowana bezpośrednio na standardowe wyjście.Wypróbuj online!
Quine 2, 265 bajtów
Funkcja
f
przyjmuje fikcyjny argument i zwraca ciąg znaków.Wypróbuj online!
Quine 3, 803 bajtów
Wszystko po
LANGUAGE
pragmie jest anymalną funkcją, przyjmującą fikcyjny argument i zwracającą ciąg znaków.Wypróbuj online!
Postacie
Quine 1:
Quine 2:
Quine 3:
Jak to działa
Quine 1
Quine 1 to zmodyfikowana wersja mojego ostatniego Golfa, odpowiedź quine (z ulepszeniami H.PWiz):
main=
został usunięty.<>
i$
zostały zastąpione ich prawie synonimamimappend
iid
.Uwalnia to ważne postacie
=<>
i pomocnego operatora$
dla innych quines.Quine 2
Quine 2 używa nieco podobnych metod do programowania 2 moich ostatnich wzajemnie wykluczających się Quines , ale dostosowano ją do bezpośredniego quinowania się, a zwłaszcza w celu uniknięcia używania literałów znaków, które są potrzebne dla quine 3. Oba te sposoby są osiągane za pomocą
show
funkcji, na szczęście nie wykorzystano jeszcze żadnej z jego postaci.Quine używa tabulatorów zamiast spacji, ale dla czytelności użyłem spacji poniżej.
g
to dane quine, jako lista liczb całkowitych na końcu kodu. Każda liczba reprezentuje znak z reszty kodu.9
, tak aby tabulator był0
. To sprawia, że kodowanie jest nieco krótsze, ponieważ małe litery w nazwach funkcji i zmiennych mogą zmieścić się w 2 cyfrach.b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
to funkcja służąca do konwersji liczby na znak (w rzeczywistości ciąg jednoznakowy).[[show 9!!0,show 1!!0..]!!6..]
to zakres znaków rozpoczynający się od znaku tabulacji, do którego indeksuje się!!c
.[show 9!!0,show 1!!0..]
, zaczynając od cyfr'9'
i'1'
i skoki w krokach 8.show
ciągu odpowiedniej cyfry.f c=[b=<<g]!!0++show g
jest główną funkcją.c
jest fałszywym argumentem.b=<<g
służy=<<
do konwertowania każdej liczbyg
na jej znak. (Użycie=<<
zamiast npmap
Dlategob
potrzeby owinąć swój charakter zwrócony w liście).show g
daje ciąg znaków reprezentującyg
listę, oraz++
łączy ciągi znaków.=<<
ma niższy priorytet niż++
, potrzebne jest trochę braketingu. Aby uniknąć używania()
(zarezerwowane dla quine 3),[...]!!0
indeksuje do listy z jednym elementem.Quine 3
Zgodnie z projektem innych quinesów, quine 3 nadal ma dostęp do nawiasów, wyrażeń lambda, literałów znaków i konstruktora ciągów / list
:
. To wystarczy, aby skonstruować funkcję, która będzie kontynuowana Kodeksu Quine'a na sznurku.Niestety, wszystkie samogłoski pisane małymi literami (z wyjątkiem czasami
y
) zostały użyte, nie pozostawiając żadnych przydatnych wbudowanych funkcji alfanumerycznych. Też[]""
już nie ma. Nie pozostawia to normalnego sposobu na zbudowanie pustego ciągu, aby rozpocząć udawanie kodu.Jednak prawie wszystkie wielkie litery są nadal dostępne, więc istnieje
LANGUAGE
możliwość uzyskania rozszerzenia języka. Ponownie, dzięki szczęściu,CPP
(włącz preprocesor C) jest jedynym rozszerzeniem językowym o nazwie zawierającym tylko wielkie litery. Makra CPP często mają wielkie litery.Aby uzyskać niezbędny pusty ciąg, quine włącza
CPP
, używa__TIME__
makra, aby uzyskać stałą ciągu formy"??:??:??"
(wygodnie jest mieć zawsze tę samą długość) i dopasować wzorzec na nim.Po pragmie języka quine składa się z wyrażenia lambda wiążącego swoje parametry z tymi czterema argumentami (pozostawiając końcowy parametr pozorny
_
do zastosowania później):q
związany'\''
, dając pojedynczy znak cudzysłowu;_:_:_:_:_:_:_:_:z
związany__TIME__
, podobnie jak łańcuch"??:??:??"
, tworzącz
pusty łańcuch;y
związany z(\(?)v k x->v$k?x)
kombinatorem lambda używanym do konwersji danych quine z postaci powiązanej od lewej („foldl”) do postaci powiązanej z prawą („foldr”);(#)
zobowiązał się do\(&)(%)v->v&'{'&'-'&...
samych danych quine.Dane z quine są podane w formie kodowania Churcha, wyrażenia lambda z parametrami
(&)(%)v
.(&)
,(%)
orazv
to kodowanie może być użyte albo do zbudowania podstawowego kodu quine, albo do przebudowania samej reprezentacji danych quine.&
i%
stać lewo operatorom asocjacyjnych wewnątrz lambda. W ten sposób parametry postaci łączą się z początkowym,v
zaczynając od lewej.k
istnieje odpowiednik&'k'
.k
jest'
lub\
, które muszą być poprzedzone znakami literowymi, kodowanie odbywa się zamiast tego%'\k'
.Ponieważ kodowanie danych jest asocjacyjne, ale łańcuchy są budowane we właściwy sposób asocjatywny, wprowadzono kombinator w
y = (\(?)v k x->v$k?x)
celu wyeliminowania niedopasowania.y(...)
ma na celu zbudowanie odpowiednich funkcji do wykorzystania jako danych(&)
i(%)
operatorów quine .v
jest funkcją od ciągów do ciągów (dane quinev
są przykładami).k
to znak,x
ciąg i?
operator, który łączy je w nowy ciąg. (W przypadku kodu podstawowego(?)=(:)
. Dla faktycznej rekonstrukcji reprezentacji danych quine jest to bardziej skomplikowane.)y(?)v k = \x->v$k?x
jest inną funkcją od ciągów do ciągów.Jako przykład tego, jak to zmienia skojarzenie, jeśli
(&)=y(:)
:Mówiąc bardziej ogólnie, kiedy
(#)
jest to funkcja danych quine if1,f2
są to funkcje łączące znaki z łańcuchami:zastosowanie funkcji danych quine za pomocą
(&)=y(f1)
i(%)=y(f2)
, i to wykorzystuje przepisanef1
if2
do łączenia znaków danych quine zx
, a następnie przekazuje wynikowy ciąg dov
.Ciało głównego wyrażenia lambda łączy to wszystko:
'&':q:k:q:x
ponieważ znakk
poprzedza&'k'
ciąg znakówx
, podczas gdy'%':q:'\\':k:q:x
poprzedza%'\k'
, które są ich oryginalnymi formami danych quine.y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
odpowiednie parametry do przebudowania reprezentacji danych quine, dołączone do finałuz
(pusty ciąg), a następnie przekazane do następującej funkcji.y(:)#y(:)
są właściwymi parametrami do dodania kodu podstawowego quine do łańcucha, bez innych modyfikacji.\x->x
nie można nic zrobić ze skonstruowanym quine, który jest zwracany.źródło
Perl 6 , 3 quiny, 274 bajty
Quine 1, 52 bajty
Wypróbuj online!
Quine 2, 102 bajty
Wypróbuj online!
Quine 3, 120 bajtów
Wypróbuj online!
Weryfikacja różnych zestawów bajtów
Zdobycie trzeciego quinu wymagało wiele manewrów. Perl 6 ma 4 sposoby wyjścia (to jestem świadomy),
say
,put
,print
iprintf
. Zarównosay
iput
nowe wiersze wyjściowe, ponieważ nie mogę używać obu.put
,print
,printf
Wszystkie zawierająp
at
. Możemy to obejść częściowo, używającEVAL
wielkich literPRINT
. Stamtąd nie wydaje mi się, aby można było uzyskać 4 quiny ... (choć może coś w tym rodzajushell "echo 'quine'"
może działać)Możemy wtedy obejść problemy z odstępami, używając różnego rodzaju białych znaków do oddzielania operatorów, spacji, tabulatorów i znaków nowej linii.
Objaśnienia:
Quine 1:
Quine 2:
Jest to quine w formacie
printf |(q[printf q[%s]]xx 2)
, tzn. Formatuje kopię łańcucha w siebie. Jednak nie możemy użyć,s
ponieważ jest to używane w poprzednim quiniesay
. Tak więc używamy operatora OR ciągu (~|
) na@
i!3
, aby wytworzyć%s
część, ale nie możemy tego zrobić zarówno z ciągiem formatu, jak i ciągiem do wstawienia, więc musimy zrobićZ~
z dodatkowym ciągiem i pustym ciągiem, chociaż wtedy nie możemy użyć,
do rozdzielenia tych dwóch, więc wykonujemyXx qw[1 0]
mnożenie przez 1 i 0.Quine 3:
Jest to EVALNA quine, która stara się zrobić wszystko wielkimi literami, aby uniknąć konfliktu z innymi quinesami. Wiąże się to wiele od
EVAL
s, a także sporolc
iuc
do konwersji pomiędzy przypadkach.źródło
MathGolf ,
4 56 quines, 193 535 bajtów9 bajtów
Wypróbuj online!
45 bajtów
Wypróbuj online!
49 bajtów
Wypróbuj online!
99 bajtów
Wypróbuj online!
4488 bajtów
Wypróbuj online!
188,845 bajtów
Naprawdę nie mogę połączyć się z tym, więc oto program w Perlu 6, który generuje właściwy quine
Weryfikacja odrębności
Z całą pewnością mogę wycisnąć z tego kolejną quinę, choć myślę, że zabrakło mi sposobów na pchanie ciągów prosto na stos, więc będę musiał uciekać się do dziwniejszych metod. Nadchodzą jeszcze dziwniejsze metody, gdy staram się o szóstą dziesiątkę. W niektórych przypadkach quines może być krótszy, ale redukuję używane bajty w przygotowaniu.Ok, technicznie mogę być w stanie zrobić jeszcze jedną quine, ponieważ wciąż mam kilku operatorów, których potrzebuję (ciąg push, ciąg przyrostowy, duplikacja, mapowanie, popping), to pętla nas ogranicza. Są
{}
to jedyne operatory, które mogą wskazać blok kodu o dowolnej długości i naprawdę potrzebuję ich w szóstej piątce. Mógłbym użyć niektórych innych bloków kodu, ale są one ograniczone i wątpię, aby sekcje zapętlające były tak krótkie, ponieważ brakuje nam łatwych operatorów.Okej, spóźnione wyjaśnienia:
Wszystkie quines mają prawie taką samą strukturę:
Quine 1:
Jest to w zasadzie to samo, co zamieściłem w normalnym pytaniu quine.
Quine 2
Quine 3:
Quine 4:
Quine 5:
Quine 6:
Powodem, dla którego ten quine jest o wiele dłuższy niż inne, jest to, że inkrementowanie ciągów używa reprezentacji Unicode, co naprawdę jest do bani dla niektórych znaków w kodzie, szczególnie gdy próbujemy utworzyć znak
⌂
w kodzie, co powoduje napompowanie kodu o ponad 8000 znaków, co następnie bardzo mocno napełnia część reprezentacyjną.Ten ostatni quine zostałby znacznie zmniejszony, gdyby MathGolf był spójny, czy ciągi znaków używają natywnej strony kodowej, czy nie.
źródło
chr/ord
jednego z nich, myślę, że oboje powinniśmy użyć strony kodowej.Python 2, 2 quines,
434353349446 bajtówTo było głównie po to, aby sprawdzić, czy mogę to zrobić w Pythonie.
30 bajtów (w tym końcowy znak nowej linii):
i 416 bajtów, bez końcowego znaku nowej linii:
(Grał w golfa 81 bajtów dzięki Lynn, ale dodał obciążenie ze względu na dbanie o nową linię).
Wyjaśnienie
Pierwszy to tylko standardowa krótka quine Pythona , ale zmodyfikowana, by nie używać
_
. Ponieważ jest to Python 2, również nie używa(
lub)
.Drugi zastanowił się. Długi łańcuch jest kodowany przy użyciu
hex
kodeka (co gwarantuje, że będzie zawierał tylko0
-9
ia
-f
) i dekoduje jakoWykorzystuje quine trick, aby uzyskać własny kod źródłowy, a następnie koduje go za pomocą
hex_codec
, a następnie drukuje w otoczeniuexec"".decode("hex")
, używającsys.stdout.write
aby uniknąć drukowania nowego wiersza. Uruchomienie tego kodu powoduje wyświetlenie drugiego quine, czyli tego, jak go wygenerowałem.Podejrzewam, że więcej niż dwa są niemożliwe w Pythonie, ale chciałbym to zobaczyć, jeśli się mylę!
Jeśli nie masz nic przeciwko eval quines
Ørjan Johansen zasugerował następujące kwestie dla wstępnie zakodowanej drugiej quiny
co dałoby wynik 30 + 248 = 278 bajtów dla następujących danych wyjściowych:
Używanie
exec
w ten sposób nie jest oszustwem zgodnie z właściwymi regułami quine PPCG, ale wydaje mi się nieco oszukiwane (eleganckie i sprytne, ale wciąż oszukiwane), ponieważ niektóre znaki są używane zarówno jako kod, jak i dane. (Mimo że moja wersja używaexec
, kod i dane są osobne.) Więc zachowam wynik na 446.źródło
"hex"
działa zamiast"hex_codec"
, co powinno zaoszczędzić kilka bajtów!print '<tab>',
nie dodaje spacji na końcu. Za pomocą tego możesz uzyskać 85 bajtów od sugestii Jo Kinga: tio.run/…Japt ,
23 quiny,106172 bajtówPierwsza z nich jest dość pełną wersją mojej odpowiedzi w postaci N char quine .
Wypróbuj tutaj .
Drugi quine to większy dobry quine ETHProduction , który jest dobrym standardowym quine dla Japt.
Wypróbuj tutaj .
Trzeci używa
``
XORing i kod znaków do przechowywania danych.Wypróbuj tutaj .
Ponieważ
()'
wciąż są dostępne, może być możliwe wyciśnięcie jeszcze jednego quine.źródło
"'[+U+']+R+(Umd)¬"q mc
daje pierwszą linię do szybkich aktualizacji, jeśli to pomoże.Gol> <> ,
23 quiny,17 28 2726 bajtów6 bajtów
Wypróbuj online!
11 109 bajtówWypróbuj online!
11 bajtów
Wypróbuj online!
Gol> <> ma trzy sposoby wydrukowania dowolnego znaku:
o
Podaj jedną wartość i wydrukuj jako charH
Pop wszystko, drukuj jako char i zatrzymajS"..."
Drukuj dosłowny ciąg znaków bez wpływu na stosAle nie mogłem znaleźć sposobu na napisanie quinu za pomocą
S"..."
jako jedynej metody wyjściowej, więc wymyśliłem powyższe dwa, wykorzystując dwa rodzaje literałów łańcuchowych.Trzeci (autorstwa Jo Kinga) używa
p
polecenia, aby utworzyć „"
wS"
locie”, co z kolei drukuje wszystko oprócz zera na końcu. NastępnieEh
drukuje zero i wychodzi.Teraz, kiedy
p
zużyliśmy wszystkie polecenia wyjściowe ORAZ polecenie, uważam, że niemożliwe jest utworzenie kolejnej quine (chyba że ktośS"
wymyśli quine bezp
).źródło
S"..."
?Rubin , 2 quiny, 27 + 44 = 71 bajtów
Wypróbuj online!
Wypróbuj online!
Ograniczają mnie głównie metody produkcji. Istnieje wiele sposobów manipulowania ciągami, ale poza
$><<
wszystkimi użytecznymi metodami wyjściowymi wydaje się, że przecinają się za bardzo. Myślę, że może istnieć wyjście,eval
ale trudne jest zagnieżdżanie wielu różnych operacji na łańcuchach.źródło
JavaScript ES6, 2 quiny, 43 + 22 = 65 bajtów
Quine 1:
Quine 2:
źródło
g=z=>"g="+g
to prawidłowy quin JS?> <> , 2 quinesy, 8 + 16 = 24 bajty
8 bajtów
Wypróbuj online!
Zaczerpnięte z tej odpowiedzi .
16 bajtów
Wypróbuj online!
Opiera się to na
'r3d*>o<
quine, z wyjątkiemo
i<
nie można go używać, więc zastąpiłem<
go|
i utworzyłem dynamicznieo
(111 = 8 * 13 + 7) i umieściłem go tam, gdzie>
jest 2. miejsce .2 quines to limit
Niestety jesteśmy ograniczeni liczbą poleceń wyjściowych.
n
nie jest użyteczny, ponieważ wypisuje tylko liczby, więco
musi być wykonywany w dowolnym quine. Jedynym sposobem na dynamiczne tworzenieo
jest użyciep
. Więc jeden quine może użyćo
, a drugi może go tworzyćp
, ale nie może być trzeciego quine.Jeśli to się liczy, możliwe, że trzeci kod pozostawi kod źródłowy na stosie.
źródło
Java 10, 2 quiny,
14481248 bajtów13501122 bajtówWypróbuj online.
Równoważny:
Wyjaśnienie:
126 bajtów
System.console()
zwróci,null
gdy nie zostanie podany żaden, więc TIO zwracaNullPointerException
w tym przypadku a .Aby udowodnić, że to działa, zastąp
System.console()
goSystem.out
: Wypróbuj online.Wyjaśnienie:
Ogólne wyjaśnienie:
W Javie quine zwykle wykonuje się w następujący sposób:
String s
Zawiera kod źródłowy niesformatowany.%s
służy do wprowadzania tego ciągu do siebie za pomocąs.format(...)
.%c
,%1$c
i34
służą do formatowania podwójnych cudzysłowów.s.format(s,34,s)
łączy to wszystko.W takim przypadku najkrótszą funkcją quine lambda w Javie 10 byłoby ( 82 bajty ):
Wypróbuj online.
Ponieważ jedynym sposobem na posiadanie dwóch pinów w Javie jest użycie wersji Unicode
\uHEXA
, która jest konwertowana na znaki podczas kompilacji, nie mogę używać znaków0123456789ABCDEF\u
w wersji innej niż Unicode. Tak więc, mniejsza lub inna niż Unicode wersja będzie używaćSystem.console()
zamiastreturn
lubSystem.out
(oba zawierają „u”) i będzie używać'}'-'['
i dwa razy%c
zamiast34
i%1$c
.Kilka rzeczy do zapamiętania na temat wersji Unicode:
%04X
zamiast%04x
(dla dużych Hexadecimal zamiast małych).92
,%c
i%3$c
do formatowania ukośniki.\U
litery zamiast małych liter\u
jest najwyraźniej niedozwolone, inaczej użyłbym tylkoreturn
krótszej wersji bez kodu Unicode.źródło