একটি মিনস্কি রেজিস্টার মেশিন অনুকরণ করুন (I)


26

অনেকগুলি আনুষ্ঠানিকতা রয়েছে, সুতরাং আপনি অন্যান্য উত্সগুলি দরকারী মনে করতে পারলে আমি এটিকে স্পষ্টভাবে নির্দিষ্ট করার জন্য আশা করি যে তারা প্রয়োজনীয় নয়।

একটি আরএম একটি সসীম স্টেট মেশিন এবং সুনির্দিষ্ট নামধারী রেজিস্ট্রি নিয়ে গঠিত, যার প্রত্যেকটিতে একটি অ-নেতিবাচক পূর্ণসংখ্যা থাকে। পাঠ্য ইনপুট আরামের জন্য এই টাস্কটির রাজ্যগুলির নামকরণও প্রয়োজন।

রাষ্ট্রের তিন প্রকার রয়েছে: বৃদ্ধি এবং হ্রাস, যা উভয়ই একটি নির্দিষ্ট রেজিস্টারকে উল্লেখ করে; এবং অবসান। একটি বর্ধিত অবস্থা তার নিবন্ধককে বাড়ায় এবং তার এক উত্তরসূরের নিয়ন্ত্রণ নিয়ন্ত্রণ করে। একটি হ্রাস রাষ্ট্রের দুটি উত্তরসূরি রয়েছে: এটির নিবন্ধ যদি শূন্য না হয় তবে এটি এটি হ্রাস করে এবং প্রথম উত্তরাধিকারীর নিয়ন্ত্রণ নিয়ন্ত্রণ করে; অন্যথায় (যেমন নিবন্ধটি শূন্য) এটি কেবল দ্বিতীয় উত্তরাধিকারীর নিয়ন্ত্রণ নিয়ন্ত্রণ করে।

প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে "কৌতূহল" জন্য, টার্মিনেটের রাজ্যগুলি মুদ্রণের জন্য কঠোর কোডেড স্ট্রিং নেয় (যাতে আপনি ব্যতিক্রমী সমাপ্তির ইঙ্গিত দিতে পারেন)।

ইনপুট স্টিডিনের। ইনপুট ফর্ম্যাটটিতে প্রতি রাজ্যে এক লাইন থাকে, তারপরে প্রাথমিক রেজিস্টার সামগ্রীগুলি থাকে। প্রথম লাইনটি প্রাথমিক অবস্থা। রাষ্ট্রীয় লাইনের জন্য বিএনএফ হ'ল:

line       ::= inc_line
             | dec_line
inc_line   ::= label ' : ' reg_name ' + ' state_name
dec_line   ::= label ' : ' reg_name ' - ' state_name ' ' state_name
state_name ::= label
             | '"' message '"'
label      ::= identifier
reg_name   ::= identifier

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

ইনপুটটির চূড়ান্ত লাইন, যা প্রাথমিক নিবন্ধকারকের মান দেয়, এটি শনাক্তকারী = int অ্যাসাইনমেন্টের একটি স্থান-বিভাজিত তালিকা, যা অবশ্যই খালি নয়। এটি প্রোগ্রামের নামকৃত সকল নিবন্ধককে সূচনা করার প্রয়োজন হয় না: যে কোনও সূচনা হয় না তা 0 বলে ধরে নেওয়া হয়।

আপনার প্রোগ্রামটির ইনপুটটি পড়তে হবে এবং আরএম অনুকরণ করতে হবে। যখন এটি একটি সমাপ্ত অবস্থায় পৌঁছায় তখন বার্তাটি, একটি নতুন লাইন এবং তারপরে সমস্ত নিবন্ধকের মানগুলি (যে কোনও সুবিধাজনক, মানব-পঠনযোগ্য, বিন্যাস এবং যে কোনও ক্রমে) প্রেরণ করা উচিত।

দ্রষ্টব্য: আনুষ্ঠানিকভাবে নিবন্ধকদের আনবাউন্ডেড পূর্ণসংখ্যা রাখা উচিত। তবে, আপনি যদি ধরে নিতে চান তবে কোনও নিবন্ধকের মান 2 ^ 30 এর বেশি হবে না।

কিছু সহজ উদাহরণ

