কিপলকে ব্যাখ্যা করুন!


12

ভূমিকা

কিপল হ'ল 2003 সালে মার্চ মাসে রুন বার্গ দ্বারা উদ্ভাবিত একটি স্ট্যাক-ভিত্তিক, গুপ্ত প্রোগ্রামিং ভাষা।

কিপলটিতে 27 টি স্ট্যাক, 4 জন অপারেটর এবং একটি নিয়ন্ত্রণ কাঠামো রয়েছে।

স্ট্যাক

স্ট্যাকগুলির নাম দেওয়া হয়েছে a- zএবং এতে 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা রয়েছে। @আউটপুট নম্বরগুলি আরও সুবিধাজনক করার জন্য একটি বিশেষ স্ট্যাকও রয়েছে। যখন কোনও সংখ্যার দিকে ধাক্কা দেওয়া হয় @, তখন সেই সংখ্যার অঙ্কগুলির ASCII মানগুলি আসলে পরিবর্তে ধাক্কা দেয়। (উদাহরণস্বরূপ, আপনি যদি 12 টি চাপেন তবে @এটি 49 এবং তারপরে 50 এর @পরিবর্তে চাপ দেবে ))

iপ্রোগ্রামটি কার্যকর হওয়ার আগে ইনপুটটিকে ইনপুট স্ট্যাকের দিকে ঠেলে দেওয়া হয়। দোভাষী তার iমৃত্যুদন্ড কার্যকর করার পূর্বে মানগুলি জিজ্ঞাসা করবেন । এক্সিকিউশন শেষ হওয়ার পরে, আউটপুট স্ট্যাকের যে কোনও কিছুই oASCII চরিত্র হিসাবে আউটপুটে পপ হয়। যেহেতু এটি কিপলের একমাত্র আইও প্রক্রিয়া, তাই কিপল প্রোগ্রামের সাথে আলাপচারিতা অসম্ভব।

অপারেটর

অপারেন্ড হ'ল স্ট্যাক শনাক্তকারী বা স্বাক্ষরিত 32 বিট পূর্ণসংখ্যা।

পুশ: >বা<

সিনট্যাক্স: Operand>StackIndentifierবাStackIndentifier<Operand

পুশ অপারেটর অপারেন্ডটিকে বাম দিকে নিয়ে যায় এবং নির্দিষ্ট স্ট্যাকের উপরে ঠেলে দেয়। উদাহরণস্বরূপ, 12>aস্ট্যাকের উপর 12 টি ধাক্কা দেবে aa>bস্ট্যাক থেকে শীর্ষতম মানটি পপ করবে aএবং এটিকে স্ট্যাকের উপরে ঠেলে দেবে b। একটি খালি স্ট্যাকের পপিং সবসময় ফেরৎ 0. a<bসমতূল্য b>aa<b>cপপ থেকে আগ মান bএবং push কর্মের উভয় cএবং a

যোগ করুন +

বাক্য গঠন: StackIndentifier+Operand

অ্যাড অপারেটর স্ট্যাকের শীর্ষস্থানীয় আইটেমের যোগফলটিকে স্ট্যাকের উপরে ঠেলে দেয়। অপারেন্ডটি যদি একটি স্ট্যাক হয়, তবে মানটি এটি থেকে পপ হয়। উদাহরণস্বরূপ, যদি স্ট্যাকের শীর্ষতম মানটি a1 হয়, তবে a+2এটি এর উপর 3 টি চাপবে। যদি aখালি থাকে, তবে a+2এটির উপরে 2 টি চাপুন। যদি স্ট্যাকের শীর্ষতম মানগুলি হয় aএবং b1 এবং 2 হয়, তবে a+bস্ট্যাক থেকে 2 মানটি পপ করবে bএবং 3 স্ট্যাকের দিকে ঠেলে দেবে a

বিয়োগ: -

বাক্য গঠন: StackIndentifier-Operand

সাবট্র্যাক্ট অপারেটর অ্যাড অপারেটরের মতো হুবহু কাজ করে, এটি যুক্ত করার পরিবর্তে বিয়োগ করে।

