হাস্কেল , 1080 1033 বাইট
;
f=
g
ij=f
a =hi
hi = g
hij= ij
g ' ' =0
g '"' =0;
g '$' =0;
g '&' =0-0
g '(' =0-0-0
g '*' =0-0-0;
g ',' =0-0-0;
g '.' =0-0-0-0
g '0' =0-0-0-0-0
g '2' =0-0-0-0-0;
g '4' =0-0-0-0-0;
g '6' =0; g '8' =0
g ':' =0; g '<' =0-0
g '>' =0; g '@' =0-0;
g 'B' =0; g 'D' =0-0;
g 'F' =0; g 'H' =0-0-0
g 'J' =0; g 'L' =0-0-0-0
g 'N' =0; g 'P' =0-0-0-0;
g 'R' =0; g 'T' =0-0-0-0;
g 'V' =0; g 'X' =0-0-0-0-0
g 'Z' =0; g '^' =0; g '`' =0
g 'b' =0; g 'd' =0; g 'f' =0;
g 'h' =0; g 'j' =0; g 'l' =0;
g 'n' =0; g 'p' =0; g 'r' =0-0
g 't' =0; g 'v' =0; g 'x' =0-0-0
g 'z' =0; g '\92' =0-0; g '|' =0;
g '~' =0; g y = 1 ;z=0; i(-0)z=z;
i m('\10':y ) ="y"; ; ; ; ; ; ; ;
i m(mnmnmnmnm:y ) = i(m - 1 ) y ; ;
i k m ="y"; ; k i [ ] =01<1010101010;
k m('\10':y ) = k(m + 1 )(i m y ) ; ;
k m y =01>10; m o = k 1$'\10':o ; ; ;
o i('\10':y ) = o i y ; ; ; ; ; ; ; ; ;
o i(k:y )|g k<i = o(1 - i ) y ; ; ; ; ; ;
o i(k:y )|g k>i = o(1 - i ) y ; ; ; ; ; ;
o i [ ] =01<10; o i y =01>10;v=01>10101010
s y|o 1 y = m y|o(-0) y = m y ; s y =v; ; ;
এটি অনলাইন চেষ্টা করুন!
ব্যাখ্যা
এটি হাস্কেলের পক্ষে বেশ আকর্ষণীয় কাজ হয়ে দাঁড়িয়েছে।
সমতা
শুরু করতে আমাদের একটি চরিত্রের একটির বা বিজোড় কোড-পয়েন্ট রয়েছে কিনা তা নির্ধারণের কিছু উপায় প্রয়োজন। কেউ এটি করার স্বাভাবিক উপায়টি হ'ল কোড-পয়েন্টটি পেতে এবং এটি ২ দ্বারা মোড করা However তবে যেহেতু একজন সচেতন হতে পারে, কোনও চরিত্রের কোড-পয়েন্ট পেতে একটি আমদানি প্রয়োজন, যা উত্সের বিধিনিষেধের কারণে এটি হতে পারে না ব্যবহার করা হয়েছে। আরও অভিজ্ঞ হাসকলার পুনরাবৃত্তি ব্যবহার করার কথা ভাববেন। Char
এর Enum
টাইপক্লাসের অংশ তাই আমরা তাদের পূর্বসূরি এবং উত্তরসূরি পেতে পারি। তবে pred
এবংsucc
উভয়ই অকেজো কারণ তারা বিকল্প বাইট সমতা না করে।
সুতরাং এটি আমাদের বেশ আটকে দেয় আমরা চরগুলি দিয়ে কোনও হেরফের করতে পারি না। এর সমাধান হ'ল সবকিছুকে হার্ডকোড করা। আমরা (বেশিরভাগ) এমনকি অক্ষরগুলিকে আক্ষরিক হিসাবে উপস্থাপন করতে পারি, কারণ আমাদের যে সমস্যাগুলির সাথে সমস্যা রয়েছে'
আক্ষরিক তা বিজোড় এটি চরের পাশে থাকতে পারে না এবং বেশিরভাগ বিজোড় চরিত্র প্রকাশ করা আক্ষরিক অসম্ভব হয়ে যায়। সুতরাং আমরা সমস্ত বাইটকে হার্ড কোড দিয়েছি এবং তারপরে বিজোড় বাইটগুলির জন্য একটি ক্যাচ যুক্ত করব।
বাইটস সমস্যা
আপনি খেয়াল করতে পারেন যে কিছু কিছু বাইট রয়েছে যার জন্য এটি একক-কোটায় মোড়ানো দ্বারা আক্ষরিক তৈরি করা যায় না। এগুলি হ'ল প্রিন্টেবল, নিউলাইনস এবং \
। আমাদের অপ্রিন্টেবলগুলি নিয়ে চিন্তা করার দরকার নেই, যতক্ষণ না আমরা সেগুলির কোনওটি ব্যবহার না করে যাচাই করার দরকার নেই। প্রকৃতপক্ষে আমরা এখনও টেবিলের মতো বিজোড় অপ্রিন্টেবলগুলি ব্যবহার করতে পারি, আমি কেবল এটির দরকার নেই। নিউলাইনটিকে সেজলি এড়ানো যায় কারণ এটি প্রোগ্রাম থেকে যাইহোক ছাঁটাই করা হবে। (আমরা নিউলাইন অন্তর্ভুক্ত করতে পারি, কারণ এটি কোড-পয়েন্ট বরং সুবিধাজনক, তবে আমাদের দরকার নেই)। এই পাতাগুলিতে \
এখন \
কোডপয়েন্ট 92 রয়েছে যা সুবিধাজনকভাবে একটি বিজোড় সংখ্যা এবং এর পরেও একটি সমান সংখ্যা, তাই\92
সমান সন্ধ্যা এবং প্রতিকূলতার মধ্যে বিকল্প এইভাবে আক্ষরিক হয়'\92'
পুরোপুরি বৈধ। পরে যখন আমাদের নতুন লাইনের প্রতিনিধিত্ব করার দরকার হবে তখন আমরা লক্ষ্য করব যে ভাগ্যক্রমে এর একই সম্পত্তি রয়েছে '\10'
।
ব্যবধান সমস্যা
এখন আসল কোড লেখা শুরু করার জন্য আমাদের একক লাইনে বড় আকারের অক্ষর রাখতে সক্ষম হওয়া দরকার। এটি করার জন্য আমি ক্যাপটি লিখেছিলাম:
;
f=
g
ij=f
a =hi
hi = g
hij= ij
ক্যাপটি বৈধ হাস্কেল হিসাবে কিছু না করে do আমি প্রাথমিকভাবে এমন সংজ্ঞা তৈরি করার আশা করেছিল যা পরে কোডে আমাদের সহায়তা করবে, তবে তা হয়নি didn't ক্যাপটি তৈরির আরও সহজ উপায়ও রয়েছে, উদাহরণস্বরূপ সাদা স্থান এবং অর্ধিকোলনগুলি, তবে তারা এইভাবে বাইটগুলি সংরক্ষণ করে না তাই আমি এটি পরিবর্তন করতে বিরক্ত করি না।
Hardcoder
সুতরাং এখন যে আমার একটি লাইনে পর্যাপ্ত জায়গা রয়েছে আমি হার্ডকোডিং মানগুলি শুরু করি। এটি বেশিরভাগই বিরক্তিকর, তবে আগ্রহের কিছু জিনিস রয়েছে। একবারের জন্য লাইনগুলি আরও দীর্ঘ হতে শুরু করে আমরা ;
এক লাইনে একাধিক ঘোষণা রাখতে পারি, যা আমাদের টন বাইট সংরক্ষণ করে।
দ্বিতীয়টি হ'ল যেহেতু আমরা সবসময় একটি লাইন শুরু করতে পারি না g
তাই প্রায়শই আমাদের লাইনগুলি কিছুটা ইনডেন্ট করতে হয়। এখন হাস্কেল প্রকৃতপক্ষে ইনডেন্টেশন সম্পর্কে যত্নশীল, তাই এটি এটি সম্পর্কে অভিযোগ করবে। তবে ইন্ডেন্টেড লাইনের আগে শেষ লাইনটি যদি সেমিকোলনে শেষ হয় তবে এটি এটিকে অনুমতি দেবে। কেন? আমার অজ্ঞানতা নেই, তবে এটি কাজ করে। সুতরাং আমাদের কেবলমাত্র সেমিকোলনগুলি লাইনের শেষের দিকে রাখতে হবে।
ফাংশন বিল্ডিং ব্লক
হার্ডকোডারটি শেষ হয়ে গেলে প্রোগ্রামটির শেষের দিকে মসৃণ নৌযান চালানো হয়। আমাদের কয়েকটি সাধারণ ফাংশন তৈরি করতে হবে। প্রথমে আমি একটি সংস্করণ তৈরি করি drop
, যার নাম i
। i
এর থেকে আলাদা drop
যদি আমরা স্ট্রিংয়ের শেষটি ফেলে দেওয়ার চেষ্টা করি তবে এটি কেবল ফিরে আসে "y"
। i
ড্রপ থেকে পৃথক পৃথক যে এটি যদি একটি নতুন লাইন ফেলে দেওয়ার চেষ্টা করে তবে তা ফিরে আসবে "y"
, এগুলি কার্যকর হবে কারণ পরে যখন আমরা যাচাই করছি যে প্রোগ্রামটি একটি ত্রিভুজ False
এটি শেষ লাইনে সম্পূর্ণ না হলে আমাদের ফিরে আসতে দেয় , বা কখন একটি লাইন তাড়াতাড়ি শেষ হয়।
k
k
এনগুলিগুলিTrue
এনk
n + 1False
আমরা তখন জন্য একটি alias করা k
, m
। m
ঠিক হয় k
সঙ্গে 1
প্রথম আর্গুমেন্ট, এবং একটি newline দ্বিতীয় যুক্তি আগে লেখা।
পরবর্তী আমাদের আছে o
। o
একটি সংখ্যা এবং একটি স্ট্রিং লাগে। এটি নির্ধারণ করে যে স্ট্রিং বাইটগুলি (নিউলাইনগুলি উপেক্ষা করে) বিকল্পে g
ইনপুট নম্বর দিয়ে শুরু করে (আমাদের ব্যবহার করে) বিকল্প রয়েছে কিনা।
শেষ পর্যন্ত আমাদের উভয়টি নিয়েই এটি s
চলমান এবং যদি হয় এটি সফল হয় তবে তা পিছিয়ে যায় । এটি উভয় ব্যর্থ হলে এটি কেবল ফিরে আসে । এটি আমরা চাই ফাংশন। এটি নির্ধারণ করে যে ইনপুটটি ত্রিভুজাকার এবং পর্যায়ক্রমে হয়।o
1
0
m
False