মস্তিস্কে গল্ফ করার টিপস


23

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

উত্তর:


25

প্রতি উত্তরে একটি টিপ দেওয়া অনেক উত্তর হবে।

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

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

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

  • আরও বড় আকারে বিবেচনা করুন এবং এমনকি বিভিন্ন বিভিন্ন অ্যালগরিদম প্রয়োগ করার চেষ্টা করুন। প্রথমদিকে এটি ঠিক কীভাবে অ্যালগরিদম সেরা হবে তা স্পষ্ট হবে না; এটি বেসিক পদ্ধতির সবচেয়ে ভাল হবে তা এমনকি স্পষ্ট নাও হতে পারে, এবং এটি সম্ভবত একটি সাধারণ ভাষায় সবচেয়ে ভাল কি হতে পারে তার চেয়ে আলাদা কিছু হবে।

  • আপনি যদি বৃহত্তর বা পরিবর্তনশীল-আকারের ডেটা নিয়ে কাজ করে থাকেন তবে দেখুন এটি স্থানীয়ভাবে কোনওভাবেই মোকাবেলা করতে পারে কিনা তা দেখুন বা এটির মধ্যে আপনার সংখ্যাগত অবস্থানটি না রেখে meric

  • একই তথ্য দুটি ভিন্ন জিনিস হতে পারে। (প্রায়শই একটি সংখ্যা বা চরিত্র এবং ননজারো পজিশনাল মার্কারও থাকে । তবে এলোমেলো.বি দেখুন , যেখানে সেলুলার অটোমেটনের একটি ঘরের মান হিসাবে কিছুটা কাউন্টার ডাবল হয়।)

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

  • বেশিরভাগ ভাষায়, আপনি আপনার প্রোগ্রামের আচরণটি যাচাই করতে ঘন ঘন একটি সংকলক বা দোভাষী ব্যবহার করেন। ব্রেনফাক ভাষা বৃহত্তর ধারণাগত নিয়ন্ত্রণের দাবি করে; আপনার প্রোগ্রামটি কী করে তা বলার জন্য যদি আপনার একটি সংকলক প্রয়োজন হয় তবে আপনার প্রোগ্রামের দৃ enough় উপলব্ধি আপনার নেই, এবং আপনার সম্ভবত এটি আরও কিছুক্ষন তাকাতে হবে - কমপক্ষে যদি আপনি একটি পরিষ্কার যথেষ্ট চিত্র পেতে চান গল্ফ এ ভাল হতে অনুরূপ প্রোগ্রামগুলির ধারণাগত হলো। অনুশীলনের মাধ্যমে, আপনি একটি চালানোর চেষ্টা করার আগে আপনি আপনার প্রোগ্রামের এক ডজন সংস্করণ তৈরি করবেন এবং সেই সময়ের মধ্যে আপনি 95% নিশ্চিত হয়ে যাবেন যে আপনার সংক্ষিপ্ততমটি সঠিকভাবে চলবে।

  • শুভকামনা! খুব অল্প লোকই ব্রেইনফাককে সংক্ষিপ্তভাবে লিখতে বিরক্ত করে, তবে আমি মনে করি এটিই একমাত্র উপায় যা সম্ভবত ভাষা অব্যাহত মনোযোগকে ন্যায়সঙ্গত করতে পারে - একটি চমকপ্রদ অস্পষ্ট শিল্প রূপ হিসাবে।


3
এটি পড়ার ফলে আমি এখন ব্রেইনফাকের প্রোগ্রামিং চেষ্টা করতে চাইছি ..
ক্লাদিউ

পবিত্র ছিঃ, ভেবেছি আমি তোমার নামটি চিনতে পেরেছি। আপনার ব্রেনফাক প্রোগ্রামগুলির বড় ফ্যান, বিশেষত আপনার সুপার-শর্ট স্ব-দোভাষী!
জো কিং

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

"আপনার লেআউটের
যতগুলি ভিন্ন ধরণের

9

কয়েকটি টিপস এখানে:

ধ্রুবক:

Esolangs 'ধ্রুবক পৃষ্ঠা নির্দিষ্ট মান তৈরি করতে সবচেয়ে কম উপায়ে একটি অত্যন্ত দরকারী তালিকা রয়েছে। আমি নিজেকে প্রতি প্রোগ্রামে কমপক্ষে দুবার এই পৃষ্ঠাটি পরামর্শ দিচ্ছি।

