W tym wyzwaniu powinieneś napisać program lub funkcję, która nie pobiera danych wejściowych i wypisuje lub zwraca łańcuch o tej samej liczbie bajtów, co sam program. Jest kilka zasad:
- Możesz wysyłać tylko bajty z drukowanego zakresu ASCII (0x20 do 0x7E włącznie) lub znaki nowej linii (0x0A lub 0x0D).
- Twój kod nie może być quine, więc kod i wynik muszą różnić się co najmniej jednym bajtem.
- Twój kod musi mieć co najmniej jeden bajt.
- Jeśli dane wyjściowe zawierają końcowe znaki nowej linii, są one częścią liczby bajtów.
- Jeśli kod wymaga niestandardowych flag wiersza polecenia, policz je jak zwykle (tj. Dodając różnicę do standardowego wywołania implementacji twojego języka do liczby bajtów), a długość wyjściowa musi być zgodna z wynikiem twojego rozwiązania. Np. Jeśli twój program jest
ab
i wymaga niestandardowej flagi-n
(założymy, że nie można go połączyć ze standardowymi flagami, więc są to 3 bajty), powinieneś wyprowadzić łącznie 5 bajtów. - Wynik nie zawsze musi być taki sam, o ile można wykazać, że każde możliwe wyjście spełnia powyższe wymagania.
- Zwykłe zasady dotyczące quine nie mają zastosowania. Możesz przeczytać kod źródłowy lub jego rozmiar, ale wątpię, aby był on krótszy niż kodowanie na stałe w większości języków.
Możesz napisać program lub funkcję i użyć dowolnej standardowej metody dostarczania danych wyjściowych. Pamiętaj, że jeśli wydrukujesz wynik, możesz wydrukować go na standardowym wyjściu lub standardowym strumieniu błędów, ale tylko jeden z nich się liczy.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .
Tabela liderów
code-golf
self-referential
Martin Ender
źródło
źródło
Odpowiedzi:
C (nowoczesny Linux), 19 bajtów
Po skompilowaniu i uruchomieniu zostanie wydrukowane:
źródło
Excel, 11 bajtów
Norweska wersja językowa:
Wersja angielska (12 bajtów):
Generuje liczbę n-cyfrową i konwertuje na tekst, konwertując na małe litery.
źródło
=9^7&""
co generuje 7-cyfrową liczbę w dowolnym języku i ma tylko 7 bajtów.Labirynt , 4 bajty
Wypróbuj online!
Wydruki
0000
Wyjaśnienie
źródło
Bash (tylko wbudowane), 8 bajtów
Wydruki
cho cho
i nowa linia.źródło
Siatkówka , 2 bajty
Wypróbuj online!
Wydruki
0
i podawanie linii.Istnieje wiele rozwiązań 2-bajtowych, ale uważam, że jest to optymalne. Siatkówka domyślnie zawsze drukuje końcowy znak nowej linii, a pozbycie się go zajmuje zbyt wiele bajtów. Musielibyśmy więc znaleźć 1-bajtowy program, który pozostawia puste dane wejściowe bez zmian. Uważam, że jedynym programem, który to robi, jest program zawierający pojedynczy kanał, który jest zatem równy wyjściowi i dlatego nie jest dozwolony przez wyzwanie.
Następną najprostszą rzeczą jest życie z wyświetlaniem przez Retinę pojedynczej cyfry (liczba dopasowań wyrażenia regularnego względem pustego wejścia), i możemy to zrobić przy wielu błędnych (lub dopasowanych) 2-bajtowych wzorach.
źródło
Mathematica, 2 bajty
Factorial
źródło
C, 20 bajtów
Zwraca pewną liczbę, wypełnioną spacjami do długości 20. (Jaka liczba? Cokolwiek stanie się potem w pamięci.)
Niektóre próbki działają w moim systemie:
Szkoda, że dane wyjściowe nie mogą być dowolnymi bajtami, ponieważ pozwoliłoby to na rozwiązanie 19-bajtowe:
który wyprowadza 19 bajtów śmieci, zaczynając od
f
adresu.źródło
%esi
rejestru.Bash w systemie Linux, 6
(po którym następuje nowa linia)
Wyjścia,
Linux
po których następuje nowa linia.źródło
uname
nie jest wbudowany w bash - to osobny plik wykonywalnyuname
wbudowane bash? Każda dystrybucja, na którą mogę teraz włożyć ręce, to osobny plik binarny, w tym TIO . I odwrotnie, jak pokazuje linkowana odpowiedź,umask
jest wbudowany w większość / wszystkie powłoki.uname
jako wbudowanego polecenia. Kiedy powiedziałem „-1, a właściwie wbudowane”, miałem na myśli „Ta odpowiedź używaumask
dla -1 bajtów iumask
faktycznie jest wbudowana”.JavaScript ES6, 9 bajtów
Używanie ciągów szablonów
źródło
undefined
uważany za ciąg?(_=>_+'')
.Schemat piramidy ,
744342 bajtówZaoszczędzono 31 bajtów dzięki Khuldraeseth na'Barya! Oszczędność 1 bajtu dzięki przeprojektowanemu rozwiązaniu JoKing!
Wypróbuj online! Zwraca 41-cyfrowy numer
28^28 = 33145523113253374862572728253364605812736
, a po nim końcowy znak nowej linii.Stara wersja
Wypróbuj online!
Wyjścia
71277303925397560663333806233294794013421332605135474842607729452115234375
=160651015 ** 9
lub około 10 74 .źródło
Python 2 , 9 bajtów
To drukuje
set([1])
i wysuwa wiersz.Wypróbuj online!
źródło
print
, nie ma krótszych rozwiązań, a jedyne 9-bajtowe to warianty tego i Luisa Mendoprint 1e5
.Python 2 , 9 bajtów
Wyświetlany wynik zawiera końcowy znak nowej linii.
Wypróbuj online!
źródło
pieprzenie mózgu , 25 bajtów
Wypróbuj online! Uwaga: Wymaga implementacji z 8-bitowymi niepodpisanymi komórkami
Wynik:
Wyjaśnienie
źródło
.
który drukujeNULL
znak, który nie jest drukowany ?C (Ideone), 14 bajtów
W Ideone , który nazywa swój plik wykonywalny
prog
, wyświetla następujące polecenie z końcowym znakiem nowej linii.C (GCC), 15 bajtów
Ponieważ GCC zapisuje plik wykonywalny o nazwie
a.out
domyślnie (w przypadku braku dodatkowych flag, które kosztowałyby bajty), powoduje to wyświetlenie następującego ciągu z końcowym znakiem nowej linii.źródło
C (gcc) ,
1817 bajtówZauważ, że istnieje bajt STX ( 0x02 ) między
@
aC
.Wypróbuj online!
Ruchliwość
Zostało to przetestowane z gcc 6.3.1 i clang 3.9.1 na Fedorze 25, gcc 4.8.4 na Ubuntu 14.04.4 i gcc 4.8.3 na openSUSE 13.2, gdzie wypisuje następujące dane wyjściowe.
Oczekuję, że spowoduje to wygenerowanie tego samego wyniku dla wszystkich wersji gcc, o ile kompiluje się do pliku wykonywalnego następującego typu.
Różne platformy będą wymagały innego adresu pamięci i być może innej kolejności bajtów w wieloznakowej stałej znakowej.
Na przykład, zastępując
@\2C
z@\2\4
nadrukamiexec/ld-elf.so.1
i nowej linii FreeBSD 11 z brzękiem 3.8.0.Weryfikacja offline
Jak to działa
Domyślnie ld używa 0x400000 jako adresu bazowego segmentu tekstowego, co oznacza, że możemy znaleźć zawartość ELF zaczynając od adresu pamięci 0x400000 .
Pierwsze 640 bajtów ELF jest w dużej mierze niezależnych od rzeczywistego kodu źródłowego. Na przykład jeśli po deklaracji f następuje
main(){f();}
i nic więcej, wyglądają one następująco.Użycie np.
main(int c, char**v){f();}
Zamiast tego zmienia niektóre bajty, ale nie przesunięcie łańcucha/lib64/ld-linux-x86-64.so.2
, którego użyjemy do wytworzenia wyniku.Przesunięcie tego ciągu wynosi 0x238 i ma długość 27 bajtów. Chcemy wydrukować tylko 17 bajtów (a jeśli ostatni użyjemy
puts
, będzie to nowy wiersz ), więc dodajemy 11 do offsetu, aby otrzymać 0x243 , offset ofinux-x86-64.so.2
. Dodanie 0x400000 i 0x243 daje 0x400243 , lokalizację pamięciinux-x86-64.so.2
.Aby uzyskać ten adres pamięci, możemy użyć wieloznakowych stałych znakowych, które wykazują zachowanie zdefiniowane w implementacji. 0x400243 to (64) (2) (67) w podstawie 256, a wieloznakowe stałe znaków gcc używają kolejności bajtów big-endian, więc
'@\2C'
zwraca adres pamięci żądanego ciągu.Na koniec
puts
wypisuje żądło (zakończone zerem) w tym miejscu pamięci i końcowym nowym wierszu, tworząc 17 bajtów wyniku.źródło
U
podczas kompilacji-Df=main
.U
podczas kompilacji zmain(){f();}
.Samomodyfikujący Brainfuck , 5 bajtów
Wypróbuj online!
Wynik:
Wyjaśnienie:
Bardzo proste, drukuje źródło w odwrotnej kolejności. W SMBF zawartość programu jest przechowywana na taśmie po lewej stronie początkowej pozycji wskaźnika. Przesunięcie w lewo i wydruk spowoduje wyświetlenie kodu źródłowego wstecz.
Ponieważ w tym wyzwaniu dozwolone jest czytanie źródła, zdecydowanie powinno to być zgodne z regułami.
źródło
Podstawowy kalkulator arytmetyczny , 2 bajty
1=
odbitki
1.
lub:na tych głupich siedmiosegmentowych wyświetlaczach.
Aby odtworzyć, wybierz dowolny losowy kalkulator; wszyscy mają jakoś zainstalowany ten język programowania.
źródło
1.
zamiast1x
? Jest to również quine, które jest niedozwolone przez reguły.1=
pomyliłem się. Miałem na myśli1x
niż domniemane równe, ale zapomniałem, że=
to jest guzik.1
na moim TI-36 i TI-84 CE. Czy nie liczą się one jako „podstawowe” kalkulatory?Fourier,
262220 bajtówWypróbuj na FourIDE!
Wyjścia:
Do poprawnego użycia wielkich liter są 4 dodatkowe bajty:
Wypróbuj na FourIDE!
RIP Adam West
źródło
Brachylog , 1 bajt
Wypróbuj online!
Wyjaśnienie
w
jest wbudowanym „zapisem”. Tutaj zapisze dane wejściowe. Ponieważ Input jest zmienną wolną,w
przed wydrukowaniem oznaczy ją jako liczbę całkowitą. Pierwsza liczba całkowita, którą próbuje, to0
.źródło
Here, it will write the Input.
Czy „wejście” to sam program? Czy nie liczy się to jako czytanie źródła, które domyślnie oszukuje w quine?Java (OpenJDK 8) , 11 bajtów
Wypróbuj online!
Wynik:
Tylko odrobinę bardziej skomplikowany niż oczywistej odpowiedzi
()->"".format("%23s",0)
.Oszczędza
źródło
()->1E10-1+""
,"9.999999999E9" (13)
oszczędza jeszcze trzy bajty1e10
na1e9
lub 2 bajty, używając pustego wejścia zamiast()
tego:o->1e8-1+""
(wyjścia9.9999999E7
; długość i liczba bajtów 11 ).05AB1E , 1 bajt
Wyprowadza jedną nową linię.
õ
wypycha pusty ciąg i jest niejawnie wyprowadzany z nową linią.Wypróbuj online!
Niektóre inne 2-bajtowe rozwiązania, dla twojej przyjemności oglądania (dane wyjściowe są w nawiasach, a wszystkie dane wyjściowe mają końcowy znak nowej linii):
Istnieją jednak znacznie więcej 2-bajtowych rozwiązań.
źródło
V / vim, 1 bajt
Spowoduje to wydrukowanie jednej nowej linii.
Wypróbuj online!
Istnieje wiele wariantów, które również by działały. Na przykład,
in vim i
w V.
Istnieje również wiele, wiele, trzy bajtowych rozwiązań. Na przykład:
Wszystkie są specyficzne dla V.
źródło
4ii<ESC>
Jednak V domyślnie wypełnia ucieczkę na końcu programu.Partia, 12 bajtów
Liczba bajtów obejmuje końcowy znak nowej linii zarówno dla skryptu, jak i wyjścia, czyli
źródło
cmd.exe
będzie oczywiście wywoływał echo CRLF poWindows_NT
, a więc 12 bajtach.Sześciokąt , 3 bajty
Wypróbuj online!
Wydruki
111
.Rozłożony:
Ale kod jest tak naprawdę uruchamiany w kolejności
o!@
.źródło
/// , 12 bajtów
Wypróbuj online!
Drukuje się
bcdbcdbcdbcd
, a ponieważ jest to 12 bajtów, dodałem nieszkodliwy/
na końcu kodu, aby go wypisać.źródło
R, 7 bajtów
Wyświetla „logiczny”
źródło
MATL , 2 bajty
Kończy się nowa linia.
Wypróbuj online!
Wyjaśnienie
Schowek H
2
domyślnie zawiera liczbę .H
wypycha tę zawartość do stosu, który jest domyślnie wyświetlany z końcowym znakiem nowej linii.źródło
Węgiel , 2 bajty
Wypróbuj online!
Drukuje linię poziomą o długości 1 z
-
prawej strony i nową linię.źródło
Galaretka , 1 bajt
Całkiem kilka bajtów Jelly one - to jest jeden - ocenia lewy argument, który, gdy nic nie jest podane jako dane wejściowe, domyślnie wynosi zero, co z kolei zwraca zero i wynik jest domyślnie drukowany, a
0
.Wypróbuj online!
W rzeczywistości z 256 bajtów na stronie kodowej jest tylko 95, które obecnie nie wytwarzają innego jednobajtowego wyjścia w określonym zakresie, gdy są uruchomione jako pełny program; są to (jako znaki strony kodowej w kolejności bajtów):
Uwagi:
Większość programów 1-bajtowych wypisuje a
0
(brak operacji / daje listę z pojedynczym zerem, która wypisuje a0
), większość innych drukuje a1
(0=0
i tym podobne)Ọ
to jeden program, który daje inny bajt, ale taki, który jest poza zakresem zgodnie ze specyfikacją - produkuje bajt zerowy (rzutuje na0
znak)⁶
tworzy spację (literał)⁷
produkuje linię (dosłownie)Niektóre bajty, które teraz działają, mogą tego nie robić w przyszłości - wydaje się, że sporo bajtów jest zarezerwowanych (sądzę) na wartości niladyczne, które, gdy zostaną przypisane, prawie na pewno nie wygenerują wyniku jednobajtowego.
źródło
byte
Befunge , 2 bajty
Wypróbuj online!
Drukuje
0
ze spacją. Działa również w Befunge 98.źródło