lub: Zbuduj pionowy quine
Zainspirowany przez: Stań przy długich liniach .
Twoim zadaniem jest zbudowanie pionowej kabiny o możliwie najkrótszej długości linii.
Punktacja
Zwycięża najkrótsza linia (z wyłączeniem nowych linii), z kryterium golfa jako rozstrzygającym.
Długość linii jest określana jako najdłuższa linia w twoim programie, z wyłączeniem znaku końca linii.
Na przykład:
$_=
Q.
P
ma długość linii 3 i liczbę bajtów 8, podczas gdy:
Q
$
_
P
Ma długość linii 1 i liczbę bajtów 7 (zakładając, że nie ma końca nowej linii).
Zasady
Quines musi spełniać wspólnotową definicję quine .
Standardowe luki są zabronione.
code-challenge
quine
source-layout
Dom Hastings
źródło
źródło
Odpowiedzi:
Lenguage , długość linii 0, ≈ 1,01 × 10 805 bajtów
Kod źródłowy składa się z
linefeeds, który koduje następujący program do pieprzenia mózgów.
Kod źródłowy jest w większości identyczny z zmiękczonym promieniowaniem quine Lenguage @ minus
.
na końcu, z++++++++++.[-]
zastąpieniem.
wydruku linii zamiast bajtów zerowych i odpowiednich zmian w sekcji danych w linii 1.źródło
"about 1.75*10**76 yottabytes in ASCII"
]++++++++ ++.-->
JavaScript, długość linii 1,
960956928 bajtówBardziej czytelna wersja, która również jest quine (usunięto zbędne znaki nowej linii):
Wyjaśnienie
Uff Wybierz się tutaj na przejażdżkę, ponieważ będzie to zdradziecka podróż ...
Spędziłem dużo czasu próbując dowiedzieć się, jak rozwiązać to wyzwanie z długością 1 - bez wbudowanych (bezpośrednio, w każdym razie), słów kluczowych, a nawet funkcji strzałek - zanim zdałem sobie sprawę, że jest to możliwe z JSF *** , który może oceń dowolny kod JavaScript, unikając jednocześnie tokenów wielobajtowych. Ale rozwiązanie JSF z łatwością miałoby tysiące bajtów, jeśli nie dziesiątki lub setki tysięcy. Na szczęście nie ograniczamy się tylko do -
()[]+!
mamy do dyspozycji wszystkie ASCII!Postanowiłem zacząć od gry w golfa w podstawowe elementy JSF - postaci, które można zbudować z ciągów znaków, aby „odblokować więcej funkcji”. Nie możemy używać ciągów bezpośrednio do pobierania znaków, ponieważ wymagałoby to wierszy o długości 3. Zamiast tego kradniemy sztuczkę z JSF, uzyskując kilka znaków z literałów, które można zbudować za pomocą tokenów jednobajtowych:
Z nich możemy rozwinąć na zewnątrz, zaczynając od
[].find
, który jest obiektem funkcji. Konwersja to ciągfunction find() { ...
daje nam dostęp doc
,o
przestrzeń (_
) i nawiasy (y
iz
). Co ważniejsze, mamy teraz dostęp do swojegoconstructor
, zFunction
funkcją-które inceptional jak się może wydawać, daje nam możliwość wykonywania kodu budując łańcuch, mijając goFunction()
, a następnie wywołaniu funkcji generowane.Powinienem chyba wspomnieć o ogólnej metodzie stosowanej przez sam program. Począwszy od 2015 r. JavaScript ma tę naprawdę fajną funkcję zwaną „ szablonami otagowanymi ”, która nie tylko pozwala na nieoznaczone znaki nowej linii w ciągach, ale także pozwala nam wywoływać funkcję z dosłownym ciągiem znaków (w pewnym sensie;
myFunc`abc`;
jest mniej więcej równoważnamyFunc(["abc"])
). Jeśli umieścimy wywołanie funkcji jako ostatnią rzecz w programie, ogólna struktura będzie wyglądać następująco:Wszystko,
func
co należy zrobić, to wypisanie argumentu, następnie kliknięcie wstecz, następnie argument ponownie i drugi zwrot. Zakładając, że mamy argumenta
i zapisany backtickf
, możemy to zrobić za pomocą kodualert(a+f+a+f)
. Jednak w tej chwili brakuje,+
a sam backtick.+
(przechowywane wP
) nie jest trudne; kradniemy kolejną sztuczkę z JSF, budując ciąg1e23
, konwertując na liczbę, a następnie z powrotem na ciąg, dając"1e+23"
.Użycie backticka jest nieco bardziej skomplikowane. Na początku próbowałem uzyskać
String.fromCharCode
, ale znalezienieC
okazało się prawie tak samo trudne. Na szczęścieatob
jest łatwy do uzyskania (Function("return atob")()
;b
jest generowany z0+{}
, co daje[object Object]
) i może dać dowolny znak ASCII, jeśli zostanie znaleziony odpowiedni ciąg magiczny. Krótki skrypt dał mi12A
jako jedną z opcji, które można łatwo znaleźć w12Array
(nieco krótszy wygenerować dzięki[].constructor[n+a+m+e]
;m
znajduje się w0 .constructor+0
:"function Number() { ..."
).Wreszcie, wszystko trzymamy razem. Przypisujemy strzałkę wsteczną do zmiennej
f
, ale ponieważ nie możemy jej użyć bezpośrednio w ciągu funkcji, zamiast tego ustawiamy zmiennąq
na literęf
i używamy jej zamiast tego. To czyni nasz ostatni ciąga+l+e+r+t+y+a+P+q+P+a+P+q+z
, lub"alert(a+f+a+f)"
. NastępnieFunction()
podajemy to do, podajemy gotowy kod do wyniku i voila, mamy skrypt JavaScript z nie więcej niż jednym znakiem w wierszu!W tej chwili czuję się okropnie, więc proszę pytać o błędy, które popełniłem lub rzeczy, które mi umknęły w tym wyjaśnieniu, a wrócę do ciebie po odpoczynku ...
źródło
f=
wiersz.f
jedno kliknięcie. Sama linia jest równoważnaf=atob("12Array")[1]
. Druga sztuczka polega na tym, żeq
tak naprawdę jest ustawiona na literęf
w pierwszym wierszu, więc wF(...)
wierszu mogę użyć jej do wstawienia literyf
do ocenianego ciągu, ponieważ zmiennaf
nie jest już ustawiona na tę literę. Jesta+l+e+r+t+y+a+P+q+P+a+P+q+z
to równoważne z"alert(a+f+a+f)"
.0+{}
i0[E]
skreślić, aby uzyskaćb
im
.Haskell , długość linii 6,
400343336 bajtówWypróbuj online! Nie znam sposobu na obejście
putStr
, dlatego długość linii wynosi 6. Zewnętrzne nawiasy klamrowe pozwalają pozbyć się innego wymaganego wcięcia po nowej linii w obrębie jednej deklaracji.źródło
> <> , 22 bajty, długość linii 1
Wypróbuj online!
-6 bajtów dzięki Emignie .
źródło
CJam , długość linii 1,
1613 bajtówWypróbuj online!
To mały cud, że wstawianie nowego wiersza w
standardowej quinie,nawet krótsza standardowa quina,{"_~"}_~
"_p"␊_p
robi dobrze. (Dzięki, Martin!) Końcowy znak nowej linii jest konieczny.Objaśnienie (z • jako nowy wiersz)
Po zakończeniu drukowane jest to, co zostało na stosie (
•_•p•
), uzyskując całkowitą wydajność"•_•p•"••_•p•
.źródło
Haskell + CPP, długość linii 2,
705237 bajtówWypróbuj online! Użycie flagi,
-CPP
która włącza preprocesor C, pozwala nam użyć ukośnika odwrotnego na końcu linii, aby kontynuować ją w następnej linii.Rzeczywisty kod to
main=putStr$(:"\\\n")=<<s++show s;s="<data>"
.Edycja: Dorywczo -468 bajtów dzięki Ørjan Johansen !
źródło
main=putStr$(:"\\\n")=<<s++show s;s="<data>"
. Wypróbuj online!Rdza, długość linii: 5, bajty:
301299Wypróbuj online
Pomimo tego, jak to wygląda, nie jest to ezoteryczny język programowania, jest tylko dużo szumu linii formatu.
Aby móc użyć, wybrano pionową długość 5
print
. Nie sądzę, że istnieje sposób na wydruk, który miałby krótszą długość w pionie, deklarując, że funkcje C używająextern
słowa kluczowego,stdout
ma 6 bajtów długości,write
5 bajtów długości,no_main
7 bajtów długości (main jest zwykle funkcją;)).źródło
cargo fmt
żeby tu nawet pomógł ...05AB1E , Długość linii: 1, Liczba bajtów: 43
Wypróbuj online!
źródło
Japt , długość linii 1, 20 bajtów
Na podstawie standardowej wersji Japt Quine firmy ETH .
Wypróbuj tutaj!
źródło
JavaScript (ES6), długość linii 3, 17 bajtów
źródło
Czerwona , długość linii: 10, 49 bajtów
Wypróbuj online!
W rzeczywistości jest to reine quine
Objaśnienie: Kolor czerwony / Rebol jest
mold
zgodny ze stylem kodowania polegającym na przesunięciu 4 spacji.źródło
RProgN , 3 bajty, długość linii 1
Wypróbuj online!
Kopia odpowiedzi Dennisa tutaj (idź do głosu)
Jest to zgodne z naszą obecną definicją właściwego quine, ponieważ pierwsze 0 koduje drugie 0 i odwrotnie.
źródło
RProgN 2 , L = 1, B = 15 bajtów
Jest to równoważne z programem:
Awaria
«
najpierw wypycha funkcję reprezentującą niejawnie resztę programu na stos, a następnie kontynuuje wykonywanie.Ø.
dołącza pusty ciąg do funkcji, która go uszeregowuje. To zawsze będzie rygorystycznie podobne do programu ekwiwalentnego, ponieważ nowe linie nie będą działać.`\n-
Usuwa wszystkie znaki nowej linii z łańcucha, teraz wyglądające jak«Ø.`=S`.
.S
następnie przekształca go w stos pojedynczych znaków i`\n.
dołącza do stosu przez nowe linie, zwracając oczekiwany program.Wypróbuj online!
źródło
Niedociążenie , długość linii 1, 20 bajtów
Wypróbuj online!
To tylko standardowa quine niedociążenia z dołączonymi znakami nowej linii. Wymaga implementacji takiej jak TIO, która ignoruje nieznane znaki poleceń.
Część w
()
jest dosłownym ciągiem umieszczanym na stosie,:
powielanym,a
zawijającym górny wpis stosu w nawiasach iS
drukowanym.źródło
Perl 5 , 259 bajtów
Wypróbuj online!
Weryfikacja .
źródło
JavaScript (ES6 REPL), pełny program, długość linii: 3, liczba bajtów: 31
To jest port odpowiedzi @ kamoroso94 na samodzielny pełny program.
Jeśli ktoś znajdzie sposób na usunięcie niektórych bajtów bez dodawania więcej do długości linii, możesz komentować :)
źródło
Pip , długość linii 1, 35 bajtów
Wypróbuj online!
W oparciu o najkrótszy znany Pip Quine'a,
V Y"`V Y`.RPy"
. Główną trudnością w ściśnięciu go do długości linii 1 jest toRP
, że nie można go podzielić na dwie linie. Ale w tym przypadku wszystkoRP
(repr) robi zawijanie łańcucha w podwójne cudzysłowy, co możemy zrobić bezpośrednio.Oto wyjaśnienie oparte na wersji poziomej:
źródło
Befunge-98 , 41 bajtów
Wypróbuj online!
Naprawdę zwykły quine odwrócony bokiem, z dodatkowymi rzeczami do drukowania nowych linii.
źródło