আমি আপনার কোড বিশ্লেষণ বিভাগে আপনার কোড বিশ্লেষণ । এর আগে আমি বোনাস উপাদানের কয়েকটি মজাদার অংশ উপস্থাপন করি।
ওয়ান লাইনার ওয়ান লেটার 1
say e; # 2.718281828459045
e
রাকুতে কম্পিউটিং নিয়ে দামিয়ান কনওয়ের অসাধারণ নিবন্ধটি দেখতে উপরের লিঙ্কটিতে ক্লিক করুন ।
নিবন্ধটি অনেক মজাদার (সর্বোপরি, এটি দামিয়ান)। এটি কম্পিউটিংয়ের একটি খুব বোধগম্য আলোচনা e
। এবং এটি লাকির প্রাচীর দ্বারা সজ্জিত টিমটোউডিডিআই দর্শনের রাকুর দ্বিখণ্ডিত পুনর্জন্মের প্রতি শ্রদ্ধা। 3
একটি ক্ষুধার্ত হিসাবে, নিবন্ধটি প্রায় অর্ধেক থেকে একটি উদ্ধৃতি এখানে:
এই দক্ষ পদ্ধতিগুলি সমস্ত একইভাবে কাজ করে দেওয়া হয় terms সংক্ষিপ্ত আকারের একটি প্রাথমিক উপসেট (একটি প্রাথমিক উপসেট) শর্তাদির দ্বারা - সম্ভবত আমাদের পক্ষে এটি করার কোনও ফাংশন থাকলে হয়তো আরও ভাল হত। এবং অবশ্যই এটি আরও ভাল হবে যদি ক্রিয়াকলাপটি নিজেই সঠিকভাবে উত্তর তৈরি করার জন্য সিরিজের সেই প্রাথমিক উপসেটটির কতটুকু অন্তর্ভুক্ত হওয়া প্রয়োজন তার চেয়ে সঠিকভাবে কাজ করতে পারত ... বরং ফলাফলের মাধ্যমে ম্যানুয়ালি আঁচড়ানোর প্রয়োজন আমাদের থেকে better এটি আবিষ্কার করার জন্য একাধিক ট্রায়াল।
এবং, রাকুতে প্রায়শই, আমাদের যা প্রয়োজন ঠিক তা তৈরি করা আশ্চর্যরকম সহজ:
sub Σ (Unary $block --> Numeric) {
(0..∞).map($block).produce(&[+]).&converge
}
আপনার কোড বিশ্লেষণ
সিরিজ উত্পন্ন করার জন্য এখানে প্রথম লাইন রয়েছে:
my @e = 1, { state $a=1; 1 / ($_ * $a++) } ... *;
বন্ধ ( { code goes here }
) একটি পদ গণনা করে। একটি বন্ধের একটি স্বাক্ষর থাকে, হয় অন্তর্নিহিত বা সুস্পষ্ট, এটি নির্ধারণ করে যে এটি কত যুক্তি গ্রহণ করবে। এক্ষেত্রে সুস্পষ্ট স্বাক্ষর নেই। ব্যবহারের $_
( "TOPIC" পরিবর্তনশীল ) একজন অন্তর্নিহিত স্বাক্ষর যে এক যুক্তি হল যে আবদ্ধ প্রয়োজন ফলাফল $_
।
সিকোয়েন্স অপারেটর ( ...
) বারবার তার বাম দিকে ক্লোজারটিকে ডেকে আনে এবং আগের শব্দটিকে ক্লোজারের যুক্তি হিসাবে অতিক্রম করে ডানদিকে ডান দিকের প্রান্ত বিন্দু অবধি অবিচ্ছিন্ন শর্ত তৈরি করতে , যা এই ক্ষেত্রে হ'ল ওরফে অনন্তের *
জন্য শর্টহ্যান্ড Inf
।
বন্ধের প্রথম কলের বিষয়টি হ'ল 1
। সুতরাং ক্লোজার গণনা এবং 1 / (1 * 1)
সিরিজ হিসাবে প্রথম দুটি পদ ফলন দেয় 1, 1/1
।
মধ্যে বিষয় দ্বিতীয় কল আগের মান, 1/1
, IE 1
আবার। সুতরাং ক্লোজার গণনা এবং রিটার্ন 1 / (1 * 2)
, সিরিজটি প্রসারিত করে 1, 1/1, 1/2
। এটি সব ভাল দেখাচ্ছে।
পরবর্তী ক্লোজারগুলি 1 / (1/2 * 3)
যা হয় 0.666667
। সেই পদটি হওয়া উচিত 1 / (1 * 2 * 3)
। উফ।
আপনার কোডটি সূত্রের সাথে মেলে
আপনার কোডটি সূত্রের সাথে মিলবে বলে মনে করা হচ্ছে:
এই সূত্রে, প্রতিটি পদটি সিরিজের অবস্থানের ভিত্তিতে গণনা করা হয় । ট ম সিরিজের (যেখানে শব্দটি ট = 0 প্রথম 1
) শুধু গৌণিক হয় ট এর পারস্পরিক।
(সুতরাং এটি পূর্বের পদটির মানের সাথে কিছুই করার ছিল না Thus সুতরাং $_
, যা পূর্ববর্তী পদটির মান পায় , এটি বন্ধে ব্যবহার করা উচিত নয়))
আসুন একটি ফ্যাক্টরিয়াল পোস্টফিক্স অপারেটর তৈরি করুন:
sub postfix:<!> (\k) { [×] 1 .. k }
( ×
একটি ইনফিক্স গুণ গুণান্বিত অপারেটর, সাধারণ এএসসিআইআই ইনফিক্সের ভাল লাগার ইউনিকোড ওরফে*
))
এটি সংক্ষেপে:
sub postfix:<!> (\k) { 1 × 2 × 3 × .... × k }
(আমি ব্রেসগুলির অভ্যন্তরে সিউডো মেটাসেণ্ট্যাকটিক স্বরলিপি ব্যবহার করেছি যাতে প্রয়োজনীয় হিসাবে অনেক পদ যুক্ত বা বিয়োগের ধারণাটি বোঝায়।
আরও সাধারণভাবে, op
এক্সপ্রেশনের শুরুতে একটি ইনফিক্স অপারেটর বর্গাকার বন্ধনীগুলিতে স্থাপন করা একটি সংমিশ্রিত উপসর্গ অপারেটর গঠন করে যা এর সমতুল্য reduce with => &[op],
। আরও তথ্যের জন্য হ্রাস মেটাওপ্রেটর দেখুন ।
নতুন ফ্যাকটোরিয়াল পোস্টফিক্স অপারেটরটি ব্যবহার করতে এখন আমরা ক্লোজারটি পুনরায় লিখতে পারি:
my @e = 1, { state $a=1; 1 / $a++! } ... *;
বিঙ্গো। এটি সঠিক সিরিজ উত্পাদন করে।
... যতক্ষণ না এটি ঘটায়, অন্য কারণে পরবর্তী সমস্যাটি হ'ল সংখ্যার যথাযথতা। তবে এর সামনের অংশে এটি মোকাবেলা করা যাক।
আপনার কোড থেকে প্রাপ্ত একটি লাইনার
তিনটি লাইন একটিকে সংকুচিত করুন:
say [+] .[^10] given 1, { 1 / [×] 1 .. ++$ } ... Inf
.[^10]
প্রযোজ্য বিষয়টিতে, যা দ্বারা সেট করা হয়েছে given
। (এর ^10
জন্য সংক্ষিপ্তকরণ 0..9
, সুতরাং উপরের কোডটি সিরিজের প্রথম দশ পদগুলির যোগফলকে গণনা করে))
আমি $a
ক্লোজার কম্পিউটারটিকে পরের শব্দটি থেকে মুছে ফেলেছি । একাকী $
হ'ল (state $)
অ্যানোনিয়াস স্ট্যাটাল স্কেলার as আমি এটি একটি প্রাক বৃদ্ধি পরিবর্তে পরবর্তী বৃদ্ধি একই প্রভাব অর্জন হিসাবে আপনি আরম্ভের দ্বারা করেনি প্রণীত $a
করতে 1
।
আমরা এখন চূড়ান্ত (বড়!) সমস্যাটি রেখে এসেছি, নীচের মন্তব্যে আপনার দ্বারা নির্দেশিত।
প্রদত্ত এর অপারেশনগুলির কোনওটিই একটি Num
(একটি ফ্লোট এবং আনুমানিক), /
অপারেটর সাধারণত একটি 100% নির্ভুল Rat
(একটি সীমাবদ্ধ নির্ভুল যুক্তিযুক্ত) প্রদান করে। তবে যদি ফলাফলটির ডিনোমিনেটর b৪ বিট অতিক্রম করে তবে ফলাফলটি একটিতে রূপান্তরিত হয় Num
- যা নির্ভুলতার জন্য পারফরম্যান্সের ব্যবসা করে, এমন ট্রেড অফ যা আমরা তৈরি করতে চাই না। আমাদের তা আমলে নেওয়া দরকার।
সীমাহীন নির্ভুলতার পাশাপাশি 100% নির্ভুলতা নির্দিষ্ট করতে , কেবলমাত্র অপারেশনকে FatRat
এস ব্যবহার করতে বাধ্য করুন । এটি সঠিকভাবে করতে, কেবল (কমপক্ষে) অপারেটরগুলির একটি হ'ল FatRat
(এবং অন্য কেউ নয় Num
):
say [+] .[^500] given 1, { 1.FatRat / [×] 1 .. ++$ } ... Inf
আমি এটি 500 দশমিক সংখ্যায় যাচাই করেছি। আমি আশা করি রাকু ভাষা বা রাকুডো সংকলকের কিছু সীমা অতিক্রম করার কারণে প্রোগ্রামটি ক্র্যাশ না হওয়া পর্যন্ত এটি সঠিক থাকবে। (এর কিছু আলোচনার জন্য আমার উত্তরটি 65536 বিট প্রশস্ত বিগিন্টকে দেশীয় পূর্ণসংখ্যায় আনবক্স করতে পারবেন না )
পাদটিকা
1 Raku কয়েকটি গুরুত্বপূর্ণ গাণিতিক ধ্রুবক মধ্যে সহ বিল্ট ইন আছে e
, i
এবং pi
(এবং তার ওরফে π
)। এইভাবে কেউ রাকুতে অলারের পরিচয় লিখতে পারেন যেমন এটি গণিতের বইয়ের মতো লাগে। ইউলারের পরিচয়ের জন্য রোসেটা কোডের রাকু প্রবেশের কৃতিত্বের সাথে :
# There's an invisible character between <> and iπ character pairs!
sub infix:<> (\left, \right) is tighter(&infix:<**>) { left * right };
# Raku doesn't have built in symbolic math so use approximate equal
say e**iπ + 1 ≅ 0; # True
2 দামিয়ানের নিবন্ধটি অবশ্যই পড়তে হবে। তবে এটি কেবল বেশ কয়েকটি প্রশংসনীয় চিকিত্সার মধ্যে একটি যা 'রাকু "ইউলারের নম্বর" "এর জন্য কোনও গুগলের 100+ মিলের মধ্যে রয়েছে ।
3 দেখুন TIMTOWTDI বনাম TSBO-APOO-OWTDI TIMTOWTDI আরো সুষম মতামত পাইথন একটি পাখা দ্বারা লিখিত একটির জন্য। কিন্তু হয় অতিদূরে TIMTOWTDI নেওয়ার মূল্যবান। এই "বিপদ" প্রতিফলিত করার জন্য, পার্ল সম্প্রদায়টি হাস্যকরভাবে দীর্ঘ, অপঠনযোগ্য এবং সংক্ষেপিত টিমটোউডিআইডিএসসিএনএবিটি - এটি করার একাধিক উপায় আছে তবে কখনও কখনও ধারাবাহিকতা খারাপ কাজ হয় না, উচ্চারিত হয় "টিম টোডি বাইকার্বোনেট"। আশ্চর্যজনকভাবে যথেষ্ট , ল্যারি রাকুর ডিজাইনে বাইকার্বোনেট প্রয়োগ করেছিলেন এবং ডামিয়ান এটি e
রাকুতে কম্পিউটিংয়ে প্রয়োগ করেছেন ।