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


11

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

অংশে (1) ব্যাকরণ যথাসম্ভব সহজ ছিল, তবে দীর্ঘ প্রোগ্রামের ফলস্বরূপ। যেহেতু এটি একটি কোড গল্ফ সাইট, তাই আমরা বরং একটি গল্ফ ব্যাকরণ করব, তাই না?

উচ্চ স্তরে, মূল ব্যাকরণ থেকে পরিবর্তনগুলি নিম্নরূপ:

  • প্রথম লাইনের লেবেলটি isচ্ছিক
  • দুইটি সংলগ্ন শনাক্তকারীদের পৃথক করার প্রয়োজন বাদে হোয়াইটস্পেস optionচ্ছিক
  • রাজ্যগুলিকে অন্তর্ভুক্ত করা যেতে পারে। দ্ব্যর্থহীন পার্সিং নিশ্চিত করার জন্য, যদি হ্রাস ক্রমের প্রথম অবস্থাটি একটি অন্তর্নিহিত রাজ্য হয় তবে এটি অবশ্যই বন্ধনীতে আবদ্ধ থাকতে হবে। এর অর্থ হ'ল যে কোনও প্রোগ্রামকে ওয়ান-লাইনারে গল্ফ করা যেতে পারে।

উদাহরণস্বরূপ, মূল পরীক্ষার ক্ষেত্রে আমাদের ছিল:

বি + = এ, টি = 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

গল্ফড ব্যাকরণে এটি সংক্ষিপ্ত করা যেতে পারে:

init:t-init d
d:a-(b+t+d)a
a:t-(a+a)"Ok"
a=3 b=4

অথবা এমনকি:

init:t-init d:a-(b+t+d)a:t-(a+a)"Ok"
a=3 b=4

"প্রোগ্রাম" লাইনের জন্য নতুন বিএনএফ (চূড়ান্ত লাইনের বিপরীতে, যা ডেটা হয়):

program    ::= first_line (newline line)*
first_line ::= cmd
line       ::= named_cmd
state      ::= state_name
             | cmd
             | '"' message '"'
delim_state::= '(' cmd ')'
             | '"' message '"'
cmd        ::= raw_cmd
             | named_cmd
named_cmd  ::= state_name ' '* ':' ' '* raw_cmd
raw_cmd    ::= inc_cmd
             | dec_cmd
inc_cmd    ::= reg_name ' '* '+' ' '* state
dec_cmd    ::= reg_name ' '* '-' ' '* delim_state ' '* state
             | reg_name ' '* '-' ' '* state_name ' '* delim_state
             | reg_name ' '* '-' ' '* state_name ' '+ state
state_name ::= identifier
reg_name   ::= identifier

শনাক্তকারী এবং বার্তা পূর্ববর্তী চ্যালেঞ্জের মতো নমনীয়।


পূর্ববর্তী চ্যালেঞ্জ থেকে সমস্ত পরীক্ষার কেস এখনও প্রযোজ্য। তদতিরিক্ত, নিম্নলিখিত গল্ফ জোসেফাস দ্রবণটি ব্যাকরণের বেশিরভাগ অনুশীলন করা উচিত:

in:k-(r+t+in)in2:t-(k+in2)r-(i+n-0"ERROR n is 0")"ERROR k is 0"
0:n-(i+2:k-(r+t+2)5:t-(k+5)7:i-(r-(t+7)c:t-(i+r+c)i+0)a:t-(i+a)7)"Ok"
n=40 k=3

প্রত্যাশিত আউটপুট:

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

এবং আমি মনে করি এটি বাকী কেসটি কভার করে:

k+k-"nop""assert false"
k=3

প্রত্যাশিত আউটপুট:

nop
k=3

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

স্কোরিংটি কোড-গল্ফের একটি বৈকল্পিক। আপনি একটি স্ব-অন্তর্ভুক্ত প্রোগ্রাম লিখতে পারেন এবং এটি ইউটিএফ-8-এনকোডিংয়ের পরে বাইটে প্রোগ্রামটির দৈর্ঘ্য হিসাবে স্কোর করবে। বিকল্পভাবে, কারণ কোড পুনঃব্যবহার একটি ভাল জিনিস, আপনি যদি n1বাইটে অংশ (I) প্রয়োগ করে থাকেন তবে আপনি এমন একটি প্রোগ্রাম লিখতে পারেন যা একটি অংশ (II) প্রোগ্রামকে একটি অংশ (আই) প্রোগ্রামে রূপান্তর করে, মূলটিতে পাইপ দেওয়ার জন্য প্রস্তুত। আপনার স্কোরটি তখন আপনার রূপান্তর প্রোগ্রামের প্লাসের দৈর্ঘ্য হবে ceil(n1 / 2)

এনবি আপনি যদি রূপান্তরের পক্ষে যান, আপনার বেনামি রাজ্যের জন্য এমনভাবে নাম তৈরি করতে হবে যাতে আপনি গ্যারান্টি দিতে পারেন যে তারা নামধারী রাজ্যের সাথে সংঘর্ষ না করে।

উত্তর:


6

হাস্কেল, 552 499 493 টি অক্ষর

import Control.Monad.RWS
import Data.Map
main=interact$z.lines
z x=let(s:_,w)=evalRWS(mapM(q.t)x)w[]in s.f.i.t$last x 
p=get>>=q
q(l:":":x)=x%do a<-p;tell$f[(l,a)];r a
q(v:"+":x)=x%fmap(.a v 1)p
q(v:"-":x)=x%liftM2(d v)p p
q(('"':s):x)=x%r(\w->unlines[init s,do(v,x)<-assocs w;v++'=':show x++" "])
q(n:x)|n<"*"=x%p|1<3=x%asks(!n)
d v p n w|member v w&&w!v>0=p$a v(-1)w|1<3=n w
t[]=[];t x=lex x>>= \(y,x)->y:t x
i(v:_:x:t)=(v,read x):i t;i[]=[]
x%m=put x>>m;r=return;a=insertWith(+);f=fromList

কমবেশি একটি সম্পূর্ণ পুনর্লিখন করেছিলেন। একটি আরডাব্লুএস মনাদ দিয়ে সিপিএস প্রতিস্থাপন করা হয়েছে যা অনুসন্ধানের জন্য তার নিজস্ব আউটপুট পড়ে বলেছে যে এটি এখনও পার্স হয়নি (আলস্যের জন্য হাঁ)! এবং আরও কিছু টুইটগুলি।

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