Cubix,16个字节
$-!u'HIa'@/1@O<
净形式:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
自己尝试
您应该在单独的列表中输入文件的十进制字节值。分隔符无关紧要,只要不是数字或减号就可以。该代码实际上只关心第一个字节,因此,您可以根据需要省略文件的其余部分。程序输出0
无损和1
有损。在这里尝试!默认输入使用FLAC标头。
说明
关于文件的好处是(几乎)所有文件都有所谓的魔术。这些是文件的前几个字节。好的软件不会检查文件扩展名,而是检查文件魔术,以查看它是否可以处理某个文件。
丹尼斯(Dennis)找到了一种使用这种魔术来找到压缩类型的方法,但是他丢弃了第一个字节的事实使我想尝试提出一种使用第一个字节而不是第二个字节的方法。毕竟,这个社区只是关于保存字节。
这是不同文件类型的前几个字节的列表。我将它们分为两组:有损和无损。这是十进制,十六进制和二进制的第一个字节的值。您可能已经看到一种模式...
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
我看到的模式是,第二位(从左到右计数)始终在“无损”字节上,而第五位始终在关闭。此组合不会以任何有损格式出现。要“提取”此代码,我们只需做一个二进制AND(由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反射到该部分中间的顶面(第一行,第二个字符,指向南)。
'@-
'@ # 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
在包装完立方体之后,我们点击了<
指令,该指令将IP指向第四行。剩下要做的就是输出并终止。
O@
O # Output top of the stack as number
@ # End program
因此,程序输出0
无损和1
有损。