Cubix、16バイト
$-!u'HIa'@/1@O<
ネット形式:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
自分で試してみてください
ファイルの10進バイト値は、個別のリストに入力する必要があります。区切り文字は関係なく、数字でもマイナス記号でもないもので十分です。コードは実際には最初のバイトのみを対象としているため、必要に応じてファイルの残りを省くことができます。このプログラムは0
、ロスレス、および1
ロッシー用に出力します。ここで試してみてください!デフォルトの入力ではFLACヘッダーが使用されます。
説明
ファイルの良いところは、(ほぼ)それらのすべてがいわゆるマジックを持っていることです。これらは、ファイルの最初の数バイトです。優れたソフトウェアは、ファイル拡張子をチェックするのではなく、特定のファイルを処理できるかどうかを確認するためのファイルマジックをチェックします。
デニスはこのマジックを使用して圧縮タイプを見つける方法を見つけましたが、彼が最初のバイトを破棄したという事実から、2番目ではなく1番目のバイトを使用するメソッドを考え出しました。結局のところ、このコミュニティはすべてバイトの節約に関するものです。
さまざまなファイルタイプの最初のバイトのリストを以下に示します。私はそれらを2つのグループに分けました:不可逆的と可逆的です。10進数、16進数、および2進数の最初のバイトの値を以下に示します。すでにパターンが表示されている場合があります...
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
私が見たパターンは、2番目のビット(左から右に数える)が「ロスレス」バイトで常にオンであり、5番目のビットが常にオフであったということでした。この組み合わせは、損失の多い形式では表示されません。これを「抽出」するには、単にバイナリAND(by 0b01001000 (=72)
)を実行してからと比較し0b01000000 (=64)
ます。両方が等しい場合、入力形式は可逆であり、そうでない場合は不可逆です。
残念ながら、Cubixにはそのような比較演算子がないため、減算を使用しました(結果が64の場合、これは0になり、それ以外の場合は8、-56または-64になります。これについては後で説明します。
まず、プログラムの最初から始めましょう。バイナリANDは、a
次のコマンドを使用して実行されます。
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
次に、減算を使用して64と比較します(この部分の中央のIP [1行目、2番目の文字、南を指す]にIPを反映するミラーにヒットします)。
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
によってIPが方向転換された後、スタックの最上部がゼロ以外の場合(およびその場合のみ)、u
制御フローを使用してa 1
をスタックにプッシュします。
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
キューブをラップした後、<
命令をヒットします。これにより、4番目の行でIPが西に向けられます。あとは、出力して終了するだけです。
O@
O # Output top of the stack as number
@ # End program
そのため、プログラム0
はロスレスおよびロスのある出力を出力し1
ます。