থ্রোব্যাক শুক্রবার: আমার জেডএক্স স্পেকট্রাম বেসিক তালিকার পুনর্নবীকরণ করুন


15

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

ফলস্বরূপ, GO TOকমান্ডটি ব্যবহারটি অহংকারমূলক ছিল এবং প্রদত্ত লাইন নম্বরটিতে কার্যকর করা লাফ দেয় (কোনও লেবেল নেই)।

এছাড়াও একটি সম্পর্কিত GO SUBকমান্ড রয়েছে যা প্রাথমিক ফাংশন কল হিসাবে ব্যবহার করা যেতে পারে। আবার, ফাঁসি দেওয়া লাইন নম্বরে জাম্প, কিন্তু যখন একটি RETURNকমান্ড এসে যাবে, ফাঁসি পর পরবর্তী নির্দেশ ফিরে জাম্প GO SUB

একইভাবে RUNকমান্ড প্রদত্ত লাইনে প্রোগ্রামের প্রয়োগ পুনরায় আরম্ভ করবে।

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


ইনপুট হিসাবে একটি লাইন-সংখ্যাযুক্ত বেসিক তালিকা দেওয়া, একই প্রোগ্রামটি আউটপুট করে তবে এমনটি পুনর্নবীকরণ করা হয়েছে যে লাইন সংখ্যাগুলি 10 থেকে শুরু হয় এবং 10-এর ধাপে বৃদ্ধি হয় ইনপুট তালিকাতে GO TOবা GO SUBকমান্ড থাকতে পারে , সুতরাং এর সাথে যুক্ত সংখ্যাগুলিও সামঞ্জস্য করতে হবে।

  • GO TOএবং GO SUBকমান্ডগুলি হয় নিজস্ব লাইনে বা IF THENলাইনের শেষে থাকে । এটি নিরাপদ বলা ^(\d+) .*GO (TO|SUB) (\d+)$এই জাতীয় লাইনের সাথে মেলে যথেষ্ট। উদ্ধৃতিতে এই আদেশগুলি উপেক্ষা করা উচিত।

  • RUNকমান্ডগুলি সর্বদা তাদের নিজস্ব লাইনে থাকবে। এই ক্ষেত্রে একটি লাইন নম্বর .চ্ছিক। যদি এটি অনুপস্থিত থাকে, তবে দোভাষী কেবল প্রোগ্রামের শীর্ষে শুরু হয়।

  • যদি একটি GO TO, GO SUBবা RUNকমান্ড অস্তিত্বহীন রেখার উল্লেখ করে, তবে এটি পরিবর্তে পরবর্তী সংজ্ঞায়িত লাইনে চলে যাবে। আপনার এন্ট্রিটি এটির সাথে ডিল করার প্রয়োজন এবং এ জাতীয় কোনও রেফারেন্স নির্দিষ্ট করা নিশ্চিত করা উচিত যাতে তারা সঠিক লাইনের দিকে নির্দেশ করে। প্রোগ্রামটি শেষ হওয়ার পরে যদি একটি লাইন নম্বর এই কমান্ডের একটিতে দেওয়া হয় তবে আচরণটি অপরিজ্ঞাত হতে পারে।

  • লাইন নম্বরগুলি সর্বদা 1 থেকে 9999 (ম্যানুয়াল অনুসারে) ইতিবাচক পূর্ণসংখ্যায় থাকবে। এর অর্থ এই যে ইনপুট প্রোগ্রামগুলিতে কখনও কখনও 999 লাইনের বেশি হবে না।

  • ইনপুট লাইনগুলি সর্বদা সংখ্যায় আরোহণের ক্রমে গণনা করা হবে।

  • এই চ্যালেঞ্জের উদ্দেশ্যে, ইনপুট তালিকাগুলিতে কেবল প্রিন্টযোগ্য এএসসিআইআই থাকবে। জেডএক্স অক্ষর সেট সম্পর্কে আপনাকে চিন্তা করার দরকার নেই। যে বলেন, যদি আপনার এন্ট্রি আসলে ZX বেসিক লেখা আছে বা সমাবেশ মেশিন কোড Z80 যথাযথ / (এবং আছে emulators আউট সেখানে ), তারপর আপনার জন্য আপনার ইনপুটে এনকোড করা চয়ন করতে পারেন ZX অক্ষর সেট পরিবর্তে।

  • আপনি বিশেষভাবে এই উদ্দেশ্যে তৈরি করা কোনও রেন্ডমার লাইব্রেরি বা ইউটিলিটি ব্যবহার করতে পারবেন না।