a + = b, a = 0
s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4

প্রত্যাশিত ফলাফল:

Ok
a=0 b=7
বি + = এ, টি = 0
init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4

প্রত্যাশিত ফলাফল:

Ok
a=3 b=7 t=0
ট্রিকিয়ার থেকে পার্স মেশিনগুলির পরীক্ষার কেস
s0 : t - s0 s1
s1 : t + "t is 1"
t=17

প্রত্যাশিত ফলাফল:

t is 1
t=1

এবং

s0 : t - "t is nonzero" "t is zero"
t=1

প্রত্যাশিত ফলাফল:

t is nonzero
t=0

আরও জটিল উদাহরণ

ডেইলিডব্লিউটিএফ এর জোসেফাস সমস্যা কোড চ্যালেঞ্জ থেকে নেওয়া। ইনপুট হ'ল এন (সৈন্য সংখ্যা) এবং কে (অগ্রিম) এবং আর ইন আউটপুট হ'ল বেঁচে থাকা ব্যক্তির (শূন্য সূচকযুক্ত) অবস্থান।

init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3

প্রত্যাশিত ফলাফল:

Ok
i=40 k=3 n=0 r=27 t=0

সেই চিত্রটি চিত্র হিসাবে, যারা দর্শনীয়ভাবে চিন্তা করেন এবং সিনট্যাক্সটি উপলব্ধি করতে সহায়ক বলে মনে করেন: জোসেফাস সমস্যা আরএম

আপনি যদি এই গল্ফটি উপভোগ করেন তবে সিক্যুয়ালটি দেখুন


ইনপুট স্টিডিন, কোনও ফাইল বা অন্য কোথাও থেকে এসেছে?
কেভিন ব্রাউন 21

@ বাসন, স্টিডিন থেকে
পিটার টেলর 21

নিম্নলিখিত সমস্যাগুলি হ্যান্ডেল করার জন্য আপনার কয়েকটি পরীক্ষার কেস যুক্ত করা উচিত: 1) স্পেস সহ বার্তা, 2) সমান চিহ্ন সহ বার্তা, 3) ইন_লাইনে বার্তাগুলি, 4) ডেস্কলাইনের প্রথম অবস্থায় বার্তা, 5) ফাঁকা জায়গাগুলিতে বার্তা কেস 3 এবং 4
এমটিএনভিউমার্ক

ব্যাকরণটির একটি ত্রুটি রয়েছে: দুটি রাজ্য_নামের প্রবেশ_দিকের মধ্যে প্রবেশের মধ্যে একটি আক্ষরিক স্থান থাকা দরকার। আপনি যদি ইনপুটে টোকেনের মধ্যে একাধিক স্পেস গ্রহণ করতে লোকের প্রয়োজন বোঝাতে চান তবে এটিও অস্পষ্ট।
এমটিএনভিউমার্ক

2
@ পিটার: স্পেসিফিকেশনের ভাল ভারসাম্য এবং কসরত করার জন্য কক্ষ সহ সত্যই মাংসল কোড-গল্ফের জন্য +1! এখানে বেশিরভাগ প্রশ্ন অনেক বেশি পাতলা হয়েছে।
এমটিএনভিউমার্ক

উত্তর:


10

পার্ল, 166

