আন্ডারলোডে গল্ফ করার টিপস


11

আন্ডারলোড হ'ল স্ট্যাক-ভিত্তিক আধা-কার্যকরী তরপিট আইস 523 দ্বারা নির্মিত । আমি সম্প্রতি এটিতে গল্ফ করার চেষ্টা করেছি, কারণ এটি একটি আশ্চর্যজনকভাবে মার্জিত ভাষা।

আন্ডারলোডে গল্ফ করার জন্য আপনার কাছে কী টিপস রয়েছে? (উত্তর প্রতি এক টিপ)


আমি পছন্দ করি যে কন্ট্রোল প্রবাহের একমাত্র রূপটি একটি evalকমান্ড, আমি এর আগে কোনও ভাষা আর দেখিনি।
ইটিএইচ প্রডাকশনগুলি

উত্তর:


3

*আউটপুট জন্য ব্যবহার করুন

কারণ আপনি স্ট্যাক একটি স্ট্রিং যাব দ্বারা আউটপুট করতে , এটি ব্যবহার করে স্ট্রিং স্তূপাকার সহায়ক হতে পারে *বদলে দিয়ে outputting S। বলুন আপনার চ্যালেঞ্জটি ছিল "একটি স্ট্রিং নিন এবং একটি স্থান সংযুক্ত করুন", আউটপুট দিয়ে এটি করার উপায়টি হ'ল:

S( )S

পথ সঙ্গে এটা করতে *, অন্য দিকে এক বাইট খাটো:

( )*

সমস্যাটি হ'ল যদি আপনার আউটপুটে প্রচুর পরিমাণ জমে থাকে তবে স্ট্যাকের আউটপুট উপাদানটি ব্যবহার করতে বাইটস লাগতে পারে।


2

বারবার পুনরায় ব্যবহৃত ফাংশনগুলির অভিধান ব্যবহার করুন

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

বেশ কয়েকটি পুনঃব্যবহৃত ফাংশন থেকে উপকার পেতে পারে এমন বড় প্রোগ্রামের ধরণে, আপনি যে সমাধানটি ব্যবহার করতে পারেন তার সমাধানের পরিবর্তে একটি বৃহত ফাংশন করা যা তার যে কোনও উদ্দেশ্যকে যেভাবে ডাকা হয় তার উপর নির্ভর করে পূরণ করতে পারে (হয় স্ট্যাকের নীচে কী রয়েছে তার উপর ভিত্তি করে, বা আর ব্যবহার করে শুধু চেয়ে সিকোয়েন্স কলিং মাধ্যমে ^; একটি সাবধানে লিখিত ফাংশন আলাদা করতে পারেন ^^থেকে ^:^থেকে ^*^থেকে ^~^, আপনি চারটি স্বতন্ত্র, মোটামুটি সংক্ষিপ্ত সিকোয়েন্স দান)। আপনি এই "অভিধান" তে একাধিকবার ব্যবহার করেছেন এমন স্ট্রিংয়ের মতো অন্যান্য দরকারী জিনিসও সঞ্চয় করতে পারেন। মনে রাখবেন যে আপনি যদি অভিধানটি ভারীভাবে ব্যবহার করেন, তবে এটি নিজের কাছে একটি কপিটি আবার স্ট্যাকের দিকে ঠেলে দিয়ে এক ধরণের কোয়েন তৈরি করা বুদ্ধিমান হতে পারে, যাতে আপনাকে নিজেই এটির সাথে অনুলিপি করার দরকার নেই: ভবিষ্যতে এটির ব্যবহারের ক্ষমতা হারাতে না পেরে এটি ব্যবহার করতে সক্ষম হবেন।


আন্ডারলোডে কোনও প্রোগ্রাম যথেষ্ট বড় হওয়ার আগেই আমি পাগল হয়ে যাব যে এটি একটি ইস্যুতে পরিণত হয়েছিল: পি
এসোলাং ফল

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

2

সমস্যাটির জন্য প্রয়োজনীয় অপারেশনের জন্য ডেটা ফর্ম্যাটগুলি চয়ন করুন

একটি সাধারণ উদাহরণ হিসাবে, বুলেঁসের সর্বাধিক দেখা বাস্তবায়ন !()মিথ্যা (যেমন পূর্ণসংখ্য 0), এবং শূন্য (যেমন পূর্ণসংখ্যা 1) এর জন্য নাল স্ট্রিং, তবে আপনার যদি লজিক্যাল এক্সওর এর আশেপাশে ভারী ভিত্তিক কোনও সমস্যা থাকে তবে এটি আরও তৈরি করতে পারে মিথ্যা, এবং ~সত্যের জন্য নাল স্ট্রিংটি ব্যবহার করার অনুভূতি (এই ডেটা ফর্ম্যাটটি ব্যবহার করে অন্য কোনও বুলিয়ান ফর্ম্যাটে রূপান্তরিত করা যেতে পারে (false)~(true)~^!এবং এক্সওআরটির *জন্য খুব সংশ্লেষ বাস্তবায়নের অনুমতি দেয় ।

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


আমি ব্যবহার করতাম (!)এবং (~!)বুলিয়ানগুলির জন্য, তবে আপনার উপায়টি আরও ভাল বলে মনে হচ্ছে।
ফল

2

"নোংরা" হ্রাস

চার্চের সংখ্যা হ্রাস করার কার্যকরী-খাঁটি উপায় হ'ল ল্যাম্বদা ক্যালকুলাস পূর্বসূরি ফাংশনটি ব্যবহার করা:

\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])