পরিষ্কার: ?

বাক্য গঠন: StackIndentifier?

ক্লিয়ার অপারেটর স্ট্যাকটি এর শীর্ষতম আইটেম 0 হলে খালি করে।

অনুবাদক, কিছু যে একটি অপারেটর পাশে নয় উপেক্ষা করা হবে, যাতে নিম্নলিখিত প্রোগ্রাম কাজ করবে: a+2 this will be ignored c<i। তবে মন্তব্য যুক্ত করার সঠিক উপায় হ'ল #চরিত্রটি ব্যবহার করে । একটি #এবং শেষ প্রান্তের অক্ষরের মধ্যে যে কোনও কিছুই কার্যকর করার আগে সরিয়ে ফেলা হয়। এএসসিআইআই অক্ষর # 10 কেপল-এ-লাইনের সমাপ্তি হিসাবে সংজ্ঞায়িত করা হয়েছে।

অপারেটরগুলি দুটি অপারেটর ভাগ করে নিতে পারে, যেমন a>b c>b c?লিখতে পারে a>b<c?

প্রোগ্রাম 1>a<2 a+aপরিণাম ডেকে আনবে aমানগুলি রয়েছে [1 4](নিচ থেকে উপরের দিকে) এবং [1 3]। একইভাবে -অপারেটর জন্য।

নিয়ন্ত্রণ কাঠামো

কিপলে একমাত্র নিয়ন্ত্রণ কাঠামো রয়েছে: লুপ।

বাক্য গঠন: (StackIndentifier code )

যতক্ষণ না নির্দিষ্ট স্ট্যাকটি খালি না থাকে, ততক্ষণ ম্যাচের বন্ধনীগুলির মধ্যে কোডটি পুনরাবৃত্তি হবে। লুপগুলিতে অন্যান্য লুপ থাকতে পারে। উদাহরণস্বরূপ, (a a>b)স্ট্যাকের সমস্ত মানগুলি স্ট্যাকের aদিকে সরানো হবে b, যদিও ক্রমটি বিপরীত হবে । কার্যত অভিন্ন, তবে এটি করার জন্য আরও মার্জিত উপায় (a>b)

উদাহরণ

100>@ (@>o)

এই আউটপুট হবে 100

33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o

এটি মুদ্রণ করবে "Hello World!"। যখন oস্ট্যাক আউটপুট হচ্ছে, এটি স্ট্যাকের শীর্ষ থেকে নীচে অক্ষরগুলি পপ করতে শুরু করে।

#prime.k by Jannis Harder
u<200
#change 200


k<2>m
u-2
(u-1 u>t u>z u<t
  (k>e e+0 e>r)
  (e>k)
  m+1
  m>t
  m>z
  m<t
  t<0>z? t?
  1>g
  (r>b
    m+0 m>a
    b+0 b>w
    (a-1 
      b+0 b>j
      j?
      1>s
      (j<0>s j?)
      s?
      (s<0 w+0 w>b s?)
      a>t
      a>z
      t>a
      b-1
      b>t
      b>z
      t>b
      z<0>t? z?
    a?)
    b?
    1>p
    (b<0 b? 0>p)
    p?
    (p 0>r? 0>p? 0>g)
  )
  g?
  (g m+0 m>k 0>g?)
u?)
(k>@
  10>o
  (@>o)
)

এটি একটি প্রাথমিক সংখ্যা জেনারেটর, তবে এটি কীভাবে কাজ করে তা আমি নিশ্চিত নই।

