রেটিনা , 56 37 বাইট
এই সমাধানটি সমস্ত প্রয়োজনীয় ইনপুট মানগুলির সাথে কাজ করে।
এই চ্যালেঞ্জের মধ্যে রেটিনা সবচেয়ে বড় সমস্যাটির মুখোমুখি হ'ল এটির স্ট্রিংগুলির সর্বাধিক দৈর্ঘ্য 2 ^ 30 অক্ষর থাকে, সুতরাং সংখ্যাগুলির সাথে আচরণ করার স্বাভাবিক পদ্ধতি (অবিচ্ছিন্ন উপস্থাপনা) 2 ^ 30 এর বেশি মানের সাথে কাজ করে না।
এই সমস্যাটি সমাধান করার জন্য আমি একটি পৃথক পদ্ধতির অবলম্বন করে সংখ্যার দশমিক দশমিক উপস্থাপনা রেখেছিলাম, তবে যেখানে প্রতিটি অঙ্কটি অ্যানারিতে লেখা হয় (আমি এই প্রতিনিধিত্বকে ডিজিটোনারি বলব )। উদাহরণস্বরূপ সংখ্যাটি সংখ্যা 341
হিসাবে লেখা হবে 111#1111#1#
। এই প্রতিনিধিত্বের সাহায্যে আমরা এখন পর্যন্ত 2^30/10
সংখ্যা পর্যন্ত (একশত মিলিয়ন ডলার) সংখ্যা নিয়ে কাজ করতে পারি । এটি নির্বিচারে পাটিগণিতের জন্য মানসম্মত অ্যানারি থেকে কম ব্যবহারিক, তবে কিছুটা চেষ্টা করে আমরা কোনও ধরণের অপারেশন করতে পারি।
উল্লেখ্য: তত্ত্ব digitunary অন্য কোন বেস ব্যবহার করতে পারে (যেমন বাইনারি 110
হবে 1#1##
বেস 2 digitunary মধ্যে), কিন্তু যেহেতু অক্ষিপট builtins দশমিক এবং ইউনারী এবং অন্যান্য ঘাঁটি সঙ্গে মোকাবিলা করার জন্য কোন সরাসরি পথ মধ্যে রূপান্তর করতে হয়েছে, দশমিক সম্ভবত সবচেয়ে সামলানো বেস।
আমি ব্যবহৃত অ্যালগরিদমটি শূন্যে না পৌঁছা পর্যন্ত একের পর এক পূর্ণসংখ্যা বিভাগ তৈরি করে চলেছে, আমরা যে বিভাগ তৈরি করেছি তার সংখ্যাটি এই সংখ্যার প্রতিনিধিত্ব করার জন্য প্রয়োজনীয় বিটের সংখ্যা।
সুতরাং, আমরা কীভাবে দুটি সংখ্যায় ভাগ করব? এটি রেটিনা স্নিপেট যা এটি করে:
(1*)(1?)\1# We divide one digit, the first group captures the result, the second group captures the remainder
$1#$2$2$2$2$2 The result is put in place of the old number, the remainder passes to the next digit (so it is multiplied by 10) and is divided by two there -> 5 times the remainder goes to the next digit
এই প্রতিস্থাপনটি একটি অঙ্কের সংখ্যা 2 দিয়ে বিভক্ত করার জন্য যথেষ্ট, মূল সংখ্যাটি বিজোড় হলে আমাদের কেবল শেষ থেকে সম্ভাব্য .5 গুলি সরিয়ে ফেলতে হবে।
সুতরাং, এখানে পুরো কোডটি রয়েছে, সংখ্যায় এখনও সংখ্যা না পাওয়া পর্যন্ত আমরা দুটি দ্বারা বিভাজন n
রেখে চলেছি এবং প্রতিটি পুনরাবৃত্তির স্ট্রিংয়ের সামনে একটি আক্ষরিক রেখেছি: শেষে সংখ্যাটি n
ফলাফল।
. |
$*1# Convert to digitunary
{`^(.*1) Loop:|
n$1 add an 'n'
(1*)(1?)\1# |
$1#$2$2$2$2$2 divide by 2
)`#1*$ |
# erase leftovers
n Return the number of 'n's in the string
এটি অনলাইন চেষ্টা করুন!
আপডেট সমাধান, 37 বাইট
দৈর্ঘ্যের এক তৃতীয়াংশ সম্পর্কে গল্ফপ্রাপ্ত অনেক ভাল ধারণার সাথে বিগ রিফ্যাক্টরিং, মার্টিন ইন্ডারকে সমস্ত ধন্যবাদ!
মূল ধারণাটি _
আমাদের আনরিয়ার প্রতীক হিসাবে ব্যবহার করা হয়: এইভাবে আমরা আমাদের স্ট্রিংগুলিতে নিয়মিত অঙ্কগুলি ব্যবহার করতে পারি, যতক্ষণ আমরা _
যখন প্রয়োজন হয় তখন এগুলিতে আবার রূপান্তর করি : এটি আমাদের বিভাজনে এবং একাধিক সন্নিবেশে অনেকগুলি বাইট সংরক্ষণ করতে দেয় ডিজিটের।
কোডটি এখানে:
<empty line> |
# put a # before each digit and at the end of the string
{`\d Loop:|
$*_ Replace each digit with the corrisponding number of _
1`_ |
n_ Add an 'n' before the first _
__ |
1 Division by 2 (two _s become a 1)
_# |
#5 Wherever there is a remainder, add 5 to the next digit
}`5$ |
Remove the final 5 you get when you divide odd numbers
n Return the number of 'n's in the string
এটি অনলাইন চেষ্টা করুন!