সমস্ত কিছুর শুরু:

+++[[<+>>++<-]>]

এটি 3 * n ^ 2 ফর্ম্যাটটিতে টেপটি সেট আপ করে, যা দেখতে সুন্দর

3 6 12 24 48 96 192 128 0 0 '

এটা কেন এত গুরুত্বপূর্ণ?

আসুন তালিকাটি নীচে যান:

  • 3 এবং 6 বোরিং হয়
  • 12: 10 (নিউলাইন) অথবা 13 (ক্যারেজ রিটার্ন) এর কাছাকাছি। কাউন্টারে 0-9 এর জন্যও ব্যবহার করা যেতে পারে
  • 24: বর্ণমালার অক্ষরের সংখ্যা 26 Close
  • 48: এএসসিআইআই এর জন্য 0
  • 96: 97 এর কাছাকাছি, এএসসিআইআই a
  • 196 এবং 128: 196-128 = 64, 65 এর কাছাকাছি, এএসসিআইআই A

এই একটি অ্যালগরিদম থেকে, আমরা ASCII পরিসরে কার্যত প্রতিটি ক্রমের শুরুতে, প্রতিটির জন্য একটি কাউন্টার এবং সহজলভ্য একটি নতুন লাইন।

একটি ব্যবহারিক উদাহরণ:

সমস্ত বড় হাতের অক্ষর এবং ছোট হাতের অক্ষর এবং অঙ্ক মুদ্রণ করা হচ্ছে।

অ্যালগরিদম সহ:

+++[[<+>>++<-]>]<<[-<->]<<<<++[->>+.>+.<<<]<--[>>.+<<-]

ছাড়া:

+++++++++++++[->+++++++>++>+++++>++++>+<<<<<]>+++++>[-<+.>>.+<]>>---->---[-<.+>]

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

একই শিরাতে আরও কয়েকটি আকর্ষণীয় অ্যালগরিদম:

3 * 2 ^, n + 1:

+++[[<+>>++<-]+>]
Tape: 4 7 13 25 49 65 197 129 1 0'

এটি 1 দ্বারা মানগুলি অফসেট করে, যা কয়েকটি জিনিস সম্পাদন করে। এটি 12 টি ক্যারেজ রিটার্ন, 64 টি বড় হাতের বর্ণমালার প্রকৃত শুরু এবং 24 টি 26-এর কাছাকাছি করে তোলে।

2 ^ n হল:

+[[<+>>++<-]>]
Tape: 1 2 4 8 16 32 64 128

64 বড় হাতের অক্ষরের জন্য ভাল, 32 স্থানের জন্য ASCII, এবং 128 কে 26 (130/5 = 26) এর কাউন্টার হিসাবে ব্যবহার করা যেতে পারে। এটি নির্দিষ্ট পরিস্থিতিতে বাইটগুলি সংরক্ষণ করতে পারে যেখানে অঙ্ক এবং ছোট হাতের অক্ষরের প্রয়োজন হয় না।

