কিউবাসিকে গল্ফ করার টিপস


13

কিউ বেসিকে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা কিউবাসিকের সাথে কমপক্ষে কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।

সংক্রান্ত টিপস QB64 এমুলেটর এছাড়াও স্বাগত জানাই। এর কিছু অতিরিক্ত বৈশিষ্ট্য রয়েছে যা মাইক্রোসফ্ট কিউবাসিকে নেই।


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

5
@ অ্যান্ড্রুব্রিজা মোটিভেশন? যে কোনও ভাষায় গল্ফের প্রতি আমার অনুপ্রেরণার মতো: মজাদার জন্য! আমি কিউব্যাসিকের ছোট প্রোগ্রামগুলি লিখতে উপভোগ করি (যদিও আমি এটি গুরুতর কিছুতে ব্যবহার করতে চাই না)। এটিতে যুক্ত বোনাসও রয়েছে যা এতে শব্দ এবং গ্রাফিক্স (উভয় পাঠ্য এবং পিক্সেল) অন্তর্নির্মিত হয়েছিল, যা আমার পছন্দসই "বাস্তব" ভাষা পাইথন দেয় না।
DLosc

পাইথনের চেয়ে কিউবাসিকে গ্রাফিকাল গেমগুলি লেখা আরও সহজ।
আনুশ

যদি কেউ সরাসরি ব্রাউজারে গ্রাফিকাল কিউবাসিক অ্যাপ্লিকেশন চেষ্টা করতে চান তবে তারা এটি ব্যবহার করতে পারেন: github.com/nfriend/origins- হোস্ট
mbomb007

উত্তর:


10

আপনার লুপিং নির্মাণগুলি জানুন

QBasic বিভিন্ন looping নির্মানের আছে: FOR ... NEXT, WHILE ... WEND, এবং DO ... LOOP। আপনি লুপ করতে GOTOবা (কিছু পরিস্থিতিতে) ব্যবহার করতে পারেন RUN

  • FOR ... NEXTএটি কি করে তা বেশ ভাল। পাইথনের বিপরীতে, এটি সামান্য পরিমাণে WHILEবা GOTOলুপের চেয়ে প্রায় সর্বদা সংক্ষিপ্ত :

    FOR i=1TO 19STEP 2:?i:NEXT
    i=1:WHILE i<20:?i:i=i+2:WEND
    i=1:9?i:i=i+2:IF i<20GOTO 9
    

    নোট করুন যে আপনার পরে ভেরিয়েবলের নামটি পুনরাবৃত্তি করতে হবে না NEXTএবং আপনি সংখ্যা এবং সর্বাধিক নিম্নলিখিত কীওয়ার্ডগুলির মধ্যে স্থানটি মুছে ফেলতে পারেন।

  • WHILE ... WENDযখন আপনার কাছে এমন লুপ থাকে যা 0 বার কার্যকর করতে পারে তার জন্য ভাল। তবে আপনি যদি জানেন যে লুপটি অন্তত একবার সম্পাদন করে, তবে GOTOএটি একটি বাইট সংক্ষিপ্ত হতে পারে:

    WHILE n>1:n=n\2:WEND
    1n=n\2:IF n>1GOTO 1
    
  • আমি কেবল DO ... LOOPঅসীম লুপগুলির জন্য ব্যবহার করি ( RUNপরিবর্তে যেখানে ব্যবহার করা যায় তা বাদে )। এটি শর্তহীন হিসাবে একই সংখ্যক অক্ষরের জন্য ব্যয় করা হলেও এটি GOTOপড়ার জন্য আরও কিছুটা স্বজ্ঞাত। (নোট করুন যে "অসীম লুপ" এ আপনি যে লুপগুলি ব্যবহার করে ভেঙেছেন তা অন্তর্ভুক্ত করতে পারে GOTO)) DO WHILE/ DO UNTIL/ LOOP WHILE/ LOOP UNTILসিনট্যাক্সটি খুব ভার্ভোজ; আপনি ভাল WHILEবা GOTOযথাযথ ব্যবহার বন্ধ
  • GOTOউপরোক্ত হিসাবে যেমনটি বলা হয়েছে, ডু / উইন্ড লুপটি লেখার সবচেয়ে সংক্ষিপ্ততম উপায়। লেবেলের পরিবর্তে একক-অঙ্কের লাইন নম্বর ব্যবহার করুন। মনে রাখবেন যে যখন কোনও বিবৃতিতে GOTOকেবলমাত্র জিনিস হয় , সেখানে দুটি সমান সংক্ষেপে শর্টকাট বাক্য গঠন পাওয়া যায়:THENIF

    IF x>y GOTO 1
    IF x>y THEN 1
    

    GOTOআরও জটিল নিয়ন্ত্রণ প্রবাহ তৈরি করতেও ব্যবহার করা যেতে পারে । নায়সায়াররা এটিকে "স্প্যাগেটি কোড" হিসাবে উল্লেখ করে তবে এটি কোড গল্ফ: অপঠনযোগ্যতা প্রায় একটি গুণ! GOTOগর্ব!

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

