अपठनीय , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 बाइट्स
आउटपुट रिवर्स अल्फाबेटिकल ऑर्डर ( z
से a
) में है लेकिन आपके नियमों के अनुसार जो अनुमन्य प्रतीत होता है।
' "" "" "'" "" "" " '" "'" " '" ""' "" ' "" "" "" "" "" "" "" ""' "" "" " " '" "'" "" ' "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" ' " " '" "'" " '" ""' "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "" ""' ""' "" "" "" "" "" "" "" ' ""' "" ' ""' "" " '" "" "" "" "" "" "" "" ' ""' "" ' ""' "" " '" "" "" "" ""' "" ' "" "" "" "" ""' "" "" "" "" " ' "" ' ""' "" ' "" "" "" "" "" "" "" "" "'" "" "" "" "" ' ""' "" ' ""'"" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "'" " "" "" " '" "" "" ""' "" ' "" "" "'" " '" "'" "" "" "" "" "" "" "" " '" "" ' ""' "" "" "" "" "" "" "" ' ""' "" "" "" "" " '" "'" " '" "'" "" '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" " '" "" ""' "" "" "" ' ""' "" ' ""' "" "" "" "" "" "" "" "" "" "" ' ""' "" ' "" "'" "" "" "" " '"" "" "" "" " '" "" "" "" "" "" "" "'" " '" ""' "" ' "" "" "" "" "" "" " ' "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' ""' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' " " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" '"" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" " ' "" ' ""' "" ' "" "'" ' "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "'" "" "" "" "" ' "" "'" "" "" "" "" " '" ""' """" "" "" ' "" "'" "" "" "" "" ' "" "" ""' "" ' ""' "" " '" "" "" "" "'" "" "" "" "" ' ""' "" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' ""' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' " " '" "'" " '" "" "" "" "" ""' "" "" "" "" "" " '" "" "" "" "" "" "" "" ' "" "" "" "" "" "'" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "'" " '" "" "" ""' "" "" "" "" "" "" " '" "'" "" ' ""' "" "" "" "" " '" ""' "" "" ""' "" "" ""' "" "" " '" "" "" "" ""' "" ' "" "'" ' "" "" "" "" "" "" "" " '" "" "" "'" " '" "'" "" ' ""' "" "" "" "" " '" "'" """" ' ""' "" "" " '" "" "" ""' "" ' ""' "" """ ' ""' "" "" " '" "" "" ""' "" ' ""' "" "
व्याख्या
सबसे पहले, यह जानने के लिए कि अपठनीय क्या कर सकता है, यहां इसका मूल ऑपरेशन है:
- आपके पास मनमाने आकार के पूर्णांक कोशिकाओं का एक अनंत टेप है
- आपके पास ब्रेनफक में मेमोरी पॉइंटर नहीं है; इसके बजाय, आप टेप पर उनके स्थान से कोशिकाओं को हटाते हैं। इसका मतलब है कि आप "मूल्य # 4 पढ़ सकते हैं" या "पढ़ा मूल्य # (मूल्य # 4 पढ़ें)" (दोहरा-प्रसार)।
- आप केवल मेमोरी सेल्स को पढ़ या लिख सकते हैं (ब्रेनफक की तरह सीधे इन्क्रीमेंट / डिक्रीमेंट नहीं)।
- आप एक अभिव्यक्ति के भीतर मूल्य वृद्धि / वृद्धि कर सकते हैं। इस प्रकार, एक मेमोरी सेल को बढ़ाने के लिए आपको पढ़ना , वेतन वृद्धि , लिखना या अलग-अलग रखना होगा
write(x, inc(read(x)))
:।
- जबकि लूप और टर्नरी स्थितियां हैं जो केवल शून्य बनाम गैर-शून्य की जांच कर सकते हैं।
यह प्रोग्राम निम्नानुसार टेप का उपयोग करता है। चर नामों का उपयोग नीचे बाद में छद्मकोड में किया जाएगा। इसके अलावा, यह पहला संस्करण दस्तावेज था (जो 1830 बाइट्स था); नीचे से जो बदलाव हुआ है उसके लिए संपादन देखें।
- सेल 0: परिवर्तनशील
q
- सेल 1: चर
a
, p
,ch
- सेल 2: चर
hash
,v
- सेल 3: चर
b
,r
- सेल 4: चर
aa
,l
- सेल 5: दशमलव अंकों की स्ट्रिंग के "अंत" को चिह्नित करने के लिए 0 रहता है
- कक्ष 6–95: दशमलव अंकों की स्ट्रिंग को पीछे की ओर संग्रहीत करें
- कक्ष 96-121: उपयोगकर्ताओं
a
(96) से z
(121) (पत्र का ASCII कोड माइनस एक) से काटे जाने वाले वोटों की संख्या को संग्रहीत करें ।
- सेल 4657–7380: याद रखें कि कितनी बार मतदाता / मतदाता संयोजन का सामना किया गया है। इन कोशिकाओं के केवल 4 संभावित मान हैं:
0
= अभी तक नहीं देखा गया, -1
= एक बार -2
देखा गया, -3
= दो बार देखा गया, = किसी भी संख्या को 2 से अधिक बार देखा गया।
एल्गोरिथ्म अनिवार्य रूप से निम्नानुसार आगे बढ़ता है:
- पात्रों में से जोड़े पढ़ते रहें
a
और b
। हैश मान की गणना करें (a-2)*(a-1)+b-1
, जो अक्षरों के प्रत्येक संयोजन के लिए अद्वितीय है — ए-जेड।
- उस हैश मान (
*hash
) पर मेमोरी सेल की जाँच करें । यदि यह है -3
, तो उपयोगकर्ता पहले से ही वोट हटाने के लिए योग्य है, इसलिए वेतन वृद्धि *(b-1)
। अन्यथा, क्षय *hash
। यदि यह है अब -3
, उपयोगकर्ता बस गया है बन तीन आवृत्तियों के बाद वोट निकाले जाने के योग्य है, तो बढ़ा देते *(b-1)
द्वारा 3
।
- इस के बाद, वर्ण उलटे क्रम में (के माध्यम से जाने
z
के लिए a
) और आउटपुट जो कि कटौती की वोट की जरूरत है। यह संख्या को दशमलव अंकों में अनुवाद करने के लिए मैन्युअल पूर्णांक विभाजन की आवश्यकता है।
यह सब स्पष्ट होने के साथ, यह वह प्रोग्राम है जो स्यूडोकोड जैसा दिखता है:
// Read pairs of characters
while (a = read) + 1 {
b = read
// Calculate hash = (a-1)*(a-2)/2 + b-1
// This also sets a = b-1
hash = 0
while --a {
aa = a
while --aa {
++hash
}
}
while --b {
++a
++hash
}
// If this combination has just been seen for the third time,
// increment *a by 3; if more than third time, increment *a by 1
*a = (*hash + 3) ? ((--*hash) + 3 ? *a : (*a+3)) : (*a+1)
}
// Loop through the characters z to a
l = 27
while --l { // l loops from 26 to 1 (not 0)
(v = *(ch = l + 95)) ? { // 'a' is ASCII 97, but cell 96
print (ch+1) // print the votee
// Now we need to turn the number v into decimal.
// p points to where we are storing decimal digits.
p = 5
while v {
// Integer division by 10 (q=quotient, r=remainder)
r = (q = 0)
while v {
--v
(++r - 10) ? 1 : {
r = 0
++q
}
}
// Store digit ASCII character
*(++p) = r + 48 // 48 = '0'
v = q
}
// Now output all the digit ASCII characters in reverse order
while *p {
print *(--p + 1)
}
} : 1
}
संपादित करें 1, 1830 → 1796: एहसास हुआ कि मैं एक स्थान पर थोड़ी देर के लूप के रिटर्न मूल्य का फिर से उपयोग कर सकता हूं।
संपादित करें 2, 1796 → 1791: यदि प्रोग्राम 6–95 की कोशिकाओं का उपयोग करने के बजाए प्रोग्राम को थोड़ा छोटा कर देता है, तो मैं दशमलव अंकों को ऋणात्मक संख्या वाली कोशिकाओं (-1 बाद) में संग्रहीत करता हूं। अतिरिक्त बोनस के रूप में, कार्यक्रम अब 10! वोटों तक सीमित नहीं है!
संपादित 3, 1791 → 1771: के परिणाम बताए के बजाय *(ch = l + 95)
करने के लिए v
, मैं अब यह करने के लिए आवंटित q
और फिर काम के लिए कदम v = q
है, जबकि हालत में, 1777 बाइट्स कोड लेने। फिर टेप पर q
और उसके स्थान को स्वैप करें v
क्योंकि q
अब 1 से अधिक सामान्य है v
।
संपादित करें 4, 1771 → 1762: दुह। hash
0 के बजाय 1 से प्रारंभ करना 9 बाइट्स छोटा है। हैश कोड अब 1 और है, जो मायने नहीं रखता है।
संपादित करें 5, 1762 → 1745: अगर मैं इनिशियलाइज़ करता हूं q
और r
0 के बजाय 1, मुझे -1
इसे सही करने के लिए कुछ स्थानों में छिड़कना है , और यह सब रद्द करना प्रतीत होता है - सिवाय इसके कि while v { --v; [...] }
लूप को अब एक कम पुनरावृत्ति निष्पादित करने की आवश्यकता है, जो मैं कहकर कर सकता हूं while --v { [...] }
, जो कि 26 अक्षर छोटा है।
संपादित करें 6, 1745 → 1736: इसके बजाय { r = 1; ++q }
, हम लिख सकते हैं q = *((r = 1)+1)+1
। यह इस तथ्य पर निर्भर करता है कि q
चर स्लॉट # 2 में है। यदि यह स्लॉट # 1 में होता तो यह और भी छोटा होता, लेकिन तब पूरा कार्यक्रम समग्र रूप से लंबा होता।
संपादित करें 7, 1745 → 1727: संपादित किया गया 6 संपादित करें और इसके बजाय उस अंतर को कम करते हुए बचत प्राप्त की, जो कि उस अभिव्यक्ति में लूप हो जो अंक ASCII कोड की गणना करता है, जो 1736 बाइट्स पर भी समाप्त होता है ... लेकिन फिर एक डिक्रीमेंट निर्देश (9 बाइट्स) बचाया ) बदलकर ((++r) - 11) ? r :
करने के लिए (r - 10) ? ++r :
।
संपादित करें 8, 1727 → 1626: हैश गणना की गई। यह अब लूप करते समय एक कम का उपयोग करता है। सेल स्थान अब उनके वास्तविक ASCII कोड पर हैं (1 से बंद नहीं)। टेप पर विभिन्न स्थानों पर फेरबदल चर क्योंकि वे अब अलग आवृत्ति के साथ होते हैं।
9 संपादित करें, 1626 → 1606: अधिक पागल inlining। पहले जबकि लूप का शरीर अब कुछ इस तरह दिखता है:
// b = next char
*(b = (hash = read)) = {
// hash = b + (a-1)*(a-2)/2
while (a2 = --a) {
while --a2 {
++hash
}
}
// If this combination has just been seen for the third time,
// increment *b by 3; if more than third time, increment *b by 1
(*hash + 3) ? ((--*hash) + 3 ? *b : (*b+3)) : (*b+1)
}
और चर असाइनमेंट अब लगभग पूरी तरह से बदल गया है।
10 संपादित करें, 1606 → 1577: मुझे लगता है कि मनाया a
और a2
दोनों while लूप में 0 को कम कर रहे हैं, इसलिए यदि मैं जोड़ी सकता है p
उन दोनों में से किसी के साथ है, लेकिन नहीं के साथ ch
, मैं प्रारंभ करने की जरूरत नहीं होगी p
करने के लिए 0
(जो 29 बाइट्स लागत)। मैं स्वैप करके ऐसा कर सकते हैं पता चला है p
और r
। अब नवीनतम परिवर्तनशील वर्गीकरण (और कोड में उनके होने की आवृत्ति) हैं:
0 = v (3) (total 3)
1 = hash (6), r (5), ch (2) (total 13)
2 = b (4), q (5) (total 9)
3 = a (3), p (5) (total 8)
4 = a2 (3), l (4) (total 7)
nanananananananabatman
टेस्ट केस के लिए +1 ।