জাভাস্ক্রিপ্ট (ES7), 121 117 বাইট
x=>(a=b=0,[for(c of x)for(d of'1234')(e=c.charCodeAt()/26|0)==d?a^=1<<d:b^=(a>>d&1)<<d*4+e],f=y=>y&&y%2+f(y>>1))(b)/2
কি দারুন. ঐটা মজা ছিল. যখন এই চ্যালেঞ্জটি প্রথম প্রকাশিত হয়েছিল তখন আমি একটি উত্তর ধারণাটি লিখেছিলাম, তবে এটি 150 বাইটের বেশি ছিল এবং আমি এটি গল্ফ করার চেষ্টা করতে চাইনি। আমি গতকাল আমার নোটবুকে এই ধারণাটি ছড়িয়ে দিয়েছি এবং সিদ্ধান্ত নিয়েছি যে আমি এটি পুরোপুরি গল্ফ না করা পর্যন্ত আমি এ সম্পর্কে চিন্তাভাবনা বন্ধ করব না। আমি দুটি সম্পূর্ণ নতুন অ্যালগরিদম লিখেছিলাম, যার মধ্যে প্রথমটি প্রায় 25 বাইট টন বিট-হ্যাকিংয়ের সাথে গল্ফ করার পরে বেশ কয়েকটি বাইট সংক্ষিপ্ত হয়েছিল।
কিভাবে এটা কাজ করে
আমরা প্রথমে ভেরিয়েবল সেট a
এবং b
করতে 0
। a
একটি 4-বিট বাইনারি অ্যারে যা বন্ধন জোড়া বর্তমানে আমরা ভিতরে রয়েছি এবংb
এটি একটি 16-বিট বাইনারি অ্যারে যার বন্ধনী জোড়া এক সাথে যুক্ত linked
এর পরে, প্রতিটি অক্ষর মাধ্যমে আমরা লুপ c
মধ্যে x
, এবং প্রতিটি গৃহস্থালির কাজ d
মধ্যে '0123'
। প্রথমে আমরা নির্ধারণ করি কী ধরণের বন্ধনী c
রয়েছে e=c.charCodeAt()/26-1|0
। প্রতিটি বন্ধনী ধরণের দশমিক চর কোডগুলি নিম্নরূপ:
() => 40,41
<> => 60,62
[] => 91,93
{} => 123,125
26 কে ভাগ করে 1 টি বিয়োগ করে এবং মেঝে দিয়ে আমরা যথাক্রমে 0, 1, 2 এবং 3 এ ম্যাপ করি।
পরবর্তী আমরা পরীক্ষা করে দেখি যে এই সংখ্যাটি বর্তমান মানের সমান কিনা d
। যদি এটি হয় তবে আমরা হয় d
বন্ধনী প্রকারটি প্রবেশ করানো বা প্রস্থান করছি , সুতরাং আমরা d
এর a
সাথে বিটটি ফ্লিপ করব a^=1<<d
। যদি তা না, কিন্তু আমরা হয় ভিতরে d
তম বন্ধনী টাইপ, আমরা টুসকি প্রয়োজন e
ম বিট d
এর ম 4-বিট অধ্যায় b
। এটি এভাবে করা হয়:
b^=(a>>d&1)<<d*4+e
(a>>d&1)
d
মধ্যে বিট ফিরে a
। আমরা যদি d
বন্ধনী ধরণের ভিতরে থাকি তবে এটি 1 প্রদান করে; অন্যথায়, এটি 0. ফিরে আসে, এর পরে, আমরা d*4+e
বিট দ্বারা এই বাম স্থানান্তরিত করব , এবং b
ফলস্বরূপ XOR । আমরা যদি d
বন্ধনী প্রকারের ভিতরে থাকি তবে এই এক্সওআর এর d*4+e
বিট b
; অন্যথায়, এটি কিছুই করে না।
সমস্ত লুপিংয়ের শেষে, b
পছন্দসই রিটার্ন মানের দ্বিগুণ সমান 1-বিট সংযুক্ত থাকবে। তবে আমাদের এখনও এটি নির্ধারণ করতে হবে যে এটি কতগুলি বিট। সাব-ফাংশনটি এখানে f
আসে:
f=y=>y&&y%2+f(y>>1)
যদি y
0, এই কেবল ফেরৎ 0. অন্যথায়, এটি শেষ বিট লাগে y
সঙ্গে y%2
, তারপর সব কিন্তু শেষ প্রান্তে চলমান ফলাফলের যোগ y
ফাংশন মাধ্যমে আবার। উদাহরণ স্বরূপ:
f(y) => y && y%2 + f(y>>1)
f(0b1001101) => 1 + f(0b100110) = 4
f(0b100110) => 0 + f(0b10011) = 3
f(0b10011) => 1 + f(0b1001) = 3
f(0b1001) => 1 + f(0b100) = 2
f(0b100) => 0 + f(0b10) = 1
f(0b10) => 0 + f(0b1) = 1
f(0b1) => 1 + f(0b0) = 1
f(0b0) => 0 = 0
আমরা b
এই ফাংশনটি দিয়ে চলি এবং ফলাফলটিকে 2 দ্বারা ভাগ করি এবং আমাদের উত্তর আছে।