Cubix, 16 바이트
$-!u'HIa'@/1@O<
순수한 형태 :
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
직접 해보십시오
파일 10 진수 바이트 값을 분리 된 목록으로 입력해야합니다. 구분 기호는 중요하지 않습니다. 숫자 나 빼기 기호가 아닌 것은 충분합니다. 코드는 실제로 첫 번째 바이트에만 관심이 있으므로 원하는 경우 파일의 나머지 부분을 생략 할 수 있습니다. 이 프로그램 0
은 무손실 및 1
손실로 출력 됩니다 . 여기에서 보십시오 ! 기본 입력은 FLAC 헤더를 사용합니다.
설명
파일에 대한 좋은 점은 (거의) 모든 파일에 소위 마법이 있다는 것입니다. 그것들은 파일의 처음 몇 바이트입니다. 좋은 소프트웨어는 파일 확장자를 검사하지 않고 특정 파일을 처리 할 수 있는지 확인하기 위해 파일 마법을 검사합니다.
Dennis는이 마술을 사용하여 압축 유형을 찾는 방법을 찾았지만 첫 번째 바이트를 버렸다는 사실 때문에 두 번째 바이트가 아닌 첫 번째 바이트를 사용하는 방법을 생각해 냈습니다. 결국이 커뮤니티는 바이트 절약에 관한 것입니다.
다른 파일 형식의 첫 번째 바이트 목록은 다음과 같습니다. 나는 그것들을 손실과 무손실의 두 그룹으로 주문했다. 다음은 첫 번째 바이트 값을 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
내가 본 패턴은 두 번째 비트 (왼쪽에서 오른쪽으로 계산)가 항상 "손실없는"바이트에 있고 다섯 번째 비트는 항상 꺼져 있다는 것입니다. 이 조합은 손실 형식으로 나타나지 않습니다. 이것을 "추출"하기 위해 간단히 이진 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가 바뀌면 스택의 상단이 0이 아닌 경우에만 u
제어 흐름을 사용 1
하여 스택에 a 를 푸시 합니다.
!$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
손실로 출력 됩니다 .