Cubix, 16 ไบต์
$-!u'HIa'@/1@O<
รูปแบบสุทธิ:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
ลองด้วยตัวคุณเอง
คุณควรป้อนค่าไบต์ไฟล์ทศนิยมในรายการแยกกัน ตัวคั่นไม่สำคัญสิ่งใดก็ตามที่ไม่ใช่ตัวเลขหรือเครื่องหมายลบเพียงพอ รหัสนี้ให้ความสำคัญกับไบต์แรกเท่านั้นดังนั้นคุณสามารถปล่อยส่วนที่เหลือของไฟล์ได้หากคุณต้องการ โปรแกรมแสดงผล0
เป็น lossless และ1
lossy ลองที่นี่ ! อินพุตเริ่มต้นใช้ส่วนหัว FLAC
คำอธิบาย
สิ่งที่ดีเกี่ยวกับไฟล์คือ (เกือบ) พวกเขาทั้งหมดมีเวทมนตร์ที่เรียกว่า นี่เป็นจำนวนไบต์แรกของไฟล์ ซอฟต์แวร์ที่ดีไม่ได้ตรวจสอบนามสกุลไฟล์ แต่ควรใช้ความมหัศจรรย์ของไฟล์เพื่อดูว่าสามารถจัดการไฟล์บางไฟล์ได้หรือไม่
เดนนิสพบวิธีที่จะใช้เวทย์มนตร์นี้เพื่อค้นหาประเภทการบีบอัด แต่ความจริงที่ว่าเขาละทิ้งไบต์แรกทำให้ฉันต้องการลองใช้วิธีที่ใช้ไบต์แรกแทนที่จะเป็นวินาที ท้ายที่สุดชุมชนนี้เป็นเรื่องเกี่ยวกับการบันทึกไบต์
นี่คือรายการไบต์แรกของไฟล์ประเภทต่างๆ ฉันสั่งให้พวกเขาออกเป็นสองกลุ่ม: การสูญเสียและการสูญเสีย นี่คือค่าของไบต์แรกของพวกเขาในทศนิยมฐานสิบหกและไบนารี คุณอาจเห็นรูปแบบแล้ว ...
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
รูปแบบที่ฉันเห็นคือบิตที่สอง (นับจากซ้ายไปขวา) เปิดอยู่บนไบต์ "lossless" เสมอและบิตที่ห้าถูกปิดเสมอ ชุดนี้ไม่ปรากฏในรูปแบบที่สูญเสียใด ๆ ถึง "สารสกัดจาก" นี้เราก็จะทำไบนารีและ (โดย0b01001000 (=72)
) 0b01000000 (=64)
แล้วเปรียบเทียบกับ หากทั้งสองเท่ากันรูปแบบการป้อนข้อมูลจะไม่มีความสูญเสีย
น่าเสียดายที่ Cubix ไม่มีตัวดำเนินการเปรียบเทียบดังนั้นฉันจึงใช้การลบ (ถ้าผลลัพธ์คือ 64 นี่ให้ผลเป็น 0 และมันให้ผลลัพธ์เป็น 8, -56 หรือ -64 เป็นอย่างอื่นฉันจะกลับไปหาสิ่งนี้ในภายหลัง
ก่อนอื่นเรามาเริ่มที่จุดเริ่มต้นของโปรแกรมกันก่อน ไบนารีและเสร็จสิ้นโดยใช้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
ไปยัง stack หาก (และเฉพาะในกรณี) ด้านบนสุดของ stack ไม่เป็นศูนย์:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
หลังจากที่เราล้อมรอบลูกบาศก์เรากด<
คำแนะนำซึ่งชี้ IP ตะวันตกบนบรรทัดที่สี่ สิ่งที่เหลืออยู่ที่ต้องทำคือเอาท์พุทและยุติ
O@
O # Output top of the stack as number
@ # End program
ดังนั้นโปรแกรมจะแสดงผล0
เป็น lossless และ1
สำหรับ lossy