bash + iconv + DosBox / x86 मशीन कोड (104 97 96 95 अक्षर)
echo ↾각슈삨₲ɻ庲錿ʴ⇍罋곹삄ૃ蘊尧⺓⺂粘ㄾ㸸ਾ岈⺎➉⸠粓蜊㹏褾鄮漧粐蠊蝜⾈葜⾇⼠⺂ꤧ樠獧惇|iconv -futf8 -tucs2>o.com;dosbox o*
मैं इसे एक स्क्रिप्ट में एक खाली निर्देशिका में रखने का सुझाव देता हूं, यह लगभग गारंटी है कि इसे एक टर्मिनल में कॉपी-पेस्ट करने से सब कुछ टूट जाएगा; और भी बेहतर, आप यहाँ स्क्रिप्ट को तैयार कर सकते हैं ।
अपेक्षित उत्पादन:
यह काम किस प्रकार करता है
बैश भाग सिर्फ एक लांचर है जो स्क्रिप्ट के UTF-8 वर्णों से iconv
एक .com
फ़ाइल को "डिकम्प्रेस" करने के लिए उपयोग करता है और इसे DosBox के साथ लॉन्च करता है।
ध्यान दें कि इससे सामग्री पर कुछ सीमा हो जाती है, क्योंकि सभी इनपुट अनुक्रमों को यूसीएस -2 के रूप में व्याख्या iconv
नहीं की जा सकती है; उदाहरण के लिए, किसी कारण से bx
रजिस्टर से जुड़े कई ऑपरेशनों ने उस जगह के आधार पर तबाही मचाई, जहां मैंने उनका उपयोग किया था, इसलिए मुझे कई बार इस समस्या के आसपास काम करना पड़ा।
अब, यूनिकोड चीज़ केवल "वर्ण गणना" नियमों का लाभ उठाने के लिए है; स्क्रिप्ट का वास्तविक आकार (बाइट्स में) मूल .COM
फ़ाइल से बड़ा है ।
निकाली गई .com
फ़ाइल है
00000000 be 21 01 ac 88 c2 a8 c0 7d 0a b2 20 7b 02 b2 5e |.!......}.. {..^|
00000010 83 e0 3f 93 b4 02 cd 21 4b 7f f9 ac 84 c0 75 e4 |..?....!K.....u.|
00000020 c3 0a 0a 86 27 5c 93 2e 82 2e 98 7c 3e 31 38 3e |....'\.....|>18>|
00000030 3e 0a 88 5c 8e 2e 89 27 20 2e 93 7c 0a 87 4f 3e |>..\...' ..|..O>|
00000040 3e 89 2e 91 27 6f 90 7c 0a 88 5c 87 2e a6 7c 0a |>...'o.|..\...|.|
00000050 88 2f 5c 84 2e a8 7c 0a 87 2f 20 2f 82 2e 27 a9 |./\...|../ /..'.|
00000060 7c 0a 20 6a 67 73 c7 60 f3 0a 0a 00 ||. jgs.`....|
0000006c
और 108 बाइट्स लंबी है। इसके लिए NASM स्रोत है:
org 100h
start:
; si: pointer to current position in data
mov si,data
; load the character in al
lodsb
mainloop:
; bx: repetition count
; - zero at startup
; - -1 after each RLE run
; - one less than each iteration after each "literal" run
; the constant decrement is not really a problem, as print
; always does at least one print, and there aren't enough
; consecutive literal values to have wraparound
; if the high bit is not set, we have a "literal" byte;
; we prepare it in dl just in case
mov dl,al
; then check if it's not set and branch straight to print
; notice that bx=0 is fine, as print prints always at least one character
; test the top two bits (we need the 6th bit below)
test al,0xc0
; to see if the top bit was set, we interpret it as the sign bit,
; and branch if the number is positive or zero (top bit not set)
jge print
rle:
; it wasn't a literal, but a caret/space with a repetition count
; space if 6th bit not set, caret otherwise
mov dl,' '
; exploit the parity bit to see if the 6th bit was set
jnp nocaret
mov dl,'^'
nocaret:
; lower 6 bits: repetition count
; and away the top bits and move in bx
; we and ax and not al because we have to get rid of the 02h in ah
and ax,3fh
xchg ax,bx
print:
; print bx times
mov ah,2
int 21h
dec bx
jg print
; read next character
lodsb
test al,al
; rinse & repeat unless we got a zero
jnz mainloop
end:
ret
data:
; here be data
incbin "compressed.dat"
; NUL terminator
db 0
यह सब केवल एक डिकम्प्रेसर है compressed.dat
जिसका प्रारूप इस प्रकार है:
- यदि उच्च बिट सेट नहीं है, तो चरित्र को इस रूप में प्रिंट करें;
- अन्यथा, कम 6 बिट्स की पुनरावृत्ति गणना होती है, और दूसरी सबसे ऊंची बिट निर्दिष्ट करती है यदि इसे एक स्थान (बिट सेट नहीं) या एक कैरेट (बिट सेट) प्रिंट करना है।
compressed.dat
बदले में मूल पाठ से पायथन लिपि का उपयोग करके उत्पन्न किया जाता है ।
पूरी चीज यहां मिल सकती है ।