Bestimmen Sie anhand einer Audiodatei, ob diese in einem verlustbehafteten oder einem verlustfreien Format codiert ist. Für diese Herausforderung müssen nur die folgenden Formate klassifiziert werden:
Regeln
- Wenn die Eingabe in Form eines Dateinamens erfolgt, sollten keine Annahmen über den Dateinamen getroffen werden (z. B. kann nicht garantiert werden, dass die Erweiterung für das Format korrekt ist oder sogar vorhanden ist).
- In den Eingabedateien sind keine ID3- oder APEv2-Metadaten vorhanden.
- Beliebige zwei eindeutige und unterscheidbare Ausgaben können verwendet werden, wie z. B.
0
und1
,lossy
undlossless
,foo
undbar
usw.
Testfälle
Die Testfälle für diese Herausforderung bestehen aus einer ZIP-Datei , die zwei Verzeichnisse enthält: lossy
und lossless
. Jedes Verzeichnis enthält mehrere Audiodateien, die alle 0,5-Sekunden-440-Hz-Sinuswellen sind und in verschiedenen Formaten codiert sind. Alle Audiodateien haben Erweiterungen, die den oben genannten Formaten entsprechen, mit Ausnahme von A440.m4a
(AAC-Audio in einem MPEG Layer 4-Container).
Antworten:
Gelee ,
75 BytesVerlustbehaftete Formate geben 0 zurück , verlustfreie Formate geben zurück 1 zurück .
Probieren Sie es online! (Permalinks in Gist)
Hintergrund
Die Formate, die wir unterstützen müssen, haben die folgenden magischen Zahlen, dh sie beginnen mit diesen Bytes.
Eingezogene Einträge sind Container für das vorhergehende Format, die in den Testfällen angezeigt werden.
?
bezeichnet ein variables Byte..
bezeichnet ein nicht druckbares Byte. Alle anderen Bytes werden als ISO 8859-1-Zeichen angezeigt.Indem wir uns nur das zweite Byte ansehen, können wir das Format auf einfache Weise bestimmen:
Verlustfreie Formate haben einen Großbuchstaben als zweites Byte, verlustbehaftete Formate nicht.
Wie es funktioniert
quelle
C
828032 BytesInspiriert von der Antwort von @Dennis , kann dies noch viel weiter reduziert werden:
Leiten Sie die Dateidaten an stdin. Gibt 0 für verlustfrei oder ungleich Null für verlustbehaftet zurück.
Oder der ursprüngliche längere Scheck:
Leiten Sie die Dateidaten an stdin. Gibt einen Wert ungleich Null (1) für verlustfrei oder 0 für verlustreich zurück.
Soweit ich weiß, haben alle von Ihnen aufgelisteten Formate separate magische Zahlen (außer AIFF / WAV, aber beide sind trotzdem verlustfrei), so dass diese magische Zahl nur auf einen bekannten verlustfreien Wert überprüft wird. Dies
*v&&
dient nur zum Schutz vor übereinstimmenden Dateien, die mit einem Null-Byte (M4A) beginnen.Ich habe die Werte, die ich in den technischen Datenblättern (
fLaC
= FLAC,RIFF
= WAV / AIFF,TTA1
= TTA) und gefunden habe, aufgenommenFORM
= AIFF undFFM2
= TTA gefunden habe, stammen aus den bereitgestellten Beispieldateien (ich kann nur vermuten, dass es sich um Wrapperformate oder spätere Versionen handelt).Oder eine kürzere Alternative zum Betrügen:
Bash + Datei, 61 Bytes
Nimmt den Dateinamen als Argument. Gibt 0 für verlustfrei oder ungleich Null für verlustbehaftet zurück.
Tut genau das, was Sie erwarten würden; fragt nach
file
dem Dateityp und sucht dann nach bekannten Mustern. TTA-Übereinstimmungen: d
(: data
), AIFF / WAV-ÜbereinstimmungenIF
und FLAC-ÜbereinstimmungenFL
. Keines der verlustfreien Ergebnisse stimmt mit einem dieser Ergebnisse überein, und ich habe getestet, dass es immer noch funktioniert, wenn die Dateinamen entfernt werden.Testen:
quelle
file
traue Erweiterungen sowieso nicht (viele Benutzer, die ein PNG in ein JPEG umbenennen, ist dasselbe wie es zu konvertieren!)GS2 , 3 Bytes
Verlustbehaftete Formate geben 0 zurück , verlustfreie Formate geben 1 zurück .
Probieren Sie es online!(Permalinks in Gist)
Hintergrund
Die Formate, die wir unterstützen müssen, haben die folgenden magischen Zahlen, dh sie beginnen mit diesen Bytes.
Eingezogene Einträge sind Container für das vorhergehende Format, die in den Testfällen angezeigt werden.
?
bezeichnet ein variables Byte..
bezeichnet ein nicht druckbares Byte. Alle anderen Bytes werden als ISO 8859-1-Zeichen angezeigt.Indem wir uns nur das zweite Byte ansehen, können wir das Format auf einfache Weise bestimmen:
Verlustfreie Formate haben einen Großbuchstaben als zweites Byte, verlustbehaftete Formate nicht.
Wie es funktioniert
quelle
JavaScript (ES6), 20 Byte
Erläuterung
Nimmt den Inhalt der Datei als eine Eingabe und gibt ,
true
wenn die Datei lossless ist oderfalse
wenn es mit Verlust behaftete durch Testen der ersten Zeichen dieser Eingabe , um zu sehen , ob es eine istf
,F
,R
oderT
.Versuch es
Fügen Sie den Inhalt einer Datei in das ein
textarea
.Zweiter Versuch,
8163 BytesRuft den Inhalt einer Datei von einer angegebenen URL ab, was sich als überflüssig herausstellte.
Erster Versuch,
14611689 BytesUngültige MIME-Typen sind an Erweiterungen gebunden, und Antwortheader gelten anscheinend als zusätzliche Eingabe.
quelle
AddType <mime> <extension>
oder IIS<MimeMap>
. Natürlich könnte ein bestimmtes Setup- oder Datei-Hosting-Tool eine ordnungsgemäße Überprüfung durchführen, und das wäre es wert, wenn die Serverauswahl Teil der Antwort wäre (da der Server den Dateityp bestimmt!)Chip , 11 Bytes
Schamlos wiederholte Dennis 'Jelly-Antwort in Chip.
Verlustfreie Renditen
0x0
, verlustreiche Renditen0x1
.Probieren Sie es online aus , Links in Kürze (danke Dennis für die TIO-Strategie hier)
Erklären!
Dieser Teil ist hauswirtschaftlich: Er setzt
S
das erste Bytet
außer Kraft und endet nach dem zweiten.Das ist das Fleisch der Entscheidung. Auf jedes Eingangsbyte wird von den Bits zugegriffen
HGFEDCBA
. WennG
gesetzt ist undF
nicht, bedeutet dies, dass das Byte im Bereich von0x40
bis liegt0x5f
(was in etwa 'Großbuchstaben' entspricht und für die jeweilige Aufgabe gut genug ist).Aus Gründen der Byte-Ersparnis kehre ich diese Entscheidung jedoch von
G and (not F)
zu um(not G) or F
, da oder in Chip impliziert sein kann.Dieser resultierende wahre / falsche Wert wird dann in platziert
a
das niedrigste Bit der Ausgabe platziert. (Alle anderen Bits sind Null). Im TIO führe ich die Ausgabe über Hexdump aus, damit die Werte sichtbar sind.Entsprechend würde man in C-ish etwa sagen:
quelle
Cubix, 16 Bytes
Netzform:
Versuch es selber
Sie sollten die dezimalen Bytewerte der Datei in einer getrennten Liste eingeben. Das Trennzeichen spielt keine Rolle, alles, was keine Ziffer oder ein Minuszeichen ist, reicht aus. Der Code kümmert sich wirklich nur um das erste Byte, so dass Sie den Rest der Datei weglassen können, wenn Sie möchten. Das Programm gibt
0
für verlustfrei und1
für verlustbehaftet aus. Probieren Sie es hier aus ! Die Standardeingabe verwendet einen FLAC-Header.Erläuterung
Das Schöne an Dateien ist, dass (fast) alle eine sogenannte Magie haben. Das sind die ersten Bytes der Datei. Gute Software überprüft nicht die Dateierweiterung, sondern die Dateizauber, um festzustellen, ob eine bestimmte Datei verarbeitet werden kann.
Dennis hat einen Weg gefunden, mit dieser Magie den Komprimierungstyp zu finden, aber die Tatsache, dass er das erste Byte verworfen hat, hat mich dazu veranlasst, eine Methode zu entwickeln, die das erste Byte und nicht das zweite Byte verwendet. In dieser Community geht es schließlich darum, Bytes zu sparen.
Hier ist eine Liste der ersten Bytes der verschiedenen Dateitypen. Ich habe sie in zwei Gruppen eingeteilt: verlustbehaftet und verlustfrei. Hier sind die Werte ihres ersten Bytes in Dezimal, Hexadezimal und Binär. Möglicherweise sehen Sie bereits ein Muster ...
Das Muster, das ich sah, war, dass das zweite Bit (von links nach rechts gezählt) in den "verlustfreien" Bytes immer an und das fünfte Bit immer aus war. Diese Kombination wird in keinem der verlustbehafteten Formate angezeigt. Um dies zu "extrahieren", würden wir einfach ein binäres UND (von
0b01001000 (=72)
) machen und dann mit vergleichen0b01000000 (=64)
. Wenn beide gleich sind, ist das Eingabeformat verlustfrei, andernfalls ist es verlustbehaftet.Leider hat Cubix keinen solchen Vergleichsoperator, also habe ich Subtraktion verwendet (wenn das Ergebnis 64 ist, ergibt dies 0 und es ergibt 8, -56 oder -64, sonst. Ich werde später darauf zurückkommen.
Beginnen wir am Anfang des Programms. Das binäre UND geschieht mit dem
a
Befehl:Dann vergleichen wir mit 64 durch Subtraktion (beachten Sie, dass wir einen Spiegel treffen, der die IP auf die Oberseite [erste Zeile, zweites Zeichen, nach Süden zeigend] in der Mitte dieses Teils reflektiert).
Nachdem die IP durch den umgedreht wurde
u
, verwenden wir einen Kontrollfluss, um a1
auf den Stapel zu schieben , wenn (und nur wenn) die Oberseite des Stapels nicht Null ist:Nachdem wir uns um den Würfel gewickelt haben, treffen wir die
<
Anweisung, die die IP nach Westen auf die vierte Zeile zeigt. Sie müssen nur noch ausgeben und beenden.Das Programm gibt also
0
verlustfrei und1
verlustbehaftet aus.quelle