হাস্কেল , 3 টি কুইন, 1119 বাইট
কুইন 1, 51 বাইট
IO
স্ট্যান্ডআউটে সরাসরি বেনামে অ্যাকশন মুদ্রণ।
putStr`mappend`print`id`"putStr`mappend`print`id`"
এটি অনলাইন চেষ্টা করুন!
কুইন 2, 265 বাইট
ফাংশনটি f
একটি ডামি আর্গুমেন্ট নেয় এবং একটি স্ট্রিং দেয়।
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]
এটি অনলাইন চেষ্টা করুন!
কুইন 3, 803 বাইট
LANGUAGE
প্রগমার পরে সমস্ত কিছু একটি ছদ্মবেশী ফাংশন যা একটি ছদ্মবেশী যুক্তি গ্রহণ করে এবং একটি স্ট্রিং ফিরিয়ে দেয়।
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'
এটি অনলাইন চেষ্টা করুন!
অক্ষর
কুইন 1:
"S`adeimnprtu
কুইন 2:
!+,.0123456789;<=[]bcfghosw
কুইন 3:
#$%&'()-:>?ACEGILMNPTU\_kqvxyz{}
কিভাবে এটা কাজ করে
কুইন ঘ
putStr`mappend`print`id`"putStr`mappend`print`id`"
কুইন 1 হ'ল আমার সাম্প্রতিক গল্ফের একটি পরিবর্তিত সংস্করণ যা আপনার চতুর উত্তরের (এইচ.পি.উইজের উন্নতির সাথে):
- যেহেতু সম্পূর্ণ প্রোগ্রামগুলির প্রয়োজন হয় না,
main=
তাই সরানো হয়েছে।
<>
এবং $
তাদের কাছাকাছি প্রতিশব্দ mappend
এবং দ্বারা প্রতিস্থাপিত হয়েছে id
।
এটি অন্যান্য কুইনের জন্য গুরুত্বপূর্ণ চরিত্র =<>
এবং সহায়ক $
অপারেটকে মুক্ত করে।
কুইন 2
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,......]
কুইন 2 আমার সাম্প্রতিক মিউচুয়ালি এক্সক্লুসিভ কুইনস উত্তরগুলির 2 প্রোগ্রামের জন্য কিছুটা অনুরূপ পদ্ধতি ব্যবহার করে তবে সরাসরি কুইনের সাথে খাপ খায় এবং বিশেষত কুইন 3 এর জন্য প্রয়োজনীয় চরিত্রের আক্ষরিক ব্যবহার এড়ানোর জন্য, এই দুটিই show
ফাংশনের সহায়তায় অর্জন করা হয়েছে , নিছক ভাগ্য যা এখনও এর কোন চরিত্র ব্যবহার করে নি।
এই কুইনটি ফাঁকা জায়গাগুলির পরিবর্তে ট্যাব ব্যবহার করে, তবে আমি পঠনযোগ্যতার জন্য নীচে স্পেস ব্যবহার করেছি।
g
কোডের শেষে পূর্ণসংখ্যার একটি তালিকা হিসাবে কোয়েন ডেটা। প্রতিটি সংখ্যা বাকী কোড থেকে একটি অক্ষর উপস্থাপন করে।
- সংখ্যাগুলি স্থানান্তরিত হয়
9
, যাতে ট্যাব হয় 0
। এটি ফাংশনটির জন্য ছোট অক্ষর এবং ভেরিয়েবলের নামগুলিকে 2 ডিজিটের সাথে ফিট করার অনুমতি দিয়ে এনকোডিংটিকে কিছুটা ছোট করে তোলে।
b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
একটি সংখ্যাকে একটি চরিত্রে রূপান্তর করার একটি ক্রিয়া (আসলে একটি অক্ষরের স্ট্রিং)।
[[show 9!!0,show 1!!0..]!!6..]
ট্যাব অক্ষর দিয়ে শুরু হওয়া একটি অক্ষর পরিসীমা যা এর সাথে সূচিযুক্ত হয় !!c
।
- ট্যাব অক্ষর নিজেই অন্য সীমার মধ্যে সূচিবদ্ধ দ্বারা উত্পাদিত হয়
[show 9!!0,show 1!!0..]
, অঙ্ক অক্ষর দিয়ে শুরু হওয়া '9'
এবং '1'
এবং 8 এর পদক্ষেপে নিচে জাম্পিং।
- অঙ্কের অক্ষরগুলি
show
সংশ্লিষ্ট অঙ্কের স্ট্রিংয়ের সাথে সূচক করে উত্পাদিত হয় ।
f c=[b=<<g]!!0++show g
প্রধান কাজ। c
একটি ছদ্মবেশী যুক্তি।
b=<<g
=<<
প্রতিটি সংখ্যাটিকে g
তার চরিত্রে রূপান্তর করতে ব্যবহার করে । ( =<<
উদাহরণস্বরূপ পরিবর্তে ব্যবহারের map
কারণে b
তার ফিরে আসা চরিত্রটি একটি তালিকায় মোড়ানো দরকার))
show g
স্ট্রিংয়ের g
তালিকার প্রতিনিধিত্ব করে এবং ++
স্ট্রিংগুলি সংযুক্ত করে।
- কারণ
=<<
এর চেয়ে কম অগ্রাধিকার রয়েছে ++
, কিছু বন্ধনী প্রয়োজন। ()
(কুইন 3 এর জন্য সংরক্ষিত) ব্যবহার এড়াতে [...]!!0
একটি উপাদান যুক্ত তালিকায় সূচীগুলি।
কুইন ঘ
অন্যান্য কুইনের নকশা দ্বারা, কুইন 3 টি এখনও বন্ধনী, ল্যাম্বডা এক্সপ্রেশন, চরিত্রের অক্ষরে অক্ষর এবং স্ট্রিং / তালিকা নির্বাহকের অ্যাক্সেস পেয়েছে :
। এই ফাংশন যা গঠন করা যথেষ্ট হবে prepends একটি স্ট্রিং quine এর কোড।
দুর্ভাগ্যক্রমে, সমস্ত ছোট হাতের স্বর (কখনও কখনও বাদে y
) ব্যবহার করা হয়েছে, কোনও কার্যকর বর্ণানুক্রমিক বিল্টিন ফাংশন রেখে। এছাড়াও []""
চলে গেছে। কোডটি ভান করা শুরু করার জন্য এটি খালি স্ট্রিং তৈরির কোনও সাধারণ উপায় ছেড়ে যায় না ।
তবে, প্রায় সমস্ত বড় হাতের অক্ষর এখনও উপলভ্য, তাই LANGUAGE
একটি ভাষা বর্ধনের জন্য একটি প্রাগমা সম্ভব। আবার নিছক ভাগ্যক্রমে, CPP
(সি প্রিপ্রসেসর সক্ষম করুন) কেবলমাত্র বড় হাতের অক্ষরের সাথে নামের একমাত্র ভাষা বর্ধন। এবং সিপিপি ম্যাক্রোগুলির প্রায়শই বড় হাতের নাম থাকে।
সুতরাং প্রয়োজনীয় খালি স্ট্রিং পাওয়ার জন্য, কুইন সক্ষম করে CPP
, ফর্মটির __TIME__
স্ট্রিং ধ্রুবক পেতে সর্বদা ম্যাক্রো ব্যবহার করে "??:??:??"
(সুবিধাজনকভাবে সর্বদা একই দৈর্ঘ্যের জন্য গ্যারান্টিযুক্ত) এবং এতে প্যাটার্ন মেলে।
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......
ভাষা প্রচলনের পরে, কুইন একটি ল্যাম্বডা এক্সপ্রেশন নিয়ে গঠিত যা এই চারটি আর্গুমেন্টের সাথে তার পরামিতিগুলি আবদ্ধ করে (পরে চূড়ান্ত ডামি প্যারামিটারটি _
পরে প্রয়োগ করা হবে):
q
আবদ্ধ '\''
, একটি একক উদ্ধৃতি চরিত্র প্রদান;
_:_:_:_:_:_:_:_:z
আবদ্ধ __TIME__
, যেমন একটি স্ট্রিং ওরফে "??:??:??"
, এইভাবে z
একটি খালি স্ট্রিং তৈরি করে;
y
আবদ্ধ (\(?)v k x->v$k?x)
, একটি ল্যাম্বডা সংযুক্তকারী বাম সম্পর্কিত ("ফোল্ড") থেকে ডান যুক্ত ("ফোল্ডার") ফর্মে রূপান্তর করতে সহায়তা করতে ব্যবহৃত;
- অপারেটর
(#)
আবদ্ধ \(&)(%)v->v&'{'&'-'&...
, কুইন ডেটা নিজেই।
কুইন ডেটা চার্চ এনকোডিং আকারে দেওয়া হয়, পরামিতি সহ ল্যাম্বডা এক্সপ্রেশন (&)(%)v
।
- Instantiate বিশেষ মান অভিব্যক্তি প্রয়োগ করে
(&)
, (%)
এবং v
, এই এনকোডিং পারেন quine কোর কোড গড়ে তুলতে বা quine তথ্য উপস্থাপনা নিজেই পুনর্নির্মাণের ব্যবহার করা যাবে।
- হাস্কেলের ডিফল্ট স্থিতিশীলতার নিয়ম অনুসারে
&
এবং ল্যাম্বদার %
অভ্যন্তরে বাম সহযোগী অপারেটর হয়ে উঠুন। এইভাবে অক্ষরের প্যারামিটারগুলি v
বাম থেকে প্রাথমিক প্রারম্ভের সাথে মিলিত হয় ।
- বেশিরভাগ চরিত্রের জন্য
k
, একটি অনুরূপ আছে &'k'
।
- যখন
k
হয় '
বা \
, যা চরিত্র লিটারেল ভিতরে পলান করা প্রয়োজন, এনকোডিং পরিবর্তে %'\k'
।
যেহেতু ডেটা এনকোডিংটি বাম মিশ্রণমূলক, তবে স্ট্রিংগুলি একটি ডান সংশ্লেটিভ পদ্ধতিতে তৈরি করা হয়েছে, সুতরাং মিশ্রণটিটি y = (\(?)v k x->v$k?x)
অমিলটি পূরণের জন্য প্রবর্তিত হয়েছিল।
y(...)
কুইন ডেটা (&)
এবং (%)
অপারেটর হিসাবে ব্যবহারের জন্য উপযুক্ত ফাংশন তৈরি করার উদ্দেশ্যে ।
v
স্ট্রিং থেকে স্ট্রিং পর্যন্ত একটি ফাংশন (কুইন ডেটার উদ্দেশ্যযুক্ত v
উদাহরণ)।
k
একটি চরিত্র, x
একটি স্ট্রিং এবং ?
একটি অপারেটর যা সেগুলিকে একটি নতুন স্ট্রিংয়ের সাথে সংযুক্ত করে। (মূল (?)=(:)
কোডটির জন্য, কুইন ডেটার উপস্থাপনাকে পুনর্গঠনের জন্য এটি আরও জটিল)
- এভাবে
y(?)v k = \x->v$k?x
স্ট্রিং থেকে স্ট্রিং-তে আরেকটি ফাংশন।
এটি কীভাবে সাহচর্য পরিবর্তন করে তার উদাহরণ হিসাবে, যদি (&)=y(:)
:
(v&k1&k2&k3) x
= (((v&k1)&k2)&k3) x
= y(:)(y(:)(y(:)v k1)k2)k3 x
= y(:)(y(:)v k1)k2 (k3:x)
= y(:)v k1 (k2:(k3:x))
= v (k1:(k2:(k3:x)))
= v (k1:k2:k3:x)
আরও সাধারণভাবে, কখন (#)
কুইন ডেটা ফাংশন হয় এবং f1,f2
স্ট্রিংগুলির সাথে অক্ষরের সাথে সংযুক্ত ফাংশনগুলি হয়:
(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))
(&)=y(f1)
এবং এর সাথে কুইন ডেটা ফাংশন প্রয়োগ করে এবং (%)=y(f2)
এটি নির্ধারিত ব্যবহার করে f1
এবং f2
কুইনের ডেটার অক্ষরগুলির সাথে একত্রিত করতে x
এবং তারপরে ফলাফলটি স্ট্রিংটি পাস করে v
।
মূল ল্যাম্বডা এক্সপ্রেশনটির দেহ এগুলি সমস্ত একসাথে রাখে:
(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
'&':q:k:q:x
একটি অক্ষর জন্য k
prepends &'k'
স্ট্রিং x
, যখন '%':q:'\\':k:q:x
prepends %'\k'
, যা তাদের মূল quine তথ্য ফর্ম।
- এইভাবে
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
কুইন ডেটা উপস্থাপনা পুনর্নির্মাণের জন্য সঠিক পরামিতিগুলি রয়েছে, চূড়ান্ত z
(খালি স্ট্রিং) এ প্রিপেন্ড করা হয় এবং তারপরে নিম্নলিখিত ফাংশনে প্রেরণ করা হয়।
y(:)#y(:)
অন্যান্য পরিবর্তন ছাড়াই কুইনের মূল কোডটিকে স্ট্রিংয়ে প্রেন্ডেন্ট করার জন্য সঠিক পরামিতি।
- অবশেষে
\x->x
নির্মিত কুইনের সাথে কিছুই করতে হবে না, যা ফিরে আসে returned