রাডায় গল্ফ করার টিপস


12

রাদা হ'ল একটি স্ট্রিম-ভিত্তিক স্ক্রিপ্টিং ভাষা যা ফার্গুস্যাক দ্বারা নির্মিত ।

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

দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


আপনি কি আমাকে গল্ফে মারার টিপস পেতে চেষ্টা করছেন? : পি (আমার সম্ভবত পাইথন পৃষ্ঠার টিপসের দিকে নজর দেওয়া উচিত)
হাইপারনিউটারিনো

বাহ, পিসি.জি.এস. এর একটি প্রশ্ন যা হট নেটওয়ার্ক প্রশ্নে প্রবেশ করেছে এবং এটি কোনও প্রোগ্রামিং ধাঁধা / চ্যালেঞ্জ নয়! :)
পেড্রো এ

1
@ হাইপারনিট্রিনো শ্হ .... :)
ব্যবহারকারীর 41805

উত্তর:


7

আন্ডারস্কোর ব্যবহার করুন

এটি সম্ভবত সবচেয়ে গুরুত্বপূর্ণ টিপ। প্রায় প্রতিটি গল্ফ করা রাদা প্রোগ্রাম আন্ডারস্কোর ব্যবহার করে।

আন্ডারস্কোর সিনট্যাক্স forলুপগুলির জন্য সিনট্যাকটিক চিনি । নিম্নলিখিত কোডের লাইন সমতুল্য:

ls""|fileLength x for x|sort|pull
ls""|fileLength _|sort|pull

প্রতিটি আন্ডারস্কোর একটি অদৃশ্যতে একটি নতুন ভেরিয়েবল যুক্ত করে for স্টেটমেন্টের চারপাশে থাকা । লুপ প্রতিটি ভেরিয়েবল / আন্ডারস্কোরের জন্য স্ট্রিম থেকে একটি মান টেনে নেয় এবং তারপরে পুনরাবৃত্তি করে, যতক্ষণ না কোনও মান বাকি না থাকে।

স্ট্যান্ডার্ডগুলি যে কোনও জায়গায় বিবৃতিতে ব্যবহার করা যেতে পারে:

a[x:y+1]=[1]*(1+y-x) /* Sets range x..y (inclusive) */
seq x,y|a[_]=1       /* 6 bytes less */

যদি আপনাকে একই আন্ডারস্কোর মানটি একাধিকবার উল্লেখ করতে হয় বা মানগুলি বিপরীত ক্রমে ব্যবহার করতে হয় তবে আপনি আন্ডারস্কোরের পরে একটি সংখ্যা রাখতে পারেন:

a|[_^_1]  /* maps x to x^x */
a|[_2-_1] /* maps each pair (x,y) to y-x, eg. [1,2,4,8] -> [1, 4] */

3

কিছু সেমিকোলন / নিউলাইন optionচ্ছিক

Röda কোড লেখার সময়, সমস্ত বিবৃতি পৃথক করার জন্য সাধারণত নিউলাইনস বা সেমিকোলন ব্যবহার করার পরামর্শ দেওয়া হয়। যাইহোক, গল্ফ করার সময়, এটি জেনে রাখা উচিত যে সমস্ত সেমিকোলনগুলি সত্যই প্রয়োজন হয় না।

এখানে জায়গায় যেখানে সেমিকোলন / নতুন লাইন হয় একটি অসম্পূর্ণ তালিকা ঐচ্ছিক । তাদের অধিকাংশই প্রযোজ্য নয় যখন নিম্নোক্ত বিবৃতি একটি অপারেটর (দিয়ে শুরু হয় না (, [, +, ইত্যাদি)।

  • দায়িত্ব পরে
  • ফাংশন কল করার পরে, যখন কমপক্ষে একটি যুক্তি থাকে (উদাহরণস্বরূপ f x) বা যখন প্রথম বন্ধনী ব্যবহার করা হয় (উদা। f())
  • সব জায়গা, পরের লাইন / বিবৃতি দিয়ে শুরু হবে যদি |, ), ]বা}