5

PRINTএবং এর জন্য শর্টকাট ব্যবহার করুনREM

আপনি ব্যবহার করতে পারেন ?পরিবর্তে PRINT, এবং 'পরিবর্তে REM(মন্তব্য)।

''চর বা স্ট্রিং সিনট্যাক্সের অংশ হিসাবে সমর্থন করে এমন ভাষাগুলি দিয়ে বহুবিবাহ করার সময়ও এটি কার্যকর হতে পারে ।


5

বিভাজ্যতা পরীক্ষা

যে প্রোগ্রামগুলিতে আপনাকে পরীক্ষা করতে হয় যে একটি পূর্ণসংখ্যা অন্যের দ্বারা বিভাজ্য কিনা তা স্পষ্ট পদ্ধতিতে ব্যবহার করা উচিত MOD:

x MOD 3=0

তবে একটি সংক্ষিপ্ত উপায় হল পূর্ণসংখ্যা বিভাগটি ব্যবহার করা:

x\3=x/3

অর্থাৎ xইনট-ডিভ 3সমান xফ্লোট-ডিভের সমান 3

নোট করুন যে এই দুটি 0পদ্ধতিরই মিথ্যা এবং সত্যের পক্ষে ফিরে -1আসবে, সুতরাং আপনাকে ফলাফলটি এড়িয়ে যাওয়ার প্রয়োজন হবে, বা যুক্ত করার পরিবর্তে এটি বিয়োগ করতে হবে।


