Twoim zadaniem jest napisanie niepustego programu komputerowego zawierającego pewną sekwencję bajtów. Jeśli wybieramy określony bajt w programie i usuwamy wszystkie jego wystąpienia z programu, zmodyfikowany program powinien wypisać usunięty bajt.
Na przykład, gdyby nasz program był
aabacba
Wtedy bcb
wyszedłby a
, aaaca
musiałby wyprowadzić b
i aababa
wyszedłby c
.
Nie ma znaczenia, co robi niezmodyfikowany program.
Odpowiedzi będą oceniane w bajtach, a celem jest zminimalizowanie liczby bajtów.
code-golf
source-layout
radiation-hardening
Kreator pszenicy
źródło
źródło
Odpowiedzi:
zsh,
603594566561548440415399378370 bajtówZależy od coreutils +
dc
.Wypróbuj online!
To była ... podróż.
Ta odpowiedź składa się z trzech części. Pierwsze 4 wiersze obsługują określone przypadki specjalne w celu uproszczenia następującego kodu. Kolejne 2 linie i ostatnia linia osiągają zasadniczo to samo, ale dokładnie jedna jest uruchamiana z dowolnym usunięciem znaku. Są one napisane przy użyciu głównie komplementarnych zestawów znaków, więc usunięcie dowolnego znaku psuje tylko jeden, co pozwala drugiemu dalej funkcjonować.
Patrząc na pierwszą część, najpierw zajmiemy się
ec\nho \\n
ca t<<<$'\x20'
(następnie następuje,exi t
aby uniknąć uruchamiania późniejszego kodu, co spowodowałoby powstanie obcych danych wyjściowych)$
usunięcie za pomocąd$c -e8BC6P
(8BC6
=9226
is36*256 + 10
, a 36 i 10 są odpowiednio bajtowymi$
znakami nowego i nowego wiersza; używamy cyfr szesnastkowych dziesiętnych, aby uniknąć konieczności dołączania ich do dużego komentarza w wierszu 6)0
usuwanie zd0c -eKp
(K
pobiera dokładność dziesiętną, która jest0
domyślnie)W następnej części jedynymi używanymi znakami (oprócz śmieci na końcu drugiego wiersza) są
$'\01234567v;
spacja i nowa linia. Cztery z nich zostały uwzględnione, więc reszta ('\1234567v
) nie może wystąpić w ostatnim wierszu. Po rozwinięciu liczb ósemkowych ($'\123'
reprezentuje znak ASCII o wartości 123 8 ) otrzymujemy:Pierwszy wiersz przechodzi przez wszystkie znaki używane w programie i wyszukuje każdy w swoim własnym kodzie źródłowym (
$0
jest nazwą pliku uruchamianego skryptu), wypisując dowolny znak, który nie został znaleziony.Druga linia wygląda trochę dziwnie i wydaje się, że robi to samo, co
exit
kilka band. Jednak kodowanieexit
ósemkowe powoduje bezpośrednio$'\145\170\151\164'
, który nie zawiera2
lub3
. W rzeczywistości musimy uczynić to mniej odpornym na przeprowadzki. Wynika to z faktu, że jeśli którykolwiek z nich'\014567v
zostanie usunięty, zerwanie pierwszej linii, druga linia również się zepsuje, umożliwiając wykonanie pozostałej części kodu. Jednak musimy go również zepsuć, jeśli2
lub3
zostaną usunięte, aby linie 3 i 4 mogły działać. Odbywa się to poprzez wykuwanie butów w:
i;
, które mają odpowiednio ósemkową reprezentację 2 i 3.Śmieci na końcu wiersza 2 są po prostu po to, aby zapewnić, że każdy znak ASCII do wydruku pojawi się co najmniej raz, ponieważ wymaga tego sposób sprawdzania przez zapętlanie każdego z nich.
Jeśli
exit
nie został wywołany w pierwszej sekcji (tzn. Został zniekształcony przez usunięcie jednego z'\01234567v
), przechodzimy do drugiej, w której musimy osiągnąć to samo bez użycia żadnej z tych postaci. Ostatnia linia jest podobna do dekodowanej pierwszej linii, z tym wyjątkiem, że możemy zawęzić zakres pętli, aby zaoszczędzić kilka bajtów, ponieważ wiemy już, że wszystkie znaki oprócz'\01234567v
. Ma również0# $#
przed sobą, który komentuje to i zapobiega wytwarzaniu obcych danych wyjściowych, jeśli0
lub$
zostały usunięte.źródło
Siatkówka , 1 bajt
Wypróbuj online!
Po
1
usunięciu wszystkich instancji pojedynczego bajtu ( ) wynikiem jest1
. Wystarczająco proste.źródło
1
pusty program? Niezależnie od tego uważam, że w tych odpowiedziach wykorzystano różne podejścia i zachowania. IMO odpowiedź na poliglota jest uzasadniona tylko wtedy, gdy podejście pozostaje takie samo. (Obiektywnie nie jest to poliglota, ponieważ rzeczywisty kod jest inny, w przypadku odpowiedzi poniżej). Możesz głosować tak, jak chcesz, ale poprawna odpowiedź jest prawidłową odpowiedzią. Zachowam swoją odpowiedź taką, jaka jest, nie chcę przechowywać na niej zbioru odpowiedzi.Lenguage, 216173027061157310 bajtów
216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2
. Są216173027061157310 - 144115617572598740
$
s,216173027061157310 - 144115241762960340
#
s i216173027061157310 - 144115194786755540
spacje.144115617572598740
#
si spacje kodują następujący program BF:Wypróbuj online!
144115241762960340
$
si spacje kodują następujący program BF:Wypróbuj online!
144115194786755540
$
si#
kodują następujący program BF:Wypróbuj online!
Edycja: Zapisano 72057832274401770 bajtów dzięki @Nitrodon.
źródło
U
i bajt 127? Wypróbuj online! A może po prostu bajt nul i soh?U
jest to najkrótszy bajt ASCII, który można wydrukować. Nie chciałem używać bajtów niedrukowalnych.Galaretka , 1 bajt
Całkowicie różni się od odpowiedzi Retina. gwizdy
Wypróbuj online!
źródło
Polyglot * , 1 bajt ( oczekuje na potwierdzenie )
Wypróbuj online! (przy użyciu trójkątności)
*: Działa to w (dość szerokiej) różnorodności języków (z wyjątkiem esolangów takich jak 4,> <> i tym podobne oraz kilka innych wyjątków). Identycznie jak w przypadku odpowiedzi Jelly w kodzie źródłowym, ale metoda We / Wy jest inna - Wyjście odbywa się za pomocą kodu wyjścia. Kiedy usuwa się
0
z kodu źródłowego, pozostaje mu pusty program, który często nie zawiera błędów i zwraca kod wyjścia 0 w większości języków.źródło
sed , 1 bajt
Wypróbuj online!
Zupełnie różni się od odpowiedzi Retina lub Jelly.
źródło
Jednoargumentowy (niekonkurencyjny), 96 bajtów
Oto
xxd
zrzut.Szersza definicja języka Unary pozwala na dowolne znaki w kodzie źródłowym. Ale nie znalazłem kompilatora ani tłumacza, który by na to działał. Tak więc oznaczyłem tę odpowiedź jako niekonkurencyjną. Jeśli znajdziesz taki, który opublikował przed tym pytaniem, odsyłam do niego.
źródło