বিধি

  • আপনাকে অবশ্যই এমন একটি প্রোগ্রাম / ফাংশন লিখতে হবে যা কিপলকে ব্যাখ্যা করে। এই প্রোগ্রাম / ফাংশনটি কোনও সোর্স ফাইলের মাধ্যমে একটি কিপল প্রোগ্রাম পেতে পারে বা সরাসরি ব্যবহারকারীর কাছ থেকে এটি এসটিডিনের মাধ্যমে পেতে পারে। যদি এসটিডিএন উপলভ্য না থাকে তবে এটি অবশ্যই কীবোর্ড ইনপুট থেকে পাওয়া উচিত এবং নির্দিষ্ট অনিদ্রিত অক্ষর প্রবেশ না করা অবধি ইনপুট পাওয়া চালিয়ে যেতে হবে। উদাহরণস্বরূপ, যদি আপনার দোভাষীটি x86 মেশিন কোডে লেখা থাকে তবে এটি কীবোর্ড থেকে অক্ষর অনুসারে কিপল প্রোগ্রামের চরিত্রটি পেতে পারে এবং esc(বা অন্য কোনও কী যা মুদ্রণযোগ্য অক্ষর নির্গত করে না) চাপানো না হওয়া অবধি এটি চালিয়ে যেতে পারে ।

  • যদি কোনও ত্রুটি থাকে, যেমন একটি সিনট্যাক্স ত্রুটি বা স্ট্যাক ওভারফ্লো, তবে এটি অবশ্যই কোনও উপায়ে স্বীকৃতি দিতে হবে, উদাহরণস্বরূপ 0 এর পরিবর্তে 10 বা দোভাষী / সংকলক দ্বারা উত্পাদিত ত্রুটি বার্তাগুলির মাধ্যমে, তবে বার্তা প্রিন্টিং নয়

  • কোড গল্ফের জন্য অন্য কোনও নিয়মিত নিয়ম এই চ্যালেঞ্জের জন্য প্রয়োগ করে।

  • আপনার কোড কিপলের নমুনা সংরক্ষণাগারটিতে কয়েকটি উদাহরণ দিয়ে পরীক্ষা করা হবে

এটি একটি । বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে। শুভকামনা!


নোট করুন যে কিপ্পলে একটি optionচ্ছিক অপারেটর রয়েছে "তবে এটি স্পেসিফিকেশনের অংশ নয় এবং সরকারী দোভাষীর কেবল একটি অতিরিক্ত বৈশিষ্ট্য। আমি এখানে এটি উল্লেখ করি নি তাই এটি আপনার জমা দেওয়ার ক্ষেত্রে সমর্থন করার দরকার নেই।

নির্দিষ্টকরণের কোনও অংশ সম্পর্কে আপনার যদি সন্দেহ থাকে তবে আপনি এটি জাভাতে লিখিত সরকারী দোভাষী দ্বারা পরীক্ষা করতে পারেন । এটি একটি জিপ ফাইল ডাউনলোড করবে যা সংকলিত প্রোগ্রাম এবং উত্স কোড রয়েছে। এটি জিপিএলের আওতায় লাইসেন্সপ্রাপ্ত।


1
আমাদের কি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা ব্যবহার করতে হবে বা আমরা হোস্ট বাস্তবায়নের প্রাকৃতিক পূর্ণসংখ্যার ধরণের সাথে যেতে পারি? (সর্বাধিক গুরুত্বপূর্ণ ক্ষেত্রে সম্ভবত স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যার, স্বাক্ষরিত বা স্বাক্ষরিত 8-বিট পূর্ণসংখ্যার এবং স্বেচ্ছাসেবক-নির্ভুলতা পূর্ণসংখ্যা হয়))
মার্টিন ইন্ডার

ঠিক আছে, এটি আমি এসোট্রিক উইকিতে পেয়েছি। হ্যাঁ, কারণ আপনার অনুবাদক অন্যান্য কিপল প্রোগ্রামগুলির সাথে বেমানান থাকতে পারেন যা তাদের প্রক্রিয়াটি এই বৈশিষ্ট্যটির উপর ভিত্তি করে রয়েছে

আপনি কি ত্রুটির ক্ষেত্রে আচরণ সম্পর্কে আরও সুনির্দিষ্ট হতে পারেন? সুতরাং আমরা একটি ভুল উত্তর দিতে পারি বা ত্রুটি নির্গত করতে পারি, তবে আমরা ত্রুটিটি প্রিন্ট করতে পারি না?
অ্যালেক্স এ।