প্রশ্নের উপযুক্ত অনুসারে বাস্তবায়ন চয়ন করুন:

  • নেতিবাচক কোষগুলি প্রায় সর্বদা কার্যকর এবং এগুলি এড়াতে কোনও কারণ নেই (যদি না এটি আপনার বাইকোয়েন্টে পরিবর্তন না করে)
  • মোড়কের ঘরগুলির সাথে প্রায় একই জিনিস, আরও বেশি কারণ অনেকগুলি ধ্রুবক মোড়ক ব্যবহার করে।
  • স্বেচ্ছাসেবক সেল মাপগুলি অসীম গণিতের সিকোয়েন্সগুলির জন্য দরকারী যেমন ফাইবোনাকি সিক্যুয়েন্সকে অসীমভাবে গণনা করা ( +[[-<+>>+>+<<]>]) বা বৃহত্তর / নেতিবাচক সংখ্যার প্রক্রিয়াকরণ। Downside হয় যে যেমন কিছু সাধারণ পদ্ধতি, হয় [-]এবং [->+<]উপর ওপরেই নির্ভরশীল করা যাবে না, ধরো যদি সংখ্যা নেতিবাচক।
  • ইওএফ 0, -1 বা কোনও পরিবর্তন হিসাবে। 0 টি সাধারণত পছন্দনীয়, কারণ আপনি অতিরিক্ত চেক ছাড়াই পুরো ইনপুটটি লুপ করতে পারেন। -1 অ্যারে স্ট্রাকচারগুলি লুপ করার সময় দরকারী। আমি এখনও কোনও পরিবর্তন ছাড়াই একটি ব্যবহার পাইনি :(।

ফ্রিক কী চলছে সে সম্পর্কে নজর রাখুন:

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

যে কোনও মুহুর্তে, আমার কোডটি অন্য প্রতিটি লাইনে এমন মন্তব্যে ছড়িয়ে পড়েছে যা দেখতে এই রকম হয়:

*0 *dat a_1 ?  0' !0 0*
 or
*0 *dat 0' ap1 0  !0 0*

কিছু অতিরিক্ত পরামর্শ প্রতীক বিশেষ অর্থ নির্ধারণ করা হয়। উপরের উদাহরণে, 'যেখানে পয়েন্টারটি রয়েছে, তার *অর্থ সেই দিকের পুনরাবৃত্তি , যার ?অর্থ অজানা মানযুক্ত একটি ঘর, !0যার অর্থ একটি শূন্য নয় _এমন একটি ঘর, এর বিকল্প -এবং pএটির বিকল্প রয়েছে +orবোঝায় যে টেপটি কোনও উপস্থাপনের মতো দেখতে পারে এবং এটি হ্যান্ডেল করা দরকার।

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


5

আমার মূল পরামর্শটি হবে না।

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

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


5

এই উত্তরে আমি টেপটিতে একটি নির্দিষ্ট কক্ষটি অনেক বার উল্লেখ করতে যাচ্ছি। এটি কোন ঘরটি তা বিবেচনাধীন নয়, তবে পুরো উত্তর জুড়ে এটি একই ঘর। এই পোস্টের উদ্দেশ্যে, আমি সেই সেলটিকে "টড" বলব।

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

ব্রেনফাক কনস্ট্যান্টসের esolangs.org পৃষ্ঠা অনুসারে (যা সম্ভবত নিজেরাই একটি টিপের বিষয় হতে পারে!) 30 পাওয়ার সবচেয়ে সংক্ষিপ্ততম উপায় >+[--[<]>>+<-]>+। নেতৃত্বের >অবস্থানটি কেবলমাত্র পয়েন্টারের বামদিকে কিছুই পরিবর্তিত হয়নি তা নিশ্চিত করার জন্য রয়েছে তবে এই ক্ষেত্রে আমরা ধরে নেব যে আমরা এটির যত্ন নিই না এবং এটি ফেলে দেই। এই কোডটি ব্যবহার করে, আপনার কোডটি এর মতো দেখতে লাগবে:

+[--[<]>>+<-]>+(MISC. CODE)(GO TO TODD)[.]

আপনি কোডের প্রথম অংশটি এর মতো ভাবতে পারেন:

(SET TODD TO 30)(MISC. CODE)(GO TO TODD)[.]

কিন্তু যে খণ্ড গত দুটি অক্ষর মনে রাখবেন: >+। এটি এভাবে চিন্তা করা ঠিক যেমন বৈধ:

(SET TODD TO 29)(GO TO TODD)(ADD 1 TO TODD)(MISC. CODE)(GO TO TODD)[.]

আপনি (GO TO TODD)দুবার খেয়াল করুন! আপনি তার পরিবর্তে এইভাবে আপনার কোডটি লিখতে পারেন:

(SET TODD TO 29)(MISC. CODE)(GO TO TODD)(ADD 1 TO TODD)[.]
+[--[<]>>+<-](MISC. CODE)(GO TO TODD)+[.]

ধরে নিচ্ছি যে বাইটের যে সংখ্যাটি লাগে এটি (GO TO TODD)আগের মতো, একটি কম পদক্ষেপ == এক কম বাইট! কখনও কখনও আপনার শুরুর অবস্থান পরিবর্তিত হয় তা সেই সুবিধাটি সরিয়ে নিয়ে যায় তবে সবসময় তা নয়।


0

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

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