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


35

কি, এই পোস্টটি এখনও বিদ্যমান না?

অবশ্যই, GolfScript হয় প্রণীত , golfing জন্য তাই আপনার মনে হতে পারে যে কোন নির্দিষ্ট টিপস সত্যিই প্রয়োজন হয়। তবে গল্ফস্ক্রিপ্টের বৈশিষ্ট্যগুলির পুরো ব্যবহার করতে আপনাকে কিছু অ-স্পষ্ট কৌশলগুলি শিখতে হবে। এই পোস্টটি যেমন সহায়ক টিপস এবং কৌশল সংগ্রহের জন্য।

শুরু করার জন্য, এখানে সরকারী গল্ফস্ক্রিপ্ট রেফারেন্স পৃষ্ঠা রয়েছে pages এগুলির সাথে প্রথমে আপনার নিজেকে পরিচয় করা উচিত:

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


গীত। অনুপ্রেরণা এবং ব্যক্তিগত স্বার্থের জন্য, এখানে কয়েকটি প্রশ্ন আমি সুন্দর উত্তর দেখতে চাই :

  • গল্ফস্ক্রিপ্টে কীভাবে সীমিত প্রতিলিপি করা যায়? {FROM?TO=}%কাজ করে যদি আপনি নিশ্চিত হন যে সমস্ত ইনপুট পাওয়া গেছে FROM(বা তাদের TOসবশেষের উপাদানটিতে ম্যাপ করা আছে তা মনে করবেন না ), তবে আনম্যাপযুক্ত মানগুলি অপরিবর্তিত রাখার জন্য যে সমস্ত উপায় আমি দেখেছি সেগুলি কমবেশি ক্লুজি হয়েছে।

  • কীভাবে স্ট্রিংকে ASCII কোডগুলির একটি অ্যারে রূপান্তর করতে হবে এবং তার পিছনে কীভাবে? পার্শ্ব প্রতিক্রিয়া হিসাবে কোন অপারেশনগুলি এটি করে? স্ট্যাকের মধ্যে স্ট্রিংগুলিতে অক্ষরগুলি ফেলে দেওয়ার সর্বোত্তম উপায় কোনটি (যেমন ~অ্যারেগুলির জন্য করে)?


আরেকটি প্রশ্ন: সেখানে রুপান্তর একটি চমৎকার উপায় ... xমধ্যে ... [x]? আমি দেখতে পাচ্ছি সেরা [.;]
পিটার টেলর

@ পিটার: যদি xএকটি সংখ্যা হয়, তবে এটি []+কাজ করে এবং এটি একটি চর সংক্ষিপ্ততর। এবং অবশ্যই, যদি xস্ট্যাকের একমাত্র জিনিস হয়, তবে ঠিক করা ]হবে।
ইলমারি করোনেন

আমি সর্বোত্তম উপায়গুলি জিজ্ঞাসা করতে চাই: ন্যূনতম, সর্বাধিক এবং নিখুঁত মান। আমার সমস্ত সমাধানগুলি তাদের চেয়ে বেশি চরিত্র নিয়েছে বলে মনে হচ্ছে।
ক্লাদিউ

প্রদত্ত সূচকে একটি অ্যারে সংশোধন করার সর্বোত্তম উপায় কী?
ব্যবহারকারী1502040

@ ব্যবহারকারী1502040: নীচে উত্তর দেওয়া হয়েছে। (যদি কেউ আরও ভাল উপায় জানেন তবে দয়া করে ভাগ করুন!)
ইলমারি করোনেন

উত্তর:


29

যুক্তিযুক্ত / ভাসমান / কমপ্লেক্স

আমি এতবার পড়েছি যে গল্ফস্ক্রিপ্টের কেবলমাত্র পূর্ণসংখ্যা রয়েছে যা আমি এটি বিশ্বাস করা শুরু করি। ঠিক আছে, এটা সত্য নয়।

2-1? # Raise 2 to the power of -1. Result: 0.5
4-1? # Raise 4 to the power of -1. Result: 0.25
+    # Add. Result: 0.75

আউটপুট হয়

3/4

স্ট্যান্ডার্ড গল্ফস্ক্রিপ্ট দোভাষী এবং

0.75

উপর ওয়েব GolfScript

অনুরূপ হ্যাক যুক্তিযুক্ত, ভাসমান বা কমপ্লেক্সে কাস্ট করার অনুমতি দেয়:

