Twoje wyzwanie jest proste: napisz jak najdokładniejszy program w wybranym języku, używając tylko unikalnych bajtów. (Pełna definicja nieskazitelnego programu, skopiowana z tego linku, znajduje się u dołu tego pytania).
Zgadza się, bez żadnych zobowiązań. Twój kod w ogóle nie musi nic robić, wystarczy uruchomić bez błędów, spełnić wymagania nieskazitelnego programu (link powyżej) i nie zawierać zduplikowanych bajtów w używanym kodowaniu.
Do celów powyższego objaśnienia i powiązanej definicji „nieskazitelnego programu” błąd definiuje się jako cokolwiek, co powoduje, że program albo całkowicie nie uruchamia się, albo kończy z niezerowym kodem wyjścia po upływie określonego czasu.
Ponieważ jest to kręgle kodu , najdłuższy , a nie najkrótszy, wygrywa kod (mierzony liczbą bajtów). Maksymalnie teoretycznie możliwy wynik to 256, ponieważ możliwych jest 256 różnych bajtów. W przypadku remisu wygrywa pierwsza odpowiedź o najwyższym wyniku.
Oto pełna definicja nieskazitelnego programu, skopiowana z powyższego linku:
Zdefiniujmy nieskazitelny program jako program, który sam nie ma żadnych błędów, ale spowoduje błąd, jeśli zmodyfikujesz go, usuwając ciągłe podciągi N znaków, gdzie
1 <= N < program length
.Na przykład trzyznakowy program w języku Python 2
`8`
jest nieskazitelnym programem, ponieważ wszystkie programy powstałe w wyniku usunięcia podciągów o długości 1 powodują błędy (w rzeczywistości błędy składniowe, ale zrobi to każdy rodzaj błędu):
8` `` `8
a także wszystkie programy wynikające z usunięcia podciągów o długości 2 powodują błędy:
` `
Gdyby na przykład
`8
program nie zawierał błędów`8`
, nie byłby nieskazitelny, ponieważ wszystkie wyniki usuwania podciągów muszą zawierać błędy.
źródło
JMP <address outside of the program's memory>
w asemblerze. Zasadniczo na prawdziwym komputerze może zapętlać się w nieskończoność lub wychodzić z niezerowym błędem, ale zwykle ulega spektakularnemu awarii.Odpowiedzi:
Galaretka ,
253 254256 bajtówWypróbuj online! lub Sprawdź to!
Okazuje się, że języki gry w golfa potrafią ...
‘
.Teraz tylko«»
nie są używane«»
. Teraz uzyskaj optymalny wynik!W jaki sposób?
Kluczową cechą Jelly, która sprawia, że jest to możliwe, jest to, że znaki otwierające i zamykające dla literałów łańcuchowych nie są takie same jak w prawie wszystkich innych językach.
Struktura programu jest następująca:
M <239 character long string> L»«’Ɗạ‘}237$¤¡
M
znajduje indeksy swojego argumentu wskazujące na maksymalne elementy. Liczy się tylko to, że bez żadnego argumentu dla tego programu Jelly przypisuje0
do łańcucha i błędy Jelly, kiedyM
zostanie zastosowane0
.Aby nie dopuścić
M
do działania0
w pełnym programie, używamy¡
szybkiego, który stosujeM
się wiele razy, zależnie od wyniku linku bezpośrednio poprzedzającego. W tym przypadku jest to link<239 character long string> L»«’Ɗạ‘}237$¤
.L
przyjmuje długość tego ciągu (239) i»«’Ɗ
zmniejsza go do 238.»«
Część nic nie robi, aleƊ
(ostatnie trzy linki jako monada) powoduje, że jeśli zostaną usunięte, wystąpi błąd. Następnieạ
przyjmuje bezwzględną różnicę między wynikiem»«’Ɗ
a monadą‘}237$
zastosowaną do łańcucha.‘
inkrementuje i jest monadą, ale}
zamienia to w diadę i stosuje ją do właściwego argumentu237
, poddając się238
. W ten sposóbạ
uzyskuje się0
w pełnym programie.¤
linki z powrotem do literału łańcucha, tworząc nilad. Wynikiem tego jest to0
, żeM
w ogóle nie jest stosowane, co zapobiega wszelkim błędom.Możliwe podprogramy:
<string>..¤
będzie niezerowa iM
zostanie zastosowana0
, co spowoduje błąd.L»«’Ɗạ‘}237$
zostanie usunięta, alboM
zostanie zastosowana,0
albo wystąpią operacje między ciągiem a liczbą, w wyniku czego powstanie znakTypeError
.¤¡
zostanie usunięty,M
zostanie zastosowany do0
.”
i oba’‘
zostaną usunięte i“
nie zostaną usunięte , wszystko poM
przekształceniu w łańcuchM
będzie działać0
.”
i’
zostaną usunięte i“
nie ma, wszystko między”
i‘
zamienia listy liczb całkowitych.M
sam zostanie usunięty, istnieje,EOFError
ponieważ¡
oczekuje linku przed poprzednim niladem.M“
i dowolna liczba znaków po jej usunięciu, pojawi się znak,EOFError
ponieważ¤
szuka niladu poprzedzającego go, ale go nie znajdzie.238
nie liczy się, ponieważ jest częścią monady.To prawie wszystko obejmuje.
Wcześniej nie korzystałem,
«»‘
ponieważ dwóch ostatnich nie można uwzględnić w ciągu, ponieważ pasują one do“
znaku, tworząc rzeczy inne niż ciągi.«
też nie może być w“”
ciągu, ale nie wiem dlaczego.źródło
Haskell ,
3945505260 bajtówIdentyfikator
main
musi mieć typIO a
dla jakiegoś typu a. Po uruchomieniu programu obliczeniamain
są wykonywane, a jego wynik jest odrzucany. W tym przypadku jest to typIO ((a,b)->a)
.Wynikiem jest zastosowanie funkcji
(λ a b c d e f → return fst)
, sześcioparametrowej funkcji stałej zwracającej funkcję fst (która daje pierwszy element 2-krotny), wstrzykniętej w monadę IO. Sześć argumentyLT
(enum za mniej niż)EQ
(enum równości), pusta lista[]
,3
,2
i1
.To, co byłoby spacjami, jest zastępowane unikatowymi znakami, które liczą się jako spacje: tabulator, spacja niełamliwa, formfeed, tabulator pionowy, OGHAM SPACE MARK, spacja regularna, znak nowej linii i znak powrotu karetki. Jeśli któregoś z nich brakuje, wystąpi niedopasowanie liczby argumentów. Nazwy parametrów są wybierane jako trzy- lub czterobajtowe znaki UTF-8
𤶸陸ⵙ商ߜ新
, starannie wybierając znaki, które nie powodują duplikacji bajtów.Dzięki @BMO za jego cenny wkład.
Zrzut szesnastkowy:
Wypróbuj online!
źródło
'\109999'
wydaje się być ważny, przynajmniej w GHC 8.2.2.'\10999a'
wywołuje błąd leksykalny.
produkuje błąd leksykalny.maxBound :: Char
, tj'\1114111'
. Uwaga: liczby są domyślnie dziesiętne, więc jeśli chcesz szesnastkowy, musisz wstawićx
po nim\
np'\x10999a'
.\x10ffff
działa dobrze i\x110000
zapewnia błąd poza zakresem, jak można by oczekiwać.Python 2 ,
20 21 33 39 4550 bajtówTeraz bardzo wspólny wysiłek!
+2 dzięki Aidan F. Pierce (wymienić
sorted({0})
zmap(long,{0})
)+8 dzięki dylnan (wykorzystanie
\
i nowa linia zastąpić przestrzeń; propozycje, aby przenieść z0
do wyrażenia matematycznego, zastępując-1
z-True
; wykorzystanie szesnastkowym)+11 dzięki Angsowi (
4*23+~91
->~4836+9*1075/2
potem później~197836254+0xbCABdDF
->~875+0xDEAdFBCbc%1439/2*6
)Wypróbuj online! Lub zobacz pakiet potwierdzający
0xDEAdFBCbc
jest szesnastkowy i ocenia na59775106236
.~
jest uzupełnieniem bitowym, więc~875
ocenia na-876
.%
jest operatorem modulo, więc0xDEAdFBCbc%1439
ocenia na293
./
jest dzieleniem całkowitym, więc0xDEAdFBCbc%1439/2
ocenia na146
.*
jest mnożeniem, więcxDEAdFBCbc%1439/2*6
ocenia na876
.+
jest dodatkiem, więc~875+xDEAdFBCbc%1439/2*6
ocenia na0
.... żadna wersja pozbawiona również nie jest oceniana
0
.{0}
jestset
zawierający pojedynczego elementu0
.Wywołanie
sorted
zset
jako argument daje listę, która może być indeksowany do z[...]
.Bez
sorted
kodu({0})
po prostu dałoby toset
i nie da się tego zrobić w ten sam sposób,if({0})[-True]:q
wywołałoby toTypeError
.Indeksowanie w Pythonie jest oparte na 0 i pozwala na indeksowanie ujemne od tyłu i
True
jest równoważne1
, stądsorted({0})[-True]
znajduje element0
, a jednocześniesorted({0})[True]
podniesieIndexError
, jaksorted({})[-True]
isorted({0})[]
będzie niepoprawną składnię.0
Które znajduje się falsey więc ciała zif
,q
nigdy nie jest stracony, ale gdyby było to podnieśćNameError
, ponieważq
nie zostało zdefiniowane.Ponieważ niepusta lista jest prawdą, nie możemy ograniczyć się do
if[-1]:q
żadnego z nich.Zobacz pakiet potwierdzający, aby zobaczyć: potwierdzenie, że bajty są unikalne; wszystkie błędy; i sukces samego kodu.
źródło
C (tcc) , x86_64,
2931333940 bajtówZwraca 0 . Dzięki @feersum za sugerowanie wielkich liter szesnastkowych.
Wypróbuj online!
Jak to działa
Przypisanie zapisuje dwie liczby int ( 184 i 49664 ) w miejscu pamięci main . W przypadku 32-bitowych liczb całkowitych i kolejności bajtów little-endian dokładne bajty to
b8 00 00 00 00 c2 00 00
.Ponieważ tcc nie deklaruje zdefiniowanej tablicy jako .data (większość kompilatorów by to zrobiła ), więc przejście do main wykonuje kod maszynowy, na który wskazuje.
b8 00 00 00 00
(mov eax, imm32
) przechowuje wartość int 0 w rejestrze eax.c2 00 00
(ret imm16
) wyrzuca 0 dodatkowych bajtów ze stosu i zwraca. (Wartość w rejestrze eax jest wartością zwracaną przez funkcję).źródło
> <> , 122 bajty
Wypróbuj online!
Nic nie robi. Oparty na tym samym formacie, co moja odpowiedź „ Programowanie nieskazitelnego świata” .
Najpierw sprawdzamy, czy długość kodu wynosi 122, a jeśli nie jest to błąd.
><>
programy nie mogą zakończyć się bez użycia;
polecenia, ale jeśli to polecenie jest w programie, możemy po prostu usunąć wszystko przed nim, aby program natychmiast się zakończył. Aby temu zaradzić, używamyp
polecenia, aby umieścić;
kod w czasie wykonywania. Aby to zrobić, odejmujemy 6A
i umieszczamy go pop
.Prawdopodobnie dodam większość innych wartości powyżej 127, gdy wymyślę właściwe dwie bajty. Brakuje 5 wartości
v^;
i dwie nowe linie.Spośród 7502 podprogramów 7417 z nich zignorowało błędne instrukcje, 72 z niedomiaru pamięci, a 13 z braku pamięci.
źródło
JavaScript, 42 bajty
i
,f
lubif
spowodujeSyntaxError: missing ; before statement
;田
spowodujeSyntaxError: expected expression, got end of script
;田
spowodujeInvalid or unexpected token
;田
Pokaż fragment kodu
źródło
Brain-Flak , 2 bajty
Wypróbuj online!
Alternatywnie
[]
,{}
lub()
. Usunięcie jednego nawiasu powoduje, że drugi nawias staje się niedopasowany.Dowód, że jest to optymalne rozwiązanie:
Program Brain-Flak składa się z niladów (para nawiasów samodzielnie) lub monad (pary nawiasów zawierających 1 lub więcej niladów). Monada nie może być w nieskazitelnym programie, ponieważ możesz po prostu usunąć jedną lub więcej nilad. Podobnie, nie możesz mieć więcej niż jednego nilada w programie, ponieważ możesz usunąć jeden z nich bez przerywania programu.
Jako taki, może to być najmniej optymalny język dla nieskazitelnego lub unikalnego programowania.
źródło
Ada, 110 bajtów (latin1)
Prawdopodobnie najlepsza odpowiedź na każdy język używany w branży?
Hexdump:
Skompiluj, zapisując do dowolnego pliku kończącego się
.ads
i działającegogcc -c <filename>
. Tworzy plik wykonywalny, który nic nie robi. (Nie można podać linku TIO, ponieważ TIO umieszcza kod w.adb
pliku igcc
domyślnie próbuje znaleźć dla niego pasującą specyfikację)Zasadniczo deklaruje paczkę o nazwie zawierającej duże / małe litery łacińskie1. Potrzebuje innego znaku spacji dla każdej ze spacji, więc używa spacji, CR, LF i TAB.
Jak to wygląda w wersji vim:
Jak to działa
W Adzie można nawet skompilować specyfikację. Spec są jak pliki nagłówkowe c, ale są bardziej w pełni funkcjonalne i mogą skompilować jakiś podstawowy kod. Aby była poprawna, każda specyfikacja musi mieć format:
package <NAME> is ... end <NAME>;
z<NAME>
dopasowaniem. Zaletą Ady jest to, że nie uwzględnia ona wielkości liter. Tak więc, dopóki twoje imię i nazwisko ma warianty wielkich i małych liter, możesz iść!Najtrudniejszą częścią było uzyskanie kompilowalnej jednostki. Zwykle programy Ada mają „główną” procedurę lub funkcję leżącą poza jakimkolwiek pakietem, który stanie się ostatecznym plikiem wykonywalnym. Niestety procedury wymagają
begin
słowa kluczowego, co prowadzi do zbyt wielue
s (znane są tylko 2 przypadki), podczas gdy funkcje wymagająreturn
słowa kluczowego, co prowadzi do zbyt wielun
s. Musiałem więc po prostu skompilować pakiet.źródło
C, 8 bajtów
Nic nie robi.
Wypróbuj online!
źródło
main(){short x;}
main(){short;}
kompiluje się tylko zwarning: useless type name in empty declaration
. Myślę, że C99 i C ++ wymagają jawnego typu zwrotu, więcint main
(a możeunsigned main
) może działać, ale nie z gcc, który ostrzega tylko z-std=c11
.return 0;
może być możliwe z C89, gdzie nie ma niejawnegoreturn 0
końcamain
. Wyjście ze statusem niezerowym można uznać za niepowodzenie, zgodnie z innymi odpowiedziami. Czy dodawanie flag kompilatora, takich jak,-Werror
liczy się dobrze do wyniku w kręgle kodu? Ponieważ ścisłe egzekwowanie naruszeń C11 może pozwolić na znacznie dłuższy program. Hmm,#include<>
coś, a potem użyj tego; nie możesz usunąć zarówno włączenia, jak i użycia, a jeśli zawiedzie bez prototypu lub makr def, wygrywasz.main
iinclude
oba zawierająi
, więc nie można mieć obu. Podobnie do deklarowania i używania funkcji. Równieżreturn
w ogóle o tym pomyślę.int main
nie może działać.JavaScript, 22 bajty
Wypróbuj online!
Możliwe błędy
Po zmianie spowoduje jeden z następujących błędów 1 :
1. Dokładna liczba wyraźnych błędów zależy od silnika. Ta lista została wygenerowana za pomocą SpiderMonkey (Firefox).
źródło
Python 3 + Flask-Env ,
7131417 bajtówBrak TIO, ponieważ nie ma
flask-env
.Znaleziono najdłuższą nazwę modułu, która nie ma przecięcia
import
i nie ma żadnych liczb na końcu nazwy._sha256
jest dłuższy, ale256
na swój własny nie robi błędów. Znalazłem jedną bibliotekę,b3j0f.sync
czyli o jeden bajt dłużej, ale nie mogłem jej poprawnie zaimportować.import
z\<newline>
. Wyjęcie jednego lub obu powoduje błąd.Mogą być jeszcze dłuższe opcje niż
flask_env
, tak naprawdę nie przeprowadziłem wyczerpującego wyszukiwania, ale przejrzałem ~ 70 000 modułów. Otwarty na sugestie.źródło
256
działa bez błędów.import *[hawkey]
i podobnie, ale niestety nie działa ...R , 14 bajtów
Wypróbuj online!
Może to być najdłuższy możliwy w R. Wywołanie dowolnej funkcji jest skazane na niepowodzenie, ponieważ można usunąć wszystko oprócz nazwy funkcji, co po prostu spowoduje wydrukowanie kodu źródłowego funkcji. Jest to najdłużej nazwany obiekt w domyślnej konfiguracji R, bez duplikatów znaków i bez nazwy obiektu podczas usuwania ciągłych znaków.
Ta pierwsza próba nie zadziałała, ale wiele się nauczyłem, próbując!
dontCheck({family;NROW})
źródło
Perl 5, 3 bajty
=>
to „gruby przecinek”, który cytuje słowo po lewej stronie. To jest równoważne zktóry nic nie robi.
Bez tłustego przecinka
y
jest operatorem transliteracji, który jest nieprawidłowy bez powtórzenia później trzech znaków tego samego znaku.Sam przecinek tłuszczowy jest również nieważny, tak jak jest
=
i>
sam.źródło
pieprzenie mózgu , 2 bajty
Wypróbuj online!
Inspirowany odpowiedzią Jo King Brain-Flak . Jest to optymalne, ponieważ jedynym błędem w pieprzeniu mózgu są niedopasowane nawiasy. (Jeszcze raz dziękuję Jo King za tę informację.)
źródło
Rubinowy , 28 bajtów
Wypróbuj online!
Sprawdź to!
źródło
Standardowy ML , 22 bajty
Wypróbuj online!
op-(a,b)
jest pozbawioną cukru formąa-b
.~
oznacza unarny minus, więc tak naprawdę zajmujemy się obliczeniami765+324
. To wyrażenie jest dopasowane do stałej na stałe1089
. To dopasowanie się powiedzie, jeśli program nie został zmieniony i nic się nie stanie.Jeśli dopasowanie się nie powiedzie, ponieważ niektóre cyfry zostały usunięte, dostaje się znak „an”
unhandled exception: Bind
. Usunięcieop-
powoduje błąd typu, ponieważ krotka jest dopasowana do plikuint
. Wszystkie inne usunięcia powinny skutkować błędem składni.źródło
Swift 4 , 19 bajtów
Wypróbuj online!
Wszystkie możliwe błędy, które znalazłem to:
[
,]
,{
lub}
spowoduje błąd składni[].
spowodujeUse of unresolved identifier 'contains'
.
spowodujeConsecutive statements on a line must be separated by ';'
[]
spowodujeReference to member 'contains' cannot be resolved without a contextual type
{1 !=␊0}
spowodujeExpression resolves to an unused function
1 !=␊0
spowodujeMissing return in a closure expected to return 'Bool'
'!=' is not a prefix unary operator
'=' must have consistent whitespace on both sides
!=
spowodujeMissing return in a closure expected to return 'Bool'
Consecutive statements on a line must be separated by ';'
Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
[].contains
spowodujeClosure expression is unused
Inne interesujące programy to (jeden w każdej linii):
źródło
a
sTcl , 6 bajtów
Wypróbuj online!
Tcl , 3 bajty
Wypróbuj online!
Tcl , 2 bajty
Wypróbuj online!
źródło
Partia, 7 bajtów
Dobry początek
źródło
Siatkówka , 2 bajty
Nie zdziwiłbym się, gdyby to było optymalne ...
Wypróbuj online!
Wyrażenie regularne zawiera pustą grupę. Usunięcie jednego z paren spowoduje błąd analizy z powodu niedopasowanych nawiasów.
Inne rozwiązania to:
\(
,\)
,\[
,\]
,\*
,\+
,\?
,a]
źródło
a]
nie popełnia błędu.C (gcc) ,
7375 bajtówWypróbuj online!
Na podstawie odpowiedzi @Steadybox, dzięki @Angs za wykrycie poważnego błędu.
Tak, to jest brudny Hack (bo w rzeczywistości używa
#define
się-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
a-Dg=return
), ale nie widzę żadnej reguły, która zakazuje takiej opcji kompilatora.źródło
-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
+-Dg=return
, więc twierdzę, że używa to gotowego języka specjalnie zaprojektowanego dla wyzwania , które jest domyślnie zabronione.