একটি গল্ফিং ভাষায় সঞ্চয় করার জন্য টিপস


16

আমি একটি গল্ফ ভাষা লিখছি।

আপনি কি কোনও কোড-গল্ফ ভাষায় সঞ্চয় করার জন্য ভেরিয়েবল, স্ট্যাক (গুলি), টেপস, রেজিস্টার ইত্যাদির পরামর্শ দেন? অন্তর্নিহিত ইনপুট সম্পর্কে কী?

রুক্ষ সংজ্ঞা:

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

আমি বিভিন্ন পরিস্থিতিতে এবং সামগ্রিকভাবে প্রতিটি বিকল্পের সুবিধাগুলি এবং অসুবিধাগুলি জানার জন্য প্রশংসা করব। দয়া করে যুক্তি সহ মতামত এবং ব্যাকআপ বিবৃতি এড়িয়ে চলুন।


1
আমি মনে করি আপনার প্রশ্নের মধ্যে এই শর্তগুলির একটি সংজ্ঞা অন্তর্ভুক্ত করা উচিত
ক্রিতিক্সি লিথোস

2
@ ফ্যাটালাইজ প্রযুক্তিগতভাবে স্টোরেজ পদ্ধতিটি আপনি কোন ধরণের গল্ফিং ভাষা
বানাচ্ছেন

1
@Ethproductions তারা সম্পূর্ণ আন্তঃনির্ভরশীল।
জালিয়াতি করুন

1
আমি বিভিন্ন স্টোরেজ শর্তাদির কয়েকটি মোটামুটি সংজ্ঞা সংযোজন করেছি, বিনা দ্বিধায় সম্পাদনা করতে বা আপনার পছন্দ না হলে ফিরে রোল করুন।
ETH প্রোডাকশনগুলি

2
স্টোরেজ পদ্ধতি এবং ভাষার ধরণের মধ্যে খুব ঘনিষ্ঠ সম্পর্ক রয়েছে তবে আমি মনে করি আপনাকে উভয়টিই দেখতে হবে। উদাহরণস্বরূপ, "অপরিহার্য" ভাষাগুলি (যাঁরা তাদের নির্দেশাবলী বাম থেকে ডানদিকে কঠোরভাবে সম্পাদন করেন) স্ট্যাক-ভিত্তিক (সিজেএম, 05 এএবি 1 ই), টেপ-ভিত্তিক (ব্রেনএফ ***), বা অন্য কোনও কিছু হতে পারে (ভি, যা ব্যবহার করে) একটি বড় 2 ডি স্ট্রিংকে "রেফারগুলি সহ কয়েকটি রেজিস্টার সহ" বাফার "বলা হয়। এখানে উপসর্গ-ভিত্তিক ভাষা (পাইথ), ইনফিক্স-ভিত্তিক ভাষা (জাপট, পিপ, এবং মূলত প্রতিটি মূলধারার ল্যাং), লিঙ্ক-ভিত্তিক ভাষা (জেলি) ইত্যাদি রয়েছে যার মধ্যে উল্লেখযোগ্য কোনও পদ্ধতিই খুব কমই ব্যবহার করে।
ETH প্রোডাকশনগুলি

উত্তর:


4

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

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

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

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

তবে মনে রাখবেন যে, আপনি বাইনারি গাছের আকারটি অপারেটর প্রতি মাত্র 2 বিটের মধ্যে এনকোড করতে পারেন। সুতরাং, যদি আপনার ভাষাতে than৪ টিরও কম অপারেটর থাকে, আপনি আসলে theতিহ্যবাহী মডেলগুলিকে উপেক্ষা করতে পারেন এবং কেবলমাত্র অতিরিক্ত গাছগুলিতে সম্পূর্ণ গাছটিকে এনকোড করতে পারেন (তাদের সংযুক্ত করুন প্যারেন্ট এবং নীচে_ বাম পতাকাগুলি)। আরও বেশি অপারেটর থাকলেও আপনি এটির পরিবর্তনের জন্য মোটামুটি ভাল ডিফল্ট (যেমন জেলি মডেল) এবং 3 টি পরিবর্তনকারী তৈরি করতে পারেন make

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

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

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


7

আমি তাদের সব পরামর্শ!

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

একটি উদাহরণ:

  • বলুন আমি দুটি সংখ্যা ইনপুট হিসাবে নিতে চাই এবং তাদের স্ট্রিং দৈর্ঘ্য যুক্ত করতে চাই
  • ভেরিয়েবলগুলি এর জন্য ভাল হতে পারে (একটি স্ট্যাক নাও থাকতে পারে)
  • গল্ফস্ক্রিপ্টে উদাহরণ কোড (অন্তর্নিহিত ইনপুট সহ):

    ~,\,+
    ~ # Eval input (e.g. "1 2" > 1, 2)
    , # Take Length
    \ # Reverse items on the stack
    , # Take Length
    + # Add
      # Implicit output
    

    তবে, ভেরিয়েবলগুলির সাথে (আমি জানি এটি দীর্ঘতর, এটি কেবল স্ট্যাকের জায়গাগুলি অদলবদল করতে হবে না):

    ~,:a;,:b;ab+
    ~ # Eval input
    , # Get length
    :a# Store in "a"
    ; # Discard value left on stack
    , # Length
    :b# Store in "b"
    ; # Discard
    a # Recall a
    b # Recall b
    + # Add
      # Implicit output
    

Overloads

আর একটি জিনিস যা সহায়ক হতে পারে তা হ'ল ওভারলোড। উদাহরণস্বরূপ, যদি আপনার কোনও ভেরিয়েবল স্টোরেজ ফাংশন থাকে, তবে এটি স্ট্যাক বা টেপ যুক্ত করতে মোনাড (ওয়ান ইনপুট ফাংশন; আমি জে / কে / এপিএল এর বাহ্যিক শব্দটি সম্পর্কে নিশ্চিত নই)।

উদাহরণ:

c12 # Stores "1" into register 2
c1] # Pushes "1" onto the stack ("]" is used to denote the end of the monad)

যদি কোনও যুক্তিকে ভুল প্রকারের সাথে ডাকা হয়, এটি একটি কাতারে যুক্ত হয় যা স্ট্যাকটি ফাঁকা থাকলে মান পূরণ করার জন্য ব্যবহৃত হয়?
ফলটি Esolanging

5

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

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

কেবলমাত্র তাদের নাম বা সংজ্ঞাগুলি গর্তের জন্য কেবল সেগুলির কার্যকারিতা সীমাবদ্ধ করবেন না - কিছু ফাংশন put the 1st thing of the stack on top of the stackঅবশ্যই সাহায্য করতে পারে।


5

মূলত দুটি ধরণের স্টোরেজ রয়েছে যা আলাদাভাবে পরিচালনা করা প্রয়োজন; সম্প্রতি উত্পন্ন মান এবং / অথবা ইনপুটগুলিতে অ্যাক্সেস; এবং দীর্ঘমেয়াদী সঞ্চয়স্থান

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

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

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


0

আমি একটি টেপ এবং একটি রেজিস্টার প্রস্তাব।

আমি স্ট্যাকের চেয়ে টেপগুলিকে পছন্দ করি কারণ টেপগুলিতে কম উপাদান থাকে, এগুলির দ্বারা ম্যানিপুলেশন সহজ করে তোলে। এছাড়াও, রেজিস্টারে টেপগুলিতে উপাদান রাখতে সক্ষম হওয়া এবং তদ্বিপরীত পক্ষে সহজ, শর্ট কোড তৈরি করে।

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