{-2.?./*}:rational
{2.-1??./*}:float
{-2.-1??./*}:complex

9
ওএমজিডব্লিউটিএফএক্স ও_ও !!!
ইলমারি করোনেন

3
WAT! খুব নিশ্চিত যে এটি দোভাষীর মধ্যে একটি বাগ, তবে বাহ
ডোরকনব

3
সর্বাধিক সাম্প্রতিক দোভাষী এর লাইন Gint.new(@val**b.val)। দেখে মনে হচ্ছে যে Gintকনস্ট্রাক্টর একটি নিখোঁজ কাস্ট মিস করছে ...
প্রিমো

10

একটি নম্বর নেতিবাচক

গল্ফস্ক্রিপ্টের অভাবের একটি বিষয় হ'ল একটি অন্তর্নিহিত অপারেশন অপারেটর। স্ট্যাকের কোনও সংখ্যাকে তার নেতিবাচক, যেমন -1*বা 0\-, তিনটি অক্ষরের রূপান্তর করার সুস্পষ্ট উপায়গুলির জন্য । তবে এটি দুটি করার একটি উপায় রয়েছে:

~)

এটি কাজ করে কারণ গল্ফস্ক্রিপ্ট দুটির পরিপূরক গাণিতিক ব্যবহার করে, যাতে equ x সমান - x −1।

অবশ্যই, রূপটিও (~কাজ করে; তাদের মধ্যে নির্বাচন করা সাধারণত স্বাদের বিষয়।


9

একটি অ্যারে পরিবর্তন করা

গল্ফস্ক্রিপ্টে একটি অ্যারে পরিবর্তন করার সহজ উপায়টি এলোমেলো বাছাই কী দ্বারা বাছাই করা। আপনার যদি কেবল কয়েকটি মানকে অযৌক্তিকভাবে বদলানো দরকার তবে নিম্নলিখিত কোডটি করবে:

{;9rand}$

মনে রাখবেন, এমনকি সংক্ষিপ্ত তালিকাগুলির জন্যও এটি খুব ভাল কোনও বদল দেবে না। জন্মদিনের প্যারাডক্সের কারণে , যুক্তিসঙ্গতভাবে অভিন্ন শ্যফেল পেতে, যুক্তিটি randতালিকার দৈর্ঘ্যের বর্গক্ষেত্রের তুলনায় উল্লেখযোগ্যভাবে বেশি হওয়া দরকার।

প্রতিস্থাপন করা হচ্ছে 9সাথে উপরে 99এইভাবে দশ উপাদান পর্যন্ত তালিকার জন্য যুক্তিসঙ্গতভাবে ভালো ফল দেয়, কিন্তু এখন আর তালিকার জন্য লক্ষণীয় পক্ষপাত প্রদর্শণ করে।

নিম্নলিখিত কোডটি, যা 9 9 = 387,420,489 সম্ভাব্য মানগুলি ব্যবহার করে, প্রায় 1000 টি আইটেম বা তার জন্য ভাল (এবং প্রায় 20,000 অবধি গ্রহণযোগ্য):

{;9.?rand}$

সত্যিই দীর্ঘ তালিকাগুলির জন্য, 99 99 ≈ 3.7 × 10 197 মানগুলির জন্য আরও 9 যুক্ত করুন :

{;99.?rand}$

পরীক্ষামূলক:

উপরে দেখানো বিভিন্ন বৈকল্পিকগুলি ব্যবহার করে 10-টি তালিকার প্রথম উপাদানটির বিতরণটি এখানে 10,000 টিরও বেশি পরীক্ষার নমুনা দেওয়া হয়েছে:

  • আউটপুট 10,{;9rand}$0=একটি খুব স্পষ্ট পক্ষপাত দেখায়, 0তিন বারেরও বেশি হওয়ার পরে প্রথম অবস্থানে চলে যাওয়ার সম্ভাবনা রয়েছে 1:

    0 16537 #######################################################
    1 5444  ##################
    2 7510  #########################
    3 8840  #############################
    4 9124  ##############################
    5 12875 ##########################################
    6 9534  ###############################
    7 8203  ###########################
    8 7300  ########################
    9 14633 ################################################
    
  • সাথে 10,{;99rand}$0=, বেশিরভাগ পক্ষপাতিত্ব চলে গেছে, তবে একটি লক্ষণীয় পরিমাণ এখনও অবধি:

    0 10441 ##################################
    1 9670  ################################
    2 9773  ################################
    3 9873  ################################
    4 10134 #################################
    5 10352 ##################################
    6 10076 #################################
    7 9757  ################################
    8 9653  ################################
    9 10271 ##################################
    
  • এর সাথে 10,{;9.?rand}$0=, আউটপুটটি মূলত সত্যিকারের এলোমেলো নমুনা থেকে পৃথক হয়:

    0 9907  #################################
    1 9962  #################################
    2 10141 #################################
    3 10192 #################################
    4 9965  #################################
    5 9971  #################################
    6 9957  #################################
    7 9984  #################################
    8 9927  #################################
    9 9994  #################################
    

গীত। জন্য সত্যিই সাংখ্যিক বিন্যাস বা স্ট্রিং খারাপ প্রকাশের shuffling, নিম্নলিখিত কোড মাঝে মাঝে গ্রহণযোগ্য হতে পারে:

{rand}$

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


3
আমার মনে আছে আমি একবার সন্দেহের সাথে জন্মদিনের প্যারাডক্সের জন্য গণিতটি করেছি আমার ভাই আমাকে এটি সম্পর্কে বলার পরে, তিনি ঠিক বলেছেন :(
অজেক্স 333221

8

একটি নির্দিষ্ট subquestion ঠিকানা:

কীভাবে স্ট্রিংকে ASCII কোডগুলির একটি অ্যারে রূপান্তর করতে হবে এবং তার পিছনে কীভাবে? পার্শ্ব প্রতিক্রিয়া হিসাবে কোন অপারেশনগুলি এটি করে? স্ট্যাকের মধ্যে একটি স্ট্রিংগুলিতে অক্ষরগুলি ফেলে দেওয়ার সর্বোত্তম উপায় কী (যেমন অ্যারেগুলির জন্য? না)?

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

'ABC123'{)}%

'BCD234'স্ট্যাক ছেড়ে চলে যাবে।

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

স্ট্যাকের মধ্যে একটি স্ট্রিংগুলিতে অক্ষরগুলি ফেলে দেওয়ার সর্বোত্তম উপায় কী? {}/

স্ট্রিংটিকে ASCII কোডের অ্যারেতে রূপান্তর করার সর্বোত্তম উপায় কী? [{}/](সাধারণ সতর্কতার সাথে যে স্ট্যাকের বাইরে অন্য কিছু না থাকলে আপনি এড়িয়ে যেতে পারেন [)

ASCII কোডগুলির একটি অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করার সর্বোত্তম উপায় কী? ''+(দ্রষ্টব্য যে এটি অ্যারের সমতলও করে, যেমন উদাহরণ [65 [66 67] [[[49] 50] 51]]''+দেয় 'ABC123')


একটি একক ASCII কোডটিকে স্ট্রিংয়ে পরিণত করার সর্বোত্তম উপায় কী? []+''+? (বরং দীর্ঘ মনে হচ্ছে)
জাস্টিন

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

6

যদি আপনার প্রোগ্রামটি রহস্যজনকভাবে ভেঙে যায় তবে আপনার ভেরিয়েবলগুলি পরীক্ষা করুন

আমি কেবল একটি দৃশ্যত সঠিক প্রোগ্রামটি ডিবাগ করার জন্য ব্যয় করেছি যা !ভেরিয়েবল হিসাবে ব্যবহৃত হয়েছিল (এই কারণে যে আমি আবার এটি ব্যবহার করতে যাচ্ছি না)। দুর্ভাগ্যবশত আমি করেনি ব্যবহার if, এবং এটি দেখা যাচ্ছে যে বাস্তবায়ন ifকল !যা শাখা অনুসরণ করতে সিদ্ধান্ত নিতে।


6

অ্যারের মধ্যে স্ট্যাকের শীর্ষ আইটেমটি মোড়ানো

সেখানে রুপান্তর একটা চমৎকার উপায় আছে কি ... xমধ্যে ... [x]?

সম্পূর্ণ সাধারণতার জন্য, সেরা বিকল্পটি 4 টি চর হিসাবে উপস্থিত হবে। তবে কিছু বিশেষ ক্ষেত্রে এটি হ্রাস করা সম্ভব।

1 চর

]বিশেষ ক্ষেত্রে xকাজ করে যা স্ট্যাকের একমাত্র জিনিস।

3 চর

[]+xএকটি পূর্ণসংখ্যার ক্ষেত্রে বিশেষ ক্ষেত্রে কাজ করে ।

.,/একটি বিশেষ ক্ষেত্রে কাজ করে যা xসত্যবাদী অ্যারে বা স্ট্রিং। যেমন "AB".,/দেয় ["AB"]; 3,.,/দেয় [[0 1 2]]। যাইহোক, "".,/এবং [].,/উভয় দিতে []

4 অক্ষর

[.;] নিঃশর্ত কাজ করে।


6

প্রদত্ত সূচকে একটি অ্যারে সংশোধন করার সর্বোত্তম উপায় কী? - ব্যবহারকারী1502040

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

অ্যারেতে xসূচকে একটি নতুন মান toোকানোর জন্য সবচেয়ে সংক্ষিপ্ত সাধারণ iপদ্ধতিটি হ'ল প্রদত্ত সূচকে অ্যারেটি বিভক্ত করা এবং xতাদের সাথে আবার যোগদানের আগে প্রথমার্ধে যুক্ত করা:

  • .i<[x]+\i>+(১১ টি অক্ষর) - x(0-ভিত্তিক) সূচকে অ্যারেতে মান সন্নিবেশ করানi

এর সাথে সূচকের মানটি প্রতিস্থাপন করতে আমাদের কেবল অ্যারের দ্বিতীয়ার্ধটি একটি উপাদান দ্বারা সংক্ষিপ্ত করতে হবে:ix

  • .i<[x]+\i)>+(12 টি অক্ষর) - iমানটির সাথে (0-ভিত্তিক) সূচকটিতে প্রতিস্থাপন করুনx

বিকল্পভাবে, পরিবর্তে প্রথমার্ধকে সংক্ষিপ্ত করে কার্যকরভাবে কার্যকরভাবে কার্যকর করা হবে, তবে 1-ভিত্তিক সূচকের সাথে, যা কখনও কখনও পছন্দসই হতে পারে:

  • .i(<[x]+\i>+(12 অক্ষর) - iমানটির সাথে (1-ভিত্তিক) সূচকে উপাদানটি প্রতিস্থাপন করুনx

উপরের সমস্ত উদাহরণে, যদি xএটি একটি সংখ্যা হয় তবে তার চারপাশের বর্গাকার বন্ধনী দুটি অক্ষর সংরক্ষণ করতে বাদ দেওয়া যেতে পারে, যেহেতু এটি +কোনওভাবে অ্যারেতে স্বয়ংক্রিয়ভাবে জোর করা হবে :

  • .i<x+\i>+(9 টি অক্ষর) - x(0-ভিত্তিক) সূচকে অ্যারেতে নম্বরটি সন্নিবেশ করানi
  • .i<x+\i)>+(10 টি অক্ষর) - iসংখ্যার সাথে (0-ভিত্তিক) সূচকে উপাদানটি প্রতিস্থাপন করুনx
  • .i(<x+\i>+(10 টি অক্ষর) - iসংখ্যার সাথে (1-ভিত্তিক) সূচকে উপাদানটি প্রতিস্থাপন করুনx

উভয় xবা ইনপুট "অ্যারে" (বা উভয়) আসলে স্ট্রিং থাকলে বন্ধনীগুলিও বাদ দেওয়া যেতে পারে , সেক্ষেত্রে ফলাফলটি একটি স্ট্রিংয়েও জোর করা হবে (সাধারণ অ্যারে → স্ট্রিং রূপান্তর নিয়ম ব্যবহার করে)।


গীত। বিশেষ স্থান ধার্য, যদি আমরা জানি যে অ্যারে মধ্যে রয়েছে iএবং 2 × iউপাদান, আমরা একটি নতুন উপাদান ঢোকাতে পারবেন x(0 ভিত্তিক) সূচিতে iসঙ্গে i/[x]*(6 অক্ষর)। এটি আসলে যা করে তা হ'ল অ্যারেগুলিকে iউপাদানগুলি পর্যন্ত ভাগ করে xপ্রতিটি খণ্ডের মধ্যে সন্নিবেশ করানো । মনে রাখবেন যে, এক্ষেত্রে বন্ধনীগুলি xএকটি সংখ্যা হলেও প্রয়োজনীয় ।


PPS। একটি বিকল্প পদ্ধতির নাম গতিশীল নামযুক্ত ভেরিয়েবল ব্যবহার করা। উদাহরণ স্বরূপ,

 'foo' 42 ':x'\+~

মান নির্ধারণ করবে 'foo'পরিবর্তনশীল x42, যখন

 42 'x'\+~

এটি পুনরুদ্ধার করা হবে।

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


3
সম্পূর্ণ অফ-টপিক: 10 কে অভিনন্দন! :-D
ডুরকনবব

1
আপনি যদি জানেন যে অ্যারেতে সদৃশ মান নেই তবে আপনি i9 বাইটের জন্য সূচীতে একটি মান প্রতিস্থাপন করতে পারেন :.[i=]/[x]*
মার্টিন ইন্ডার

5

চূড়ান্ত আউটপুট ম্যানিপুলেশন

ডিফল্টরূপে, যখন আপনার প্রোগ্রামটি শেষ হয়, গল্ফস্ক্রিপ্ট ইন্টারপ্রেটার স্ট্যাকের সমস্ত কিছু আউটপুট দেয়, সাথে একটি চূড়ান্ত নিউলাইন, ঠিক যেমন আপনার প্রোগ্রামটি শেষ হয়:

]puts

ডকুমেন্টেশনটি যা সরাসরি উল্লেখ করে না তা হ'ল দোভাষী এই আউটপুটটি তৈরি করতে আক্ষরিক অর্থে বিল্ট- ইনটিকে কল করে putsএবং এই বিল্ট- ইনটি আক্ষরিকভাবে সংজ্ঞায়িত করা হয়:

{print n print}:puts;

সুতরাং, আপনি দমন বা এবং redefining দ্বারা চূড়ান্ত আউটপুট নিপূণভাবে পারেন puts, print এবং / অথবাn (অথবা  যদি তুমি অনুভূতি সত্যিই পাক)। এখানে কিছু উদাহরন:

চূড়ান্ত নিউলাইন দমন করুন:

'':n;

(অবশ্যই আপনি এটি ছেড়ে দিতে পারেন ; যদি আপনি স্ট্যাকের অতিরিক্ত খালি স্ট্রিং মনে না তবে আপনি পারেন))

চূড়ান্ত আউটপুট পুরোপুরি দমন করুন:

:puts

এটি putsস্ট্যাকের শীর্ষে যা ঘটে তা দিয়ে ওভাররাইট করে। যদি এটি এমন কিছু ঘটে যা আপনি কার্যকর করতে চান না, তবে আপনি এর 0:puts;পরিবর্তে উদাহরণ ব্যবহার করতে পারেন । দ্রষ্টব্য যে এটি দমন করে p(যা হিসাবে সংজ্ঞায়িত করা হয় {`puts}:p;) তবে আপনি printযদি চান তবে আউটপুট ব্যবহার করতে পারেন।


আর nothingমানে \n?
ক্যালকুলেটরলাইন

আপনি যদি পিছনের নতুন লাইনে আপত্তি না দেখান তবে আপনি ];চূড়ান্ত আউটপুট দমন করতেও ব্যবহার করতে পারেন ।
wastl

5

আমি সর্বোত্তম উপায়গুলি জিজ্ঞাসা করতে চাই: ন্যূনতম, সর্বাধিক এবং নিখুঁত মান। আমার সমস্ত সমাধানগুলি তাদের চেয়ে বেশি চরিত্র নিয়েছে বলে মনে হচ্ছে। - ক্লদিউ

মিনিট / সর্বোচ্চ

একটি অ্যারের মধ্যে সবচেয়ে ছোট / বৃহত্তম মানটি সন্ধান করতে, কেবল এটি সাজান এবং প্রথম / শেষ উপাদানটি নিন:

  • $0= (3 টি অক্ষর) - একটি অ্যারেতে সর্বনিম্ন উপাদান
  • $-1= (৪ টি চর) - একটি অ্যারেতে সর্বাধিক উপাদান

আপনি যদি অ্যারের দৈর্ঘ্যটি জানেন এবং এটি 10 ​​টি উপাদান বা তার চেয়ে কম হয় তবে আপনি -1সর্বশেষ উপাদানটির সূচকটি প্রতিস্থাপন করে সর্বোচ্চ তিনটি অক্ষরে সন্ধান করতে পারেন ।

স্ট্যাকের মানগুলি যদি থাকে তবে আপনি প্রথমে এটিকে প্রথমে একটি অ্যারেতে সংগ্রহ করতে পারেন। এর জন্য, মাঝে মাঝে দরকারী কৌশলটি হ'ল [\]স্ট্যাকের শীর্ষ দুটি উপাদানকে একটি অ্যারেতে [@]সংগ্রহ করে , যখন শীর্ষ তিনটি সংগ্রহ করে। সুতরাং, আমরা পেতে:

  • [\]$0= (Rs টি অক্ষর) - স্ট্যাকের সর্বনিম্ন দুটি মান
  • [@]$0= (Rs টি অক্ষর) - স্ট্যাকের সর্বনিম্ন তিনটি মান
  • [\]$1= (Rs টি অক্ষর) - স্ট্যাকের উপর সর্বাধিক দুটি মান
  • [@]$2= (Rs টি অক্ষর) - স্ট্যাকের উপরে সর্বোচ্চ তিনটি মান

একই কৌশলটি তিনটি মানের মধ্যস্থতা সন্ধান করতেও ব্যবহার করা যেতে পারে যা মাঝেমধ্যে কার্যকর হতে পারে:

  • [@]$1= (Rs টি অক্ষর) - স্ট্যাকের উপর তিনটি মানের মাঝারি

মূল মানগুলি স্ট্যাকের উপরে রেখে যখন দুটি মানের ন্যূনতম / সর্বাধিক সন্ধান করার জন্য এখানে আরেকটি সম্ভাব্য দরকারী কৌশল :

  • .2$>$ (৫ টি অক্ষর) - মূল মানগুলি ছাঁচে ফেলে রেখে সর্বনিম্ন দুটি মান সন্ধান করুন
  • .2$<$ (৫ টি অক্ষর) - মূল মানগুলি ছোঁয়া ছাড়ার সময়, সর্বাধিক দুটি মান সন্ধান করুন

এটি যেভাবে কাজ করে তা হ'ল .2$বিপরীত ক্রমে ( a ba b b a) স্ট্যাকের শীর্ষ দুটি উপাদানকে ক্লোন করে , </ >অনুলিপিগুলি তুলনা করে 0 বা 1 প্রদান করে এবং স্কেলার $তারপরে তুলনার ফলাফলের উপর নির্ভর করে দুটি ইনপুট মানগুলির অনুলিপি করে।


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

স্ট্যাকের সর্বনিম্ন দুটি অ-নেতিবাচক পূর্ণসংখ্যার সন্ধান করার একটি আরও ছোট উপায় হ'ল ,<,(3 টি অক্ষর)। হায়, এই কৌশলটি সর্বাধিক সন্ধানের জন্য কাজ করে না।


পরম মান

GolfScript বিল্ট-ইন পরম মান অপারেটর হয় abs(3 অক্ষর)। যদিও এটি আমার চেয়ে দুটি চরিত্রের চেয়ে বেশি, সাধারণভাবে পীড়া দেওয়া শক্ত।

কিছু ক্ষেত্রে (যেমন নিখুঁত মান অনুসারে বাছাই করার জন্য) আপনি কোনও সংখ্যার বর্গকে তার নিখুঁত মানের জন্য পর্যাপ্ত বিকল্প খুঁজে পেতে পারেন; এটি দুটি অক্ষরে গণনা করা যেতে পারে, হয় 2?বা হয় .*। সুতরাং, আমরা পেতে:

  • {.*}$0= (Rs অক্ষর) - অ্যারেতে পরম মানের দ্বারা সর্বনিম্ন উপাদান
  • {.*}$-1= (8 টি অক্ষর) - অ্যারেতে পরম মান দ্বারা সর্বাধিক উপাদান

একইভাবে, উদাহরণস্বরূপ, কোনও সংখ্যার পরম মান 3 abs 3<( কম স্পেস সহ 6 টি) এর চেয়ে কম হলে পরীক্ষার পরিবর্তে, এটির বর্গক্ষেত্র 9 .*9<(4 অক্ষর, কোনও জায়গার প্রয়োজন নেই) এর কম হলে আপনি পরীক্ষা করতে পারেন ।


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

@ কিরারিনস্নাহ: ধন্যবাদ! আমি এটি উত্তরে যুক্ত করেছি।
ইলমারি করোনেন

4

একটি অ্যারের থেকে সদৃশ সরিয়ে ফেলা হচ্ছে

সেট অপারেটর |(ইউনিয়ন), &(ছেদ) এবং ^(প্রতিসম পার্থক্য) একাধিক অ্যারে উপাদানকে একের মধ্যে ভেঙে ফেলবে। সুতরাং, অ্যারের থেকে সদৃশ উপাদানগুলি সরিয়ে ফেলার সহজ উপায় হ'ল এটির ইউনিয়ন বা ছেদটি নিজের সাথে নেওয়া:

.|

বা:

.&

এই অপারেটরগুলি স্ট্রিংগুলিকে অক্ষরের অ্যারে হিসাবে বিবেচনা করবে, সুতরাং এগুলি স্ট্রিং থেকে সদৃশ অক্ষরগুলি সরানোর জন্যও ব্যবহার করা যেতে পারে।


4

সীমাবদ্ধ প্রতিলিপি

একটি নির্দিষ্ট subquestion ঠিকানা: একটি স্ট্রিং দেওয়া, একটি সঞ্চালনের সেরা উপায় কি tr? যেমনtr/ABC/abc/

স্ট্রিংয়ের সমস্ত অক্ষর যদি প্রভাবিত হয় তবে এটি বেশ সহজ: {'ABC'?'abc'=}%(ওভারহেড: 9 টি অক্ষর)।

যাইহোক, যদি কিছু চরিত্র অনূদিত হয় না এবং 'ABC'?দেয় তবে তা ভঙ্গ -1

লিপি রচনাটি যদি চক্রবিহীন হয় তবে স্ট্রিং বিভাজন এবং যোগদানের সাথে এক সাথে একবারে প্রতিস্থাপন করা যেতে পারে: 'AaBbCc'1/2/{~@@/\*}/(ওভারহেড: 15 অক্ষর)। এটি অস্থাবর হতে পারে, তবে একটি বিকল্প পদ্ধতি রয়েছে যা বর্তমানে আরও ভাল এবং চক্রীয় ট্রান্সলিটেশনগুলির জন্য কাজ করে।

বর্তমানে, সংক্ষিপ্ততম সাধারণ সমাধানগুলির 14 টি অক্ষরের ওভারহেড রয়েছে:

  • একটি পদ্ধতির মধ্যে একটি পালানোর চরিত্র জড়িত :, যেখানে আক্ষরিক নাল বাইট বোঝায়। (অবশ্যই, এই পদ্ধতিটি সম্পূর্ণ সাধারণ নয়: এটি অন্য কোনও চরিত্রকে নাল বাইটে ম্যাপ করতে পারে না)){.'ABC'?'abc0'=\or}%0

  • বিকল্পভাবে, {.'ABC'?'abc'@),+=}%একই ওভারহেড রয়েছে, তবে কেবল প্রিন্টযোগ্য ASCII অক্ষর ব্যবহার করে। @),+একটি সংবর্ত করা হয় (কিন্তু, দৃশ্যতঃ সবচেয়ে কম) পথ তা নিশ্চিত করার জন্য প্রতিস্থাপন স্ট্রিং সবসময় ইনপুট অক্ষর দিয়ে শেষ হয়।


শেষ পদ্ধতির ব্যবহার করে ইনপুট স্ট্রিংয়ের জন্য 'ABCDEF'আমি ফলাফলটি পাই 'abc000'তবে সঠিক ফলাফল হবে 'abcDEF'। আমি কিছু অনুপস্থিত করছি?
ক্রিশ্চিয়ান লুপাস্কু

1
@ ডাব্লু0এলএফ, এটি 0 সাহসী কারণ এটি পূর্বে উল্লিখিত পালানোর চরিত্রটি - যেমন বাইট ০।
পিটার টেলর

4

একটি স্ট্রিংকে চরের অ্যারেতে পরিণত করুন

আপনি টাইপ করে 1/এটি করতে পারেন: এটির পরে।

উদাহরণ: "String"1/অ্যারে স্ট্যাক করার জন্য ধাক্কা দেয় ['S''t''r''i''n''g']

আপনি যখন স্ট্রিংয়ের চারপাশে চরগুলি স্থানান্তর করতে চান তখন এটি সুবিধাজনক।


1
এটি কীভাবে কার্যকর হতে পারে তার একটি উদাহরণ দিতে পারেন? স্ট্রিংগুলি ইতিমধ্যে অ্যারের মতো কাজ করে যাতে এটি তেমন কার্যকর বলে মনে হয় না।
জাস্টিন

@ কুইনকুনক্স এটি কার্যকর যখন আপনি অক্ষরগুলি পপ করতে চান এবং তাদের
আস্কি

এবং আপনি কখন এটি করতে চান?
জাস্টিন

5
@ কুইনকুনস: উদাহরণস্বরূপ একটি স্ট্রিং ঘোরানো। "abc"1/(+-> "bca", তবে "abc"(+-> bc97
ডেনিস

4

সংখ্যার আক্ষরিক অর্পণ করা

প্রায়শই, লেখার পরিবর্তে 1:xএবং তারপরে ভেরিয়েবলটি আপডেট / আপডেট করার পরিবর্তে xআপনি 1সরাসরি ব্যবহার এবং আপডেট করতে পারেন :

1:^;{^.p.+:^;}5*
{1.p.+:1;}5*       (4 bytes shorter)

অবশ্যই এটি অন্যান্য শুরুর মানগুলির জন্যও কাজ করে, তবে যদি সেই মানটি আপনার কোডের অন্য কোথাও ঘটে তবে তা ভেঙে যাবে।

পরিবর্তনশীল নাম হিসাবে বিরামচিহ্ন

আপনি যদি আছে প্রোগ্রাম ছাড়া করতে পারেন প্রচুর - ভেরিয়েবল ব্যবহার করতে, এটি যতিচিহ্ন ইতিমধ্যে নয় আপনার কোড ব্যবহার করার জন্য প্রায়ই জিনিস এর &, |, ^, অথবা ?। এই ভাবে, উদাহরণস্বরূপ, যদি আপনি লিখতে পারেন &nপরিবর্তে x nআপনার পরিবর্তনশীল ধাক্কা এবং তারপর একটি newline ধাক্কা।


3
যদিও কিছু অ্যাসাইনমেন্টের অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া থাকতে পারে। বিশেষ করে, এর বরাদ্দ !প্রায়ই একটি খারাপ ধারণা, যেমন তা ভঙ্গ করবে ifএবং do(সেইসাথে while, until, and, orএবং xor)। একইভাবে, orদোভাষী দ্বারা একটি উপাধিকার হিসাবে সংজ্ঞায়িত করা হয়েছে 1$\if, সুতরাং পুনরায় সংজ্ঞায়িত করুন 1, $বা \এটিও ভেঙে দেবে। Redefining `বিরতি p
ইলমারি করোনেন

3

একটি অ্যারে ফিল্টার করছে

অ্যারে ফিল্টার করার সবচেয়ে সাধারণ উপায় হ'ল ব্যবহার করা { }, যা অ্যারের প্রতিটি উপাদানটির জন্য কোড ব্লকটি মূল্যায়ন করে এবং সেই উপাদানগুলিকে বাছাই করে যার ফলস্বরূপ মানটি সত্য (যেমন এটি grepপার্লের মতো কাজ করে )।

তবে অ্যারে বিয়োগ অপারেটরটি ব্যবহার -করা প্রায়শই খাটো হয়। এই অপারেটরটি দুটি অ্যারে নেয় এবং প্রথম অ্যারেতে ঘটে এমন প্রতিটি উপাদান সরিয়ে দেয়। এটি প্রথম অ্যারে বা ধসের ডুপ্লিকেটগুলিতে উপাদানগুলির ক্রমকে পরিবর্তন করে না । একটি কার্যকর কৌশলটি হ'ল বিপর্যয়যুক্ত অ্যারে ছেদকারী অপারেটর উপার্জন করতে দুটি বিয়োগ অপারেশন প্রয়োগ করা:

  • a b -: অ্যারে পাওয়া কোন উপাদান সরান b থেকে অ্যারেa
  • a. b --: অ্যারে থেকে অ্যারে পাওয়া যায় না এমন কোনও উপাদান মুছে ফেলুনba

বিশেষত, কোনও উপাদানটি কতবার সংঘটিত হয় তা গণনা করতে এটি ব্যবহার করা যেতে পারে অ্যারেতে :

  • a.[c]--,: cঅ্যারের মধ্যে উপাদানটি কতবার ঘটে তা গণনা করুনa

সাধারণভাবে, এই পদ্ধতিটি সর্বোত্তম নয়, যেহেতু উভয়ের একটি:

  • a[c]/,(: cঅ্যারের মধ্যে উপাদানটি কতবার ঘটে তা গণনা করুনa
  • a{c=},,: cঅ্যারের মধ্যে উপাদানটি কতবার ঘটে তা গণনা করুনa

একটি চরিত্র ছোট হয় (এবং, যদি গণনাটি একে একে বন্ধ হয়ে যায় তবে এটি a[c]/,একটি চরিত্রকে আরও বাঁচায়)। তবে, বিশেষ ক্ষেত্রে যেখানে cএকটি সংখ্যা এবং aএটি একটি সাধারণ অ্যারে (কোনও স্ট্রিং নয়), আশেপাশের বর্গাকার বন্ধনীগুলি cবাদ দেওয়া যেতে পারে কারণ -অপারেটর তার আর্গুমেন্টগুলি একই ধরণের সাথে জড়িত করে:

  • a.c--,: cঅ্যারেতে যে সংখ্যাটি ঘটে তার সংখ্যা গণনা করুন (স্ট্রিং নয়!)a

(যদি aএকটি স্ট্রিং এবং c0 এবং 9 এর মধ্যে একটি সংখ্যা, a.c--যতবার গণনা করা হবে অঙ্ক c ঘটেa ।)


অনুরূপ কৌশলটি অ্যারেতে সর্বাধিক সাধারণ উপাদানটি খুঁজে পেতে ব্যবহার করতে পারে :

:a{a\[.]-,}$0=

আবার, যদি ইনপুটটি সংখ্যার একটি অ্যারে হয় তবে পুরো [.]ক্রমটি বাদ দেওয়া যেতে পারে। হায়, এটি ছাড়া স্ট্রিংয়ের জন্য কাজ করে না[.]


ঘটনা গণনা করার জন্য (সাধারণ কেস), a[c]/,(এবং a{c=},,এটি একটি বাইট ছোট।
ডেনিস

@ ডেনিস: ধন্যবাদ! আমি এটি সম্পাদনা করেছি
ইলমারি করোনেন

3

এসটিডিআইএন থেকে পড়ুন

গল্ফস্ক্রিপ্ট স্টিডিন থেকে পড়তে পারেন:

"#{STDIN.read}"

ইওএফ না পৌঁছানো পর্যন্ত এটি এসটিডিএন থেকে পড়া চালিয়ে যাবে। বিকল্পভাবে:

"#{STDIN.gets}"

অথবা

"#{STDIN.readline}"

অন্যান্য জিনিস উপলব্ধ:

getbyte
getc
gets([sep])
gets(limit)
gets(sep, limit)
inspect # perhaps useful for an underhanded contest
isatty
read([length])
readbyte
readchar
readline([sep])
readline(limit)
readline(sep, limit)
readlines([sep])
readlines(limit)
readlines(sep, limit)
readpartial(maxlen [, outbuf])

এগুলির প্রত্যেকের জন্য, এগুলি কেবল একবার ব্যবহার করা যেতে পারে (এবং প্রতিটি প্যারামিটার পরিবর্তনের জন্য একবারে খালি বন্ধনীর সাহায্যে আরও একবার); এর পরে, মূল মানটি হ'ল নতুন মানের পরিবর্তে আপনি যা পাবেন।


2
আপনি এমন একটি মন্তব্য যুক্ত করতে চাইতে পারেন যা {"#{STDIN.readline}"p}2*২ টি লাইন পড়ে না তবে পরিবর্তে স্ট্রিংটি একবারে মূল্যায়ন করা হয়।
হাওয়ার্ড

2
আপনি যদি iকোনও পূর্ণসংখ্যার সাথে আরম্ভ করেন, '"#{'i):i';STDIN.gets}"'++~প্রতিবার মূল্যায়ন করার পরে এটি একটি আলাদা ফলাফল দেবে। ব্যাকটিক্সও উল্লেখযোগ্য হতে পারে। যদি আমরা লিনাক্স ধরে নিই তবে আমরা এর `head -1`পরিবর্তে ব্যবহার করতে পারি STDIN.gets
ডেনিস

@ ডেনিস: "#{var'g','gpush Gstring.new(STDIN.gets)'.cc}";আপনাকে একটি নতুন গল্ফস্ক্রিপ্ট অপারেটর সংজ্ঞায়িত করতে দেয়g যা স্ট্ডিনের থেকে একটি লাইন পড়ে এবং স্ট্যাকের উপর চাপ দেয়।
ইলমারি করোনেন

2

হেক্সাডেসিমাল ইনপুট ডিকোডিং

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

এই 8-চর লুপটি স্ট্রিংয়ের সাথে প্রয়োগ করা হয়েছে, ছোট হেক্স অঙ্কগুলি তাদের সংখ্যাসূচক হিসাবে রূপান্তর করবে:

{39%9-}%

আপনার যদি বড় আকারের হেক্স অঙ্কগুলি (এছাড়াও) গ্রহণ করতে হয় তবে সর্বমোট সহজ (এবং সম্ভবত সবচেয়ে সংক্ষিপ্ত) সমাধানটি প্রথমে 32|মোট 11 টি অক্ষরের সাথে তাদের নিম্নচিকিত্সা করা উচিত:

{32|39%9-}%

দ্রষ্টব্য যে আউটপুট প্রযুক্তিগতভাবে এখনও একটি স্ট্রিং হবে (ASCII অক্ষর 0 - 15 সমন্বিত থাকবে) তবে বেশিরভাগ গল্ফস্ক্রিপ্ট অ্যারে ফাংশনগুলিও স্ট্রিং গ্রহণ করবে। আপনার যদি একেবারে অ্যারের প্রয়োজন হয় তবে আপনি সর্বদা ব্যবহার করতে পারেন [{39%9-}/](যেখানে প্রথম[ স্ট্যাকটি অন্যথায় খালি থাকলে alচ্ছিক)।

উপরের কোডটির আউটপুটটিকে পূর্ণসংখ্যায় রূপান্তর করতে, আপনি কেবল 16base(6 টি অক্ষর) ব্যবহার করতে পারেন । আপনি যদি এর পরিবর্তে বাইটের একটি অ্যারে চান, তবে সংক্ষিপ্ত সমাধানটি আমি খুঁজে পেয়েছি হেক্স ডিজিটের প্রতিটি জোড়া 2/{16base}%(11 অক্ষর) দিয়ে ডিকোড করার জন্য । সমস্ত একসাথে রাখা, আমি হেক্স স্ট্রিংকে বাইট অ্যারেতে পরিণত করতে সবচেয়ে সংক্ষিপ্ত কোডটি 8 + 11 = 19 অক্ষর:

{39%9-}%2/{16base}%

মনে রাখবেন যে, এই কোড আউটপুট হয় প্রকৃতপক্ষে একটি অ্যারের, না একটি পংক্তি। যদি প্রয়োজন হয় ""+তবে আপনি এটির সাথে যুক্ত করে উদাহরণস্বরূপ স্ট্রিংফাই করতে পারেন উদাহরণস্বরূপ বা, যদি আপনি শেষে কোনও অতিরিক্ত নিউলাইন মনে করেন না n+,।


2

নতুন অন্তর্নির্মিত অপারেটরগুলির সংজ্ঞা দেওয়া হচ্ছে

স্ট্যান্ডার্ড গল্ফস্ক্রিপ্ট ইন্টারপ্রেটারে খুব কমই ব্যবহৃত বৈশিষ্ট্য রয়েছে যা ডাবল কোটেড স্ট্রিং ইন্টারপোলটেড রুবি মঞ্জুরি দেয়।

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

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

"#{var'add','gpush a+b'.cc2}";

আপনি নিজের কোডটিতে সংজ্ঞাটি কোথায় রেখেছেন তা সত্য নয়; রুবি কোড যুক্ত ডাবল-কোটযুক্ত স্ট্রিং পার্স হওয়ার সাথে সাথেই নতুন অপারেটর সংজ্ঞায়িত হয়ে যায়। addঅপারেটর কাজ উপরে বর্ণিত ঠিক বিল্ট-ইন মত+ অপারেটর, এবং ঠিক একই ভাবে ব্যবহার করা যেতে পারে:

1 2 add          # evaluates to 3
"foo" "bar" add  # evaluates to "foobar"

অবশ্যই, একটি নতুন সংযোজন অপারেটর সংজ্ঞায়িত করা বেশ অব্যর্থ, যদি না আপনি বিল্ট-ইন +অপারেটরটি মুছার মতো নির্বোধ কিছু করেন । তবে আপনি একই কৌশলটি নতুন অপারেটরগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারেন যা কাজগুলি গল্ফস্ক্রিপ্টটি (সহজেই) স্থানীয়ভাবে করতে পারে না যেমন বলুন, অভিন্নভাবে অ্যারে বদলানো:

"#{var'shuf','gpush a.factory(a.val.shuffle)'.cc1}";

10,shuf          # evaluates to 0,1,2,...,9 in random order

বা পুরো স্ট্যাকের বিষয়বস্তু মুদ্রণ:

"#{var'debug','puts Garray.new($stack).ginspect'.cc}";

4,) ["foo" debug  # prints ["" [0 1 2] 3 "foo"], leaving the stack untouched

বা ইন্টারেক্টিভ ইনপুট:

"#{var'gets','gpush Gstring.new(STDIN.gets)'.cc}";

]; { "> " print gets ~ ]p 1 } do   # simple GolfScript REPL

এমনকি ওয়েব অ্যাক্সেস:

"#{
  require 'net/http'
  require 'uri'
  var'get','gpush Gstring.new(Net::HTTP.get_response(URI.parse(a.to_s)).body)'.cc1
}";

"http://example.com" get

অবশ্যই, পরবর্তীকালের কিছুটা গল্ফিয়ার (এবং ঝুঁকিপূর্ণ!) বাস্তবায়ন যেমন:

"#{var'get','gpush Gstring.new(`curl -s #{a}`)'.cc1}";

যদিও নিজের মধ্যে বিশেষভাবে গল্ফ নয়, বিল্ট-ইন কমান্ডগুলি সরবরাহ করে তা আপনাকে গল্ফস্ক্রিপ্টের সক্ষমতা বাড়িয়ে দেয়।


এটা কিভাবে কাজ করে?

এইভাবে নতুন গল্ফস্ক্রিপ্ট অপারেটরগুলি কীভাবে সংজ্ঞায়িত করা যায় সে সম্পর্কে অনুমোদনমূলক রেফারেন্স অবশ্যই দোভাষীর সোর্স কোড । এটি বলেছিল, এখানে কয়েকটি দ্রুত টিপস:

  • একটি নতুন অপারেটর সংজ্ঞায়িত করতে nameযা রুবি কোড চালায় code, ব্যবহার করুন:

    var'name','code'.cc
  • কোডের অভ্যন্তরে, gpopস্ট্যাকের বাইরে একটি মান পড়তে এবং gpushএকটি পিছনে ঠেলাঠেলি করার জন্য ব্যবহার করুন You এছাড়াও আপনি সরাসরি অ্যারের মাধ্যমে স্ট্যাকটি অ্যাক্সেস করতে পারেন $stack। উদাহরণস্বরূপ, উভয়কে ঠেলাঠেলি করে aএবং bস্ট্যাকের উপরে রাখার $stack<<a<<bচেয়ে গল্ফিয়ার gpush a;gpush b

    • [অ্যারে স্টার্ট মার্কারগুলির অবস্থানগুলি অ্যারেতে সংরক্ষণ করা হয় $lbgpopফাংশন তাদের অবস্থান স্ট্যাক পর্যন্ত সঙ্কুচিত নিচে হলে তা এই মার্কার সামঞ্জস্য কিন্তু সাধিত যত্ন নেয় $stackসরাসরি অ্যারের না।
  • .ccস্ট্রিং পদ্ধতি যে একটি GolfScript অপারেটর মধ্যে একটি স্ট্রিং রুবি কোড প্রনয়ন প্রায় শুধু একটি সুবিধার্থে মোড়কের হয় Gblock.new()। এছাড়া রূপগুলো হয়েছে .cc1, .cc2এবং .cc3যে অপারেটর স্বয়ংক্রিয়ভাবে স্ট্যাকের বন্ধ 1, 2 অথবা 3 আর্গুমেন্ট পপ এবং তাদের ভেরিয়েবল নির্ধারণ করা a, bএবং c। এটির .orderমতো এমন একটি পদ্ধতি রয়েছে যা .cc2এটি স্বয়ংক্রিয়ভাবে অগ্রাধিকার অনুসারে যুক্তি সাজায়

  • GolfScript স্ট্যাক সমস্ত মান (এবং হওয়া উচিত!) প্রকারের অবজেক্টের Gint, Garray, Gstringবা Gblock। অন্তর্নিহিত দেশীয় পূর্ণসংখ্যা বা অ্যারে, যেখানে প্রয়োজন হয়, .valপদ্ধতিটির মাধ্যমে অ্যাক্সেস করা যায় ।

    • তবে নোট করুন যে Gstring.valএকটি অ্যারের ফেরত দেয় Gint! Gstringকোনও স্থানীয় রুবি স্ট্রিংয়ে রূপান্তর করতে .to_sতার পরিবর্তে কল করুন (বা স্ট্রিং ইন্টারপোলেশনের মতো এটি স্বয়ংক্রিয়ভাবে এমন একটি প্রসঙ্গে ব্যবহার করুন)। যে .to_gsকোনও জিএস মানকে কল করা এটি এটিকে পরিণত করে Gstring, তাই কোনও জিএস মান দিয়ে স্ট্রিংফাই করা যায় .to_gs.to_s
  • gpushক্রিয়াটি সংশ্লিষ্ট জিএস ধরনের মধ্যে নেটিভ রুবি সংখ্যা, স্ট্রিং বা অ্যারে স্বয়ংক্রিয় মোড়ানো থাকে, স্পষ্টভাবে কলিং যেমন দ্বারা যাতে আপনি প্রায়ই এটা নিজেকে করতে হবেGstring.new() । যদি আপনি জিএস মান ধরণের একের বাইরে অন্য কোনও কিছু স্ট্যাকের দিকে ঠেলে থাকেন তবে পরে যে কোনও কোড যা এটিকে চালিত করার চেষ্টা করে তা ক্রাশ হওয়ার সম্ভাবনা রয়েছে।

  • জিএস মান .factoryধরণেরও এমন একটি পদ্ধতি রয়েছে যা টাইপের কনস্ট্রাক্টরকে কল করে, যা দরকারী বিষয়গুলি উদাহরণস্বরূপ তাদের অ্যারে / স্ট্রিংগুলি পুনর্নির্মাণের জন্য তাদের সামগ্রীগুলি পুনঃনির্মাণের জন্য ব্যবহার করতে পারে। সব ধরনের আরো একটি আছে .coerceপদ্ধতি যা সঞ্চালিত জাভাস্ক্রিপ্টের এই মাতব্বরী : a.coerce(b)ধারণকারী একজোড়া ফেরৎ aএবং bএকই ধরনের করতে বাধ্য।

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