আরও ভাল 'ফাংশন' সংজ্ঞা ব্যবহার করে 19 বাইট সংরক্ষণ করা হয়েছে
আমি বলতাম এটি কেবলমাত্র রেগেক্স ভাষার জন্যই বেশ ভাল।
বেস লিব ইউনারি এবং দশমিকের মধ্যে রূপান্তর করার অনুমতি দেয় (যা চ্যালেঞ্জটি স্পষ্টভাবে দশমিককে বর্ণিত হিসাবে প্রয়োজন), তবে বাইনারি সমর্থন করে না; সুতরাং আমি এটি লিখতে হয়েছিল স্ক্রিপ্টের অংশ হিসাবে এটিতে 120 বাইট যুক্ত করা উচিত।
#import base
b(\d*):(_*)\2_b/b1$1:$2b/b(\d*):(_+)\2b/b0$1:$2b/b(\d+):b/$1/b:b/0/B(_*):1/B$1$1_:/B(_*):0/B$1$1:/B(_*):B/$1/j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/j(\d*),\1\d{0,7}:,?(.*)/,$2,/,((_+)_+),(\2),/,$1,/,(_+),(\1_*),/,$2,/^,(_*),$/d<$1>/j,b:u<(?#input)>b:
এটি অনলাইন চেষ্টা করুন!
স্বতন্ত্র রেজেক্সেস দ্বারা।
#import base
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
^,(_*),$/d<$1>/
j,b:u<(?#input)>b:
ধাপ
প্রথমত, আমরা 'বেস' লাইব্রেরিটি আমদানি করি যা দুটি রেগেক্স দেয়। এক যা u<numbers>
একাকারে রূপান্তরিত হয়। এবং এক রূপান্তরিত যাd<unary_underlines>
দশমিক হয়। এটি কারণ, চ্যালেঞ্জটির বেস 10 এ আইও প্রয়োজন।
তারপরে আমরা কয়েকটি মুষ্টিমেজাজকে সংজ্ঞায়িত করি যা ইউনারিকে বাইনারি রূপান্তর করে।
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
এর মধ্যে প্রথমটি b(\d*):(_*)\2_b/b1$1:$2b/
অনুসন্ধান করে b
, বিকল্পভাবে কিছু বাইনারি অঙ্কগুলি অনুসরণ করা হয়, তারপরে একটি :
, তারপরে যে কোনও পরিমাণ আন্ডারলাইন থাকে, তারপরে ঠিক একই পরিমাণে আন্ডারলাইন প্লাস একের শেষে এবং অন্যটি হয় b
।
এরপরে আমরা এরপরে b1
আগে থেকে বাইনারি অঙ্কগুলি :
এবং আন্ডারস্কোরগুলির প্রথমার্ধে এবং শেষ পর্যন্ত শেষ করে প্রতিস্থাপন করবb
।
সুতরাং এইটি পরীক্ষা করে যদি অ্যানারি দুটি দ্বারা বিভাজ্য না হয় এবং যদি তাই হয় তবে এটি 1 টি বাইনারি অঙ্কগুলিতে প্রেন্ডেন্ড করে, তারপর একে বিয়োগকে দুটি দ্বারা বিভক্ত করে।
দ্বিতীয়টিটি b(\d*):(_+)\2b/b0$1:$2b/
প্রায় আদর্শিক, তবে অতিরিক্তের জন্য _
এটি যাচাই করে না , এর অর্থ এটি দুটি দ্বারা বিভাজ্য হলে কেবল এটি মেলে এবং এই ক্ষেত্রে 0
তার পরিবর্তে প্রিপেন্ড করে।
তৃতীয়টি চেক করে যদি আমরা অ্যানারি ডিজিটের বাইরে না থাকি এবং যদি তাই হয় তবে কেবল বাইনারি অঙ্কগুলি ছেড়ে যাওয়ার জন্য প্যাডিংটি সরিয়ে ফেলে।
গত এক চেক যদি সেখানে ছিল না কোনো বাইনারি ডিজিট সরবরাহকৃত, এবং যে ক্ষেত্রে শুধু পাতার মধ্যে 0
।
আমরা সংজ্ঞায়িত রেগেক্সেসের পরবর্তী গ্রুপটি হ'ল বাইনারিটিকে ইউনারিতে রূপান্তর করা, এবং কিছুটা সহজ।
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
এই গোষ্ঠীর প্রথমটি, একে একে এর বিরোধীতার B(_*):1/B$1$1_:/
মতো, একটি সনাক্ত করে এবং B
তারপরে যেকোন পরিমাণ ইউনারি ডিজিটের পরে :1
। এটি B
এই ক্ষেত্রে ম্যাচের জন্য যাচাই করে না , কারণ এটি একবারে কেবল একটি সংখ্যার জন্য অনুসন্ধান করে। এটি যদি মিলে যায় তবে এটি আগের মিলিত পরিমাণটি ইউনারি অঙ্কের দ্বিগুণ করে এবং একটি যোগ করে, তারপরে একটিটি সরিয়ে দেয়।
দ্বিতীয়টি, B(_*):0/B$1$1:/
প্রথমটির তুলনায় প্রায় আদর্শবাদী, ব্যতীত এটির 0
পরিবর্তে মেলে 1
এবং একটি অতিরিক্ত অখণ্ড অঙ্কটি যোগ করে না।
এর মধ্যে সর্বশেষ,, B(_*):B/$1/
যদি বাইনারি সংখ্যার বেশি না থাকে এবং তা যদি অ্যানারিটিকে আবদ্ধ করে তা পরীক্ষা করে। এটির বিরোধী থেকে পৃথক, এর জন্য বিশেষ 0 কেসের দরকার নেই।
পরবর্তী আমরা j
রেজেক্সেস সংজ্ঞায়িত করি, যা বিভাজন ফাংশন হিসাবে কাজ করে।
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
প্রথমটি, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
বেশিরভাগ ভারী উত্তোলন করে। এটি অনুসন্ধান করে j
, বিকল্পভাবে বাইনারি অঙ্কগুলি অনুসরণ করে যা "ইনক্রিমেন্টার", তারপরে একটি কমা যার পরে বর্ধনকারী হয় ঠিক তখন 8 বাইনারি অঙ্কগুলি পরে বাকী বাইনারি সংখ্যাটি অনুসরণ করে, তারপর ক :
। 8 সংখ্যার প্রথমটি বর্ধনকারীকে যুক্ত করা হয়, এভাবে এটি বৃদ্ধি করে, তারপরে বাইনারি ইনপুট থেকে those সংখ্যার ব্যতীত সমস্ত কিছুই :
নিম্নলিখিত ক পরে সংযুক্ত করা হয় ,
। তাই (যদি আমরা 8 পরিবর্তে 2 সংখ্যা ব্যবহার করে ছিল) j,1001:
হয়ে যাবে j1:1001:,01
তারপর j10:1001,01,11
। অতিরিক্তভাবে, সংযুক্ত অ্যারে উপাদানগুলি মোড়ানো হয়B
এগুলিতে ফিরে রূপান্তর করতে, সেগুলিতে ।
অন্যটি, j(\d*),\1\d{0,7}:,?(.*)/,$2,/
ইনক্রিমেন্টারের পরে যাচাই করার জন্য 8 টিরও কম বাইনারি সংখ্যা রয়েছে কিনা তা পরীক্ষা করে এবং যদি তা হয় তবে এসগুলিতে আবৃত অ্যারে ব্যতীত অন্য সমস্ত কিছু সরিয়ে ফেলবে ,
। যেমন।,_,___,
অ্যারে তৈরি করার সময় এবং তার পরে আমরা তুলনা রেজিক্সগুলি সংজ্ঞায়িত করি।
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
এর মধ্যে প্রথমটি, ,((_+)_+),(\2),/,$1,/
কমা পরীক্ষা করে তারপরে কিছু পরিমাণ আন্ডারস্কোর, তারপরে আরও কিছু, তার পরে কমা, তারপরে প্রথম পরিমাণের আন্ডারস্কোর, কমা থেকে নয়। এরপরে এটি ,
এর দ্বারা ঘিরে থাকা প্রথম উপাদানের মোট পরিমাণের আন্ডারস্কোরের সাথে এটি প্রতিস্থাপন করে ।
পরেরটি, ,(_+),(\1_*),/,$2,/
কমা অনুসন্ধান করে তারপরে কিছু পরিমাণ আন্ডারস্কোর অনুসরণ করে অন্য কমা, তারপরে একই পরিমাণ বা আরও আন্ডারস্কোর এবং একটি শেষ কমা। এটি পরিবর্তে সঠিক উপাদান ছেড়ে যাবে।
অবশেষে, যখন এইরূপে ম্যাচিংয়ের কোনও উপাদান বাকি থাকে, তখন ^,(_*),$
আমরা পার্শ্ববর্তী কমাগুলি সরিয়ে দিয়ে দশমিকের মাধ্যমে ফিরে রূপান্তর করি d<>
। তারপরে আর কোনও রেজেক্সস গুলি চালাতে পারে না এবং আউটপুট উপস্থাপন করা হয়।
ইনপুটটি প্রথমে টেম্পলেটে স্থাপন করা হয় j,b:u<(?#input)>b:
, যা প্রথমে দশমিক ইনপুটটিকে আনারীতে রূপান্তর করে, যেমন 5
-> j,b:_____b:
, তারপরে ফলস্বরূপ অ্যানারি বাইনারি হয়ে যায়, j,101:
তারপরে বাইনারি বিভক্ত হয় (যা উদাহরণের জন্য কাজ করে না), বৃহত্তম উপাদান পায়, রূপান্তর করে দশমিক ফিরে, এবং সম্পন্ন।