এএসসিআইআই এল-সিস্টেমের উপস্থাপক


16

পটভূমি

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

উদাহরণস্বরূপ, axiom "A" এবং বিধিগুলির সাথে A = ABA; B = BBB স্ট্রিংগুলির ক্রম "ABA", "ABABBBABA", "ABABBBABABBBBBBBBABABBBA" ইত্যাদি তৈরি করে, সংক্ষিপ্ততার জন্য, আমরা স্পষ্টভাবে উল্লেখ করি না এল-সিস্টেম সংজ্ঞায়িত করার সময় বর্ণমালা। তদ্ব্যতীত, পুনর্লিখনের সুস্পষ্ট বিধিবিহীন যে কোনও চিহ্নকে অপরিবর্তিত বলে ধরে নেওয়া হয় (যেমন প্রতীক A এর জন্য ডিফল্ট নিয়মটি হল A = A)।

টার্টাল গ্রাফিক্সের একটি ফর্ম ব্যবহার করে এল-সিস্টেমগুলি ভিজ্যুয়ালাইজ করা যায়। সম্মেলনে, কচ্ছপ ডান দিকে শুরু হয়। তার স্ট্রিমগুলির প্রতীকগুলি নিয়ে পুনরাবৃত্তি করে একটি স্ট্রিং আঁকা: একটি এফ এর অর্থ "এক ইউনিট এগিয়ে নিয়ে যাওয়া", একটি জি এর অর্থ "একটি ইউনিট এগিয়ে নিয়ে যাওয়া", একটি + এর অর্থ "বামে একটি কোণ একক ঘুরুন" এবং একটি - এর অর্থ "ডান এক কোণ ঘুরুন" ইউনিট "। স্ট্রিংয়ের অন্যান্য সমস্ত চিহ্ন উপেক্ষা করা হয়। এই প্রশ্নের প্রয়োজনে, কোণ ইউনিট সর্বদা 90 to হিসাবে ধরে নেওয়া হয় °

কার্য

যে কোনও এল-সিস্টেমের বিবরণ এবং বেশ কয়েকটি পুনরাবৃত্তি দেওয়া হয়েছে, আপনার প্রোগ্রামটি বাক্স-অঙ্কন অক্ষর ব্যবহার করে ফলাফলের স্ট্রিংয়ের (উপরে বর্ণিত হিসাবে) একটি ASCII রেন্ডারিং আউটপুট করবে।

  • প্যারামিটারগুলি একটি স্পেস-বিভাজনযুক্ত স্ট্রিং হিসাবে অ্যাকোয়িয়াম, পুনর্লিখনের নিয়মগুলি (যেমন; সমীকরণের তালিকাভুক্ত তালিকা হিসাবে) এবং পুনর্লিখনের পুনরাবৃত্তির সংখ্যার সমন্বয়ে পাস হয়। উদাহরণস্বরূপ, "FF = FGF; G = GGG 2" ইনপুটটি "FGFGGGFFF" স্ট্রিং তৈরি করে এবং তাই যথাযথ ফাঁক দিয়ে চারটি লাইন আঁকবে।
  • এল-সিস্টেম দ্বারা ব্যবহৃত প্রতীকগুলি স্থান এবং সেমিকোলন বাদে যে কোনও ASCII অক্ষর হতে পারে। প্রতীক অনুসারে সর্বাধিক একটি সুস্পষ্ট বিধি নির্দিষ্ট করা আছে (পূর্বনির্ধারিত পুনর্লিখনের নিয়মটি উপরে বর্ণিত হিসাবে পরিচয় ম্যাপিং হিসাবে রয়েছে)।
  • আপনি ধরে নিতে পারেন যে আউটপুটটিতে সর্বদা কমপক্ষে একটি এফ থাকে will
  • ভিজ্যুয়ালাইজেশন উপস্থাপনের জন্য আউটপুটে নিম্নলিখিত ইউনিকোড বক্স-অঙ্কন অক্ষরগুলি ব্যবহার করা উচিত : ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , ┘ (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), । (U + 2575), ╶ (U + 2576) এবং ╷ (U + 2577)। উদাহরণের জন্য নীচে দেখুন।
  • আউটপুটটিতে শীর্ষতম বাক্স অক্ষরের উপরে বা নীচের অংশের নীচের অংশে খালি লাইন থাকা উচিত নয়। এটিতে বাম পাশের বাক্সের পাঠকের বামে বা ডানদিকের ডানদিকে কোনও স্থানও থাকা উচিত নয়। ট্রেলিং স্পেস সহ লাইনের ডানদিকে যা ডানদিকের বাক্স অক্ষরের বাইরে না বাড়ানো অনুমোদিত।

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