উদাহরণ ইনপুট:

1 REM "A rearranged guessing game"
2 INPUT A: CLS
3 INPUT "Guess the number ", B
10 IF A=B THEN PRINT "Correct": STOP
100 IF A<B THEN GO SUB 125
120 IF A>B THEN GO SUB 122
121 GO TO 3
125 PRINT "Try again"
126 RETURN
127 REM "An example of GO TO 7 and GO SUB 13 in quotes"

উদাহরণ আউটপুট:

10 REM "A rearranged guessing game"
20 INPUT A: CLS
30 INPUT "Guess the number ", B
40 IF A=B THEN PRINT "Correct": STOP
50 IF A<B THEN GO SUB 80
60 IF A>B THEN GO SUB 80
70 GO TO 30
80 PRINT "Try again"
90 RETURN
100 REM "An example of GO TO 7 and GO SUB 13 in quotes"

আমি একটি জেডএক্স বেসিক ম্যানুয়ালটিতে লিঙ্ক করতে চেয়েছিলাম। আমি যে সবচেয়ে ভাল খুঁজে পেতে পারি তা হ'ল http://www.worldofspectrum.org/ZXBasicManual/index.html তবে এটি একটি মৃত লিঙ্ক বলে মনে হচ্ছে। ওয়েবব্যাক মেশিনটির একটি অনুলিপি রয়েছে


7
এছাড়াও 5000 তম প্রশ্ন জিজ্ঞাসা করে কংগ্রেটস!
FryAmTheEggman

1
নস্টালজিয়া সময় - আমার প্রথম পিসি ছিল একটি স্পেকট্রাম 48 কে এবং আমার প্রথম সমাবেশের একটি প্রোগ্রাম একজন
নবনিযুক্ত

2
@ edc65 আপনার কি এখনও আপনার ভাড়াটিয়া সংসদ কোড রয়েছে? যদি তাই হয় তবে এটি একটি উত্তর হিসাবে পোস্ট করতে আপনাকে স্বাগতম!
ডিজিটাল ট্রমা

1
পরীক্ষার ক্ষেত্রে স্ট্রিং আক্ষরিকের মধ্যে কমপক্ষে একটি গোটো / গসব অন্তর্ভুক্ত করা উচিত।
পিটার টেলর

1
আমি একটি উল্লেখ পেয়েছি: জেডএক্স 81 গণিত জিওটিও এবং জিওএসউবিগুলিকে হিসাবে হিসাবে অনুমতি দেয়GOTO 100 + A*10 এবং জেডএক্স স্পেকট্রামের ম্যানুয়াল তালিকার পরিশিষ্ট সিGO TO একটি সংখ্যাসূচক প্রকাশটি স্বীকার করার জন্য (ধ্রুবকের কোনও বাধা নেই) অনুমতি দেয়। এখানে জেডএক্স 80 এবং জেডএক্স 81 তে গণিতের গুণাবলীর আলোচনা রয়েছে GOTO। বিটিডাব্লু, স্পেকট্রাম সংস্করণে স্থানটি কেন যুক্ত করা হয়েছিল তা আমার কোনও ধারণা নেই।
টবির গতি

উত্তর:


5

জাভাস্ক্রিপ্ট (ES6) 177

পরবর্তী বৈধ লাইন নম্বরটির জন্য (ব্যয়বহুল) স্ক্যান সম্পাদনা করুন

l=>l.split`
`.map((x,i)=>([,n,t]=x.match(/(\d+)(.*)/),l[n]=10*-~i,t),l=[]).map((x,i)=>10*-~i+x.replace(/(UN |GO TO |UB )(\d+)$/,(a,b,c)=>(l.some((v,i)=>i<c?0:a=b+v),a))).join`
`

পরীক্ষা

f=l=>
  l.split`\n`
  .map((x,i)=>([,n,t]=x.match(/(\d+)(.*)/),l[n]=10*-~i,t),l=[])
  .map((x,i)=>10*-~i+x.replace(/(UN |GO TO |UB )(\d+)$/,(a,b,c)=>(l.some((v,i)=>i<c?0:a=b+v),a)))
  .join`\n`
        