পরবর্তী প্রতিবেদনটি একটি অপারেটর, সেমিকোলন / সম্পর্কে newline সঙ্গে শুরু হয় তাহলে ঐচ্ছিক যদি

  • বিবৃতিটি একটি ফাংশন কল এবং প্রথম বন্ধনী ব্যবহৃত হয়, যেমন {f(x)[y]}হিসাবে একই same{f(x);[y]} । এটি কেবলমাত্র বিবৃতি প্রসঙ্গে কাজ করে, যখন ফাংশন কলটি কোনও এক্সপ্রেশন হয় না।
  • বিবৃতিটি একটি অ্যাসাইনমেন্ট এবং প্রথম বন্ধনী ব্যবহৃত হয়, উদাহরণস্বরূপ x=(y)[z]একই x=(y);[z](যেমনটি একই নয় x=((y)[z]))।

এবং দুর্ভাগ্যক্রমে দুর্ভাগ্যবশত নতুন লাইনের প্রয়োজনীয়তার জন্য এমন কয়েকটি জায়গা এখানে রয়েছে :

  • পরে ++এবং--
  • পরে [...]

অ্যাসাইনমেন্ট পুনর্গঠন করে প্রায়শই বাইটগুলি সংরক্ষণ করা সম্ভব। উদাহরণ স্বরূপ:

a=0;b=""c=[""]
b=""c=[b]a=0

x=f()y=i;z=a[0]
x=f()z=a[0]y=i

1

প্রত্যয় নিয়ন্ত্রণ কাঠামো ব্যবহার করুন

আপনি ব্যবহার করতে পারেন যেমন, প্রত্যয় বিবৃতি ব্যবহার না করা প্রায় কখনই অনুকূল নয়{...} জায়গায়do...end

কিছু উদাহরণ:

x|unless[not(_ in y)]do[0]else[1]done
x|[0]unless[not(_ in y)]else[1]

if[p<0]do c+=p;a-=p done
{c+=p;a-=p}if[p<0]

আপনি কি if[_ in y]পরিবর্তে করতে পারেন ?
ব্যবহারকারী 41805

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

1

ইনপুট জন্য স্ট্রিম ব্যবহার করুন

ইনপুট উপাদানগুলির তালিকার একটি ক্ষেত্রে, মানগুলি অ্যারে হিসাবে না পেয়ে স্ট্রিম থেকে মানগুলি টানাই উপকারী হতে পারে।

বেশিরভাগ ক্ষেত্রে অ্যারের উপাদানগুলিকে স্ট্রিমে ঠেলে এবং তারপরে একটি forলুপ (বা আন্ডারস্কোর) ব্যবহার করে পুনরাবৃত্তি করা হয় । যেভাবে যাইহোক উপাদানগুলি স্ট্রিম থেকে পুনরাবৃত্তি হয়, কেন শুরু থেকেই তাদের সংজ্ঞা দেওয়া হবে না?

উদাহরণস্বরূপ, ইনপুটটিতে সংখ্যার স্কোয়ারের যোগফল গণনা করতে:

{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum}      /* saves 5 bytes */

1

বন্ধনীগুলি বিবৃতি প্রসঙ্গে areচ্ছিক। অপারেটর দিয়ে যুক্তি শুরু হলেও এটি প্রযোজ্য। উদাহরণস্বরূপ, [a()|sqrt-_]তুলনায় কম [a()|sqrt(-_)]। পরের বন্ধনীগুলি aবাধ্যতামূলক, যেমনa বিবৃতি প্রসঙ্গে নয়, অভিব্যক্তি প্রসঙ্গে।

যাইহোক, লেখা [a()|sqrt(_+1)*2]সম্ভব নয়, এবং অতিরিক্ত প্রথম বন্ধনী পার্সার সাহায্য করার জন্য প্রয়োজন হয়: [a()|sqrt((_+1)*2)]। প্রায়শই এ জাতীয় অভিব্যক্তি পুনরায় লেখা সম্ভব হয় যাতে এটি প্রথম বন্ধনী দিয়ে শুরু না হয়:[a()|sqrt 2*(_+1)]


প্রথম বন্ধনীর প্রয়োজন ছাড়াই ফাংশনে একাধিক পরামিতি পাস করাও কি সম্ভব?
ব্যবহারকারী 41805

@ ক্রিতিক্সিলিথোস হ্যাঁ যেমন। [a()|atan2 _,_]অনুমতি দেওয়া হবে।
ফার্গুসক