উদাহরণ

# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴  ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴  ╶╴╶╴        ╶╴╶╴  ╶╴╶╴

# Koch curve
>> "F F=F+F−F−F+F 1"
 ┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
    ┌┐
   ┌┘└┐
  ┌┘  └┐
 ┌┼┐  ┌┼┐
╶┘└┘  └┘└╴

আপনার প্রোগ্রামটি পরীক্ষা করার জন্য অন্যান্য উদাহরণগুলির মধ্যে রয়েছে:

# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"

# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"

# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"

এর মধ্যে প্রথম দুটি নীচে বর্ণিত (@ edc65 এর উত্তর ব্যবহার করে উত্পাদিত):

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

আপনি সিস্টেমের কোনো পরীক্ষা করতে এই পৃষ্ঠার

স্কোরিং

সংক্ষিপ্ততম কোড (বাইটে) জয়ী। স্ট্যান্ডার্ড বিধি প্রয়োগ।

Miscellania

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

"F F=FF;F=F+F;F=F++F;F=F+++F"

আরেকটি সাধারণ সম্প্রসারণ, প্রায়শই উদ্ভিদের মডেলিংয়ের সময় ব্যবহৃত হয়, [এবং] চরিত্রগুলিকে বর্তমান অবস্থান এবং কোণকে ধাক্কা দেওয়া এবং পপিং হিসাবে ব্যাখ্যা করা। বেশিরভাগ গাছপালা 90 than এর চেয়ে কম কোণ ব্যবহার করে তবে এখানে একটি উদাহরণ রয়েছে যা না:

"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"

এই চ্যালেঞ্জটিতে এই উদাহরণগুলির কোনওটিরও সমর্থন করা দরকার না।

এই চ্যালেঞ্জটিও "সরি, যুবক, তবে এটি কচ্ছপগুলি পুরোপুরি!" । তবে, সেই চ্যালেঞ্জটি ASCII এর চেয়ে লাইন রেন্ডারিং ব্যবহার করেছে এবং আরও নমনীয় সিনট্যাক্সের অনুমতি দিয়েছে।

উত্তর:


7

জাভাস্ক্রিপ্ট (ES6), 440 বাইট (410 অক্ষর)

F=p=>([a,r,n]=p.split(' '),t=>{r.split(';').map(x=>r[x[0]]=x.slice(2),r={});for(;n--;)a=[...a].map(c=>r[c]||c).join('');u=x=y=0,g=[];for(c of a)c=='+'?[t,u]=[u,-t]:c=='-'?[u,t]=[t,-u]:c<'F'|c>'G'?0:((y+=u)<0?(g=[[],...g],++y):g[y]=g[y]||[],(x+=t)<0?(g=g.map(r=>[,...r]),++x):0,c>'F'?0:g[g[f=t?0.5:2,y][x]|=(3+t-u)*f,y-u][x-t]|=(3+u-t)*f)})(1)||g.map(r=>[for(c of r)' ╶╴─╵└┘┴╷┌┐┬│├┤┼'[~~c]].join('')).join('\n')

কম গল্ফড

F=p=>{
  [a,r,n]=p.split(' '),
  r.split(';').map(x=>r[x[0]]=x.slice(2),r={}); // set rules
  for(;n--;)a=[...a].map(c=>r[c]||c).join(''); // build string
  t=1,u=x=y=0, // start pos 0,0 start direction 1,0
  g=[[]]; // rendering in bitmap g
  for(c of a)
    c=='+'?[t,u]=[u,-t] // left turn
    :c=='-'?[u,t]=[t,-u] // right turn
    :c=='F'|c=='G'?(     // move or draw
      (y+=u)<0?(g=[[],...g],++y):g[y]=g[y]||[], // move vertical, enlarge grid if needed
      (x+=t)<0?(g=g.map(r=>[,...r]),++x):0, // move horizontal, enlarge grid if needed
      c=='F'&&( // draw: set bits
        f=t?0.5:2,
        g[y][x]|=(3+t-u)*f,
        g[y-u][x-t]|=(3+u-t)*f
      )
    ):0;
  // render bits as box characters
  return g.map(r=>[' ╶╴─╵└┘┴╷┌┐┬│├┤┼'[~~c]for(c of r)].join('')).join('\n')
}

