Cubix, 16 octets
$-!u'HIa'@/1@O<
Forme nette:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
Essayez-le vous-même
Vous devez entrer les valeurs d'octets décimaux du fichier dans une liste séparée. Le séparateur n'a pas d'importance, tout ce qui n'est pas un chiffre ou un signe moins suffit. Le code ne se soucie vraiment que du premier octet, vous pouvez donc laisser de côté le reste du fichier si vous le souhaitez. Le programme génère 0
des sorties sans perte et 1
avec perte. Essayez-le ici ! L'entrée par défaut utilise un en-tête FLAC.
Explication
La bonne chose à propos des fichiers est que (presque) tous ont une soi-disant magie. Ce sont les premiers octets du fichier. Un bon logiciel ne vérifie pas l'extension du fichier, mais plutôt la magie du fichier pour voir s'il peut gérer un certain fichier.
Dennis a trouvé un moyen d'utiliser cette magie pour trouver le type de compression, mais le fait qu'il ait supprimé le premier octet m'a donné envie d'essayer de trouver une méthode qui utilise le premier octet plutôt que le second. Après tout, cette communauté consiste à économiser des octets.
Voici une liste des premiers octets des différents types de fichiers. Je les ai classés en deux groupes: avec et sans perte. Voici les valeurs de leur premier octet en décimal, hexadécimal et binaire. Vous pourriez déjà voir un motif ...
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
Le motif que j'ai vu était que le deuxième bit (compté de gauche à droite) était toujours activé sur les octets "sans perte" et le cinquième bit était toujours désactivé. Cette combinaison n'apparaît dans aucun des formats avec perte. Pour «extraire» cela, nous ferions simplement un ET binaire (par 0b01001000 (=72)
), puis nous comparerions à 0b01000000 (=64)
. Si les deux sont égaux, le format d'entrée est sans perte, sinon c'est avec perte.
Malheureusement, Cubix n'a pas un tel opérateur de comparaison, j'ai donc utilisé la soustraction (si le résultat est 64, cela donne 0, et il en résulte 8, -56 ou -64 sinon. J'y reviendrai plus tard.
Commençons d'abord par le début du programme. L'ET binaire se fait à l'aide de la a
commande:
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
Ensuite, nous comparons à 64 en utilisant la soustraction (notez que nous avons frappé un miroir qui reflète l'IP vers la face supérieure [première ligne, deuxième caractère, pointant vers le sud] au milieu de cette partie).
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
Une fois l'IP retournée par le u
, nous utilisons un flux de contrôle pour pousser a 1
vers la pile si (et seulement si) le haut de la pile n'est pas nul:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
Après avoir fait le tour du cube, nous avons frappé l' <
instruction, qui pointe l'IP vers l'ouest sur la quatrième ligne. Il ne reste plus qu'à sortir et à terminer.
O@
O # Output top of the stack as number
@ # End program
Ainsi, le programme génère 0
des sorties sans perte et 1
avec perte.