1

ইন / স্টেটমেন্টের ,পরিবর্তে ব্যবহার করুন..[]push

সম্পর্কিত: পরিবর্তে ব্যবহার করুন,and

pushফাংশন (সেইসাথে printফাংশন) আর্গুমেন্ট যে কোন সংখ্যার নিতে, এবং কোন বিভেদক সঙ্গে তাদের প্রত্যেককে আউটপুট করতে পারেন।

সুতরাং এর অর্থ এইরকম কিছু

["a"..b]        /*8 bytes (string "a" concatenated with variable b)*/

সংক্ষিপ্ত করা যেতে পারে ন্যায়বিচার

["a",b]         /*7 bytes*/

1 বাইট সংরক্ষণ করা হচ্ছে।


1

[]/ push>print

printবিবৃতি কখনও ব্যবহার করবেন না । []ধাক্কা বিবৃতি সর্বদা গল্ফিয়ার হয়। printএবং এর মধ্যে পার্থক্যটি pushহ'ল প্রাক্তনটি একটি পিছনের নতুন লাইনটি আউটপুট দেয় যখন উত্তরটি দেয় না। তবে এটি পরিবেষ্টিত হতে পারে।

print"a"              /* 8 bytes */
["a                   /* 6 bytes; uses a literal newline */
"]

print"a",b            /* 10 bytes */
[`a$b                 /* 8 bytes; uses a literal newline and `` strings */
`]

1

``স্ট্রিং ব্যবহার করে

ইন ""স্ট্রিং, আপনি তাদের ব্যবহার করার জন্য কিছু নির্দিষ্ট অক্ষর অব্যাহতি থাকবে। উদাহরণস্বরূপ, ব্যাকস্ল্যাশ মুদ্রণ করতে আপনার মতো স্ট্রিং থাকতে হবে "\\"। ব্যাকস্ল্যাশ থেকে বাঁচার জন্য একটি যুক্ত বাইট রয়েছে। তবে আপনি যদি ব্যবহার করেন তবে ``আপনি করবেন না এই চরিত্রটি থেকে বাঁচতে এবং একটি বাইট সংরক্ষণ করতে পারবেন।

print"\\"     /* 9 bytes */
print`\`      /* 8 bytes */

শুধু তাই নয়, আপনি ``স্ট্রিংয়ের সাহায্যে ভেরিয়েবল এবং এক্সপ্রেশনগুলি এনকোড করতে পারেন$variableName বা ${expression}, ""স্ট্রিংগুলিতে উপস্থিত না এমন একটি বৈশিষ্ট্য ।

আমরা এই উদাহরণগুলিতে একটি অনুবর্তনযোগ্য নিউলাইন সহ "a"ভেরিয়েবলের মান দিয়ে স্ট্রিং সংক্ষিপ্ত করে আউটপুট করছি b

["a",b,"      /* 11
"]               bytes   */
[`a$b         /* 8
`]               bytes; encodes b in the string using $b */

1

ব্যবহার ,পরিবর্তেand

রাডার শর্তগুলি স্ট্রিম এবং এতে একাধিক মান থাকতে পারে। এই মানগুলি এক বুলিয়ান মান দিয়ে হ্রাস করা হয়and

এর অর্থ আপনি একাধিক মানকে স্ট্রিমের দিকে ঠেলে দিতে অবস্থার andসাথে প্রতিস্থাপন করতে পারেন ,:

x if[a and b]
x if[a,b]

খালি অবস্থা সত্য

এটি এমন কোনও শর্তেও থাকতে পারে যার কোনও মান নেই, যা সত্য।

x while true
x while[]

1

ফর্ম প্রতিস্থাপনের তালিকা লিখুন *"...;..."/";"

replaceফাংশন স্বাভাবিকভাবে আর্গুমেন্ট হিসাবে স্ট্রিং একটি তালিকা লাগে। তবে, তালিকাটি যদি দীর্ঘ হয় তবে রেজিগ্স / রিপ্লেসমেন্ট জোড়গুলিকে স্ট্রিংয়ে রেখে স্ট্রিংকে আলাদা করে স্টার অপারেটরটি ব্যবহার করা সুবিধাজনক:

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