পরীক্ষা করার জন্য টেস্ট কোড স্নিপেট (ফায়ারফক্সে)


দুর্দান্ত (এবং দ্রুত!) উত্তর। আমি ড্রাগনে স্ক্রিনশট এবং ইলবার্ট কার্ভ আউটপুট যুক্ত করেছি।
উরি গ্রান্টা

6

হাস্কেল, 568 বাইট

import Data.List.Split
p=splitOn
l=lookup
m=maximum
n=minimum
o[h,x]=(h,x)
Just x#_=x
_#x=x
g[s,r,i]=iterate((\c->lookup[c](map(o.p"=")(p";"r))#[c])=<<)s!!read i
u v@(a,x,y,d,e)c|c=='+'=(a,x,y,-e,d)|c=='-'=(a,x,y,e,-d)|c=='G'=(a,x+d,y+e,d,e)|c=='F'=(s(x,y)(d%e)a:s(x+d,y+e)(d?e)a:a,x+d,y+e,d,e)|1<2=v
s p n a=(p,n+(l p a)#0)
1%0=2;0%1=8;-1%0=1;0%(-1)=4
1?0=1;0?1=4;-1?0=2;0?(-1)=8
f z=unlines[[" ╴╶─╷┐┌┬╵┘└┴│┤├┼"!!(l(x,y)q#0)|x<-[n a..m a]]|y<-[m b,m b-1..n b]]where a=map(fst.fst)q;b=map(snd.fst)q;(q,_,_,_,_)=foldl u([],0,0,1,0)$g$p" "z

পরীক্ষা রান:

*Main> putStr $ f "F F=F-F+F+F-F 3"
╶┐┌┐  ┌┐┌┐        ┌┐┌┐  ┌┐┌╴
 └┼┘  └┼┼┘        └┼┼┘  └┼┘
  └┐  ┌┼┼┐        ┌┼┼┐  ┌┘
   └┐┌┼┘└┘        └┘└┼┐┌┘
    └┼┘              └┼┘   
     └┐              ┌┘
      └┐┌┐        ┌┐┌┘
       └┼┘        └┼┘
        └┐        ┌┘
         └┐┌┐  ┌┐┌┘
          └┼┘  └┼┘
           └┐  ┌┘
            └┐┌┘
             └┘

কিভাবে এটা কাজ করে:

  • পুনর্লিখন (ফাংশন g): আমি বিধিগুলি একটি সংস্থার তালিকায় (অক্ষর -> প্রতিস্থাপনের স্ট্রিং) পার্স করি এবং বারবার এটি অ্যাক্সিমের উপরে মানচিত্র করি।
  • পথ তৈরি করা (ফাংশন) u (আমি একটি ম্যাট্রিক্স কিন্তু সঙ্গে (X, Y) কী ও 4 মৌলিক ব্লক বিট নিদর্শন হিসাবে অবস্থানের আরেকটি সমিতি তালিকায় পথ সঞ্চয় করবেন না: একটি একক পদক্ষেপ জন্য) , , এবং মান হিসাবে) । পথে আমি বর্তমান অবস্থান এবং দিক সম্পর্কে নজর রাখি।
  • পাথ আঁকুন (ফাংশন f): প্রথমে আমি পথের তালিকা থেকে সর্বাধিক / মিনিটের মাত্রা গণনা করি এবং তারপরে আমি [সর্বাধিক y -> মিনিট y] এবং [মিনিট x -> সর্বোচ্চ x] এর উপরে পুনরাবৃত্তি করি এবং ব্লকগুলি আঁকার জন্য অনুসন্ধান করি।

0

ES7, 394 অক্ষর, 424 বাইট

F=p=>([a,r,n]=p.split` `,t=>{r.split`;`.map(x=>r[x[0]]=x.slice(2),r={});for(;n--;)a=[...a].map(c=>r[c]||c).join``;u=x=y=0,g=[];for(c of a)c=='+'||c=='-'?[t,u]=[u,-t]:c<'F'|c>'G'?0:((y+=u)<0?(g=[[],...g],++y):g[y]=g[y]||[],(x+=t)<0?(g=g.map(r=>[,...r]),++x):0,c>'F'?0:g[g[f=t?0.5:2,y][x]|=(3+t-u)*f,y-u][x-t]|=(3+u-t)*f)})(1)||g.map(r=>[for(c of r)'╶╴─╵└┘┴╷┌┐┬│├┤┼'[~~c]].join``).join`
`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.