গল্ফস্ক্রিপ্ট - 12 টি অক্ষর
{,1\{)*}/}:f
গল্ফস্ক্রিপ্ট দিয়ে শুরু করা - ধাপে ধাপে কারখানা
গল্ফস্ক্রিপ্ট শেখার চেষ্টা করা লোকদের জন্য এখানে কিছু। পূর্বশর্ত হ'ল গল্ফস্ক্রিপ্টের প্রাথমিক ধারণা এবং গল্ফস্ক্রিপ্ট ডকুমেন্টেশন পড়ার ক্ষমতা।
সুতরাং আমরা আমাদের নতুন সরঞ্জাম গল্ফস্ক্রিপ্ট চেষ্টা করতে চাই । সহজ কিছু দিয়ে শুরু করা সর্বদা ভাল, সুতরাং আমরা ফ্যাক্টরিয়াল দিয়ে শুরু করি। একটি সাধারণ অপরিহার্য সিউডোকোডের উপর ভিত্তি করে এখানে একটি প্রাথমিক প্রচেষ্টা:
# pseudocode: f(n){c=1;while(n>1){c*=n;n--};return c}
{:n;1:c;{n 1>}{n c*:c;n 1-:n;}while c}:f
গলফস্ক্রিপ্টে হোয়াইটস্পেস খুব কমই ব্যবহৃত হয়। সাদা স্থান থেকে মুক্তি পাওয়ার সহজ কৌশলটি বিভিন্ন ভেরিয়েবলের নাম ব্যবহার করা। প্রতিটি টোকেন একটি পরিবর্তনশীল হিসাবে ব্যবহার করতে পারেন ( সিনট্যাক্স পৃষ্ঠাটি দেখুন)। দরকারী টোকেন হিসাবে ভেরিয়েবল মত বিশেষ অক্ষর ব্যবহার করতে |
, &
, ?
সাধারণত কোনো কিছু কোডে অন্যত্র ব্যবহৃত -। এগুলি সর্বদা একক অক্ষর টোকেন হিসাবে পার্স করা হয়। বিপরীতে, ভেরিয়েবলগুলি পছন্দ করেn
স্ট্যাকের পরে কোনও সংখ্যা ঠেলে দেওয়ার জন্য একটি স্থানের প্রয়োজন হবে। নম্বরগুলি মূলত পূর্বনির্ধারিত পরিবর্তনশীল।
সর্বদা হিসাবে, এমন বক্তব্য থাকবে যা আমরা শেষ ফলাফলকে প্রভাবিত না করেই পরিবর্তন করতে পারি। Golfscript, সবকিছু ব্যতীত সত্য মূল্যায়ণ 0
, []
, ""
, এবং {}
(দেখুন এই )। এখানে আমরা লুপের প্রস্থান শর্তটিকে সহজভাবে পরিবর্তন করতে পারি{n}
(আমরা অতিরিক্ত সময় লুপ করব, এবং এন = 0 হলে শেষ করব)।
যে কোনও ভাষা গল্ফ করার মতো, এটি উপলব্ধ ফাংশনগুলি জানতে সহায়তা করে। ভাগ্যক্রমে তালিকাটি গল্ফস্ক্রিপ্টের জন্য খুব ছোট। আমরা অন্য একটি চরিত্র সংরক্ষণ করতে পরিবর্তন 1-
করতে পারি (
। বর্তমানে কোডটি এর মতো দেখাচ্ছে: (আমরা চাইলে আমরা এখানে 1
পরিবর্তে ব্যবহার করতে পারতাম |
, যা সূচনাটি নামিয়ে দেয়))
{:n;1:|;{n}{n|*:|;n(:n;}while|}:f
সংক্ষিপ্ততম সমাধানগুলি পাওয়ার জন্য স্ট্যাকটি ভালভাবে ব্যবহার করা গুরুত্বপূর্ণ (অনুশীলন অনুশীলন অনুশীলন)। সাধারণত, মানগুলি যদি কেবলমাত্র কোডের একটি ক্ষুদ্র অংশে ব্যবহৃত হয় তবে এগুলি ভেরিয়েবলগুলিতে সংরক্ষণ করার প্রয়োজন হবে না। চলমান পণ্য পরিবর্তনশীল অপসারণ করে এবং কেবল স্ট্যাক ব্যবহার করে, আমরা বেশ কয়েকটি অক্ষর সংরক্ষণ করতে পারি।
{:n;1{n}{n*n(:n;}while}:f
এখানে ভেবে দেখার মতো আরও কিছু। আমরা n
লুপের বডির শেষে স্ট্যাক থেকে ভেরিয়েবলটি সরিয়ে দিচ্ছি , কিন্তু তারপরে এটির পরে তা চাপছি। আসলে, লুপটি শুরু হওয়ার আগে আমরা এটিকে স্ট্যাক থেকেও সরিয়ে ফেলি। পরিবর্তে আমাদের এটি স্ট্যাকের উপর ছেড়ে দেওয়া উচিত এবং আমরা লুপের শর্তটি ফাঁকা রাখতে পারি।
{1\:n{}{n*n(:n}while}:f
হতে পারে আমরা এমনকি সম্পূর্ণরূপে চলক অপসারণ করতে পারেন। এটি করার জন্য, আমাদের সর্বদা স্ট্যাকের মধ্যে পরিবর্তনশীল রাখতে হবে। এর অর্থ হ'ল কন্ডিশন চেক শেষে স্ট্যাকের উপরে আমাদের ভেরিয়েবলের দুটি কপি প্রয়োজন, যাতে চেকের পরে আমরা এটি হারাতে পারি না। যার অর্থ হ'ল আমাদের অতিরিক্ত কাজ হবে0
লুপ শেষ হওয়ার পরে আমাদের স্ট্যাকের মধ্যে হবে তবে এটি ঠিক করা সহজ।
এটি আমাদের সর্বোত্তম while
লুপ সমাধানের দিকে নিয়ে যায় !
{1\{.}{.@*\(}while;}:f
এখন আমরা এটি আরও খাটো করতে চাই। স্পষ্ট লক্ষ্য শব্দ হতে হবে while
। ডকুমেন্টেশনের দিকে তাকানো, দুটি কার্যকর বিকল্প রয়েছে - উদ্ঘাটন এবং কর । যখন আপনার কাছে নিতে বিভিন্ন রুটের পছন্দ আছে, চেষ্টা করুন এবং উভয়ের সুবিধাগুলি বিবেচনা করুন। আনফোল্ডটি 'বেশ কিছুক্ষণ লুপ', সুতরাং অনুমান হিসাবে আমরা 5 টি চরিত্রকে while
4 দ্বারা কেটে ফেলব /
। হিসাবে do
, আমরা while
3 টি অক্ষর কেটেছি এবং দুটি ব্লক একত্রিত করতে পারি, যা অন্য একটি অক্ষর বা দুটি সংরক্ষণ করতে পারে।
do
লুপটি ব্যবহারে আসলে একটি বড় ত্রুটি রয়েছে । যেহেতু একবার শরীরে একবার মৃত্যুদন্ড কার্যকর করার পরে শর্ত পরীক্ষা করা হয়, এর মানটি 0
ভুল হবে, সুতরাং আমাদের যদি একটি বিবৃতি প্রয়োজন হতে পারে। আমি আপনাকে এখনই বলব যে উদ্ঘাটনটি ছোট is (এর সাথে কিছু সমাধানের do
শেষে দেওয়া আছে)। এগিয়ে যান এবং এটি চেষ্টা করুন, আমাদের ইতিমধ্যে কোডটি ন্যূনতম পরিবর্তন প্রয়োজন।
{1\{}{.@*\(}/;}:f
গ্রেট! আমাদের সমাধানটি এখন সুপার-শর্ট এবং আমরা এখানে ঠিক করেছি, তাই না? নাঃ। এটি 17 টি অক্ষর এবং জে 12 টি অক্ষর রয়েছে। কখনও পরাজয় স্বীকার করবেন না!
এখন আপনি ... পুনরাবৃত্তি নিয়ে ভাবছেন
পুনরাবৃত্তি ব্যবহারের অর্থ আমাদের অবশ্যই একটি শাখা কাঠামো ব্যবহার করা উচিত । দুর্ভাগ্যজনক, তবে কারণ হিসাবে সংক্ষিপ্তভাবে পুনরাবৃত্তভাবে প্রকাশ করা যেতে পারে, এটি পুনরাবৃত্তির একটি কার্যকর বিকল্প হিসাবে মনে হয়।
# pseudocode: f(n){return n==0?n*f(n-1):1}
{:n{n.(f*}1if}:f # taking advantage of the tokeniser
আচ্ছা এটি সহজ ছিল - আমরা যদি পূর্বে পুনরাবৃত্তি করার চেষ্টা করে থাকি তবে আমরা হয়ত কোনও while
লুপ ব্যবহার না করেও তাকিয়ে থাকতে পারি ! তবুও, আমরা কেবল 16 টি অক্ষরে আছি।
অ্যারেগুলির
অ্যারেগুলি সাধারণত দুটি উপায়ে তৈরি করা হয় - [
এবং ]
অক্ষরগুলি ব্যবহার করে বা ,
ফাংশন দিয়ে। যদি স্ট্যাকের শীর্ষে কোনও পূর্ণসংখ্যার সাথে মৃত্যুদন্ড কার্যকর করা হয় তবে আর্টের সাহায্যে ,
সেই দৈর্ঘ্যের একটি অ্যারের [i] = i প্রদান করে।
অ্যারেগুলিকে পুনরাবৃত্তি করার জন্য, আমাদের কাছে তিনটি বিকল্প রয়েছে:
{block}/
: ঠেলা, ব্লক, পুশ, ব্লক, ...
{block}%
: [পুশ, ব্লক, পুশ, ব্লক, ...] (এটির কিছু ঘনত্ব রয়েছে, যেমন প্রতিটি ধাক্কার আগে স্ট্যাক থেকে মধ্যবর্তী মানগুলি সরানো হয়)
{block}*
: ধাক্কা, ধাক্কা, ব্লক, ধাক্কা, ব্লক, ...
গল্ফস্ক্রিপ্ট ডকুমেন্টেশনের {+}*
একটি অ্যারের সামগ্রীর যোগফল ব্যবহার করার উদাহরণ রয়েছে । এটি পরামর্শ দেয় আমরা {*}*
কোনও অ্যারের পণ্য পেতে ব্যবহার করতে পারি।
{,{*}*}:f
দুর্ভাগ্যক্রমে, এটি বেশ সহজ নয়। সমস্ত উপাদান এক ( [0 1 2]
পরিবর্তে [1 2 3]
) দ্বারা বন্ধ রয়েছে । আমরা {)}%
এই সমস্যাটি সংশোধন করতে ব্যবহার করতে পারি ।
{,{)}%{*}*}:f
বেশ ভাল না। এটি শূন্যটি সঠিকভাবে পরিচালনা করে না। এটি পুনরুদ্ধার করতে আমরা (n + 1)! / (N + 1) গণনা করতে পারি, যদিও এটির জন্য খুব বেশি খরচ হয়।
{).,{)}%{*}*\/}:f
আমরা একই বালতিতে এন = 1 হ্যান্ডেল করার চেষ্টা করতে পারি। এটি করার পক্ষে এটি খুব সংক্ষিপ্ত, চেষ্টা করতে পারেন এবং আপনার পক্ষে সবচেয়ে কম কাজ করতে পারেন work
তাই ভাল 7 টি অক্ষর বাছাই করা হয়: [1\]$1=
। নোট করুন যে এই বাছাই করার কৌশলটির দরকারী উদ্দেশ্য রয়েছে যেমন একটি সংখ্যার উপর সীমানা চাপানো (যেমন `[0 \ 100] $ 1 =)
এখানে কেবলমাত্র 3 টি অক্ষর রয়েছে: বিজয়ী এখানে রয়েছে!
যদি আমরা একই ব্লকে ইনক্রিমেন্ট এবং গুণন করতে চাই তবে অ্যারের প্রতিটি উপাদান দিয়ে পুনরাবৃত্তি করা উচিত। যেহেতু আমরা কোনও অ্যারে তৈরি করছি না, এর অর্থ আমাদের ব্যবহার করা উচিত {)*}/
, যা আমাদের ফ্যাকটোরিয়ালের সংক্ষিপ্ততম গল্ফস্ক্রিপ্ট বাস্তবায়নে নিয়ে আসে! দীর্ঘ 12 টি অক্ষর, এটি জে সঙ্গে বাঁধা!
{,1\{)*}/}:f
বোনাস সমাধান
লুপের if
জন্য একটি সরল সমাধান দিয়ে শুরু do
:
{.{1\{.@*\(.}do;}{)}if}:f
আমরা এটির বাইরে আরও কিছু দাগতে পারি। কিছুটা জটিল, তাই আপনাকে নিজের কাজগুলি বোঝাতে হবে ones আপনি এই সমস্ত বুঝতে পেরেছেন তা নিশ্চিত করুন।
{1\.!!{{.@*\(.}do}*+}:f
{.!{1\{.@*\(.}do}or+}:f
{.{1\{.@*\(.}do}1if+}:f
আরও ভাল বিকল্প হ'ল গণনা করা (এন + 1)! / (এন + 1), যা if
কাঠামোর প্রয়োজনীয়তা দূর করে ।
{).1\{.@*\(.}do;\/}:f
তবে এখানে সংক্ষিপ্ততম do
সমাধানটি 0 থেকে 1 ম্যাপ করার জন্য কয়েকটি অক্ষর এবং সমস্ত কিছু নিজের কাছে নিয়ে যায় - সুতরাং আমাদের কোনও শাখা প্রশস্তকরণের দরকার নেই। এই ধরণের অপ্টিমাইজেশন মিস করা অত্যন্ত সহজ।
{.!+1\{.@*\(.}do;}:f
আগ্রহীদের জন্য, উপরের মত একই দৈর্ঘ্য সহ কয়েকটি বিকল্প পুনরাবৃত্ত সমাধান এখানে সরবরাহ করা হয়েছে:
{.!{.)f*0}or+}:f
{.{.)f*0}1if+}:f
{.{.(f*}{)}if}:f
* দ্রষ্টব্য: আমি এই পোস্টে কোডের অনেকগুলি টুকরোগুলি আসলেই পরীক্ষা করে দেখিনি, তাই ত্রুটি আছে কিনা তা নির্দ্বিধায় জানান।