Scenariusz
Ostatnio zauważyłeś dziwne zachowanie w swoim ulubionym edytorze tekstu. Na początku wydawało się, że ignoruje losowe znaki w kodzie podczas zapisywania na dysku. Po chwili zauważyłeś wzór; znaki o nieparzystych wartościach ASCII były ignorowane. Podczas dalszej kontroli odkryłeś, że możesz poprawnie zapisywać do plików tylko wtedy, gdy co ósmy bit jest równy zero. Teraz musisz wiedzieć, czy ten cenny plik został dotknięty tym dziwnym błędem.
Zadanie
Musisz napisać kompletny program, który określa, czy plik zawiera jakieś nieparzyste bajty (pokazując, że nie jest uszkodzony). Ale z powodu edytora tekstu nie można pisać żadnych nieparzystych bajtów w kodzie źródłowym. Możesz założyć wcześniej istniejące kodowanie dla danych wejściowych, jednak nadal musisz sprawdzać każdy pojedynczy bajt, nie tylko znaki.
Wejście
Twój program pobierze zawartość lub ścieżkę do pliku ze standardowego wejścia lub wiersza poleceń.
Wynik
Twój program wyświetli stdout albo prawdziwą wartość, jeśli dany plik zawiera nieparzysty bajt, albo fałsz, jeśli co ósmy bit jest równy zero.
Kryteria
To jest golf golf, najkrótszy program, który wykonuje zadanie, wygrywa. Aby zgłoszenie było prawidłowe, co ósmy bit w kodzie źródłowym plików musi wynosić zero. Polecam dołączenie kopii plików binarnych kodu źródłowego do twojego zgłoszenia.
Przypadki testowe
(W kodowaniu ASCII) Wejście:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
Napiwki
Wybierz język mądrze. To wyzwanie może nie być możliwe w każdym języku
Polecenie Unix
xxd -b <file name>
wydrukuje pliki binarne pliku na konsoli (wraz z dodatkowymi funkcjami formatowania)Możesz używać innych kodowań innych niż ASCII, takich jak UTF-8, o ile wszystkie inne reguły są przestrzegane
źródło
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
są zakazanymi drukowalnymi znakami ASCII dla każdego, kogo to obchodzi. Dozwolone znaki do wydruku ASCII to" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
ma on dziwny bit. Miałem nadzieję, że WhiteSpace jest bezpieczny, ale niestety[TAB]
. Jeśli chcesz iść do starej szkoły, EBCDIC daje ci trzy samogłoski.Odpowiedzi:
GS2 , 4 bajty
Wypróbuj online!
Hexdump
Jak to działa
źródło
Befunge, 36 bajtów
Wiem, że to stare pytanie, ale chciałem spróbować, bo myślałem, że będzie to interesujące wyzwanie w Befunge.
Wypróbuj online!
Wyprowadza,
1
jeśli dane wejściowe są uszkodzone (tzn. Zawierają nieparzysty bajt) i0
jeśli jest w porządku.Wyjaśnienie
Problem polega na tym, jak określić nieparzyste bajty bez dostępu do poleceń
/
(dzielenia) lub%
(modulo). Rozwiązaniem było pomnożenie wartości przez 128 (sekwencja28*8**
), a następnie zapisanie tego wyniku na polu gry. W ściśle standardowym interpretatorze komórki pola gry mają 8-bitowe wartości, więc liczba nieparzysta pomnożona przez 128 zostaje obcięta do -1, a liczba parzysta staje się 0.Inną sztuczką było odczytywanie wartości -1 lub 0 z pola gry bez dostępu do polecenia
g
(get). Obejściem tego problemu było zapisanie wartości na środku istniejącej sekwencji ciągów (" "
), a następnie wykonanie tej sekwencji w celu wypchnięcia zamkniętej wartości na stos. W tym momencie określenie dziwności bajtu jest prostym testem mniejszym od zera.Ostatnim aspektem wartym omówienia jest wynik. W fałszywym przypadku dochodzimy do
>$.
sekwencji z tylko jedną wartością na stosie, więc$
czyści stos, co powoduje, że.
wynik jest zerowy. W prawdziwym przypadku podążamy ścieżką20`:>$.
. Ponieważ dwa są większe od zera, porównanie wypycha jeden na stos, a następnie:
tworzy duplikat, aby$
nie upuścił go, zanim zostanie wydrukowany.źródło
CJam (11 bajtów)
Demo online
Usuwając sztuczki, aby uniknąć nieparzystych bajtów, zmniejsza się do
który odczytuje dane wejściowe, mapuje bitowo AND za pomocą
1
, a następnie wykonuje konwersję podstawową, dając zero, gdy wszystkie AND były zerowe.źródło
:(
Plik .COM do wydruku, 100 bajtów
Hexdump:
Używanie bardzo luźnej definicji źródła jako czegoś, co może być rozsądnie wpisane przez człowieka i zainspirowane standardowym plikiem testowym antywirusa EICAR Standard (więcej informacji na temat „Bawmy się z plikiem testowym EICAR” w Bugtraq).
Używając tylko drukowalnych nieparzystych bajtów ASCII (uwaga: kody wpływające na słowa bywają nieparzyste, bit W jest lsb niektórych opcodów), tworzy fragment kodu w SP (który wygodnie ustawiamy tuż za naszym kodem generującym) , a wykonanie kończy się na wygenerowanym kodzie.
Wykorzystuje fakt, że stos początkowo zawiera wskaźnik zbliżony do początku PSP i że początek PSP zawiera
INT 20h
instrukcję (więcej informacji na ten temat na https://stackoverflow.com/questions/12591673/ ).Prawdziwe źródło:
źródło
MATL , 7 bajtów
Kod źródłowy wykorzystuje kodowanie UTF-8. Więc bajty źródłowe są (dziesiętnie)
Dane wejściowe to nazwa pliku, traktowana jako ciąg ujęty w pojedyncze cudzysłowy. Dane wyjściowe to liczba nieparzystych bajtów w pliku, co jest prawdą, jeśli nie jest zero.
Wyjaśnienie
źródło
CJam,
181715 bajtówZakłada, że ustawienia regionalne są ustawione na Latin-1. Wypróbuj online!
Jak to działa
Proste rozwiązanie wygląda następująco.
Niestety znaki
q
ii
nie mogą pojawić się w kodzie źródłowym. Aby obejść ten problem, będziemy dynamicznie tworzyć część powyższego kodu źródłowego, a następnie oceniać ciąg.źródło
Pyth,
2013 bajtówLub binarnie:
Wypróbuj online
Jak to działa
Wynikowa liczba całkowita jest prawdziwa (niezerowa), jeśli dowolny z bajtów był nieparzysty.
źródło
Galaretka , 13 bajtów
Oczekuje danych wejściowych jako cytowanego argumentu wiersza polecenia. Wypróbuj online!
Hexdump
źródło
O%2¬Ạ¬
.Siatkówka , 106 bajtów
Usuwa każdą dozwoloną postać, a następnie dopasowuje pozostałe postacie. Prawdziwe wartości to liczba znalezionych znaków. Wartości Falsey będą
0
.Wypróbuj online
Ponieważ
.
domyślnie nie pasuje do nowych linii, nie muszę ich usuwać.źródło
Perl 5 +
-p0
136 bajtówPodobnie do innych odpowiedzi, usuwa wszystkie parzyste bajty i pozostawia wszelkie nieparzyste bajty (co jest prawdą).
Wypróbuj online!
źródło
-0
nie robi nic nowego. Określa tylko sposób podziału danych wejściowych, nie usuwa żadnych znaków.-0
, chciałem zrobić cały blok jako bryłę, ale to nie powinno mieć znaczenia, ale nie mogę tego obejść ... Szkoda! Wyczyszczę te komentarze. Dzięki za heads-up!Japt , 10 bajtów
Wypróbuj online!
Strona kodowa Japt to ISO-8859-1. Kod podaje,
false
gdy sam jest wprowadzony jako ciąg, a zatem prawidłowe przesłanie.Rozpakowane i jak to działa
Nie posiadanie
String.c
(pobierz kod znaków lub mapa nad kodami znaków) było uciążliwe, ale na szczęście jestNumber.d
(konwersja numeru na znak).Okazuje się, że Japt wygrywa z CJam, Pyth i Jelly :)
Bez ograniczenia istnieje kilka sposobów, aby to zrobić w 6 bajtach (znów na poziomie CJam i Jelly):
"000..000"
jest konwertowany na liczbę 0 (fałsz) niezależnie od tego, jak długo to trwa. Z drugiej strony wszystko, co zawiera 1, jest konwertowane na wartość niezerowądouble
lubInfinity
jeśli jest zbyt duża (obie są prawdą).Bardziej proste podejście, które bezpośrednio daje
true
lubfalse
.Lub rozwiązanie 5 bajtów jest nawet możliwe przy pomocy
-d
flagi:źródło