অপঠনযোগ্য , 1830 1796 1791 1771 1762 1745 1736 1727 1726 16026 1577 বাইট
আউটপুটটি বিপরীত বর্ণানুক্রমিক ক্রমে ( zথেকে a) তবে আপনার বিধি অনুসারে যা অনুমোদিত বলে মনে হয়।
' "" "" "'" "" "" " '" "'" " '" ""' "" ' "" "" "" "" ""' "" "" "" ' "" "" " " '" "'" "" ' "" "" ""' "" " '" "" "" "" "" "'" "" " '" "" ""' "" "" "" ' " " '" "'" " '" ""' "" "" "" ' ""' "" ' "" "'" "" "" "" " '" "" "" ""' ""' ""' "" " '" "" ""' "" "" "" ' ""' "" ' ""' "" " '" "" "" "" "'" "" "" "" ' ""' "" ' ""' "" " '" "" "" "'" "" ' ""' "" "" "" " '" ""' "" "" "" "" " ' "" ' ""' "" ' "" "" "" "'" "" "" "" ' "" "'" "" "" "" "" ' ""' "" ' ""'"" "" "" ' "" "" "" "'" "" ' "" "" "" ""' "" "" "" " '" "" "" ""' "" " '" " "" "" " '" "" "" ""' "" ' "" "'" " '" "'" " '" "" "" ""' "" "" "" " '" "'" "" ' ""' "" "" "" " '" "" "" ""' "" ' "" "'" "" "" " '" "'" " '" "'" "" '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" " '" "" ""' "" "" "" ' ""' "" ' ""' "" " '" "" "" "" "'" "" "" "" ' ""' "" ' ""' "" " '" "" "'" "" " '"" "" "" "" " '" "" "" "" "'" "" "" " '" "'" "" ' ""' "" "" "" " '" "" "" " ' "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' ""' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' " " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" '"" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" " ' "" ' ""' "" ' "" "'" ' "" "" "" "'" "" ' "" "'" "" "" ' "" "" "" ""' "" "" "" ' "" "" "" ""' "" " '" "" "" ""' "" ' "" "'" "" " '" "" "" "'" "" ' """" "" ' ""' "" " '" ""' "" "" "" ' "" "" ""' "" ' ""' "" " '" "" "" "" "'" "" "" "" ' ""' "" ' "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' ""' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' " " '" "'" " '" "" ""' "" "" "" ' "" "" "" ""' "" " '" "" "" "" "'" "" "" "" ' "" "" "" ""' "" " '" "" "" "" ""' "" "" "" "" ' "" "" "" ""' "" "" """" ' "" "" "" ""' "" "" "" "" ' "" "" "" ""' "" "" "" "" ' "" "" "" ""' "" "" "" "" ' "" "" "" ""' "" "" "" " '" ""' "" "" "" ' "" "'" " '" "" "" ""' "" " '" "" "'" "" "" " '" "'" "" ' ""' "" "" "" " '" "'" "" ' "" "" ""' "" "'" "" ' "" "" "'" "" "" "" ' ""' "" ' "" "'" ' "" "" "" "'" "" "" "" " '" "" "" "'" " '" "'" "" ' ""' "" "" "" " '" "'" " '" """" ' ""' "" " '" "'" "" "" "" ' ""' "" ' "" """ ' ""' "" " '" "'" "" "" "" ' ""' "" ' "" "
ব্যাখ্যা
প্রথমে অপঠনযোগ্য যা করতে পারে তার একটি ধারণা পেতে, এটির প্রাথমিক ক্রিয়াকলাপটি এখানে:
- আপনার কাছে স্বেচ্ছাসেবী-আকারের পূর্ণসংখ্যার ঘরগুলির একটি অসীম টেপ রয়েছে
- আপনাকে যা না Brainfuck মত একটি মেমরি পয়েন্টার আছে; পরিবর্তে, আপনি টেপগুলিতে তাদের অবস্থান অনুসারে সেলগুলি ডিপ্রিফার করেন। এর অর্থ আপনি "মান # 4 পড়ুন" বা "পড়ার মান # (পড়ার মান # 4)" (ডাবল-অবচয়) করতে পারেন means
- আপনি কেবল মেমরি সেলগুলি পড়তে বা লিখতে পারেন (ব্রেনফকের মতো সরাসরি বৃদ্ধি / হ্রাস নয়)।
- আপনি একটি এক্সপ্রেশন মধ্যে মূল্যবৃদ্ধি / হ্রাস মান করতে পারেন। সুতরাং, একটি মেমরি সেল আপনি করতে হবে বাড়াতে পড়া , বৃদ্ধি , লিখতে , অথবা ভিন্নভাবে করা:
write(x, inc(read(x)))।
- কিছু লুপ এবং বার্ষিক শর্ত রয়েছে যা কেবল শূন্য বনাম শূন্যের জন্য পরীক্ষা করতে পারে।
এই প্রোগ্রামটি নিম্নলিখিতভাবে টেপ ব্যবহার করে। পরিবর্তনশীল নামগুলি পরে নীচের সিউডোকোডে ব্যবহৃত হবে। এছাড়াও, এই দস্তাবেজটির প্রথম সংস্করণ (যা 1830 বাইট ছিল); যেহেতু পরিবর্তিত হয়েছে তার নীচে সম্পাদনাগুলি দেখুন।
- সেল 0: পরিবর্তনশীল
q
- সেল 1: ভেরিয়েবল
a, p,ch
- সেল 2: ভেরিয়েবল
hash,v
- সেল 3: ভেরিয়েবল
b,r
- সেল 4: ভেরিয়েবল
aa,l
- দশমিক সংখ্যাগুলির স্ট্রিংয়ের "শেষ" চিহ্নিত করতে সেল 5: 0 থেকে যায়
- –-৯৯ ঘর: দশমিক অঙ্কের স্ট্রিংটি পিছনে সঞ্চয় করুন
- সেলগুলি 96–121: ব্যবহারকারীদের
a(96) থেকে z(121) (চিঠির ASCII কোড বিয়োগ করে এক) থেকে কেটে নেওয়া ভোটের সংখ্যা সংরক্ষণ করুন ।
- 4657–7380 ঘর: মনে রাখবেন যে কোন ভোটার / ভোটার সংমিশ্রণের মুখোমুখি হয়েছে কতবার। এই কক্ষগুলির কেবলমাত্র 4 টি সম্ভাব্য মান রয়েছে:
0= এখনও দেখা যায়নি, -1= একবারে দেখা হয়েছে, -2= দু'বার দেখা হয়েছে, -3= 2 এরও বেশি বার বহুবার দেখা গেছে।
অ্যালগরিদম মূলত নিম্নলিখিত হিসাবে এগিয়ে যায়:
- অক্ষর জোড় পড়া
aএবং রাখুন b। হ্যাশ মান গণনা করুন (a-2)*(a-1)+b-1, যা প্রতিটি letters z অক্ষরের সংমিশ্রনের জন্য অনন্য।
- সেই হ্যাশ মানটিতে মেমরি সেলটি পরীক্ষা করুন (
*hash)। যদি তা হয় -3তবে ব্যবহারকারী ইতিমধ্যে ভোট অপসারণের জন্য যোগ্য, তাই বর্ধিত *(b-1)। অন্যথায়, হ্রাস *hash। যদি এখন এটি হয় -3তবে ব্যবহারকারী তিনটি ঘটনার পরে সবেমাত্র ভোট অপসারণের জন্য যোগ্য হয়ে উঠেছে , সুতরাং এর মাধ্যমে বৃদ্ধি *(b-1)করা 3।
- এর পরে, বিপরীত ক্রমে অক্ষরে অক্ষরে যেতে (
zটু a) এবং যেগুলি কাটা ভোটের প্রয়োজন তা আউটপুট করুন। দশমিক অঙ্কগুলিতে সংখ্যাটি অনুবাদ করার জন্য এটি 10 দ্বারা ম্যানুয়াল পূর্ণসংখ্যা বিভাগের প্রয়োজন।
এই সমস্ত স্পষ্ট করেই, প্রোগ্রামটি সিউডোকোডের মতো দেখাচ্ছে:
// 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 কোষগুলি ব্যবহার না করে আমি দশমিক সংখ্যাগুলি theণাত্মক সংখ্যাযুক্ত কোষগুলিতে সঞ্চয় করি (–1 এর পরে)। একটি যুক্ত বোনাস হিসাবে, প্রোগ্রামটি আর 10⁹⁰ ভোটের মধ্যে সীমাবদ্ধ নয়!
সম্পাদনা করুন 3, 1791 → 1771: ফল নির্ধারণের পরিবর্তে *(ch = l + 95)করার v, আমি এখন এটা নির্ধারিত qএবং তারপর নিয়োগ সরাতে v = qযখন শর্ত অনুবাদ করে, এবং 1777 বাইট কোড গ্রহণ। তারপর অবস্থান অদলবদল qএবং vটেপ কারণ qএখন আর 1 বেশি দেখা যায় v।
4, 1771 71 1762 সম্পাদনা করুন: দুহ। hash0 এর পরিবর্তে 1-এ শুরু করা 9 বাইট কম হয়। হ্যাশ কোডটি এখন আরও 1 টি, এতে কিছু আসে যায় না।
5, 1762 → 1745 সম্পাদনা করুন: যদি আমি আরম্ভ করি qএবং r0 এর পরিবর্তে 1 এ, -1এটি সঠিক করার জন্য আমাকে কিছু গুলি ছিটিয়ে দিতে হবে, এবং এটি সমস্ত বাতিল হয়ে যায় বলে মনে হচ্ছে - while v { --v; [...] }লুপকে এখন আরও কিছু কম পুনরাবৃত্তি চালানো দরকার, যা আমি বলার দ্বারা করতে পারি while --v { [...] }, যা ২ characters টি অক্ষর ছোট।
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 সম্পাদনা করুন: আরও ক্রেজি ইনলাইনিং। লুপের প্রথমদিকে শরীরটি এখন এরকম কিছু দেখাচ্ছে:
// 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দু'টি লুপের সময় 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 ।