হাস্কেল (ল্যাম্বডাবোট), 92 85 বাইট
x#y|x==y=[[x]]|1>0=(guard(mod x y<1)>>(y:).map(y*)<$>div x y#2)++x#(y+1)
map(1:).(#2)
আমদানি করা guard
প্রয়োজন যেহেতু ল্যাম্বডাবোট হাসেলকে প্রয়োজন Control.Monad
। মূল ফাংশনটি একটি বেনামি ফাংশন, যা আমাকে বলা হচ্ছে অনুমোদিত এবং এটি কয়েকটা বাইট বন্ধ করে দেয়।
লাইকনিকে সাতটি বাইট সংরক্ষণ করার জন্য ধন্যবাদ।
ব্যাখ্যা:
মনডা খুব কাজে লাগে।
x # y
এটি আমাদের পুনরাবৃত্ত ফাংশন যা সমস্ত আসল কাজ করে। x
আমরা যে সংখ্যার উপরে জমেছি তা হ'ল (বিভাজকের পণ্য যা মান অবধি থাকে) এবং y
এর পরের সংখ্যাটি আমাদের এটির মধ্যে ভাগ করার চেষ্টা করা উচিত।
| x == y = [[x]]
যদি x
সমান হয় y
তবে আমরা পুনরাবৃত্তি সম্পন্ন করেছি। কেবলমাত্র x
বর্তমান গোজিন্টা চেইনের সমাপ্তি হিসাবে ব্যবহার করুন এবং এটি ফিরিয়ে দিন।
| 1 > 0 =
"সত্য" এর জন্য হাস্কেল গল্ফ-ইসম। এটি, এটি ডিফল্ট কেস।
(guard (mod x y < 1) >>
আমরা এখন তালিকা monad ভিতরে অপারেশন করছি। তালিকা মোনাডের মধ্যে, আমাদের একই সময়ে একাধিক পছন্দ করার ক্ষমতা রয়েছে। ক্লান্তি দিয়ে কোনও কিছুর "সমস্ত সম্ভাব্য" সন্ধান করার সময় এটি খুব সহায়ক। guard
বিবৃতি "কেবলমাত্র নিচের পছন্দ বিবেচনা যদি একটি শর্ত সত্য" বলেছেন। এই ক্ষেত্রে, y
বিভক্ত হলে কেবল নিম্নলিখিত পছন্দটি বিবেচনা করুন x
।
(y:) . map (y *) <$> div x y#2)
যদি y
বিভাজন হয় x
, তবে আমাদের কাছে y
গজিন্টা চেইনে যুক্ত করার পছন্দ রয়েছে । এই ক্ষেত্রে, পুনরাবৃত্তভাবে কল করুন (#)
, সমান y = 2
দিয়ে শুরু করুন , যেহেতু আমরা "ফ্যাক্টর আউট" করতে চাই যা আমরা কেবল শৃঙ্খলে যুক্ত করেছি। তারপরে, এই পুনরাবৃত্তির কল থেকে ফলাফল যাই হোক না কেন, এর মানগুলি দ্বারা একাধিক করুনx
x / y
y
y
আমরা তৈরি করেছি এবং y
সরকারীভাবে গোজিন্টা চেইনে যুক্ত করব।
++
নীচের পছন্দটিও বিবেচনা করুন। এটি কেবলমাত্র দুটি তালিকাকে একসাথে যুক্ত করে, তবে একাকীভাবে আমরা এটিকে "এই জিনিসটি বা এই অন্য কাজটি করার মধ্যে চয়ন করুন" বলে মনে করতে পারি।
x # (y + 1)
অন্য বিকল্পটি কেবল পুনরাবৃত্তি চালিয়ে যাওয়া এবং মানটি ব্যবহার না করা y
। যদি y
ভাগ না করে x
তবে এটিই একমাত্র বিকল্প। যদি y
বিভাজন হয় x
তবে এই বিকল্পটি পাশাপাশি অন্য বিকল্প হিসাবে নেওয়া হবে এবং ফলাফলগুলি একত্রিত হবে।
map (1 :) . (# 2)
এটি প্রধান গোজিন্তা ফাংশন। এটি (#)
তার যুক্তি দিয়ে কল করে পুনরাবৃত্তি শুরু করে । একজন 1
, যে gozinta চেইন prepended কারণ (#)
ফাংশন কখনো চেইন মধ্যে বেশী রাখে।