Cubix, 16 Bytes
$-!u'HIa'@/1@O<
Netzform:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
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 und 1
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 ...
Lossy: Lossless:
255:0xFF:0b11111111 102:0x66:0b01100110
79:0x4F:0b01001111 84:0x54:0b01010100
35:0x23:0b00100011 82:0x52:0b01010010
11:0x0B:0b00001011 70:0x46:0b01000110
0:0x00:0b00000000
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 vergleichen 0b01000000 (=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:
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
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).
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
Nachdem die IP durch den umgedreht wurde u
, verwenden wir einen Kontrollfluss, um a 1
auf den Stapel zu schieben , wenn (und nur wenn) die Oberseite des Stapels nicht Null ist:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
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.
O@
O # Output top of the stack as number
@ # End program
Das Programm gibt also 0
verlustfrei und 1
verlustbehaftet aus.