Cubix, 16 byte
$-!u'HIa'@/1@O<
Modulo netto:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
Provate voi stessi
È necessario immettere i valori dei byte decimali del file in un elenco separato. Il separatore non ha importanza, tutto ciò che non è una cifra o un segno meno è sufficiente. Il codice si preoccupa solo del primo byte, quindi puoi lasciare fuori il resto del file se vuoi. Il programma esce 0
per lossless e 1
per lossy. Provalo qui ! L'input predefinito utilizza un'intestazione FLAC.
Spiegazione
La cosa bella dei file è che (quasi) tutti hanno una cosiddetta magia. Questi sono i primi pochi byte del file. Un buon software non controlla l'estensione del file, ma piuttosto la magia dei file per vedere se è in grado di gestire un determinato file.
Dennis ha trovato il modo di usare questa magia per trovare il tipo di compressione, ma il fatto che abbia scartato il primo byte mi ha fatto venire voglia di provare a trovare un metodo che usasse il primo byte, piuttosto che il secondo. Dopotutto, questa community si occupa del salvataggio dei byte.
Ecco un elenco dei primi byte dei diversi tipi di file. Li ho ordinati in due gruppi: lossy e lossless. Ecco i valori del loro primo byte in decimale, esadecimale e binario. Potresti già vedere uno schema ...
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
Lo schema che ho visto era che il secondo bit (contato da sinistra a destra) era sempre attivo sui byte "lossless" e il quinto bit era sempre spento. Questa combinazione non appare in nessuno dei formati con perdita. Per "estrarre" questo, dovremmo semplicemente fare un binario AND (by 0b01001000 (=72)
) e poi confrontarlo con 0b01000000 (=64)
. Se entrambi sono uguali, il formato di input è senza perdita, altrimenti è con perdita.
Sfortunatamente, Cubix non ha un simile operatore di confronto, quindi ho usato la sottrazione (se il risultato è 64, questo produce 0 e risulta in 8, -56 o -64 altrimenti. Tornerò su questo più tardi.
Innanzitutto, iniziamo all'inizio del programma. Il binario AND viene eseguito utilizzando il a
comando:
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
Quindi, confrontiamo con 64 usando la sottrazione (nota che colpiamo un mirror che riflette l'IP sulla faccia superiore [prima riga, secondo carattere, che punta a sud] nel mezzo di questa parte).
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
Dopo che l'IP è invertito da u
, usiamo un po 'di flusso di controllo per spingere 1
a nello stack se (e solo se) la parte superiore dello stack è diversa da zero:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
Dopo aver avvolto il cubo, abbiamo colpito l' <
istruzione, che indica l'IP ovest sulla quarta riga. Tutto quello che resta da fare è produrre e terminare.
O@
O # Output top of the stack as number
@ # End program
Quindi, il programma esce 0
per lossless e 1
per lossy.