O czym zapomnieliśmy

31

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 bcbwyszedłby a, aaacamusiałby wyprowadzić bi aababawyszedłby c.

Nie ma znaczenia, co robi niezmodyfikowany program.

Odpowiedzi będą oceniane w bajtach, a celem jest zminimalizowanie liczby bajtów.

Kreator pszenicy
źródło
4
Ponieważ to wyzwanie nie jest oznaczone jako quine, czy możemy przeczytać nasz własny kod źródłowy?
Dennis,
1
@Dennis Sure. Bądź moim gościem
Wheat Wizard
2
Jeśli wszystkie bajty w naszym programie reprezentują cyfry, to czy możemy wyprowadzić kod wyjściowy?
Pan Xcoder,
15
Myślę, że byłoby to lepsze jako wyzwanie dla kodu, w którym musisz zmaksymalizować liczbę używanych dyskretnych znaków.
Notts90,
2
Powinieneś podać więcej niż 1 bajt zamiast niepustych : P. Lub co powiedział Notts90.
Magic Octopus Urn

Odpowiedzi:

70

zsh, 603 594 566 561 548 440 415 399 378 370 bajtów

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Zależ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ę

  • usuwanie nowej linii za pomocą ec\nho \\n
  • usuwanie miejsca za pomocą ca t<<<$'\x20'(następnie następuje, exi taby uniknąć uruchamiania późniejszego kodu, co spowodowałoby powstanie obcych danych wyjściowych)
  • $usunięcie za pomocą d$c -e8BC6P( 8BC6= 9226is 36*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)
  • 0usuwanie z d0c -eKp( Kpobiera dokładność dziesiętną, która jest 0domyś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:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

Pierwszy wiersz przechodzi przez wszystkie znaki używane w programie i wyszukuje każdy w swoim własnym kodzie źródłowym ( $0jest 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 exitkilka band. Jednak kodowanie exitósemkowe powoduje bezpośrednio $'\145\170\151\164', który nie zawiera 2lub 3. W rzeczywistości musimy uczynić to mniej odpornym na przeprowadzki. Wynika to z faktu, że jeśli którykolwiek z nich '\014567vzostanie 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śli 2lub 3zostaną 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 exitnie 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śli 0lub $zostały usunięte.

Klamka
źródło
5
Wow, bardzo imponujące, biorąc pod uwagę liczbę różnych postaci! Zdecydowanie czekam na to wyjaśnienie.
Kevin Cruijssen
3
@KevinCruijssen proszę bardzo :)
Klamka
1
@ Doorknob, jeśli to nie wygra 548 internetów, nie wiem co to robi. Szczerze mówiąc, wersja 603 bajtów jest równie imponująca hah!
Magic Octopus Urn
3
Jak dotąd jedyna interesująca odpowiedź.
htmlcoderexe
21

Siatkówka , 1 bajt

1

Wypróbuj online!

Po 1usunięciu wszystkich instancji pojedynczego bajtu ( ) wynikiem jest 1. Wystarczająco proste.

Conor O'Brien
źródło
6
Przeglądałem TIO, aby znaleźć coś takiego - pobiłeś mnie do tego. Btw to poliglota, współpracuje ze Snails
JayCe,
IMO, odpowiedź ta powinna zostać uaktualniona do odpowiedzi poliglotycznej jako pierwszej (być może z zawsze niekompletną listą języków), a pozostałe dwa oddane w zapomnienie. Aha, i to też działa w C .
@Rogem Nie jestem pewien, co rozumiesz przez „to działa w C.” czy masz kompilator C, który wyprowadza 1pusty 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.
Conor O'Brien
11

Lenguage, 216173027061157310 bajtów

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Są 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s i 216173027061157310 - 144115194786755540spacje.

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.

Neil
źródło
Dlaczego nie użyć Ui bajt 127? Wypróbuj online! A może po prostu bajt nul i soh?
Jo King,
@JoKing Nie wiedziałem, że Ujest to najkrótszy bajt ASCII, który można wydrukować. Nie chciałem używać bajtów niedrukowalnych.
Neil
Nawet bez korzystania z zawijania komórek lub znaków niedrukowalnych można zmniejszyć to do 216173027061157310 bajtów, umieszczając znak spacji jako trzeci odrębny bajt.
Nitrodon
7
Nie mogę się powstrzymać od głosowania z powodu „Edytuj: Zapisano 72057832274401770 bajtów ...”
Lister
10

Galaretka , 1 bajt

0

Całkowicie różni się od odpowiedzi Retina. gwizdy

Wypróbuj online!

Dennis
źródło
6
Polyglot z M i Enlist.
Pan Xcoder,
9

Polyglot * , 1 bajt ( oczekuje na potwierdzenie )

0

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ę 0z 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.

Pan Xcoder
źródło
3

sed , 1 bajt



Wypróbuj online!

Zupełnie różni się od odpowiedzi Retina lub Jelly.

tsh
źródło
Nie widzę żadnego kodu. Czy nie byłoby to odpowiedź 0 bajtów? Jak to działa?
Maszt
15
@Mast Jest nowa linia ..... będziesz mieć trudności z czytaniem programów napisanych w Whitespace, jeśli będziesz tak myślał.
user202729,
3

Jednoargumentowy (niekonkurencyjny), 96 bajtów

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Oto xxdzrzut.

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.

tsh
źródło
4
To najmniejszy Unary program, jaki kiedykolwiek widziałem.
Draco18s,