@p=<>;/=/,$_{$`}=$' for split$",pop@p;$o='\w+';(map{($r
,$o,$,,$b)=$'=~/".*?"|\S+/g if/^$o :/}@p),$_=$o=($_{$r}
+=','cmp$o)<0?do{$_{$r}=0;$b}:$,until/"/;say for eval,%_

সাথে চালাও perl -M5.010 file

এটি মারাত্মকভাবে আলাদা শুরু হয়েছিল, তবে আমি ভয় পাচ্ছি যে এটি অনেক অঞ্চলে রুবি সমাধানের সাথে শেষের দিকে রূপান্তরিত হয়েছে। দেখে মনে হচ্ছে রুবির সুবিধা "নো সিগিলস", এবং পার্লের "আরও ভাল রেজেক্স ইন্টিগ্রেশন"।

অভ্যন্তরীণ এলাকা থেকে কিছুটা বিশদ, আপনি যদি পার্ল না পড়েন:

  • @p=<>: সম্পূর্ণ মেশিনের বিবরণটি পড়ুন @p
  • /=/,$_{$`}=$' for split$",pop@p: প্রতিটি (জন্য for) অ্যাসাইনমেন্ট ( split$") গত মেশিন বিবরণ লাইন (মধ্যে @p), সমান চিহ্ন (সনাক্ত /=/) তাহলে বরাদ্দ মূল্য $'hask করার %_চাবি$`
  • $o='\w+': পার্ল রেজেক্স "শব্দের অক্ষর" মিলানোর জন্য প্রাথমিক অবস্থা প্রথম হবে
  • until/"/: লুপটি অবসান না হওয়া পর্যন্ত:
    • map{($r,$o,$,,$b)=$'=~/".*?"|\S+/g if/^$o :/}@p: মেশিনের বিবরণে লুপ @p: যখন আমরা বর্তমান অবস্থার সাথে মিলিত লাইনে থাকি ( if/^$o :/), টোকেনাইজ ( /".*?"|\S+/g) বাকী রেখাটি $'ভেরিয়েবলের সাথে ($r,$o,$,,$b)। ট্রিক: একই পরিবর্তনশীল $oযদি প্রাথমিকভাবে লেবেলের নাম এবং পরবর্তীকালে অপারেটরের জন্য ব্যবহৃত হয় used লেবেলটি মিলার সাথে সাথে অপারেটর এটিকে ওভাররাইড করে এবং একটি লেবেল হিসাবে (যুক্তিসঙ্গত) + বা - নাম দেওয়া যায় না, এটি আর কখনও মেলে না।
    • $_=$o=($_{$r}+=','cmp$o)<0?do{$_{$r}=0;$b}:$,:
      - লক্ষ্য রেজিস্টার $_{$r}উপরে বা নীচে সামঞ্জস্য করুন (এএসসিআইআই যাদু: ','cmp'+'1 যেখানে ','cmp'-'-1);
      - যদি ফলাফলটি নেতিবাচক হয় (তবে <0?কেবল এর জন্য ঘটতে
      পারে ) - তবে 0 ( $_{$r}=0) এ থাকুন এবং দ্বিতীয় লেবেল ফিরে আসুন $b;
      - অন্যথায় প্রথমে (সম্ভবত একমাত্র) লেবেল ফিরে আসুন$,
    • বিটিডাব্লু, এটির $,পরিবর্তে $aএটির untilমধ্যে কোনও সাদা স্থান না দিয়ে পরবর্তী টোকেনে আটকানো যেতে পারে ।
  • say for eval,%_: ডাম্প রিপোর্ট ( eval) এবং এর মধ্যে নিবন্ধগুলির সামগ্রী%_

আপনি সত্যিই মধ্যে কোলন প্রয়োজন হবে না /^$o :/। কেবলমাত্র লেবেলগুলি দেখছেন তা নিশ্চিত করার জন্য কেবল ক্যারেটই যথেষ্ট।
লোজ্যাকার

@ লাওজ্যাকার আমি সঠিক লেবেলে রয়েছি তা নির্ধারণ করার জন্য আমার এটির দরকার নেই তবে আমার এটিকে বাইরে রাখা দরকার $'। এটি রেজেক্সে একটি চরিত্র, এটি $c,বাইরে থেকে অ্যাকাউন্টে তিনটি হবে । পর্যায়ক্রমে কিছু বড় এখনও টোকেনাইজিং রেজেক্সে পরিবর্তন।
জেবি

10

পাইথন + সি, 466 টি অক্ষর

কেবল মজাদার জন্য, একটি অজগর প্রোগ্রামটি আরএম প্রোগ্রামকে সি-তে সংকলিত করে, তারপরে সিটিকে সংকলন ও চালিত করে

import sys,os,shlex
G=shlex.shlex(sys.stdin).get_token
A=B=''
C='_:'
V={}
J=lambda x:'goto '+x+';'if'"'!=x[0]else'{puts('+x+');goto _;}'
while 1:
 L,c=G(),G()
 if''==c:break
 if':'==c:
  v,d=G(),G()
  V[v]=1;B+=L+c+v+d+d+';'
  if'+'==d:B+=J(G())
  else:B+='if('+v+'>=0)'+J(G())+'else{'+v+'=0;'+J(G())+'}'
 else:A+=L+c+G()+';'
for v in V:C+='printf("'+v+'=%d\\n",'+v+');'
open('C.c','w').write('int '+','.join(V)+';main(){'+A+B+C+'}')
os.system('gcc -w C.c;./a.out')

3
রেজিস্টারগুলিতে ' main', ' if' ইত্যাদির মতো নাম থাকলে এটি কাজ করবে না
ন্যাব

1
@ ন্যাব: বাজকিল আমি সঠিক জায়গায় আন্ডারস্কোর উপসর্গ যুক্ত করার জন্য এটি পাঠকের কাছে রেখেছি।
কিথ র্যান্ডাল

6

হাস্কেল, 444 অক্ষর

(w%f)(u@(s,v):z)|s==w=(s,f+v):z|t=u:(w%f)z
(w%f)[]=[(w,f)]
p#(a:z)|j==a=w p++[j]&z|t=(p++[a])#z;p#[]=w p
p&(a:z)|j==a=p:""#z|t=(p++[a])&z
c x=q(m!!0)$map((\(s,_:n)->(s,read n)).break(=='=')).w$last x where
 m=map(""#)$init x
 q[_,_,r,"+",s]d=n s$r%1$d
 q[_,_,r,_,s,z]d|maybe t(==0)(lookup r d)=n z d|t=n s$r%(-1)$d
 n('"':s)d=unlines[s,d>>=(\(r,v)->r++'=':shows v" ")]
 n s d=q(filter((==s).head)m!!0)d
main=interact$c.lines
t=1<3;j='"';w=words

ম্যান, ওটা শক্ত ছিল! স্পেস সহ বার্তাগুলির যথাযথভাবে পরিচালনার জন্য 70 টিরও বেশি অক্ষর রয়েছে। আউটপুট ফর্ম্যাটিং আরও "মানব পাঠযোগ্য" হতে পারে এবং উদাহরণগুলির সাথে মেলে আরও 25 টাকা খরচ হয়।


  • সম্পাদনা করুন: (498 -> 482) বিভিন্ন ছোট ইন-লিনিংগুলি, এবং @ FUZxxl এর কিছু পরামর্শ
  • সম্পাদনা করুন: (482 -> 453) নিবন্ধগুলির জন্য প্রকৃত সংখ্যা ব্যবহার করে ফিরে যান; অনেক গল্ফ কৌশল প্রয়োগ করা হয়েছে
  • সম্পাদনা করুন: (453 -> 444) ইনলাইনড আউটপুট ফর্ম্যাটিং এবং প্রাথমিক মান পার্সিং

আমি হাস্কেলকে চিনি না, সুতরাং আমি সমস্ত সিনট্যাক্সটি ডিক্রিফার করতে পারি না, তবে আপনি নিবন্ধের বিষয়বস্তুর জন্য তালিকা ব্যবহার করছেন তা দেখতে আমি যথেষ্ট পরিমাণে ডিসিফার করতে পারি। আমার অবশ্যই বলতে হবে আমি আশ্চর্য হয়েছি যে এটি কীট ব্যবহারের চেয়ে কম।
পিটার টেলর

whereসেমিকোলন দ্বারা বিভক্ত একক লাইনে স্থানীয় বাইন্ডিংগুলি স্থাপন করা আপনাকে 6 টি অক্ষর বাঁচাতে পারে। এবং আমি অনুমান করি যে আপনি qযদি অন্যথায় কোনও প্যাটার্ন গার্ডে ভার্জোজটি পরিবর্তন করে সংজ্ঞা অনুসারে কিছু অক্ষর সংরক্ষণ করতে পারেন।
FUZxxl

এবং এছাড়াও: কেবল অন্ধভাবে ধরে নিন, তৃতীয় মানটি "-"সংজ্ঞায় রয়েছে qএবং পরিবর্তে একটি আন্ডারস্কোর ব্যবহার করুন।
FUZxxl

আমার ধারণা, আপনি 8 থেকে লাইন পরিবর্তন করে অন্য চরটি সংরক্ষণ করতে পারেন q[_,_,r,_,s,z]d|maybe t(==0)$lookup r d=n z d|t=n s$r%(-1)$d। তবে যাইহোক, এই প্রোগ্রামটি খুব ভাল গল্ফ করা হয়।
FUZxxl

প্রিলিওডের সুবিধা নিয়ে আপনি পার্সিং কোডটি যথেষ্ট সংক্ষিপ্ত করতে পারেন lex। উদাহরণস্বরূপ, f[]=[];f s=lex s>>= \(t,r)->t:f rউদ্ধৃত স্ট্রিংগুলি সঠিকভাবে পরিচালনা করার মতো কিছু লাইন টোকনে বিভক্ত করবে।
হামার

6

রুবি 1.9, 214 212 211 198 195 192 181 175 173 175

*s,k=*$<
a,=s
b=Hash.new 0
eval k.gsub /(\w+)=/,';b["\1"]='
loop{x,y,r,o,t,f=a.scan /".*?"|\S+/
l=(b[r]-=o<=>?,)<0?(b[r]=0;f):t
l[?"]&&puts(eval(l),b)&exit
a,=s.grep /^#{l} /}

আমি একে অপরের লেবেল উপসাগর এ ব্যর্থ হবে আশা করি। থটস?
জেবি

আমি উদাহরণগুলি ছাড়া অন্য কোনও ক্ষেত্রে এটি কাজ করে দেখছি না। এতে দোষ কী ?
জেবি

আমি এখন এটি স্থির মনে করি।
লোজ্যাকার

আহ, আরও ভাল। ধন্যবাদ.
জেবি

3

দেলফি, 646 6

বিভাজন স্ট্রিং এবং স্টাফগুলি সম্পর্কে ডেলফি খুব বেশি প্রস্তাব দেয় না। ভাগ্যক্রমে, আমাদের জেনেরিক সংগ্রহ রয়েছে, যা কিছুটা সহায়তা করে, তবে এটি এখনও একটি লার্জিকাল সমাধান:

uses SysUtils,Generics.Collections;type P=array[0..99]of string;Y=TDictionary<string,P>;Z=TDictionary<string,Int32>;var t:Y;l,i:string;j,k:Int32;q:P;u:Z;v:TPair<string,Int32>;begin t:=Y.Create;repeat if i=''then i:=q[0];t.Add(q[0],q);ReadLn(l);for j:=0to 6do begin k:=Pos(' ',l+' ');q[j]:=Copy(l,1,k-1);Delete(l,1,k)end;until q[1]<>':';u:=Z.Create;j:=0;repeat k:=Pos('=',q[j]);u.Add(Copy(q[j],1,k-1),StrToInt(Copy(q[j],k+1,99)));Inc(j)until q[j]='';repeat q:=t[i];i:=q[4];u.TryGetValue(q[2],j);if q[3]='+'then Inc(j)else if j=0then i:=q[5]else Dec(j);u.AddOrSetValue(q[2],j)until i[1]='"';WriteLn(i);for v in u do Write(v.Key,'=',v.Value,' ')end.

এখানে ইন্টেন্টেড এবং মন্তব্য করা সংস্করণ:

uses SysUtils,Generics.Collections;
type
  // P is a declaration line, offsets:
  // 0 = label
  // 1 = ':'
  // 2 = register
  // 3 = operation ('-' or '+')
  // 4 = 1st state (or message)
  // 5 = 2nd state (or message)
  P=array[0..99]of string;
  // T is a dictionary of all state lines :
  Y=TDictionary<string,P>;
  // Z is a dictionary of all registers :
  Z=TDictionary<string,Int32>;
var
  t:Y;
  l,
  i:string;
  j,
  k:Int32;
  q:P;
  u:Z;
  v:TPair<string,Int32>;
begin
  // Read all input lines :
  t:=Y.Create;
  repeat
    // Put all lines into a record
    if i=''then i:=q[0];
    t.Add(q[0],q);
    // Split up each input line on spaces :
    ReadLn(l);
    for j:=0to 6do
    begin
      k:=Pos(' ',l+' ');
      q[j]:=Copy(l,1,k-1);
      Delete(l,1,k)
    end;
    // Stop when there are no more state transitions :
  until q[1]<>':';
  // Scan initial registers :
  u:=Z.Create;
  j:=0;
  repeat
    k:=Pos('=',q[j]);
    // Add each name=value pair to a dictionary :
    u.Add(Copy(q[j],1,k-1),StrToInt(Copy(q[j],k+1,99)));
    Inc(j)
  until q[j]='';
  // Execute the state machine :
  repeat
    q:=t[i];
    i:=q[4];
    u.TryGetValue(q[2],j);
    if q[3]='+'then
      Inc(j)
    else
      if j=0then
        i:=q[5]
      else
        Dec(j);
    u.AddOrSetValue(q[2],j)
  until i[1]='"';
  WriteLn(i);
  for v in u do
    Write(v.Key,'=',v.Value,' ')
end.

1

পিএইচপি, 446 441 402 398 395 389 371 370 366 টি অক্ষর

<?$t=trim;$e=explode;while($l=$t(fgets(STDIN))){if(strpos($l,"=")){foreach($e(" ",$l)as$b){list($k,$c)=$e("=",$b);$v[$k]=$c;}break;}list($k,$d)=$e(":",$l);$r[$z=$t($k)]=$t($d);$c=$c?:$z;}while($d=$e(" ",$r[$c],4)){$c=$v[$a=$d[0]]||!$d[3]?$d[2]:$d[3];if(!$r[$c]){eval("echo $c.'\n';");foreach($v as$k=>$c)echo$k."=".$c." ";die;}if(!$d[3]&&++$v[$a]||$v[$a]&&--$v[$a]);}

Ungolfed


<?php

$register = array();
$values = array();

while($line = trim(fgets(STDIN))){

    if(strpos($line, "=")){

        // Set each value and then continue to the calculations

        foreach(explode(" ", $line) as $var){
            list($key, $val) = explode("=", $var);

            $values[$key] = $val;
        }

        break;
    }

    list($key, $data) = explode(":", $line);

    // Add data to the register

    $register[$z = trim($key)] = trim($data);

    // Set the first register

    $current = $current?:$z;
}

while($data = explode(" ", $register[$current], 4)){

    // Determine next register and current register

    $current = $values[$target = $data[0]] || !$data[3]? $data[2] : $data[3];

    // Will return true if the register does not exist (Messages wont have a register)

    if(!$register[$current]){

        // No need to strip the quotes this way

        eval("echo$current.'\n';");

        // Print all values in the right formatting

        foreach($values as $key => $val)
            echo $key."=".$val." ";

        die();
    }

    // Only subtraction has a third index
    // Only positive values return true

    // If there is no third index, then increase the value
    // If there is a third index, increment the decrease the value if it is positive

    // Uses PHP's short-circuit operators

    if(!$data[3] && ++$values[$target] || $values[$target] && --$values[$target]);
}

পরিবর্তণের


446 -> 441 : প্রথম রাজ্যের জন্য স্ট্রিং সমর্থন করে এবং কিছুটা সামান্য সংক্ষেপণ
441 -> 402 : সংক্ষিপ্ত থাকলে / অন্যথায় এবং অ্যাসাইনমেন্ট বিবৃতি যতটা সম্ভব
402 -> 398 : ফাংশন নামগুলি স্ট্রেন্ট হিসাবে ব্যবহার করা যেতে পারে যা স্থির হিসাবে ব্যবহৃত হতে পারে
398 -> 395 : শর্ট সার্কিট অপারেটরগুলি
395 -> 389 : অন্য অংশের প্রয়োজন নেই
389 -> 371 : অ্যারে_কি_এক্সিস্টগুলি ব্যবহার করার দরকার নেই ()
371 -> 370 : অপরিবর্তিত স্থান
370 -> 366 সরানো: এতে দুটি অপ্রয়োজনীয় স্থান সরানো হয়েছে ভবিষ্যদ্বাণী


1

গ্রোভী, 338

m={s=r=[:];z=[:]
it.eachLine{e->((e==~/\w+=.*/)?{(e=~/((\w+)=(\d+))+/).each{r[it[2]]=it[3] as int}}:{f=(e=~/(\w+) : (.*)/)[0];s=s?:f[1];z[f[1]]=f[2];})()}
while(s[0]!='"'){p=(z[s]=~/(\w+) (.) (\w+|(?:".*?")) ?(.*)?/)[0];s=p[3];a=r[p[1]]?:0;r[p[1]]=p[2]=='-'?a?a-1:{s=p[4];0}():a+1}
println s[1..-2]+"\n"+r.collect{k,v->"$k=$v"}.join(' ')}


['''s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4''':'''Ok
a=0 b=7''',
'''init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4''':'''Ok
a=3 b=7 t=0''',
'''s0 : t - s0 s1
s1 : t + "t is 1"
t=17''':'''t is 1
t=1''',
'''s0 : t - "t is nonzero" "t is zero"
t=1''':'''t is nonzero
t=0''',
'''init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3''':'''Ok
i=40 k=3 n=0 r=27 t=0'''].collect {input,expectedOutput->
    def actualOutput = m(input)
    actualOutput == expectedOutput
}

1
আমি এটি পরীক্ষা করেছি তবে স্টডআউটে কোনও ফল আউট বলে মনে হচ্ছে না । ফলাফলগুলি দেখতে আমার কী যুক্ত করতে হবে? (পিএস অনুমানটি বলেছে যে আউটপুটে নিবন্ধগুলির ক্রমটি অপ্রাসঙ্গিক, তাই আপনি এটি থেকে rs টি অক্ষর সংরক্ষণ করতে পারেন .sort())
পিটার টেলর

@ পিটার টিপটির জন্য ধন্যবাদ - আমাকে 8 টি চর যোগ করতে হবে println- আহ ভাল!
আরমান্ড

1

ক্লোজার (344 টি অক্ষর)

"পঠনযোগ্যতা" এর জন্য কয়েকটি লাইন ব্রেক সহ:

(let[i(apply str(butlast(slurp *in*)))]
(loop[s(read-string i)p(->> i(replace(zipmap":\n=""[] "))(apply str)(format"{%s}")read-string)]
(let[c(p s)](cond(string? s)(println s"\n"(filter #(number?(% 1))p))
(=(c 1)'-)(let[z(=(get p(c 0)0)0)](recur(c(if z 3 2))(if z p(update-in p[(c 0)]dec))))
1(recur(c 2)(update-in p[(c 0)]#(if %(inc %)1)))))))

1

পোস্টস্ক্রিপ্ট () () (852) (718)

বাস্তবের জন্য এবার। সমস্ত পরীক্ষার মামলা কার্যকর করে। এটি এখনও প্রোগ্রাম প্রবাহে অবিলম্বে অনুসরণ করতে আরএম প্রোগ্রাম প্রয়োজন follow

সম্পাদনা করুন: আরও ফ্যাক্টরিং, হ্রাস পদ্ধতির নাম।

errordict/undefined{& " * 34 eq{.()= !{& " .(=). load " .( ).}forall ^()=
stop}{^ ^ " 0 @ : 0}ifelse}put<</^{pop}/&{dup}/:{def}/#{exch}/*{& 0
get}/.{print}/~{1 index}/"{=string cvs}/`{cvn # ^ #}/+={~ load add :}/++{1
~ length 1 sub getinterval}/S{/I where{^}{/I ~ cvx :}ifelse}/D{/? # :/_ #
cvlit :}/+{D S({//_ 1 +=//?})$ ^ :}/-{/| # : D S({//_ load 0 ne{//_ -1
+=//?}{//|}ifelse})$ ^ :}/![]/@{~/! #[# cvn ! aload length & 1 add #
roll]:}/;{(=)search ^ # ^ # cvi @ :}/${* 32 eq{++}if * 34 eq{& ++(")search
^ length 2 add 4 3 roll # 0 # getinterval cvx `}{token ^
#}ifelse}>>begin{currentfile =string readline ^( : )search{`( + )search{`
$ ^ +}{( - )search ^ ` $ $ ^ -}ifelse}{( ){search{;}{; I}ifelse}loop}ifelse}loop

সংযুক্ত প্রোগ্রামের সাথে যুক্ত হয়ে মন্তব্য করেছে।

%!
%Minsky Register Machine Simulation
errordict/undefined{ %replace the handler for the /undefined error
    & " * 34 eq{ % if, after conversion to string, it begins with '"',
        .()= !{ % print it, print newline, iterate through the register list
            & " .(=). load " .( ). % print regname=value
        }forall ^()= stop % print newline, END PROGRAM
    }{ % if it doesn't begin with '"', it's an uninitialized register
        ^ ^ " 0 @ : 0 %initialize register to zero, return zero
    }ifelse
}put
<<
/^{pop}
/&{dup}
/:{def} % cf FORTH
/#{exch}
/*{& 0 get} % cf C
/.{print} % cf BF

% these fragments were repeated several times
/~{1 index}
/"{=string cvs} % convert to string
/`{cvn # ^ #} % convert to name, exch, pop, exch
/+={~ load add :} % add a value to a variable
/++{1 ~ length 1 sub getinterval} % increment a "string pointer"

/S{/I where{^}{/I ~ cvx :}ifelse} %setINIT define initial state unless already done
/D{/? # :/_ # cvlit :} %sr define state and register for generated procedure
/+{D S({//_ 1 +=//?})$ ^ :} % generate an increment state and define
/-{/| # : D S({//_ load 0 ne{//_ -1 +=//?}{//|}ifelse})$ ^ :} % decrement state
/![] %REGS list of registers
/@{~/! #[# cvn ! aload length & 1 add # roll]:} %addreg append to REGS
/;{(=)search ^ # ^ # cvi @ :} %regline process a register assignment
/${ %tpe extract the next token or "string"
    * 32 eq{++}if %skip ahead if space
    * 34 eq{ %if quote, find the end-quote and snag both
        & ++(")search ^ length 2 add 4 3 roll # 0 # getinterval cvx `
    }{
        token ^ # %not a quote: pull a token, exch, pop
    }ifelse
}
>>begin

{
    currentfile =string readline ^
    ( : )search{ % if it's a state line
        `( + )search{ % if it's an increment
            ` $ ^ + %parse it
        }{
            ( - )search ^ ` $ $ ^ - %it's a decrement. Parse it
        }ifelse
    }{ % not a state, do register assignments, and call initial state
        ( ){search{;}{; I}ifelse}loop %Look Ma, no `exit`!
    }ifelse
}loop
init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3

আমি যেহেতু কোনও পোস্টস্ক্রিপ্ট লিখেছি এটির কিছুক্ষণ পরেও আপনি কি নামগুলির সাথে ফাংশনগুলি সংজ্ঞায়িত করছেন regline? আপনি তাদের মতো জিনিস বলে অনেক সঞ্চয় করতে পারবেন না R?
পিটার টেলর

হ্যাঁ, অবশ্যই। তবে এই সম্ভাব্য সমস্যাগুলিও রয়েছে যেহেতু এই সমস্ত সংজ্ঞা রাষ্ট্রের সাথে সহাবস্থান করে এবং একই অভিধানে নাম নিবন্ধিত করে। তাই আমি কিছু স্মৃতিচক্রের মান দিয়ে বিরামচিহ্নগুলি অনুসন্ধান করার চেষ্টা করেছি (যাতে আমি এখনও এটি পড়তে পারি :))। আমি আরও অ্যালগরিদমিক হ্রাস পাওয়ার আশা করছি, তাই আমি তাজা চোখ দিয়ে দেখার আগে আমি খুব বেশি শক্তি ব্যয় করতে চাইনি।
luser droog

1

এডাব্লু কে - 447

BEGIN{FS=":"}NF<2{split($1,x," ");for(y in x){split(x[y],q,"=");
g[q[1]]=int(q[2])}}NF>1{w=$1;l=$2;gsub(/ /,"",w);if(!a)a=w;for(i=0;;)
{sub(/^ +/,"",l);if(l=="")break;if(substr(l,1,1)=="\""){l=substr(l,2);
z=index(l,"\"")}else{z=index(l," ");z||z=length(l)+1}d[w,i++]=
substr(l,1,z-1);l=substr(l,z+1)}}END{for(;;){if(!((a,0)in d))break;h=d[a,0];
if(d[a,1]~/+/){g[h]++;a=d[a,2]}else{a=g[h]?d[a,2]:d[a,3];g[h]&&g[h]--}}
print a;for(r in g)print r"="g[r]}

এটি প্রথম পরীক্ষার জন্য আউটপুট:

% cat | awk -f mrm1.awk
s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
^D
Ok
a=0
b=7

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.