Hình khối, 16 byte
$-!u'HIa'@/1@O<
Hình thức mạng:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
Tự mình thử
Bạn nên nhập các giá trị byte thập phân của tệp trong một danh sách riêng biệt. Dấu phân cách không quan trọng, bất cứ điều gì không phải là một chữ số hoặc dấu trừ đều đủ. Mã thực sự chỉ quan tâm đến byte đầu tiên, vì vậy bạn có thể bỏ phần còn lại của tệp nếu muốn. Các chương trình đầu ra 0
cho lossless, và 1
cho lossy. Hãy thử nó ở đây ! Đầu vào mặc định sử dụng tiêu đề FLAC.
Giải trình
Điều hay ho về các tập tin là (gần như) tất cả chúng đều có một thứ gọi là ma thuật. Đó là một vài byte đầu tiên của tập tin. Phần mềm tốt không kiểm tra phần mở rộng tệp, mà là ma thuật tệp để xem liệu nó có thể xử lý một tệp nhất định không.
Dennis đã tìm ra cách sử dụng phép thuật này để tìm loại nén, nhưng thực tế là anh ấy đã loại bỏ byte đầu tiên khiến tôi muốn thử đưa ra một phương thức sử dụng byte đầu tiên, thay vì thứ hai. Rốt cuộc, cộng đồng này là tất cả về việc lưu byte.
Đây là danh sách các byte đầu tiên của các loại tệp khác nhau. Tôi ra lệnh cho họ thành hai nhóm: mất mát và mất mát. Dưới đây là các giá trị của byte đầu tiên của chúng ở dạng thập phân, thập lục phân và nhị phân. Bạn có thể thấy một mô hình đã ...
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
Mẫu mà tôi thấy, là bit thứ hai (được tính từ trái sang phải) luôn bật trên các byte "lossless" và bit thứ năm luôn bị tắt. Sự kết hợp này không xuất hiện trong bất kỳ định dạng mất mát nào. Để "giải nén" điều này, chúng ta chỉ cần thực hiện một nhị phân AND (bằng 0b01001000 (=72)
) và sau đó so sánh với 0b01000000 (=64)
. Nếu cả hai đều bằng nhau, định dạng đầu vào là lossless, nếu không thì mất.
Đáng buồn thay, Cubix không có toán tử so sánh như vậy, vì vậy tôi đã sử dụng phép trừ (nếu kết quả là 64, kết quả này là 0 và kết quả là 8, -56 hoặc -64 nếu không tôi sẽ quay lại vấn đề này sau.
Đầu tiên, hãy bắt đầu từ đầu chương trình. AND nhị phân được thực hiện bằng a
lệnh:
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
Sau đó, chúng tôi so sánh với 64 bằng cách sử dụng phép trừ (lưu ý chúng tôi nhấn một gương phản chiếu IP lên mặt trên [dòng đầu tiên, ký tự thứ hai, chỉ về phía nam] ở giữa phần này).
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
Sau khi IP được quay xung quanh u
, chúng tôi sử dụng một số luồng điều khiển để đẩy a 1
đến ngăn xếp nếu (và chỉ khi) đỉnh của ngăn xếp khác không:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
Sau khi chúng tôi quấn quanh khối lập phương, chúng tôi nhấn vào <
hướng dẫn, điểm IP phía tây trên dòng thứ tư. Tất cả những gì còn lại phải làm là đầu ra và chấm dứt.
O@
O # Output top of the stack as number
@ # End program
Vì vậy, chương trình đầu ra 0
cho lossless, và 1
cho lossy.