হাস্কেল , 166 154 বাইট
(-২২ বাইটস লাইকোনিকে ধন্যবাদ, (জিপবিথ এবং ল্যাম্বদার পরিবর্তে জিপ এবং তালিকা উপলব্ধি, প্রথম লাইনটি উত্পাদন করার আরও ভাল উপায়))
i#n|let k!p=p:(k+1)![m*l*r+(m*(l*r-l-r)+1)*0^mod k(2^(n-i))|(l,m,r)<-zip3(1:p)p$tail p++[1]];x=1<$[2..2^n]=mapM(putStrLn.map("M "!!))$take(2^n)$1!(x++0:x)
এটি অনলাইন চেষ্টা করুন!
ব্যাখ্যা:
ফাংশন পুনরাবৃত্তির পদক্ষেপের পরে i#n
উচ্চতার একটি এএসসিআইআই-ত্রিভুজ আঁকে ।2^n
i
অভ্যন্তরীণভাবে ব্যবহৃত এনকোডিং খালি অবস্থানগুলি 1
এবং পুরো অবস্থান হিসাবে এনকোড করে 0
। অতএব, ত্রিভুজ প্রথম লাইন হিসাবে এনকোডেড হয়েছে [1,1,1..0..1,1,1]
সঙ্গে 2^n-1
শূন্য উভয় পক্ষের বেশী। এই তালিকাটি তৈরি করতে, আমরা তালিকাটি শুরু করি x=1<$[2..2^n]
, অর্থাত [2..2^n]
ম্যাপ করা সমস্ত কিছু সহ তালিকা 1
। তারপরে, আমরা সম্পূর্ণ তালিকাটি তৈরি করিx++0:x
অপারেটর k!p
(নীচে বিশদ বিবরণ), একটি লাইন সূচক দেওয়া হয়েছে k
এবং p
এর সাথে সম্পর্কিত লাইনগুলির একটি অসীম তালিকা তৈরি করে p
। আমরা এটি সঙ্গে অনুরোধ1
পুরো ত্রিভুজটি পেতে এবং উপরে বর্ণিত প্রারম্ভিক লাইনের এবং তারপরে কেবল প্রথম 2^n
লাইনগুলি নেওয়া হয় । এর পরে, আমরা কেবল প্রতিটি লাইনে মুদ্রণ প্রতিস্থাপন 1
স্থান সঙ্গে এবং 0
সঙ্গে M
(তালিকা অ্যাক্সেস করার মাধ্যমে "M "
অবস্থানে 0
বা 1
)।
অপারেটর k!p
নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:
k!p=p:(k+1)![m*l*r+(m*(l*r-l-r)+1)*0^mod k(2^(n-i))|(l,m,r)<-zip3(1:p)p$tail p++[1]]
প্রথমত, আমরা এর তিনটি সংস্করণ উত্পন্ন করি p
: 1:p
এটি p
একটি 1
প্রেন্টেন্ড সহ, p
নিজেই এবং tail p++[1]
যা এর প্রথম উপাদানটি ছাড়া সমস্ত কিছুp
1
সংযোজন সহ বাদে সমস্ত কিছু। তারপরে আমরা এই তিনটি তালিকা জিপ করি, আমাদের p
বাম এবং ডান প্রতিবেশী হিসাবে কার্যকরভাবে সমস্ত উপাদান সরবরাহ করে (l,m,r)
। নতুন লাইনে সংশ্লিষ্ট মান গণনা করতে আমরা একটি তালিকা বোধগম্যতা ব্যবহার করি:
m*l*r+(m*(l*r-l-r)+1)*0^mod k(2^(n-i))
এই অভিব্যক্তিটি বোঝার জন্য, আমাদের দু'টি বিবেচনা করার জন্য প্রাথমিক ধারণা রয়েছে: আমাদের হয় কেবল পূর্ববর্তী লাইনটি প্রসারিত করুন, অথবা আমরা এমন এক পর্যায়ে এসেছি যেখানে ত্রিভুজটির একটি ফাঁকা জায়গা শুরু হয়। প্রথম ক্ষেত্রে, আশেপাশের কোনও স্পট পূরণ করা থাকলে আমাদের একটি পূর্ণ স্থান রয়েছে have এটি হিসাবে গণনা করা যেতে পারে m*l*r
; যদি এই তিনটির কোনওটি শূন্য হয়, তবে নতুন মানটি শূন্য। অন্য কেসটি কিছুটা কৌশলযুক্ত। এখানে, আমাদের মূলত প্রান্ত সনাক্তকরণ প্রয়োজন। নিম্নলিখিত টেবিলটি নতুন লাইনে ফলাফল মান সহ আটটি সম্ভাব্য পাড়া দেয়:
000 001 010 011 100 101 110 111
1 1 1 0 1 1 0 1
এই টেবিলটি উত্পন্ন করার জন্য একটি সোজাসুজি সূত্র 1-m*r*(1-l)-m*l*(1-r)
যা সহজতর হবে m*(2*l*r-l-r)+1
। এখন আমাদের এই দুটি ক্ষেত্রে নির্বাচন করতে হবে, যেখানে আমরা লাইন নম্বরটি ব্যবহার করি k
। যদি mod k (2^(n-i)) == 0
, আমাদের দ্বিতীয় কেসটি ব্যবহার করতে হয়, অন্যথায়, আমরা প্রথম কেসটি ব্যবহার করি। শব্দটি 0^(mod k(2^n-i))
হ'ল 0
যদি আমাদের প্রথম কেস ব্যবহার করতে হয় এবং1
যদি আমাদের দ্বিতীয় কেস ব্যবহার করতে হয়। ফলস্বরূপ, আমরা ব্যবহার করতে পারি
m*l*r+(m*(l*r-l-r)+1)*0^mod k(2^(n-i))
মোট - যদি আমরা প্রথম কেসটি ব্যবহার করি তবে আমরা সহজভাবে পাই m*l*r
, তবে দ্বিতীয় ক্ষেত্রে, একটি অতিরিক্ত শব্দ যুক্ত করা হয়, যা গ্র্যান্ডকে মোট দেয় m*(2*l*r-l-r)+1
।