//TEST
console.log=x=>O.textContent+=x+'\n'
  
test=`1 REM "A rearranged guessing game"
2 INPUT A: CLS
3 INPUT "Guess the number ", B
10 IF A=B THEN PRINT "Correct": STOP
100 IF A<B THEN GO SUB 125
120 IF A>B THEN GO SUB 122
121 GO TO 3
125 PRINT "Try again"
126 RETURN`
console.log(test+'\n\n'+f(test))
<pre id=O></pre>


1
ভাল লাগছে। আমার +1 টি দাঁড়িয়ে আছে :)
ডিজিটাল ট্রমা

2

পার্ল 6, 147 145 144 142 বাইট

{my%a;.trans(/^^(\d+)/=>{%a{$0}=$+=10}).trans(/:s<!after \"\N*>(UN |GO TO |UB )(\d+)<!before \N*\">/=>{$0~%a{%a.keys».Num.grep(*>=$1).min}})}

এটি সম্ভবত আরও কিছুটা নিচে গল্ফ করা যেতে পারে।

সম্প্রসারিত

my &f = -> $s { 
    my %line-map; # This will map the old line numbers to the new ones

    $s.trans(/^^(\d+)/                    # This .trans creates the line number map
             => { %line-map{$0} = $+=10 } # as well as replaces the actual line numbers
            )\
      # This .trans replaces all the line numbers for each GO TO, GO SUB, RUN
      .trans(/:s<!after \"\N*>(UN |GO TO |UB )(\d+)<!before \N*\">/ 
             => {$0 ~ %line-map{%line-map.keys».Num.grep(*>=$1).min} } 
            )
}

পদ্ধতিটি ব্যবহার করার কোনও কারণ নেই .min{min %line-map.keys».Num.grep:*>=$1পরিবর্তে ব্যবহার করুন
ভেন

1

অ্যাপ্লিকেশনগুলির জন্য ভিজ্যুয়াল বেসিক, 288 বাইট

বেসিক উপভাষায় কোনও সমাধান দেওয়ার জন্য আমি প্রতিরোধ করতে পারিনি। সম্ভবত ভিজ্যুয়াল বেসিক 6 / .NET বা ছোট ছোট পরিবর্তনগুলির সাথে অন্যান্য আধুনিক রূপগুলির সাথে কাজ করে।

Sub n(t,a)
f=Chr(10)
u=Chr(0)
Open t For Input As 1
a=f &Input(LOF(1),1)&f
Close
j=10
For i=1 To 9999
q=f &j &u
g=" GO TO "
w=i &f
m=j &f
a=Replace(Replace(Replace(Replace(a,g &w,g &m),f &i &" ",q),"B "&w,"B "&m),"UN "&w,"UN "&m)
If InStr(1,a,q)Then j=j+10
Next
a=Replace(a,u," ")
End Sub

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

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

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

কিছু মন্তব্য:

  • সংক্ষিপ্ততার জন্য, আমরা জাম্পিং স্টেটমেন্টগুলির সাথে ম্যাচের জন্য আরও ছোট সম্ভাব্য স্ট্রিংটি ব্যবহার করি। আমাদের অনুসন্ধানের স্ট্রিংয়ের শেষ প্রান্তটি ব্যবহার করে আমরা উদ্ধৃত ঘটনাগুলি বা ব্যবহারকারীর কার্যাদি (যা সর্বদা সিনক্লেয়ারে প্রথম বন্ধনী ব্যবহার করে) অন্তর্ভুক্ত করার ঝুঁকির মধ্যে চলে না। নির্মাণের GO TOকারণে বৃহত্তর স্ট্রিং প্রয়োজন FOR ... TO(যেমন তুলনা করুন 50 FOR X=AGO TO 100এবং 50 GO TO 100)

  • কোডটি ফর্মের বিবৃতিগুলিকে সমর্থন করে না GO TO200(সাদা অংশ ব্যতীত), যদিও জেডএক্স ম্যানুয়ালটি বোঝায় যে এটি বেশ কয়েকটি উদাহরণে বৈধ কোড (এটি মোকাবেলা করতে আরও এক ডজন আরও বাইট লাগবে)।

  • কোডটি শুরুতে একটি নতুন লাইন এবং প্রোগ্রামের শেষে অন্যটি যুক্ত করে। আমি শেষ পর্যন্ত এটি পরিষ্কার করতে পারতাম (আরও কয়েক ডজন বাইট) তবে জেডএক্স সম্ভবত ফাঁকা লাইন উপেক্ষা করবে ignore

নীচে, আরও পাঠযোগ্য সংস্করণ:

Sub Renumber(ByVal ProgramPath As String, ByRef Program As Variant)

    Open ProgramPath For Input As #1
    Program = Chr(10) & Input(LOF(1), 1) & Chr(10)
    Close

    NewNumber = 10
    For OldNumber = 1 To 9999
        Program = Replace(Program, " GO TO" & OldNumber & Chr(10), " GO TO" & NewNumber & Chr(10)) 'self-explaining
        Program = Replace(Program, Chr(10) & OldNumber & " ", Chr(10) & NewNumber & Chr(0)) 'matches line number (and replaces whistespace with Chr(0) to avoid re-replacing
        Program = Replace(Program, "B " & OldNumber & Chr(10), "B " & NewNumber & Chr(10)) 'matches GO SUB
        Program = Replace(Program, "UN " & OldNumber & Chr(10), "UN " & NewNumber & Chr(10)) 'matches RUN
        If InStr(1, Program, Chr(10) & NewNumber & Chr(0)) Then NewNumber = NewNumber + 10 'if there is such a line, increment NewNumber
Next
Program = Replace(Program, Chr(0), " ") 'replace back Chr(0) with whitespace
End Sub

বিটিডাব্লু, একটি কিউব্যাসিক সলিউশনটি আরও দীর্ঘ হবে কারণ কিউব্যাসিকের আমার স্ট্রিং-রিপ্লেসমেন্ট ফাংশনটি এখনও মনে নেই।
DLosc

আমি মনে করি আপনি ঠিক বলেছেন ... সে সম্পর্কে ভুলে গেছেন
dnep

1

পিপ -rn , 63 বাইট

Ygn:#{_<aFIy}*t+tgR`(RUN|GO (SUB|TO)) (\d+)$`{b.s.(nd)}R`^\d+`n

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

সেটআপ

-rপতাকা স্থানীয় পরিবর্তনশীল মধ্যে লাইনের একটি তালিকা হিসাবে stdin এবং এটি দোকানে সব লেখাg । গ্লোবাল ভেরিয়েবল t10 এ প্রিনিটাইজালাইজড এবং গ্লোবাল ভেরিয়েবল sপ্রিনিটাইটিজড হয় " "

Yg

ইয়াঙ্কসকে gবৈশ্বিক ভেরিয়েবলের রেখার তালিকা দেয় y, যাতে এটি ফাংশনের ভিতরে উপলব্ধ হয় যা আমরা সংজ্ঞায়িত করতে চলেছি।

লাইন নম্বর অনুবাদ ফাংশন

আমরা একটি ফাংশন তৈরি করি যা নতুন নম্বর স্কিমের সংশ্লিষ্ট লাইন নম্বরটিতে মূল সংখ্যা স্কিমের (কোনও অস্তিত্বহীন সহ) কোনও লাইন নম্বর থেকে মানচিত্র করে।

ধরুন আমাদের এই লাইন আছে:

1 INPUT A
4 PRINT A
9 IF A=1 THEN GO TO 3

আমরা 1 থেকে 10, 2-4 থেকে 20 এবং 5-9 থেকে 30 পর্যন্ত মানচিত্র তৈরি করতে চাই we আমাদের কাছে যদি মূল লাইন সংখ্যার একটি তালিকা থাকে ([1; 4; 9] ), আমরা একটি ফিল্টার অপারেশন ব্যবহার করতে পারেন খুঁজে বের করতে কিভাবে এই সংখ্যা অনেক কম আমরা রূপান্তর করার চেষ্টা করছি লাইন নম্বর চেয়ে। ফলাফলটি 10 ​​দ্বারা গুণিত করুন এবং 10 যোগ করুন, এবং আমাদের পছন্দসই উত্তর রয়েছে।

উদাহরণস্বরূপ, 9 রূপান্তর করার সময়, দুটি রেখার সংখ্যা আছে (1 এবং 4) 9 এর চেয়ে কম 2 2 * 10 + 10 দেয় 30. 3 রূপান্তর করার সময়, একটি লাইন সংখ্যা (1) 3 এর কম হয় 20 দেয়।

এখানে কোডটি (পড়তে সহজ হতে কিছুটা সংশোধন করা হয়েছে):

n:{#(_<aFIy)*t+t}
  {             }  Lambda function with parameter a:
        FIy         Filter y (the list of program lines) for
     _<a             lines that are numerically less than a
                    (In a numeric context, only the first run of digits on the line is considered)
   #(      )        Number of items in the filtered list
            *t+t    Times 10, plus 10
n:                 Assign that function to global variable n

প্রথম প্রতিস্থাপন: GO TO, GO SUB, এবংRUN

প্রোগ্রামটির বাকী অংশটি একটি একক অভিব্যক্তি gযা কয়েকটা রেইগেক্স প্রতিস্থাপন গ্রহণ করে এবং করে (যা প্রতিটি লাইনে প্রয়োগ করে ভেক্টরাইজ করে g)।

এখানে প্রথম প্রতিস্থাপন:

g R `(RUN|GO (SUB|TO)) (\d+)$` {b.s.(nd)}

Regex কোন ম্যাচ RUN, GO SUBএবংGO TO , একটি সংখ্যা দ্বারা অনুসরণ লাইনের শেষে করে। এটি নিশ্চিত করে যে এটি স্ট্রিংয়ের সাথে মেলে RUNনা এবং লাইন নম্বর ছাড়া এটিও মেলে না।

ক্যাপচারিং গ্রুপগুলির ক্রমটি গুরুত্বপূর্ণ। প্রথম দল কমান্ড (এক ধারন করে RUN, GO SUBঅথবা GO TO)। দ্বিতীয় গোষ্ঠীটি যদি ব্যবহৃত হয় তবে হয় SUBবা ক্যাপচার করেTO । আমাদের এই অংশটি ক্যাপচার করার দরকার নেই, তবে একটি নন-ক্যাপচারিং গ্রুপের জন্য অতিরিক্ত বাইটের প্রয়োজন। তারপরে তৃতীয় দলটি লাইন নম্বরটি ক্যাপচার করে।

আমরা প্রতিস্থাপনের জন্য একটি কলব্যাক ফাংশন ব্যবহার করি। পিপ মধ্যে কলব্যাক ফাংশন সঙ্গে, সমগ্র ম্যাচ প্রথম যুক্তি a, এবং অনুক্রমে ক্যাপচার গ্রুপ পরবর্তী আর্গুমেন্ট b, c, d, এবং e। সুতরাং আমাদের প্রথম গ্রুপে কমান্ড আছে, যা goesুকে যায় এবং bতৃতীয় গ্রুপে লাইন নম্বরটি whichুকে যায় d। শুধুমাত্র পরিবর্তন আমরা করতে হবে আমাদের রূপান্তর ফাংশন, যা পাতার মর্মর-শৈলী বলা হয় মাধ্যমে লাইন সংখ্যা পাস করা: (nd)। তারপরে আমরা একসাথে এটি সম্মতি জানাইb এটিকে এবং একটি স্থান এবং এটি ফিরে আসি।

দ্বিতীয় প্রতিস্থাপন: লাইন সংখ্যা

রূপান্তর করতে যা বাকি আছে তা হ'ল লাইনের শুরুতে লাইন সংখ্যা।

(...) R `^\d+` n

রেজেক্স একটি লাইনের শুরুতে সংখ্যাগুলির একটি রানের সাথে মেলে। আবার আমরা একটি কলব্যাক ফাংশন ব্যবহার করি; এবার, রূপান্তর ফাংশনটি nনিজেই যথেষ্ট, যেহেতু পুরো ম্যাচটি (প্রথম যুক্তি, a) হ'ল আমরা রূপান্তর করতে চাই।

যেহেতু এটি প্রোগ্রামের সর্বশেষ প্রকাশ, তাই পিপ ফলাফলটি স্বতঃপ্রকাশ করে। -nপতাকা নতুন লাইন দিয়ে ফলাফলের তালিকা আলাদা করে।

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