@ অ্যালেক্স এ। হ্যাঁ, কারণ এটি প্রোগ্রামের আউটপুট হিসাবে বিবেচিত হতে পারে, এবং আপনি একটি কিপল প্রোগ্রাম তৈরি করতে পারেন যা ত্রুটি বার্তার মতো একই আউটপুট থাকতে পারে। ত্রুটি বার্তা প্রিন্ট করে এমন কোনও ফাংশন / বিবৃতি না রাখার জন্য এটি "সস্তা" (কম অক্ষর ব্যবহার করে) is

3
কোন উত্স প্রোগ্রামে হোয়াইটস্পেস ঘটতে পারে? iআমি স্টিডিন থেকে উত্স প্রোগ্রামটি নিলে কীভাবে ইনপুট জিজ্ঞাসা করতে পারি ?
orlp

উত্তর:


6

সি, 709 702 বাইট

বাইট স্কোরটি নতুন লাইনের সাথে রয়েছে (এটি মুছতে পারে) সরানো হয়েছে তবে পড়া সহজ করার জন্য আমি এখানে নিউলাইনগুলি সহ পোস্ট করছি:

#define R return
#define C ;break;case
c[999]={};*P=c;*S[28];M[99999]={};t;*T;
u(s,v){S[s]+=28;*S[s]=v;
if(s>26){for(t=v/10;t;t/=10)S[s]+=28;T=S[s];do{*T=48+v%10;T-=28;}while(v/=10);}}
o(s){t=S[s]-M>27;S[s]-=28*t;R S[s][28]*t;}
I(s){R s<65?27:s-97;}
O(int*p){if(!isdigit(*p))R o(I(*p));
for(;isdigit(p[-1]);--p);for(t=0;isdigit(*p);t*=10,t+=*p++-48);R t;}

main(i,a){for(i=0;i<28;++i)S[i]=M+i;
for(;~(*++P=getchar()););P=c+1;
for(;;){i=I(P[-1]);switch(*P++){
case 35:for(;*P++!=10;)
C'<':u(i,O(P))
C'>':u(I(*P),O(P-2))
C'+':u(i,*S[i]+O(P))
C'-':u(i,*S[i]-O(P))
C'?':if(!*S[i])S[i]=M+i
C'(':for(i=1,T=P;i;++T)i+=(*T==40)-(*T==41);if(S[I(*P)]-M<28)P=T;else u(26,P-c)
C')':P=c+o(26)-1
C-1:for(;i=o(14);)putchar(i); R 0;}}}

সাথে সংকলন করুন gcc -w golf.c( -wআপনার বিড়ালের জন্য সতর্কতাগুলি স্থির করে)।

iইনপুট ব্যতীত সমস্ত কিছুর সমর্থন করে , কারণ আপনি স্টিডিনের কাছ থেকে কোড নিলে কীভাবে এটি করতে হবে সে সম্পর্কে আমার তদন্তে এখনও জিজ্ঞাসাবাদকারী প্রতিক্রিয়া জানায়নি। এটি সিনট্যাক্স ত্রুটির প্রতিবেদন করে না।


প্রধান পোস্টের মন্তব্যে আমি "আই" স্ট্যাক সম্পর্কে আপনার প্রশ্নের উত্তর দিয়েছি।

বিটিডাব্লু কীভাবে এটি কেপল প্রোগ্রামগুলি পড়ে? কমান্ড আর্গুমেন্টের মাধ্যমে? আমার এটি কীভাবে ব্যবহার করা উচিত?

@ গ্লাসিক এটি স্টিনে প্রোগ্রামটি আশা করে exp
orlp

যখন পর্যন্ত ? কিভাবে এক্সকিউশন শুরু করবেন?

@ গ্লাসিক কেবল স্টিডিনে প্রোগ্রামটি পাস করুন। যেমন ./a.out < prime.k
orlp

3

রুবি, 718 বাইট (বর্তমানে নন-কেপটিং)

আমি খুবই ক্লান্ত

