Biorąc pod uwagę plik audio, określ, czy jest on zakodowany w formacie stratnym czy bezstratnym. Do celów tego wyzwania należy klasyfikować tylko następujące formaty:
Zasady
- Jeśli dane wejściowe są przyjmowane w postaci nazwy pliku, nie należy przyjmować żadnych założeń dotyczących nazwy pliku (np. Nie gwarantuje się, że rozszerzenie jest poprawne dla formatu, a nawet jest obecne).
- W plikach wejściowych nie będą obecne metadane ID3 ani APEv2.
- Można zastosować dowolne dwa unikalne i rozróżnialne dane wyjściowe, takie jak
0
i1
,lossy
ilossless
,foo
ibar
itp.
Przypadki testowe
Przypadki testowe dla tego wyzwania składają się z pliku zip znajdującego się tutaj, który zawiera dwa katalogi: lossy
i lossless
. Każdy katalog zawiera kilka plików audio, które są 0,5-sekundowymi falami sinusoidalnymi 440 Hz, zakodowanymi w różnych formatach. Wszystkie pliki audio mają rozszerzenia pasujące do powyższych formatów, z wyjątkiem A440.m4a
(którym jest audio AAC w kontenerze MPEG Layer 4).
Odpowiedzi:
Galaretka ,
75 bajtówFormaty stratne zwracają 0 , formaty bezstratne zwracają 1 .
Wypróbuj online! (permalinki w Gist)
tło
Formaty, które musimy obsługiwać, mają następujące magiczne liczby, tzn. Zaczynają się od tych bajtów.
Wcięte wpisy to kontenery dla poprzedniego formatu, które pojawiają się w przypadkach testowych.
?
oznacza bajt zmienny..
oznacza bajt niedrukowalny. Wszystkie pozostałe bajty są wyświetlane jako znak ISO 8859-1.Patrząc tylko na drugi bajt, możemy łatwo ustalić format:
Formaty bezstratne mają jako drugi bajt wielką literę, natomiast formaty stratne nie.
Jak to działa
źródło
C,
828032 bajtyZainspirowany odpowiedzią @Dennis , można to znacznie zmniejszyć:
Prześlij dane pliku do standardowego wejścia. Zwraca 0 dla stratnych lub niezerowe dla stratnych.
Lub oryginał dłużej czek:
Prześlij dane pliku do standardowego wejścia. Zwraca niezerową (1) dla stratnej lub 0 dla stratnej.
Z tego, co mogę powiedzieć, wszystkie wymienione formaty mają osobne magiczne liczby (oprócz AIFF / WAV, ale i tak oba są bezstratne), więc to po prostu sprawdza tę magiczną liczbę pod kątem znanej bezstratnej wartości. Ma
*v&&
to na celu ochronę przed pasującymi plikami, które zaczynają się od bajtu zerowego (M4A).Uwzględniłem wartości, które znalazłem w arkuszach specyfikacji (
fLaC
= FLAC,RIFF
= WAV / AIFF,TTA1
= TTA), aFORM
= AIFF iFFM2
= TTA pochodzą z dostarczonych plików przykładowych (mogę tylko zgadywać, że są to formaty opakowań lub nowsze wersje).Lub krótsza alternatywa przypominająca oszustwo:
Plik Bash +, 61 bajtów
Traktuje nazwę pliku jako argument. Zwraca 0 dla stratnych lub niezerowe dla stratnych.
Robi dokładnie to, czego można oczekiwać; pyta,
file
jaki jest typ pliku, a następnie sprawdza znane wzorce. Dopasowania TTA: d
(: data
), dopasowanie AIFF / WAVIF
i dopasowania FLACFL
. Żaden z bezstratnych wyników nie pasuje do żadnego z nich, a ja przetestowałem, że nadal działa, jeśli nazwy plików zostaną usunięte.Testowanie:
źródło
file
nie ufa rozszerzeń anyway (wielu użytkowników rzecz zmiany nazwy PNG do JPEG jest taka sama, jak przekształcenie go!)GS2 , 3 bajty
Formaty stratne zwracają 0 , formaty bezstratne zwracają 1 .
Wypróbuj online! (permalinki w Gist)
tło
Formaty, które musimy obsługiwać, mają następujące magiczne liczby, tzn. Zaczynają się od tych bajtów.
Wcięte wpisy to kontenery dla poprzedniego formatu, które pojawiają się w przypadkach testowych.
?
oznacza bajt zmienny..
oznacza bajt niedrukowalny. Wszystkie pozostałe bajty są wyświetlane jako znak ISO 8859-1.Patrząc tylko na drugi bajt, możemy łatwo ustalić format:
Formaty bezstratne mają jako drugi bajt wielką literę, natomiast formaty stratne nie.
Jak to działa
źródło
JavaScript (ES6), 20 bajtów
Wyjaśnienie
Bierze zawartość pliku jako wejście i powrót
true
, jeśli plik jest bezstratna lubfalse
jeśli jest stratny testując pierwszy znak tego wejścia, aby zobaczyć, czy jest tof
,F
,R
lubT
.Spróbuj
Wklej zawartość pliku do
textarea
.Drugi wysiłek,
8163 bajtówPobiera zawartość pliku z podanego adresu URL, który okazał się przesadą.
Pierwszy wysiłek,
14611689 bajtówNiepoprawne, ponieważ typy MIME są powiązane z rozszerzeniami i, najwyraźniej, nagłówki odpowiedzi kwalifikują się jako dodatkowe dane wejściowe.
źródło
AddType <mime> <extension>
lub IIS<MimeMap>
. Oczywiście konkretna konfiguracja lub narzędzie do hostowania plików może przeprowadzić odpowiednią inspekcję, a to zasługiwałoby na wybór serwera jako części odpowiedzi (ponieważ to serwer określa typ pliku!)Chip , 11 bajtów
Bezwstydnie odwzorowała galaretkową odpowiedź Dennisa w Chipie.
Bezstratne zwroty
0x0
, straty zwrotne0x1
.Wypróbuj online , linki w skrócie (dzięki Dennis za strategię TIO tutaj)
Wyjaśnić!
Ta część to sprzątanie: to
S
kipuje pierwszy bajt it
kończy się po drugim.To jest sedno decyzji. Do każdego bajtu wejściowego mają dostęp bity
HGFEDCBA
. GdybyG
jest ustawiona, aF
nie jest, oznacza to, że bajt jest w zakresie0x40
do0x5f
(co jest mniej więcej odpowiednikiem „dużą literą” i wystarczająco dobre dla zadania pod ręką).Jednak dla oszczędności bajtów odwracam tę decyzję od
G and (not F)
na(not G) or F
, ponieważ lub może być ukryta w Chipie.Ta wynikowa wartość prawda / fałsz jest następnie umieszczana w
a
, który jest najniższym bitem wyniku. (Wszystkie inne bity będą wynosić zero). W TIO uruchamiam dane wyjściowe przez zrzut heksowy, aby wartości były widoczne.Równolegle w języku C można by powiedzieć coś takiego:
źródło
Cubix, 16 bajtów
Formularz netto:
Spróbuj sam
Należy wprowadzić wartości bajtów dziesiętnych pliku na oddzielnej liście. Separator nie ma znaczenia, wystarczy coś, co nie jest cyfrą ani znakiem minus. Kod naprawdę obchodzi tylko pierwszy bajt, więc możesz pominąć resztę pliku, jeśli chcesz. Program generuje dla stratnych
0
i bezstratnych1
. Wypróbuj tutaj ! Domyślne wejście używa nagłówka FLAC.Wyjaśnienie
Zaletą plików jest to, że (prawie) wszystkie mają tak zwaną magię. To kilka pierwszych bajtów pliku. Dobre oprogramowanie nie sprawdza rozszerzenia pliku, ale raczej magię pliku, aby sprawdzić, czy może obsłużyć określony plik.
Dennis znalazł sposób na użycie tej magii do znalezienia rodzaju kompresji, ale fakt, że odrzucił pierwszy bajt, sprawił, że chciałem wymyślić metodę, która użyłaby pierwszego bajtu, a nie drugiego. W końcu ta społeczność polega na oszczędzaniu bajtów.
Oto lista pierwszych bajtów różnych typów plików. Podzieliłem je na dwie grupy: stratne i bezstratne. Oto wartości ich pierwszego bajtu w postaci dziesiętnej, szesnastkowej i binarnej. Możesz już zobaczyć wzór ...
Wzorzec, który widziałem, był taki, że drugi bit (liczony od lewej do prawej) zawsze był włączony w „bezstratnych” bajtach, a piąty bit był zawsze wyłączony. Ta kombinacja nie pojawia się w żadnym z formatów stratnych. Aby to „wyodrębnić”, po prostu zrobilibyśmy binarne AND (by
0b01001000 (=72)
), a następnie porównaliśmy z0b01000000 (=64)
. Jeśli oba są równe, format wejściowy jest bezstratny, w przeciwnym razie jest stratny.Niestety Cubix nie ma takiego operatora porównania, więc użyłem odejmowania (jeśli wynikiem jest 64, daje to 0, a w przeciwnym razie daje 8, -56 lub -64. Wrócę do tego później.
Najpierw zacznijmy od początku programu. Binarne AND odbywa się za pomocą
a
polecenia:Następnie porównujemy do 64 za pomocą odejmowania (zauważmy, że uderzamy w lustro, które odbija IP do górnej powierzchni [pierwsza linia, drugi znak, skierowany na południe] w środku tej części).
Po odwróceniu adresu IP przez
u
, używamy przepływu sterującego, aby wypchnąć a1
na stos, jeśli (i tylko jeśli) góra stosu jest różna od zera:Po owinięciu sześcianu uderzamy w
<
instrukcję, która wskazuje IP na zachód w czwartej linii. Wszystko, co pozostaje do zrobienia, to wyjście i zakończenie.Tak więc program generuje dane
0
bezstratne i1
stratne.źródło