আপনার যদি বিপরীত অবস্থা প্রয়োজন হয় (অর্থাত্ xহ'ল) না দ্বারা বিভাজ্য 3), সুস্পষ্ট পদ্ধতির না সমান অপারেটর ব্যবহার করতে হয়:

x\3<>x/3

তবে যদি xননজেটিভ হওয়ার নিশ্চয়তা থাকে তবে আমরা একটি বাইট সংরক্ষণ করতে পারি। পূর্ণসংখ্যা বিভাগ ফলাফলকে ছাঁটাই করে, তাই এটি সর্বদা ভাসমান বিভাগের চেয়ে কম বা সমান হবে। অতএব, আমরা শর্তটি এইভাবে লিখতে পারি:

x\3<x/3

একইভাবে, যদি xনেতিবাচক হওয়ার গ্যারান্টিযুক্ত হয়, কাটা ফলাফল আরও বৃদ্ধি করে এবং আমরা লিখতে পারি x\3>x/3। আপনি যদি সাইনটি না জানেন তবে xআপনাকে আটকে থাকতে হবে <>


5

স্ক্যানার অপব্যবহার

অনেকগুলি ভাষার মতো, কোন চরিত্রগুলি মুছে ফেলা যায় এবং মুছে ফেলা যায় না তা জেনে রাখা গুরুত্বপূর্ণ।

  • প্রতীকের পাশের যে কোনও স্থান সরিয়ে ফেলা যেতে পারে: IF""=a$THEN?0
  • স্পেস সাধারণত একটি অঙ্ক এবং একটি চিঠি ঘটছে মধ্যে মুছে ফেলা হতে পারে , যাতে : FOR i=1TO 10STEP 2। কিউব্যাসিক ১.১ ( আর্কাইভ.অর্গে উপলব্ধ ) এবং কিউবি between৪ এর মধ্যে কিছু পার্থক্য রয়েছে :
    • কিউবাসিক 1.1 কোনও অঙ্ক এবং নিম্নলিখিত বর্ণের মধ্যে স্থান অপসারণের অনুমতি দেয়। তদ্ব্যতীত, মুদ্রণ বিবৃতিগুলিতে, এটি একটানা মানগুলির মধ্যে একটি সেমিকোলন অনুমান করবে: ?123xহয়ে যায় PRINT 123; x। উপরোক্ত ব্যতিক্রমগুলি হ'ল সিকোয়েন্সগুলি 1e2এবং 1d+3, যা বৈজ্ঞানিক স্বরলিপি হিসাবে বিবেচিত হয় এবং এতে প্রসারিত হয়100! এবং 1000#(যথাক্রমে একক এবং ডাবল-স্পষ্টতা)।
    • QB64 সাধারণত একই, কিন্তু সংখ্যার দ্বারা অনুসরণ করা যাবে না d, eকিংবা fআদৌ যদি না তিনি সুগঠিত বৈজ্ঞানিক স্বরলিপি আক্ষরিক অংশ। (উদাহরণস্বরূপ, আপনি QBasic যথাযথভাবে যেমন লাইনের সংখ্যা 1 FORবা তার পরেও জায়গাটি বাদ দিতে পারবেন না 9 ENDprint) মুদ্রণ বিবৃতিতে এটি কেবলমাত্র সেমিকোলনগুলিকে অনুমান করে যদি কোনও একটির স্ট্রিং থাকে: ?123"abc"কাজ করে তবে না ?TAB(5)123বা ?123x
  • সেমিকোলনের কথা বললে কিউব্যাসিক ১.১ একটি PRINTবিবৃতিতে ট্রেলিং সেমিকোলন যুক্ত করে যা কল TABবা এর সাথে শেষ হয় SPC। (কিউবি 64 না।)
  • 0দশমিক বিন্দু ( .1বা 1.) এর আগে বা পরে বাদ দেওয়া যেতে পারে তবে উভয়ই ( .) নয়।
  • ENDIFসমতূল্য END IF
  • একটি স্ট্রিংয়ের সমাপ্ত ডাবল উদ্ধৃতিটি একটি লাইনের শেষে বাদ দেওয়া যেতে পারে।

endifআসলে
কিউবি 64 তে

@ ওয়াস্টল তাই এটা করে। আমি যখন প্রথমবার এটি কিউবি 64 তে পরীক্ষা করেছি তখন আমি একটি পুরানো সংস্করণ ব্যবহার করছি যাতে এটি একটি সিনট্যাক্স ত্রুটি ছিল। উল্লেখ করার জন্য ধন্যবাদ!
ডিএলসাস

4

Nextবিবৃতি একত্রিত করুন

Next:Next:Next

নিচে নামানো হতে পারে

Next k,j,i

যেখানে জন্য iterators Forলুপ হয় i, jএবং k- যাতে।

উদাহরণস্বরূপ নীচের (By৯ বাইট)

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next
Next
Next

65 বাইটে নিচে নামানো যেতে পারে

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next k,j,i

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

Input n,m,o
For i=0To n
    For j=0To m
        For k=0To o
            ?i;j;k
Next k,j,i

4

আপনার ইনপুট পদ্ধতি জানুন

QBasic ব্যবহারকারী কীবোর্ড ইনপুট পেতে বিভিন্নভাবে আছে: INPUT, LINE INPUT, INPUT$, এবং INKEY$

  • INPUTআপনার মানক বহুমুখী ইনপুট বিবৃতি। প্রোগ্রামটি এটি যা করছে তা বন্ধ করে দেয়, একটি কার্সার প্রদর্শন করে এবং ব্যবহারকারীকে কিছু ইনপুট টাইপ করতে দেয়, এর মাধ্যমে শেষ হয় EnterINPUTসংখ্যা বা স্ট্রিং পড়তে পারে এবং এটি কমা-বিচ্ছিন্ন একাধিক মান পড়তে পারে। আপনি প্রম্পট হিসাবে একটি স্ট্রিং নির্দিষ্ট করতে পারেন, আপনি ডিফল্ট প্রশ্ন-চিহ্নের প্রম্পট সহ যেতে পারেন, এবং আপনি এমনকি (আমি এই রাতে আজই শিখেছি) প্রম্পটটি পুরোপুরি দমন করতে পারি। কিছু নমুনা আমন্ত্রণ:
    • INPUT x$,y
      ডিফল্ট ? প্রম্পট ব্যবহার করে এবং একটি স্ট্রিং এবং একটি সংখ্যা পড়ে, কমা দ্বারা পৃথক।
    • INPUT"Name";n$
      প্রম্পট দিয়ে Name? স্ট্রিং পড়ে।
    • INPUT"x=",x
      প্রম্পট করে x=(কোনও প্রশ্ন চিহ্ন নয়! সিনট্যাক্সে কমাটি নোট করুন) এবং একটি সংখ্যা পড়ে।
    • INPUT;"",s$
      প্রম্পটটি দমন করে (খালি প্রম্পট স্ট্রিং সহ উপরোক্ত কমা সিনট্যাক্স ব্যবহার করে), একটি স্ট্রিং পড়ে এবং যখন ব্যবহারকারী প্রবেশ করায় তখন পরবর্তী লাইনে চলে না (সেমিকোলনের পরে এটিই INPUTঘটে)। উদাহরণস্বরূপ, আপনি যদি এর PRINT s$পরে অবিলম্বে হন তবে আপনার পর্দা দেখতে ভাল লাগবে User_inputUser_input
  • এর একটি অপূর্ণতা INPUTহ'ল আপনি এতে কমা দিয়ে একটি স্ট্রিং পড়তে পারবেন না, যেহেতু INPUTফিল্ড বিভাজক হিসাবে কমা ব্যবহার করেছেন। একক লাইন নির্বিচারে (মুদ্রণযোগ্য ASCII) অক্ষর পড়তে, ব্যবহার করুন LINE INPUT। এটি ঠিক একই সিনট্যাক্স বিকল্পগুলি পেয়েছে INPUT, এটির জন্য ঠিক একটি ভেরিয়েবল লাগে যা অবশ্যই স্ট্রিং ভেরিয়েবল হতে হবে। অন্যান্য পার্থক্য হ'ল LINE INPUTডিফল্ট দ্বারা প্রম্পট প্রদর্শন করে না; যদি আপনি একটি চান, আপনাকে এটি স্পষ্টভাবে নির্দিষ্ট করতে হবে।
  • INPUT$(n)কোনও প্রম্পট বা কার্সার প্রদর্শন করে না তবে ব্যবহারকারী nঅক্ষর প্রবেশ না করা পর্যন্ত কেবল অপেক্ষা করে এবং তারপরে সেই অক্ষরগুলি সহ একটি স্ট্রিং প্রদান করে। INPUTবা এর বিপরীতে LINE INPUT, ব্যবহারকারীর Enterপরে চাপতে হবে না এবং প্রকৃতপক্ষে Enterএকটি চরিত্র হতে পারে (এটি ASCII অক্ষর 13 দেবে, সি-এর মতো ভাষাগুলি হিসাবে পরিচিত\r )।

    প্রায়শই এটি INPUT$(1)সাধারণত লুপ হিসাবে কার্যকর in ইন্টারেক্টিভ প্রোগ্রামগুলিতেINPUT$ ভাল যেখানে একক কী কী চাপগুলি কাজ করে । দুর্ভাগ্যক্রমে, এটি কেবল এমন কীগুলির সাথে কাজ করে যেগুলিতে ASCII কোড রয়েছে; এই ভালো জিনিস অন্তর্ভুক্ত Escএবং Backspace, কিন্তু না নির্দেশক তীরচিহ্নগুলি, Insertএবং Delete, এবং অন্যদের।

  • কোনটি যেখানে INKEY$আসে। INPUT$(1)এটি একইরূপে এটি একটি একক কীপ্রেস 1 এর ফলাফল প্রদান করে তবে এর চেয়ে আলাদা:

    • INKEY$ কোন যুক্তি লাগে না।
    • যদিও INPUT$(n)ব্যবহারকারী পর্যন্ত স্থগিত মৃত্যুদন্ড প্রবেশ nঅক্ষর, INKEY$ফাঁসি বন্ধ করে না। যদি ব্যবহারকারী বর্তমানে কোনও কী INKEY$টিপছে তবে সেই কীটি উপস্থাপন করে একটি স্ট্রিং প্রদান করে; যদি না হয়, এটি ফিরে আসে ""। এর অর্থ হ'ল আপনি যদি INKEY$পরবর্তী কীটি চাপতে ব্যবহার করতে চান তবে আপনাকে এটি একটি ব্যস্ত-অপেক্ষার লুপে আবদ্ধ করতে হবে: 2

      k$=""
      WHILE""=k$
      k$=INKEY$
      WEND
      
    • উভয় INPUT$এবং INKEY$ASCII অক্ষরের সাথে সামঞ্জস্যপূর্ণ কীগুলির জন্য ASCII অক্ষরগুলি ফেরত পাঠান (পলায়ন, ট্যাব এবং ব্যাকস্পেসের মতো নিয়ন্ত্রণ অক্ষর সহ)। তবে, INKEY$এমন কিছু কীগুলিও পরিচালনা করতে পারে যার এএসসিআইআই কোড নেই। এগুলির জন্য (সহায়তা ফাইলটি বলে), "INKEY নাল অক্ষর (ASCII 0) এবং কীবোর্ড স্ক্যান কোড দিয়ে তৈরি একটি 2-বাইট স্ট্রিং প্রদান করে" "

      কাদা হিসাবে পরিষ্কার? এখানে কিছু উদাহরণ। আপনি যদি INKEY$উপরের লুপটি বাম তীর কীটির কী চাপকে ক্যাপচার করতে ব্যবহার করেন k$তবে স্ট্রিংটি "␀K"( Kপ্রতিনিধিত্বকারী স্ক্যান কোড সহ 75) থাকবে। ডান তীর জন্য, এটি "␀M"(77)। পৃষ্ঠা ডাউন "␀Q"(81)। এফ 5 হ'ল "␀?"(63)।

      এখনও কাদা হিসাবে পরিষ্কার? হ্যাঁ। এটি বিশ্বের সবচেয়ে স্বজ্ঞাত জিনিস নয়। সহায়তা ফাইলটিতে স্ক্যান কোডগুলির একটি টেবিল রয়েছে তবে আমি সর্বদা ফলাফলগুলি মুদ্রণের জন্য একটি সামান্য প্রোগ্রাম লিখি INKEY$এবং সঠিক মানগুলি কী তা খুঁজে পেতে কীগুলির একটি গুচ্ছ টিপুন। আপনি কি জানেন একবার যা অক্ষর যা চাবি মিলা, আপনি ব্যবহার করতে পারেন RIGHT$(k$,1)এবং LEN(k$)সব বিভিন্ন ক্ষেত্রে আপনি সম্মুখীন হতে পারে মাঝে পার্থক্যটা উল্লেখ করা।

    শেষের সারি? INKEY$অদ্ভুত, তবে যদি আপনার প্রোগ্রামটির অ-অবরোধকারী ইনপুট প্রয়োজন হয় বা তীর কীগুলি ব্যবহার করা প্রয়োজন হয় তবে কেবলমাত্র একমাত্র উপায় ।


1 সহ না Shift, Ctrl, Alt, PrntScr, Caps Lock, এবং অনুরূপ। যারা গণনা করে না। : ^ পি

2WHILE ... WEND বাগ্ধারা এখানে কি আমি আমার QBasic বই শিখেছি হয়। গল্ফিংয়ের উদ্দেশ্যে, তবে একটি GOTOলুপটি ছোট


3

LOCATE সত্যিই শক্তিশালী হতে পারে

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

চ্যালেঞ্জটি আমাদের 16x6 গ্রিডে ব্যবহার করা প্রতিটি অক্ষর আউটপুট করতে বলেছে। সঙ্গে LOCATEএই কেবল div ও ASCII কোড উপর গেলিক ভাষার একটি ব্যাপার (হয় aএই কোডে):

LOCATE a\16-1,1+2*(a MOD 16)

এবং তারপরে অক্ষরটি মুদ্রণ করুন:

?CHR$(a)

3

কিউব্যাসিক-এ, DIMবিবৃতিটি একটি নাম এবং একটি প্রকার প্রদান করে ভেরিয়েবলগুলি তৈরি করতে প্রথাগত । তবে এটি বাধ্যতামূলক নয়, কিউব্যাসিক ভেরিয়েবলের নামের প্রত্যয় অনুসারে একটি প্রকারভেদ করতে পারে। যেহেতু আপনি একই সময়ে কোনও ভেরিয়েবল ডিক্লেয়ার করতে এবং আরম্ভ করতে পারবেন না, তাই DIMকোডগল্ফটি এড়ানো প্রায়শই বুদ্ধিমানের কাজ । দুটি স্নিপেট যা কার্যত অভিন্ন *:

DIM a AS STRING: a = "example"
a$ = "example"

* দ্রষ্টব্য যে এটি দুটি পৃথক ভেরিয়েবলের নাম তৈরি করে।

$স্ট্রিং, !একক নির্ভুলতা সংখ্যার %জন্য এবং দ্বিগুণের জন্য একটি ভেরিয়েবল নামের শেষে যুক্ত করে আমরা ভেরিয়েবলের প্রকারটি নির্দিষ্ট করতে পারি । যখন কোনও প্রকার নির্দিষ্ট না করা হয় তখন সিঙ্গেলগুলি ধরে নেওয়া হয়।

a$ = "Definitely a string"
b! = "Error!"

মনে রাখবেন এটি অ্যারেগুলিকেও ধারণ করে। সাধারণত, একটি অ্যারে হিসাবে সংজ্ঞায়িত হয়:

DIM a(20) AS STRING

তবে অ্যারেগুলিও DIMমেড মেড হওয়ার দরকার নেই :

a$(2) = "QBasic 4 FUN!"

a$11 টি স্লট সহ স্ট্রিংগুলির জন্য এখন একটি অ্যারে : সূচক 0 থেকে শুরু করে 10 সূচি সহ is একটি ডিফল্ট অ্যারে ধরণের উভয় ভাবেই সমর্থন করে।

DIMউপরের বিশটি স্লটের অ্যারে মনে আছে ? এটিতে ২১ টি স্লট রয়েছে, কারণ একই নীতিটি ম্লান এবং অ-ডিম্বাদিত অ্যারে উভয়ের ক্ষেত্রেই প্রযোজ্য।


আমি এটি কখনই উপলব্ধি করতে পারি না এটি অ্যারেতে প্রয়োগ করা হয়। মজাদার.
ট্রাইকোপলাক্স

3

সংক্ষিপ্ত IFবিবৃতি

IF বিবৃতি বরং ব্যয়বহুল, এবং এগুলি নিচে গল্ফ করা অনেকগুলি বাইট সংরক্ষণ করতে পারে।

নিম্নলিখিতটি বিবেচনা করুন ( এরিক দ্য আউটগল্ফার উত্তর থেকে অভিযোজিত ):

IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF

প্রথম কাজটি আমরা করতে পারি তা হ'ল ENDIFএকক লাইন IFবিবৃতি ব্যবহার করে :

IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0

এটি ততক্ষণ কাজ করে যতক্ষণ আপনি এটিকে অন্য কোনও কিছুর মতো একই লাইনে রাখার চেষ্টা না করেন। বিশেষত, যদি আপনার নেস্টেড IFবিবৃতি থাকে তবে কেবলমাত্র অন্তর্দিকের এক-রেখাযুক্ত হতে পারে।

তবে এই ক্ষেত্রে, আমরা IFসম্পূর্ণরূপে গণিত ব্যবহার করে নির্মূল করতে পারি । আমরা আসলে যা চাই তা বিবেচনা করুন:

  • যদি RND<.5সত্য হয় ( -1), আমরা চাই:
    • x 1 দ্বারা হ্রাস করতে
    • y একই থাকতে
    • a(i) 1 হয়ে
  • অন্যথায়, যদি RND<.5মিথ্যা হয় ( 0), আমরা চাই:
    • x একই থাকতে
    • y 1 দ্বারা হ্রাস করতে
    • a(i) 0 হতে

এখন যদি আমরা একটি পরিবর্তনশীল মধ্যে (শর্তসাপেক্ষ ফল সংরক্ষণ r=RND<.5), আমরা নতুন মান নিরূপণ করতে পারেন x, yএবং a(i):

  • যখন rহয় -1, x=x-1; যখন rহয় 0, x=x+0
  • যখন rহয় -1, y=y+0; যখন rহয় 0, y=y-1
  • যখন rহয় -1, a(i)=1; যখন rহয় 0, a(i)=0

সুতরাং আমাদের চূড়ান্ত কোডটি দেখে মনে হচ্ছে:

r=RND<.5
x=x+r
y=y-1-r
a(i)=-r

আসল সংস্করণে পুরো 20 বাইট (40%) সঞ্চয় করা।


গাণিতিক পদ্ধতিটি আশ্চর্যজনকভাবে প্রায়শই প্রয়োগ করা যেতে পারে, তবে যখন দুটি মামলার মধ্যে যুক্তির মধ্যে পার্থক্য রয়েছে (উদাহরণস্বরূপ যখন আপনাকে কোনও ক্ষেত্রে কিছু ইনপুট করতে হবে তবে অন্য ক্ষেত্রে নয়) তখনও আপনাকে ব্যবহার করতে হবে IF


3

কখনও কখনও, আপনি অ্যারে এড়ানো উচিত

কিউব্যাসিকের অ্যারেগুলি যখন ইনস্ট্যান্টিয়েটেড হয় DIMকেবল ১১ টি স্লট। যদি কোন চ্যালেঞ্জের জন্য 11 টির বেশি স্লট (বা এন স্লট, যেখানে এন 11 এর চেয়ে বড় হতে পারে) প্রয়োজন হয়, আপনার DIMঅ্যারে হওয়া উচিত । এছাড়াও, ধরে নেওয়া যাক আমরা ডেটা দিয়ে এই অ্যারেটি তৈরি করতে চাই:

DIM a$(12)
a$(0) = "Value 1"
a$(1) = "Value 2"
...

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

a$ = "value 1value 2"

এখানে, আমরা 1 সংযুক্ত স্ট্রিংয়ে সবকিছু রাখি। পরে, আমরা এটি এর মতো অ্যাক্সেস করি:

?MID$(a$,i*7,7)

এই পদ্ধতির জন্য, সমস্ত মান সমান দৈর্ঘ্যের হওয়া জরুরী। দীর্ঘতম মানটি নিন এবং অন্য সকলকে প্যাড করুন:

a$="one  two  threefour "

আপনার শেষ মানটি প্যাড করার দরকার নেই এবং আপনি সমাপনী উদ্ধৃতিগুলি এড়িয়ে যেতে পারেন! যদি চ্যালেঞ্জটি নির্দিষ্ট করে যে উত্তরে সাদা-স্পেসের অনুমতি নেই তবে এটি RTRIM$()ঠিক করতে ব্যবহার করুন ।

আপনি এখানে এই কৌশল কার্যকর করতে পারেন ।


3

PRINT( ?) কিছু quirks আছে

নম্বরগুলি একটি শীর্ষস্থানীয় এবং পিছনে স্থান সহ মুদ্রিত হয়।

মুদ্রণ একটি লাইন ব্রেক শুরু করে। এই আচরণটির পরিবর্তে কোনও ট্যাব sertোকাতে বিবৃতিটির শেষে কমা বা কোনও সন্নিবেশ এড়ানোর জন্য একটি আধা-কোলন যুক্ত করে পরিবর্তন করা যেতে পারে:

মুদ্রণের সময় এটি ব্যবহার করতে &বা ;পৃথক ক্রিয়াকলাপগুলির মধ্যে প্রয়োজন হয় না । চিঠিটি প্রতিটি পাশে ফাঁকা ?1"x"s$রেখে নম্বরটি মুদ্রণ করবে1x এবং এর বিষয়বস্তুs$

?"foo"
?"bar"
?10
?"foo",
?"bar"
?"foo"; 
?"bar"
?1CHR$(65)
?1" "CHR$(65)
?"A","B

আউটপুট

foo
bar
 10
foo           bar
foobar
 1 A
 1  A
A             B

একটি লাইনব্রেক প্রিন্টিং দিয়ে ঠিক করা যায় ?


বিশেষত মুদ্রণ সংখ্যার উপর: একটি স্থান যদি সংখ্যার আগে মুদ্রিত হয় যদি এটি ননজিটিভেটিভ হয়; অন্যথায়, একটি বিয়োগ চিহ্ন -সেখানে মুদ্রিত হয়। সংখ্যার পরে একটি স্থানও মুদ্রিত হয়। এই স্থানগুলি থেকে মুক্তি পাওয়ার জন্য আমি সবচেয়ে ভাল PRINT USINGউপায়টি আবিষ্কার করেছি - আপনি যদি এই উত্তরে এটি যোগ করতে চান বা এটি একটি পৃথক উত্তর হওয়া উচিত তবে ডুন্নো।
DLosc

2

WRITE জায়গায় দরকারী হতে পারে PRINT

PRINTআপনি আউটপুটটি করতে চান এমন উপায় হ'ল এটি বেশ নমনীয় এবং ?শর্টকাট রয়েছে। তবে, WRITEকমান্ডটি আপনাকে নির্দিষ্ট পরিস্থিতিতে বাইটগুলি বাঁচাতে পারে:

  • স্ট্রিং আউটপুট দেওয়ার সময় WRITEএটিকে ডাবল কোট ( ") দিয়ে মোড়ানো হয় । আপনার যদি ডাবল উদ্ধৃতি সহ আউটপুট প্রয়োজন WRITE s$হয় তবে তার চেয়ে অনেক কম ?CHR$(34);s$;CHR$(34)। উদাহরণস্বরূপ দেখুন, সবচেয়ে স্বল্পতম কিউ বেসিক কুইন দেখুন
  • একটি সংখ্যা আউটপুট করার সময়, এর WRITEআগে এবং পরে এর মতো জায়গাগুলি যুক্ত করে না PRINTWRITE nচেয়ে অনেক খাটো ?MID$(STR$(n),2)। উদাহরণস্বরূপ, কিউবি 64-তে ফিজবুজ দেখুন ।
  • একাধিক মান আউটপুট দেওয়ার সময় WRITEএগুলি কমা: WRITE 123,"abc"আউটপুটগুলির সাথে পৃথক করে 123,"abc"। আমি এমন দৃশ্যের কথা ভাবতে পারি না যেখানে এটি কার্যকর হবে তবে এর অর্থ এই নয় যে এটি একটি নয়।

এর সীমাবদ্ধতা WRITE:

  • এর সাথে পৃথককারী ছাড়া একাধিক মান আউটপুট করার কোনও উপায় নেই PRINT a;b
  • আউটপুট শেষে নতুন লাইনটি দমন করার কোনও উপায় নেই। (আপনি এটির সাথে কাজ করতে সক্ষম হতে পারেন LOCATE, তবে এটির জন্য প্রচুর বাইট খরচ হয়))

1

কখনও কখনও, কিউবাসিক মঙ্গলে ফাংশনে প্রবেশ করে। আপত্তি!

এখানে বেশ কয়েকটি ফাংশন রয়েছে যা স্ট্রিংয়ের পরিবর্তে অক্ষরগুলিতে কাজ করে, তবে charকিউব্যাসিকে কোনও ডেটাটাইপ নেই, কেবল string ($)টাইপ রয়েছে। উদাহরণস্বরূপ ASC()ফাংশনটি ধরুন , যা কোনও চরিত্রের জন্য ASCII কীকোড প্রদান করে। যদি আমরা প্রবেশ করতাম

PRINT ASC("lala")

কেবল প্রথমটি lকিউবাসিক বিবেচনা করবে। এইভাবে, আমাদের দৈর্ঘ্য 1 পর্যন্ত স্ট্রিং কাটা নিয়ে বিরক্ত করার দরকার নেই।

আর একটি উদাহরণ আসে এই প্রশ্ন থেকে যেখানে STRING$()ফাংশনটি উত্তরের একটিতে ব্যবহৃত হয়।

STRING $ ফাংশনটি দুটি আর্গুমেন্ট গ্রহণ করে, একটি সংখ্যা এন এবং একটি স্ট্রিং s takes, এবং s of এর প্রথম অক্ষরের এন কপি সমন্বিত একটি স্ট্রিং তৈরি করে

@DLosc, এখানে

মনে রাখবেন কিউব্যাসিক যখন একটি মাল্টি-চার স্ট্রিং সরবরাহ করে এবং কেবল একটি চরের প্রয়োজন হয়, স্বয়ংক্রিয়ভাবে প্রথম চরটি নেয় এবং বাকী অংশগুলি উপেক্ষা করে।

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