যেখানে 0 = \ x। \ Yy, T = \ x। \ Yx এবং $ উত্তরসূরি।

আন্ডারলোডে আবার লিখেছেন, এটি 28 বাইট:

(!())~(!())~(!:(:)~*(*)*~)~^!

এটি ঠিক আছে, তবে আমরা আন্ডারলোডের কিছু দরকারী বৈশিষ্ট্য কাজে লাগাতে পারি , যথা :!এবং ()*এটি কোনও বিকল্প নেই। এর অর্থ এই যে, একটি সংখ্যা জন্য n, :ⁿ!!()()*ⁿ(যেখানে cⁿহয় cপুনরাবৃত্তি nবার) উৎপাদ এন-1। উদাহরণস্বরূপ চার্চের সংখ্যা 3 এর জন্য এটি করা এর ফল দেয়:

:::!!()()***

অপ-অপশন জোড়া মুছে ফেলা হচ্ছে, আমরা পাই:

:*

যা 2।

সুতরাং এটি নতুন এবং খাটো পূর্বসূরী অপারেশন:

:(:)~^(!!()())*~(*)~^*

এটি 7 বাইট সংক্ষিপ্ত।


যদিও এন = 0 এ বিরতি। আপনার যদি (()~(:))~:(^!!())*~(*)~^** এটির কাজ করতে হয় তবে এটি 3 বাইট কম হয়।
janrjan Johansen

@ JanrjanJohansen সাধারণত, আপনার জন্য এন = 0 এর জন্য একটি বিশেষ কেস হবে, কারণ আন্ডারলোডের সংখ্যা 0 হ্রাস পাওয়ার সাথে সাথে কোনওভাবেই বোঝা যায় না।
ফল

1

প্রোগ্রাম স্পেসে অবিশ্রুত স্ট্যাকের মান রাখুন

আন্ডারলোডের আসলে দুটি স্ট্যাক থাকে — স্ট্রিংয়ের স্ট্যাক এবং সোর্স কোডটি তৈরি করে এমন কমান্ডের স্ট্যাক। আন্ডারলোডের ^নির্দেশ আমাদের আগের স্ট্যাক থেকে স্ট্রিংগুলিকে সর্বাগ্রে সরাতে দেয়। এটি করার মাধ্যমে আমরা প্রচুর অপ্রয়োজনীয় স্ট্যাক ম্যানিপুলেশন সংরক্ষণ করতে পারি।

উদাহরণস্বরূপ, আমরা বলার (a)(b)(c)মূল স্ট্যাক এবং আমরা নীচে দুটি উপাদান কনক্যাটেনেট করার উপেক্ষা, চাই (c), পেতে (ab)(c)। এটি করার সহজ উপায় হ'ল স্ট্যাকটি ঘোরানোর জন্য (c)(a)(b)এবং তারপরে সম্মিলিতভাবে ফিরে অদলবদল করা:

a~a~*~a*^*~

এইটা খারাপ. a~a~*~a*^এই স্ট্যাকটি ঘোরানোর জন্য ব্যবহার করা অত্যন্ত ব্যয়বহুল, এবং সম্ভব হলে এড়ানো উচিত। (c)পরিবর্তে প্রোগ্রাম স্পেসে রেখে , এটিকে চারটি বাইট ছোট করা যায়:

a(*)~*^

ধারণাটি হ'ল আপনি যে নির্দেশনাগুলি কার্যকর করতে চান সেগুলি গ্রহণ করা এবং তারপরে (c)শেষে পিছনে চাপ দেওয়ার জন্য একটি নির্দেশ যুক্ত করুন এবং তারপরে ফলাফলটি মূল্যায়ন করুন। এর অর্থ হ'ল (c)আমাদের সমাপ্তির পরে এটি পিছনে ধাক্কা না দেওয়া পর্যন্ত আমাদের চিন্তা করতে হবে না ।


1
আপনি এটি হিসাবে এটি লিখতে পারেন (*)~a*^, যা আমার কাছে মনে হয় কিছুটা কমপোজ্য able মূলত ~a*^হয় dipজয় থেকে কমান্ড।
janrjan জোহানসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.