Wyzwanie
Utwórz dwa programy, A i B, które są programami dla kotów w tym samym języku. Po połączeniu, AB (również w tym samym języku) powinno być quine.
Załóżmy na przykład, hello
i world
to zarówno programy Cat in języka XYZ. Jeśli helloworld
jest to quine w tym języku, to twoje rozwiązanie jest ważne.
Dla tych, którzy nie znają kotów i quinesów, program cat to taki, który drukuje dokładnie to, co zostało mu przekazane przez stdin, a quine to program, który drukuje własny kod źródłowy.
Punktacja i zasady
- Całkowita liczba bajtów skonkatowanego programu AB to Twój wynik. Ponieważ jest to kod golfowy, wygrywa najniższy wynik.
- Standardowe luki są zabronione
- Dane wejściowe muszą być pobierane ze standardowego wejścia, a wyjściowe muszą być przesyłane na standardowe wyjście.
- Programy kotów nie muszą brać argumentów; muszą tylko skopiować stdin na stdout.
- Quine powinno działać, gdy program nie otrzymuje danych wejściowych, ale nie musi działać poprawnie (ale może) dla innych danych wejściowych.
- Quine nie musi się kończyć, pod warunkiem, że wydrukuje dokładnie swój kod źródłowy, nic więcej.
- Quine musi mieć co najmniej jeden bajt.
- A i B mogą być tym samym programem.
- BA nie musi być quine ani nawet prawidłowym programem.
AB
musi być niepusty, ponieważ wiele języków ma kota 0-bajtowego, co pozwala na quinę 0-bajtową.Odpowiedzi:
V , 2 + 2 == 4 bajty
Wypróbuj quine!
Wypróbuj kota!
A jest
2i
B jest również
2i
Jak to działa?
Po pierwsze, kilka wyjaśnień na temat działania V. Jedną z godnych uwagi rzeczy, które umożliwiają tę odpowiedź, jest to, że w V pusty program jest programem cat. To nie jest szczególny przypadek, jest nieodłączny od sposobu działania V. Podczas uruchamiania wszystkie dane wejściowe są ładowane do „bufora”, każde polecenie w jakiś sposób modyfikuje bufor, a następnie, gdy program jest wykonywany, bufor jest domyślnie drukowany. Oznacza to, że dowolny ciąg NOP jest również programem cat.
Te
i
środki sterowania trybu Insert , co oznacza, że każda postać w wyniku zastosowaniai
zostaną dodane do bufora. Z liczbą poprzedzającą ten tekst zostanie zduplikowany n razy.Oznacza to, że w przypadku programu cat nic nie zostanie dodane do bufora i zostanie wydrukowane podczas odczytu. Innymi słowy:
Ale w przypadku quine po tekście jest tekst
i
:Bezczelny brak odpowiedzi
V , 0 bajtów
Wypróbuj online!
A jest pustym programem.
B jest również pustym programem.
: P
źródło
Rubinowy, 71 bajtów
Można podzielić na koty w następujący sposób:
i
Dwa koty są identyczne, z wyjątkiem wiodącej 2, która nie ma możliwości we wszystkich trzech programach. The
<<2
Jest herestring, co oznacza, że wszystko, począwszy od następnej linii, aż do końcowej 2 z własnej linii jest ciągiem znaków, które możemy łączyć do siebie (*2
) i dołączyć do tyłu 2. W Koty herestring jest dobrze uformowane, ale pusty, więc wyrażenie regularne nie pasuje do niego i przejdziemy do$<.read
wyrażenia i wyprowadzimy STDOUT. Kiedy jednak połączymy koty, łańcuch nie zakończy się aż do trzeciego wiersza, więc wyrażenie regularne pasuje, a my zwiemy i wyprowadzamy quine.źródło
Pyth,
29 bajtów (5 + 24)27 bajtów (5 + 22)To było zabawne.
Wypróbuj quine tutaj
Wypróbuj pierwszego kota tutaj
Wypróbuj drugiego kota tutaj
Objaśnienia
źródło
C # (kompilator Visual C #) , 551 bajtów
Odp .: 95 bajtów
Wypróbuj online!
B: 438 + 18 bajtów
Wypróbuj online!
A + B: 533 + 18 bajtów
Wypróbuj online!
A i B przyjmują dane wejściowe jako argument wiersza poleceń. A + B ignoruje każde wejście. Dodano 18 bajtów B i A + B dla
/p:StartupObject=B
opcji wysyłanej do MSBuild. Jest to konieczne tylko w A + B, ale wydawało się, że oszustwo nie ma go również w B. W ten sposób flagi kompilatora dla A + B są flagami kompilatora dla A (brak) plus flagami kompilatora dla B.Wyjaśnienie
Program A jest prosty. Klasa A zawiera (nieużywaną) zmienną statyczną
i
zainicjowaną do2
i wypisuje swój pierwszy argument po uruchomieniu.//
Na końcu jest ważna dla kodu A + B, ale nie robi nic w sobie.Program B jest dziwny w izolacji, ale zasadniczo taki sam. Tworzy klasę A zawierającą
i
inicjowaną zmienną statyczną0
, a następnie uruchamia główną metodę klasy B, która robi to samo co program A, ponieważA.i
ma mniej niż 1, i zwraca przed jakimkolwiek dziwnym zjawiskiem. Nowe wiersze nie są tutaj konieczne, ale są ważne dla A + B.W połączeniu
//
z programu A komentuje deklarację klasy A z programu B, ale z powodu nowej linii klasa B jest w porządku, pozwalając zamiast tegoA.i
odwoływać się do2
wartości z programu A. Flaga kompilatora powoduje uruchomienie programu przez B.Main (), ponieważ A.Main () również istnieje. Rezultat jest taki, że program A + B nie wyświetla swojego argumentu, ale zamiast tego przechodzi do następnego segmentu B.Main (), który jest w zasadzie tylko standardowym quine C # .źródło
Haskell , 116 + 20 =
187175174136 bajtówKilka bajtów zapisanych, odkąd pokazał mi Ørjan Johansen
interact
Cat 1
Wypróbuj online!
Cat 2
Wypróbuj online!
Quine
Wypróbuj online!
Podstawową zasadą w pracy jest to, że gdy dodamy drugiego kota pierwszy możemy zmienić nazwę funkcji mamy do interakcji z od
a
doidmain
. Ponieważinteract id
jest kotem, chcemyidmain
dla mnie funkcji, która zwraca quine. Oczywistym rozwiązaniem byłoby jednak zastosowanieconst
, ponieważ możemy założyć, że dane wejściowe również są puste(++)
. Stąd znajdujemy kod źródłowy za pomocą dość standardowych środków, mamy zmienną,g
która koduje źródło i używamy specjalnego opakowania do wydrukowania go w postaci ciągu i kodu. Istnieje niewielki wyjątek, że musimy umieścić nasz koder z przodu, ponieważ musimy już zakończyćinteract id
. To oznacza dodatekg=
nie jest zakodowany i musi być obsługiwany ręcznie. Nasz następny kot jest dość standardem, z wyjątkiem tego, że musimy go ustawić jako poprawny kod, gdy zostanie przyczepiony do końca drugiego kota, więc potrzebujemy obu kotów jako instancji strażników wzorców.Strategia alternatywna, 43 + 105 =
186148Cat 1
Wypróbuj online!
Cat 2
Wypróbuj online!
Quine
Wypróbuj online!
źródło
getContents
+putStr
zinteract id
. Wypróbuj online! (Quine nie działa już z niepustymi danymi wejściowymi, co pozwala na użycie(++ ...)
sekcji dlaidmain
.)interact
, chyba dlatego, że rzadko robię rzeczy związane z IO z Haskellem. Zredagowałem post.Python 3, 286 bajtów
Mój pierwszy golf w Python i moja pierwsza quine! Niezbyt elegancki, ale działa.
Program A (238 bajtów)
(brak końcowego nowego wiersza)
Program B (48 bajtów)
(brak końcowego nowego wiersza)
Wypróbuj online
Podziękowanie
źródło
end=open...
i używać%r
zamiast%s
nie robić nowego wiersza i cytatów%r
. Nie jestem jednak pewien, co masz na myśli o nowej linii.%s
formatować nowy wiersz, możesz po prostu zrobić literał\n
. Możesz także użyć;
do podzielenia instrukcji zamiast\n
(z wyjątkiem tego, żeif
musi znajdować się w osobnej linii).%
można przez to uciec w ciągu%%
. Jedynym argumentem wymaganym do sformatowania łańcucha jest sam łańcuch, wszystko inne można rozłożyćlocals()
do zapisania 2 bajtów.C ++ (clang) , 313 + 102 = 415 bajtów
Program A (kończy się na nowej linii):
Program B (nie kończy się na nowej linii):
Nie strasznie podstępny i jak zwykle C ++ nie jest świetny do quitingu. Nie zdziwi mnie to, że istnieją sposoby na ogolenie bajtów tu i tam z tego samego pomysłu. Jedynym małym haczykiem jest zmiana zachowania czegoś po jego zdefiniowaniu, a inicjalizacja zmiennej dynamicznej z efektem ubocznym załatwia sprawę. (Czy można to zrobić nawet w C bez rozszerzeń kompilatora?)
Wypróbuj online: A , B , AB
(Jedyny problem dotyczący przenośności, o którym wiem, to to, że program zakłada
<cstdio>
umieszczanie nazw zarówno w globalnej przestrzeni nazw, jak i wewnątrzstd
).źródło
Befunge-98 (FBBI) , 8 + 15 = 23 bajty
A + B: (działa tylko przy braku danych wejściowych)
Wypróbuj online!
ZA:
Wypróbuj online!
B:
Wypróbuj online!
źródło
Python 3 , 100 + 37 = 137 bajtów
Program A:
Wypróbuj online!
Program B:
Wypróbuj online!
Make Quine AB
Wypróbuj online!
Działa tylko, gdy dane wejściowe są puste, w przeciwnym razie poprzedza dane wejściowe do danych wyjściowych.
źródło
Attache , 15 + 126 = 141 bajtów
ZA:
Wypróbuj online!
B:
Wypróbuj online!
A + B:
Wypróbuj online!
Wyjaśnienie
Każdy z programów cat koduje
AllInput[]|Echo
, co jest prostym programem cat. B jest główną fazą quine; sam jest to funkcja wektoryzowana (przez unarską@
) wywoływana bez danych wejściowych (nazywana as|Call
). Zatem pierwsze warunkoweIf[_,A,B]
wykonuje sięB
, co jest po prostuAllInput[]|Echo
.Po wykonaniu A + B jednoargumentowy
@
staje się binarny z@
powoduEcho
połączenia z lambda:Oznacza to, że lambda jest wykonywana wcześniej
Echo
. Wracając do warunkowej, ta funkcja ma teraz cały STDIN jako argument. Tak,If[_,A,B]
wykonujeA
, co jest standardem ramy Quine.źródło
Stax , 16 + 12 = 28 bajtów
Cat 1:
Uruchom i debuguj
Cat 2:
Uruchom i debuguj
Quine:
Uruchom i debuguj
źródło
Cat 1:
Lua , 41 bajtów
Wypróbuj online!
Cat 2:
Lua , 70 bajtów
Wypróbuj online!
Quine:
Lua , 111 bajtów
Wypróbuj online!
io.input(arg[0])
w Cat 2 ustawia bieżący plik jako standardowe wejście, w wyniku czego kot drukuje kod źródłowyźródło
> <> , 12 +3 = 15 bajtów
Program A:
Wypróbuj online!
I program B:
Wypróbuj online!
Utwórz program AB:
Wypróbuj online!
źródło
JavaScript (Node.js) , 199 bajtów
Wypróbuj online!
Kat. A, 57 bajtów
Wypróbuj online!
Kat. B, 142 bajty
Wypróbuj online!
źródło