ফাইলটি একটি কমান্ড লাইন আর্গুমেন্ট হিসাবে লোড করা হয় এবং এসটিডিআইএন এর মাধ্যমে ইনপুট প্রেরণ করা হয়। বিকল্পভাবে, আপনার iনিবন্ধের ইনপুট প্রয়োজন না হলে ফাইলটি STDIN এ পাইপ করুন ।

অনুমানের বিষয়ে কিছু বিভ্রান্তির কারণে, বর্তমান সংস্করণটি a<b>cসঠিকভাবে পরিচালনা করছে না, এবং তাই এটি স্থির না হওয়া অবধি প্রতিযোগিতা করা।

a<b>cএখনই স্থির যাইহোক, প্রাইমস ফাংশনটি চালানোর সময় এটি এখনও ভুল ফলাফল প্রদান করে, তাই এটি এখনও একটি নন-ক্যাপ্টিং উত্তর হিসাবে রয়ে গেছে।

(f=$<.read.gsub(/#.*?\n|\s[^+-<>#()?]*\s/m,' ').tr ?@,?`
t=Array.new(27){[]}
t[9]=STDIN.read.bytes
k=s=2**32-1
r=->c{c=c[0];c[0]==?(?(s[c[1..-2]]while[]!=t[c[1].ord-96]):(c=c.sub(/^(.)<(\D)>(.)/){$1+"<#{t[$2.ord-96].pop||0}>"+$3}.sub(/(\d+|.)(\W)(\d+|.)?/){_,x,y,z=*$~
a=x.ord-96
b=(z||?|).ord-96
q=->i,j=z{j[/\d/]?j.to_i: (t[i]||[]).pop||0}
l=t[a]
y<?-?(x==z ?l[-1]*=2:l<<(l.pop||0)+q[b]
l[-1]-=k while l[-1]>k/2):y<?.?(x==z ?l[-1]=0:l<<(l.pop||0)-q[b]
l[-1]+=k while l[-1]<-k/2-1):y<?>?t[a]+=a<1?q[b].to_s.bytes: [q[b]]:y<???
(t[b]+=b<1?q[a,x].to_s.bytes: [q[a,x]]): l[-1]==0?t[a]=[]:0
z||x}while c !~/^(\d+|.)$/)}
s=->c{(z=c.scan(/(\((\g<1>|\s)+\)|[^()\s]+)/m)).map &r}
s[f]
$><<t[15].reverse.map(&:chr)*'')rescue 0

যাইহোক +1। আপনি কি ফাইবোনাকি প্রোগ্রামটি ব্যবহার করে দেখেছেন?
edc65

@ এডসি 65 ফিবোনাচি সিকোয়েন্স প্রোগ্রামটি ভুল জিনিসটিও প্রিন্ট করে: 0 1 1 2 4 8 16...আমি ভাবছি এটি কোনও নির্দিষ্ট ত্রুটি কিনা
মান কালি

না, ফিবোনাচি প্রোগ্রামটি বোকা, উদাহরণস্বরূপ লাইনটি a+0আজেবাজে কথা
edc65

আমি অনুমান করি যে প্রাইম সংখ্যা সম্পর্কে সমস্যাটি হ'ল এটি নেস্টেড কন্ট্রোল স্ট্রাকচারগুলি পরিচালনা করে না, তবে আমি রুবি সম্পর্কে খুব বেশি কিছু জানি না, আমি আমার অনুমানটির সঠিক সন্দেহ করি।

এই প্রোগ্রামটি প্যারেন্সের নেস্টেড সেটগুলি সঠিকভাবে পরিচালনা করতে হবে কারণ /(\((\g<1>|\s)+\)|[^()\s]+)/mএটি টোকেন এবং টোকেনের গোষ্ঠীতে বিভক্ত হয়ে আসার জন্য পুনরাবৃত্তির রেগেক্স ম্যাচটি ব্যবহার করে। ( এটি regex101 এ পরীক্ষা করুন )। এটি আমার বাকী বিশ্লেষণে সম্ভবত একটি ত্রুটি, তবে আমি জানি না কোথায়।
মান কালি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.