বাইট গণনাটি আইএসও 8859-1 এনকোডিং ধরেছে।
+%`\B
¶$`:
1
এটি অনলাইন চেষ্টা করুন!
বিকল্প সমাধান:
+1`\B
:$`:
1
ব্যাখ্যা
এটি আমার পুরানো, কম গল্ফযুক্ত, সংস্করণ এবং তারপরে আমি কীভাবে এটি সংক্ষিপ্ত করেছিলাম তা দেখানোর ভিত্তিতে ব্যাখ্যা করা আরও সহজ হবে। আমি বাইনারিটিকে দশমিক দশকে রূপান্তরিত করতাম:
^
,
+`,(.)
$`$1,
1
রেটিনায় দশমিক সংখ্যা নির্মানের একমাত্র বুদ্ধিমান উপায় হল জিনিস গণনা করা (কারণ রেটিনার কয়েকটি বৈশিষ্ট্য রয়েছে যা এটি একটি পরিমাণের প্রতিনিধিত্ব করে দশমিক সংখ্যা প্রিন্ট করতে দেয়)। সুতরাং সত্যিই একমাত্র সম্ভাব্য পন্থা হ'ল বাইনারিটিকে আনারিতে রূপান্তর করা এবং তারপরে অ্যানারি অঙ্কের সংখ্যা গণনা করা। শেষ লাইন গণনা করে, তাই প্রথম চারটি বাইনারিকে অ্যানারিতে রূপান্তর করে।
আমরা যে কিভাবে করব? বিটগুলির তালিকা থেকে পূর্ণসংখ্যায় রূপান্তর করতে আমরা ফলাফলটি প্রাথমিকভাবে শুরু করি 0
এবং তারপরে বিটগুলি সর্বাধিক থেকে কম তাৎপর্যপূর্ণ থেকে চলে যাই, আমাদের ইতিমধ্যে যে মান রয়েছে তার দ্বিগুণ এবং বর্তমান বিটটি যুক্ত করব। যেমন যদি বাইনারি সংখ্যা হয় তবে 1011
আমরা সত্যিই গণনা করব:
(((0 * 2 + 1) * 2 + 0) * 2 + 1) * 2 + 1 = 11
^ ^ ^ ^
যেখানে আমি স্বচ্ছতার জন্য পৃথক বিট চিহ্নিত করেছি।
আনারিতে এটি করার কৌশলটি হ'ল) দ্বিগুণ করার অর্থ হল সংখ্যা এবং পুনরাবৃত্তি করা) যেহেতু আমরা 1
শেষের দিকে এস গণনা করছি , আমাদের প্রসেসে 0
এস এবং 1
এস এর মধ্যে পার্থক্য করারও দরকার নেই । এটি এক সেকেন্ডের মধ্যে আরও পরিষ্কার হয়ে যাবে।
প্রোগ্রামটি যা করে তা হ'ল এটি ইতিমধ্যে চিহ্নিতকরণ হিসাবে প্রথম দিকে কমা যোগ করে আমরা ইতিমধ্যে কতটা ইনপুট প্রক্রিয়া করেছি:
^
,
চিহ্নিতকারীটির বামে, আমরা যে মানটি সংগ্রহ করছি তা থাকবে (যা সঠিকভাবে শূন্যের অদ্বিতীয় উপস্থাপনায় শুরু করা হয়েছে), এবং মানটির ডান প্রসেসের পরবর্তী বিট হবে। এখন আমরা নীচের বিকল্পটি একটি লুপে প্রয়োগ করি:
,(.)
$`$1,
শুধু তাকান ,(.)
এবং $1,
, এটি প্রতিবারে মার্কারকে একটুখানি ডানে সরিয়ে দেয়। তবে আমরা সন্নিবেশও করি $`
যা চিহ্নিতকারীর সামনে সবকিছু, অর্থাৎ বর্তমান মান, যা আমরা দ্বিগুণ করছি। ইনপুট প্রক্রিয়াকরণের সময় স্বতন্ত্র পদক্ষেপগুলি এখানে দেওয়া হয়েছে 1011
, যেখানে আমি $`
প্রতিটি লাইনের উপরে সন্নিবেশ করার ফলাফল চিহ্নিত করেছি (এটি প্রথম ধাপের জন্য খালি):
,1011
1,011
_
110,11
___
1101101,1
_______
110110111011011,
আপনি দেখতে পাবেন যে আমরা অন্য সব কিছুর পাশাপাশি শূন্যকে ধরে রেখেছি এবং দ্বিগুণ করেছি, তবে আমরা যেহেতু শেষে এগুলিকে উপেক্ষা করছি তাই যতক্ষণ না আমরা তাদের দ্বিগুণ করেছি, ততক্ষণ যতক্ষণ না সেগুলির সংখ্যা 1
হবে সঠিক। আপনি যদি তাদের গণনা করেন, সেখানে আছেন11
মধ্যে , কেবল আমাদের প্রয়োজন।
সুতরাং এটি কিভাবে 12 বাইট ডাউন এ গল্ফ প্রশ্ন ছেড়ে দেয়। 18-বাইট সংস্করণের সবচেয়ে ব্যয়বহুল অংশটি চিহ্নিতকারী ব্যবহার করতে হচ্ছে। লক্ষ্যটি তা থেকে মুক্তি পাওয়া। আমরা সত্যই প্রতিটি বিটের উপসর্গ দ্বিগুণ করতে চাই, সুতরাং প্রথম ধারণাটি এটি হতে পারে:
.
$`$&
সমস্যাটি হ'ল এই বিকল্পগুলি একই সাথে ঘটে, তাই প্রথম বিট প্রতিটি বিটের জন্য দ্বিগুণ হয় না , তবে এটি প্রতিবার একবার অনুলিপি করে। ইনপুট জন্য 1011
আমরা পেতে (সন্নিবেশ চিহ্নিত চিহ্নিত $`
):
_ __ ___
1101011011
আমাদের এখনও ইনপুটটিকে পুনরাবৃত্তভাবে প্রক্রিয়া করতে হবে যাতে দ্বিগুণ প্রথম উপসর্গটি আবার দ্বিতীয় এবং দ্বিগুণ হয়ে যায়। একটি ধারণা হ'ল সর্বত্র চিহ্নিতকারী sertোকানো এবং বারবার উপসর্গের সাথে তাদের প্রতিস্থাপন করুন:
\B
,
+%`,
¶$`
প্রতিটি মার্কারকে প্রথমবারের সাথে উপসর্গের সাথে প্রতিস্থাপনের পরে, আমাদের ইনপুটটির শুরু কোথায় ছিল তা মনে রাখা দরকার, তাই আমরা পাশাপাশি লাইনফিডগুলি সন্নিবেশ করিয়েছি এবং %
পরবর্তীটি $`
কেবলমাত্র নিকটতম লাইনফিডে জিনিসগুলি তুলেছে তা নিশ্চিত করার জন্য বিকল্পটি ব্যবহার করি ।
এটি কাজ করে, তবে এটি এখনও অনেক দীর্ঘ (16 টি বাইট যখন 1
শেষে গণনা করা হয়)। কীভাবে আমরা জিনিসগুলি ঘুরিয়ে দেব? আমরা যে জায়গাগুলিতে চিহ্নিতকারী সন্নিবেশ করতে চাই সেগুলি সনাক্ত করে \B
(দুটি সংখ্যার মধ্যে একটি অবস্থান)। কেন আমরা কেবল সেই অবস্থানগুলিতে উপসর্গ সন্নিবেশ করি না? এটি প্রায় কাজ করে, তবে পার্থক্যটি হ'ল পূর্ববর্তী সমাধানে আমরা প্রতিটি প্রতিস্থাপনে একটি করে চিহ্নিতকারীকে সরিয়ে দিয়েছি, এবং প্রক্রিয়াটি শেষ করে দেওয়া গুরুত্বপূর্ণ। যাইহোক, \B
চরিত্রগুলি নয় তবে কেবল পজিশন, তাই কিছুই মুছে ফেলা হয় না। আমরা পারি তবে বন্ধ\B
পরিবর্তে এই জায়গায় একটি অ-অঙ্কের অক্ষর সন্নিবেশ করে মেলা থেকে। এটি শব্দহীন সীমানাকে শব্দের সীমানায় পরিণত করে, যা আগে চিহ্নিতকারী চরিত্রটি সরিয়ে দেওয়ার সমতুল্য। এবং এটিই 12-বাইট সমাধানটি করে:
+%`\B
¶$`:
কেবল সম্পূর্ণতার জন্য, এখানে 1011
প্রতিটি পদক্ষেপের পরে খালি লাইন সহ প্রক্রিয়াজাতকরণের পৃথক পদক্ষেপগুলি এখানে রয়েছে :
1
1:0
10:1
101:1
1
1:0
1
1:0:1
1
1:0
10:1:1
1
1:0
1
1:0:1
1
1:0
1
1:0:1:1
আবার, আপনি দেখতে পাবেন যে শেষ ফলাফলটি হ'ল 11 1
টি করে।
পাঠকের অনুশীলন হিসাবে, আপনি কি দেখতে পাচ্ছেন যে এটি অন্যান্য ঘাঁটিতে কীভাবে খুব সহজেই জেনারেল করে (বেসে ইনক্রিমেন্টে কিছু অতিরিক্ত বাইটের জন্য)?