क्यूबिक्स, 16 बाइट्स
$-!u'HIa'@/1@O<
नेट फॉर्म:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
इसे स्वयं आज़माएं
आपको एक अलग सूची में फ़ाइल दशमलव बाइट मान इनपुट करना चाहिए। विभाजक कोई फर्क नहीं पड़ता, कुछ भी जो एक अंक या शून्य साइन नहीं है। कोड वास्तव में केवल पहले बाइट के बारे में परवाह करता है, इसलिए यदि आप चाहें तो आप बाकी फ़ाइल को छोड़ सकते हैं। कार्यक्रम 0
दोषरहित, और 1
हानिपूर्ण के लिए आउटपुट करता है । इसे यहाँ आज़माएँ ! डिफ़ॉल्ट इनपुट एक 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
मैंने जो पैटर्न देखा, वह यह था कि दूसरा बिट (बाएं से दाएं की गिनती) हमेशा "दोषरहित" बाइट्स पर था और पांचवां बिट हमेशा बंद था। यह संयोजन किसी भी हानिपूर्ण प्रारूप में दिखाई नहीं देता है। इसे "निकालने" के लिए, हम बस एक बाइनरी और (बाय 0b01001000 (=72)
) करेंगे और फिर तुलना करेंगे 0b01000000 (=64)
। यदि दोनों समान हैं, तो इनपुट प्रारूप दोषरहित है, अन्यथा यह हानिपूर्ण है।
अफसोस की बात यह है कि क्यूबिक्स के पास ऐसा कोई तुलनात्मक ऑपरेटर नहीं है, इसलिए मैंने घटाव का उपयोग किया (यदि परिणाम 64 है, तो यह 0 देता है, और इसका परिणाम 8 होता है, -56 या -64 अन्यथा। मैं इसके बाद वापस मिलूंगा।
सबसे पहले, चलो कार्यक्रम की शुरुआत में शुरू करते हैं। बाइनरी और a
कमांड का उपयोग किया जाता है :
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
फिर, हम घटाव का उपयोग करके 64 की तुलना करते हैं (ध्यान दें कि हम एक दर्पण को हिट करते हैं जो इस भाग के मध्य में आईपी को शीर्ष चेहरे [पहली पंक्ति, दूसरा चरित्र, दक्षिण की ओर इशारा करता है) को दर्शाता है)।
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
IP द्वारा चालू किए जाने के बाद u
, हम 1
स्टैक को पुश करने के लिए कुछ नियंत्रण प्रवाह का उपयोग करते हैं यदि (और केवल यदि) तो स्टैक का शीर्ष गैर-शून्य है:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
क्यूब के चारों ओर लपेटने के बाद, हमने <
निर्देश को मारा , जो आईपी लाइन को चौथी पंक्ति पर इंगित करता है। वह सब जो करना बाकी है वह आउटपुट और समाप्त है।
O@
O # Output top of the stack as number
@ # End program
तो, कार्यक्रम 0
दोषरहित, और 1
हानिपूर्ण के लिए आउटपुट करता है ।