<সমস্ত ভাষা> এ গল্ফ করার টিপস


81

এই পোস্টের উদ্দেশ্যটি হ'ল সমস্ত গল্ফিং টিপসগুলি সংগ্রহ করা <all languages>যা কোনও নির্দিষ্টের চেয়ে সহজেই প্রয়োগ করা যায় ।

কেবলমাত্র উত্তর পোস্ট করুন যে এর যুক্তিটি সংখ্যাগরিষ্ঠ ভাষার ক্ষেত্রে প্রয়োগ করা যেতে পারে

দয়া করে, প্রতি উত্তরে একটি টিপ


5
"মেজরিটি" কোন মেট্রিক দ্বারা?
পাল্টা

2
একই শব্দটির মেট্রিক দ্বারা @ বামফ্রন্টআউটবাউট
অজেক্স 333221

8
সমস্যাটি হ'ল অনেকগুলি ভাষা (প্রায়শই স্বল্প-কালীন) পরীক্ষামূলকভাবে খুব অল্পক্ষণীয় দৃষ্টান্তযুক্ত, যার জন্য সাধারণ প্রোগ্রামিং এক্সপ্রেশনগুলি মোটেই বোঝা যায় না। সুতরাং " সমস্ত ভাষার সিংহভাগ " এটি সম্পাদন করা কার্যত অসম্ভব। আপনার এটিকে কোনও উপায়ে সীমাবদ্ধ করা উচিত, যেমন "কোডগলফ.এসইতে নিয়মিত ব্যবহৃত বেশিরভাগ ভাষা" to এই মুহুর্তে, উত্তরগুলি দেখতে অনেকটা "দূরবর্তী সি-উত্পন্ন ভাষাগুলির সংখ্যাগরিষ্ঠ" এর মতো দেখতে লাগে তবে সমস্ত লিখিত কোডের বৃহত সংখ্যাগরিষ্ঠ যদিও তাদের মধ্যে লেখা থাকে তবে সংখ্যাগরিষ্ঠ ভাষা নয়
পাল্টে ঘড়ির

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

14
আশা রাখি, কেউ কিছু নামক একটি ভাষা তৈরি করে <all languages>...
mbomb007

উত্তর:


72

লুপগুলি মার্জ করুন

আপনি সাধারণত দুটি ফলস্বরূপ লুপগুলি বা দুটি নেস্টেড লুপগুলিকে একটিতে মার্জ করতে পারেন।

আগে:

for (i=0; i<a; i++) foo();
for (i=0; i<b; i++) bar();

পরে:

for (i=0; i<a+b; i++) i<a?foo():bar();

ugoren লুপগুলি এখনও একই নয়। @ গাফি ঠিক বলেছেন।
কাওড

5
@kaoD, উভয় ক্ষেত্রেই fooবলা হয় aবার barবলা হয় bবার। এটি কারণ "পরে", লুপটি a+bবার সঞ্চালিত হয়, প্রথম aকল foo, পরেরগুলি কল করে bar
উগোরেন

আমি এটি আবার দেখছি (অনেক পরে,), এবং আমি এখন আমার নিজের প্রশ্ন বুঝতে পারি না। আমি সম্ভবত এর আগে টার্নারি অপারেশন বুঝতে পারি না? আমি এখন এটি যেভাবে দেখছি, তা বোঝা যায়।
গাফি

1
ওফস, আমি খুব গভীর রাতে পড়েছিলাম। তুমি ঠিক বলছো!
কাওড

3
অত্যন্ত অনুরূপ: for(y=0;y<Y;++y)for(x=0;x<X;++x)প্রায়ই হতে পারে for(i=0;i<X*Y;++i)সঙ্গে xদ্বারা প্রতিস্থাপিত i%Xএবং yদ্বারা প্রতিস্থাপিত i/X
লিন

62

কেবল স্পষ্টভাবে উল্লেখ করতে:

আপনার অ্যালগোরিদমের পছন্দকে প্রশ্ন করুন এবং সম্পূর্ণ নতুন কিছু চেষ্টা করুন।

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

495 (কপ্রেকার) হিট করার ক্ষেত্রে এটি বিশেষভাবে লক্ষণীয় ছিল যেখানে আসল অ্যালগরিদম থেকে বিচ্যুত হওয়া এবং একই ফলাফলের জন্য আপনি যে প্যাটার্নগুলির জন্য আবেদন করতে পারেন তা খুঁজতে অনেক ভাষায় সংক্ষিপ্ত ছিল (কেবল জে নয়)।

খারাপ দিকটি হ'ল আপনি সম্ভবত একই জিনিসটি অর্ধ ডজন বার সমাধান করেছেন। তবে এটি এইচকিউ 9 + (যেখানে হ্যালো ওয়ার্ল্ডকে আউটপুট দেওয়ার অন্য কোনও উপায় সন্ধান করা কিছুটা নিরর্থক হবে) বাদে সত্যই অন্যান্য ভাষায় কাজ করে ।


12
+1 গল্ফিংয়ের পক্ষে ভাল হওয়ার পাশাপাশি, অনেক বাস্তব-বিশ্বের পরিস্থিতিতে যে কোনও প্রোগ্রামারের পক্ষে এটি ভাল অনুশীলন!
গাফী

52

পরীক্ষা-চালিত বিকাশ ব্যবহার করুন

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


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

2
আমি এই পদ্ধতিটি পছন্দ করি, এটি একটি কারণ যা আমি লিখি সমস্ত সমস্যার বিস্তৃত পরীক্ষার স্যুট অন্তর্ভুক্ত করে tend
জোয়

@ রাবারডাক দ্য নিজেকে পুনরাবৃত্তি করবেন না নীতিটি প্রায়শই কঠোরভাবে অনুসরণ করা হয়।
জোনাথন ফ্রেচ

48

যৌক্তিক বিবৃতি হ্রাস করার চেষ্টা করুন

উদাহরণস্বরূপ, যদি Aএবং Bবুলিয়ান হয় এবং আপনার ভাষা কিছু পরিমাণে বুলিয়ানদের সাথে সংখ্যার মতো আচরণ করে, A and (not B)এবং A>Bসমতুল্য। উদাহরণস্বরূপ পাইথনে

if A and not B:
    foo()

এটার মতই:

if A>B:
    foo()

3
আমি এটা কখনই ভাবিনি।
সিজেফুরে

27
B>A or foo()এটি প্রকাশ করার আরও ছোট উপায় হতে পারে, বুলিয়ান এক্সপ্রেশনগুলির অলস মূল্যায়নের সুযোগ নিন এটি নিশ্চিত করার জন্য যে এটি যখন প্রয়োজন হয় কেবল জিনিসগুলি গণনা করে।
স্ক্রাগার

5
@ স্ক্রাগার: সঠিক, তবে এটি এই টিপের মূল বিষয় নয়। (যদিও এটি একটি মূল্যবান স্বতন্ত্র টিপ))
রাইজলপ্রফ্ট

3
@scragar, B>A or fooমূল্যায়ন করবেন fooযদি B==Aযা আমরা কি চান না। (ডান?)
এমএস 210

2
এছাড়াও, যদি আপনার দীর্ঘ সংকীর্ণ শর্ত থাকে (5/6 প্যারামিটার দিয়ে বলুন), আপনি এর জন্য স্বল্পতম বুলিয়ান অভিব্যক্তি খুঁজে পেতে একটি ট্রুথ টেবিল এবং কর্নহো মানচিত্র ব্যবহার করতে পারেন
কেটেনকিও

33

আপনার ইতিমধ্যে থাকা মানগুলি ব্যবহার করে ভেরিয়েবলগুলি সূচনা করুন।

পরিবর্তে x=1, ইতিমধ্যে 1 সমান এমন কিছু সন্ধান করার চেষ্টা করুন
For উদাহরণস্বরূপ, কোনও ফাংশনের ফেরতের মান: printf("..");x=0;-> x=!printf("..");। এটি 0 সহ সবচেয়ে সহজ, কারণ আপনি সর্বদা প্রত্যাখ্যান করতে পারেন, বা যখন আপনার যা প্রয়োজন তা হ'ল সত্যের মান (এবং এটি 1 বা 19 এর দিকে লক্ষ্য রাখবেন না)।


4
: সি হিসাবে আপনি 1. দেখুন প্রধান থেকে-argc ব্যবহার করতে পারেন codegolf.stackexchange.com/questions/1034/reinvent-the-for-loop/...
std''OrgnlDave

1
@ std''OrgnlDave, সত্য, তবে এই প্রশ্নটি সমস্ত ভাষায় সাধারণ বিষয়গুলি সম্পর্কে।
ugoren

33

এবং এর ~জন্য অবিচ্ছিন্ন ব্যবহার করুনx+1x-1

এই কৌশলটি এমন ভাষাগুলিতে প্রযোজ্য যেগুলিতে অ্যানারি বিটওয়াইজ নেগেশন অপারেটর ~এবং একটি অ্যানারি নিয়মিত নেগেশন অপারেটর রয়েছে -

যদি আপনার প্রোগ্রামটি, সুযোগক্রমে -x-1, অভিব্যক্তি ধারণ করে , আপনি ~xবাইটগুলি সংরক্ষণ করতে এটির সাথে প্রতিস্থাপন করতে পারেন । এটি খুব ঘন ঘন ঘটে না, তবে দেখুন যদি আমরা ( -) উভয় এক্সপ্রেশনকে তুচ্ছ করে দেখি তবে কি হবে : x+1সমান -~x! একইভাবে, x-1সমান ~-x। (কীভাবে টিল্ড পয়েন্টগুলি ভেবে দেখুন: ডান +, বাম দিকে -)

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

(x+1)*(y-1)     ==>    -~x*~-y

30

সাদা জায়গা স্পেস করুন

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

f () { echo a; echo b; }

বোর্ন শেল-এ, ();মেটাচার্যাক্টর রয়েছে এবং আশেপাশের সাদা জায়গার দরকার নেই। যাইহোক, {}শব্দগুলি এবং মেটাচারাক্টরের পাশে না থাকলে হোয়াইটস্পেসের প্রয়োজন। আমরা পাশের 4 টি স্পেস গল্ফ করতে পারি ();, তবে অবশ্যই স্থানটি {এবং এর মধ্যে রাখতে হবে echo

f(){ echo a;echo b;}

ইন কমন পাতার মর্মর এবং PicoLisp , ()metacharacters হয়। দুটি সংখ্যার গড় সন্ধান করতে এই কোডটি বিবেচনা করুন:

(/ (+ a b) 2)

আমরা 2 স্পেস দূরে গল্ফ করতে পারেন।

(/(+ a b)2)

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

#!ruby -an
i=$F.map &:to_i
puts"#{i.reduce &:+} #{i.reduce &:*}"

প্রত্যেকের &নিজের আগে একটি স্থান প্রয়োজন। রুবি সালে i=$F.map &:to_iমানে i=$F.map(&:to_i)যেখানে &একটি ব্লক প্যারামিটার প্রেরণ করা হয়। তবে, i=$F.map&:to_iমানে i=$F.map.&(:to_i)যেখানে &বাইনারি অপারেটর।

পার্ল বা রুবির মতো ভাষায় এই অদ্ভুততা দেখা দেয় যা দ্বিবিরাম বিরামচিহ্ন ব্যবহার করে। যদি সন্দেহ হয় তবে একটি রিপ্লে ব্যবহার করুন বা হোয়াইটস্পেসের নিয়মগুলি পরীক্ষা করতে সংক্ষিপ্ত প্রোগ্রামগুলি লিখুন।


1
"{" এবং "প্রতিধ্বনি" এর মধ্যে কেন স্থান দরকার, তবে "" এর মধ্যে নয়; এবং "প্রতিধ্বনি"?
রায়ান

3
আমি ওপেনবিএসডি sh (1) এর জন্য ম্যানুয়াল থেকে শর্তাদি ব্যবহার করেছি, যা বলে যে "a" একটি সংরক্ষিত শব্দ এবং ";" একটি মেটা চরিত্র। এ কারণে, "cho প্রতিধ্বনি" একটি শব্দ তবে "; প্রতিধ্বনি" দুটি শব্দ। অন্যান্য ম্যানুয়ালগুলি এটি অন্যভাবে ব্যাখ্যা করতে পারে। এছাড়াও, জেড শেল zsh এর বিভিন্ন বিধি রয়েছে।
কার্নেগ


28

একক পত্রের পরিবর্তনশীল নাম

আপনি তাদের 52 আছে; সব ব্যবহার! বিভিন্ন পদ্ধতির চেষ্টা করতে এবং দৈর্ঘ্যের তুলনা করতে ভয় পাবেন না। ভাষা এবং উপলভ্য নির্দিষ্ট শর্টকাট / লাইব্রেরি ফাংশন জানুন।


8
26 কেস-সংবেদনশীল ভাষার জন্য। :-)
গাফি 21'12

12
প্রায়শই $এবং _সনাক্তকারী হিসাবে ব্যবহার করা যেতে পারে।
গ্রিফিন

4
@ গাফি: এবং ভাষা ইউনিকোড শনাক্তকারীদের অনুমতি দেয় এমন পর্যাপ্ত পরিমাণের জন্য, যদি না আপনি টাস্কটি ASCII এ সীমাবদ্ধ করেন বা অক্ষরের পরিবর্তে বাইট গণনা করেন।
হামার

আপনি যদি ইউনিকোডের পরিবর্তে বাইটগুলি গণনা করে থাকেন তবে বর্ধিত এসকিআই ব্যবহার করে অন্য ~ 120 শনাক্তকারীগুলির যদি আপনার প্রয়োজন হয় তবে এটি একটি উপায় হতে পারে (এটি নয় যে কোনও গল্ফ স্ক্রিপ্টের জন্য আপনাকে 26 এরও বেশি হওয়া উচিত)
স্ক্রাগার

2
@টি-এসকিউএলে একটি বৈধ পরিবর্তনশীল নাম, পরিবর্তে এটি ব্যবহার করুন @a
ব্র্যাডিসি

25

শর্তসাপেক্ষ অপারেটর ব্যবহার করুন।

শর্তসাপেক্ষ অপারেটর

bool ? condition_true : condition_false

আইএফ স্টেটমেন্টের চেয়ে চরিত্রবান, আরও উপকারী ।

if(a>b){r=a;}else{r=b;}

হিসাবে লেখা যেতে পারে

r=a>b?a:b;

25
যে ভাষাগুলির একটি দশক নেই সেগুলি a&&b||cপরিবর্তে ব্যবহার করতে পারে । কিছুটা লম্বা, তবে একটি থেকে আরও ছোট if
মাইকেল কোহল

তারপরে আবারও কেউ কেউ বিকল্প ব্যবহার করতে পারে না (ভিবিএ মনে মনে আসে) তবে উভয়ই এখনও ভাল পরামর্শ। :-)
গাফি

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

তিন ব্যবহার মধ্যে যদি বিবৃতি এছাড়াও খুব সহায়ক হতে পারেif(a ? b : c)
Jojodmo

4
@MichaelKohl করে লক্ষ্য করুন যে a&&b||cআসতে পারেন cযখন aসত্য iff b, মিথ্যা একটু প্রান্ত ক্ষেত্রে দেখা যায়, কিন্তু আমরা ^^ ভুলে গেলে চলবে না
Katenkyo

24

আপনার কোড একটি ব্যাখ্যা লিখুন

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

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

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


23

আপনার অক্ষর গণনা ডাবল চেক করুন

অ-মস্তিষ্কের মতো শোনাচ্ছে, তবে সতর্কতার সাথে আপনি সম্ভবত কিছু না করে কয়েকটি অক্ষর "সংরক্ষণ" করতে সক্ষম হতে পারেন!

আপনি যদি উইন্ডোজ ব্যবহার করছেন, আপনি হয়ত \r\nপরিবর্তে ইনপুট দিচ্ছেন \rবা \nযখন আপনি রিটার্ন হিট করবেন - প্রতি লাইনে অতিরিক্ত বাইট যুক্ত করুন! আপনি এটি করছেন না এমন দ্বিগুণ পরীক্ষা করার জন্য নিয়ন্ত্রণের অক্ষরগুলি ঘুরে দেখুন।

নোটপ্যাড ++ এ আপনি সমস্ত \r\nলাইনের শেষটিকে কেবল \rগিয়ে গিয়ে রূপান্তর করতে পারেন Edit > EOL Conversion > UNIX/OSX Format

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


আমি মনে করি না যে আমি কখনও এমন কোনও মামলা দেখেছি যেখানে এটি আসলে গণনা করা হয়েছে ...
জ্যাকব

4
আমি নিজেই এই সমস্যাটি পেয়েছি (তাই আমি এটি যুক্ত করছি কেন)।
শান ল্যাথাম

21

প্রশ্নটি মনোযোগ সহকারে পড়ুন

কোড গল্ফিং প্রশ্নটি বোঝার বিষয়ে (যা জিজ্ঞাসা করা হয় এবং কী জিজ্ঞাসিত হয় না , যদিও এটি অন্য কোনও সেটিংয়ে অন্তর্ভুক্ত করা হবে) কোড তৈরির কোড হিসাবে (যা) কেবল যা চাওয়া হয় তা পূরণ করে।

স্পষ্টভাবে যা জিজ্ঞাসা করা হয়েছে তা ব্যতীত অন্য কোনও ইনপুট হ্যান্ডেল করার দরকার নেই। যদি কিছু পরীক্ষার মামলা থাকে এবং জেনেরিক প্রয়োজনীয়তা না থাকে তবে আপনার কোডটি কেবলমাত্র সে ক্ষেত্রেই কাজ করতে পারে। প্রভৃতি


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

1
হ্যাঁ, তবে নিয়মগুলির একটি শৈল্পিক পুনরায় সংজ্ঞা কোড গল্ফিংয়েরও একটি অংশ! (0 চরের সমাধান ইত্যাদি)
টোবিয়া

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

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

20

0 এবং যে কোনও 2 এন -1 এর মধ্যে নম্বরগুলি পরীক্ষা করার জন্য বিটওয়াইজ অপারেশনগুলি ব্যবহার করুন

কিছুটা অ্যাজ কেস হতে পারে তবে এটি কখনও কখনও কাজে আসে। এটি নির্ভর করে যে m = 2 n -1 প্রয়োগ করে সমস্ত সংখ্যার ডানদিকে n বিট 1 এ সেট করা আছে।

সুতরাং, 7 10 == 00000111 2 , 15 10 == 00001111 2 , 31 10 == 00011111 2 এবং আরও অনেক কিছু।

কৌশলটি হল x&~m। এই সত্য ফিরে আসবে যখনই xহয় না 0 এবং মধ্যবর্তী m(সহ), এবং মিথ্যা অন্যথায়। এটি পরবর্তী সংক্ষিপ্ত সমমানের অভিব্যক্তি থেকে 6 বাইট সংরক্ষণ করে: x>=0&&x<=mতবে m2 এন -1 সন্তুষ্ট হলে অবশ্যই কাজ করে ।


18

নতুন ভেরিয়েবলের পরিবর্তে ফাংশন প্যারামিটারগুলি পুনরায় ব্যবহার করুন


1
উদাহরণস্বরূপ, সি তে, আপনার মূল ফাংশনটি সর্বদা প্রোগ্রামকে সরবরাহ করা আর্গুমেন্টের সংখ্যাটি (যা 1 - প্রোগ্রামের নাম - 'ডিফল্ট' দ্বারা) পাস করা হয় তাই আপনার সাথে main(i){...এখন 1 এর মান সহ একটি ভেরিয়েবল রয়েছে যে কোন কাজ করুন। 2 টি অক্ষর সেখানে সংরক্ষণ করা হয়েছে ..
গ্রিফিন

6
আমি মনে করি এটি সি এর সাথে সুনির্দিষ্টভাবে সুনির্দিষ্ট ভাষাগুলির ঘোষণার দরকার নেই এবং বেশিরভাগ সংকলিত ভাষায় একটি ভেরিয়েবল সংজ্ঞায়িত করার পরে পরামিতি সংজ্ঞায়নের চেয়ে বেশি দীর্ঘ হয় না।
ugoren

জাভাতে যখন কোনও ফাংশনের ভিতরে অ্যারের প্রয়োজন হয় যা একই প্যারামিটারের মতো থাকে তবে আপনি সেই প্যারামিটারটিকে শেষ হিসাবে রেখে কয়েকটি বাইটগুলি সঞ্চয় করতে পারেন এবং এটি একটি ভারারগ প্যারামিটার তৈরি করতে পারেন; (একটি বাক্যে দীর্ঘতম শব্দটি খুঁজে পেতে কোনও ফাংশনে কিছু বাইট শেভ করার জন্য এটি ব্যবহৃত হত)
এক্স 244

18

বৃহত্তর / একটি সংখ্যা সংরক্ষণ করার চেয়ে কম:

//use:
if(n>9){A}else{B}
//instead of:
if(n<10){B}else{A}

শুধু থেকে কোড অদলবদল মনে রাখবেন ifথেকে elseএবং তারা ঠিক একই জিনিস করে (অথবা বৈষম্য পক্ষের সুইচ) হবে!

দ্রষ্টব্য: এটি কোনও 10 এর পাওয়ার এবং তাদের নেতিবাচক সাথে প্রয়োগ করা যেতে পারে:...-100, -10, 10, 100...

(উত্স লিঙ্ক)


আমি নিশ্চিত নই যে আমি এর বিষয়টি বুঝতে পেরেছি। এ থেকে কী হ্রাস পাবে?
গাফি 21

@ গাফি আপনি একটি চরিত্র সংরক্ষণ করেন এবং তারা ঠিক একই কাজ করে
ajax333221

বনাম কি বিকল্প? দুঃখিত, বাধা দেওয়ার চেষ্টা করছি না, আমি কেবল এটি পাই না। (newb, এখানে, আপাতদৃষ্টিতে ...)
গাফি

1
আহ আমি দেখি. 9 থেকে 10, 99 থেকে 100 ইত্যাদি পর্যন্ত কোনও পূর্ণসংখ্যার উত্তরণে কাজ করে দুঃখিত দুঃখিত যে আমাকে এত দিন লেগেছিল! (আমি কেবল পূর্ণসংখ্যা বলি, কারণ আমি এন = 9.5 এর সাথে একটি সমস্যা দেখতে পাচ্ছি ...)
গাফি

8
এছাড়াও কিছু ভাষায় (যদি সমর্থিত হয়) যদি আপনার সংখ্যাগুলি বড় / ছোট হয় তবে বৈজ্ঞানিক স্বরলিপিটি আপনাকে পরিবর্তে কিছু অক্ষর বাঁচাতে পারে: if(n>99999)বনামif(n<1e5)
স্ক্রাগার

16

> = এবং <= এর পরিবর্তে> এবং <ব্যবহার করুন

যখন হার্ড কোডেড পূর্ণসংখ্যা মান বিরুদ্ধে চেক, ব্যবহার >এবং <পরিবর্তে >=এবং <=যেখানে সম্ভব। উদাহরণস্বরূপ, ব্যবহার করা

if(x>24&&x<51)

ব্যবহারের চেয়ে 2 বাইট কম sh

if(x>=25&&x<=50)

3
সম্পর্কিত: আপনি যদি নিশ্চিত হন একটি ফলাফল আপনি ব্যবহার করতে পারে নেতিবাচক হতে পারে না, <1পরিবর্তে ==0শূন্য চেক যেমন (অথবা >0পরিবর্তে !=0মিরর চেক জন্য)।
কেভিন ক্রুইজসেন 21'16

1
xএকটি পূর্ণসংখ্যা হিসাবে আপনি একটি নোট যোগ করা উচিত নয় ?
জাচারা

15

অকাল লুপ বিরতি এড়ানো

যদি কোনও বুলিয়ান চেকের 1 বা ততোধিক ঘটনা পরীক্ষা করতে কোনও লুপের মধ্য দিয়ে চলতে থাকে তবে প্রথম আসল মানটিতে লুপটি প্রস্থান করার জন্য আরও কার্যকর প্রোগ্রাম তৈরি করা যেতে পারে। তবে, ব্রেকটি সরিয়ে সমস্ত পুনরাবৃত্তির মধ্য দিয়ে লুপিং সংক্ষিপ্ত কোডের জন্য অনুমতি দেয়।

int main() {
bool m = false;
int n = 1000;
for (int i = 0; i < n; i++) {
if (i >= 100) {
m = true;
break; // remove this line
}
} 
return 0;
}

5
এছাড়াও আপনি প্রক্রিয়া সহজ করতে ifদূরে বিবৃতি এই ক্ষেত্রে: m|=i>=100। (এবং আপনার কাছে প্রক্রিয়া সহজ করতে i>=100করতে i>99এই ক্ষেত্রে কিন্তু যে এখানে খুব প্রাসঙ্গিক নয়)
সামুদ্রিক

15

-পরিবর্তে ব্যবহার করুন!=

সংখ্যার তুলনা জন্য:

বি সমান হলে, a-bফলাফল 0, যা falsy হয়। 0সত্য ছাড়াও অন্য কিছু ; সুতরাং
যদি বুলিয়ান প্রসঙ্গে ব্যবহৃত হয় তবে a-b<=>a!=b

আপনি যদি এটি টের্নারি if/elseঅপারেটরের সাথে বা এর সাথে ব্যবহার করেন তবে এটি আপনাকে সমতার জন্য একটি
a==b?c:dবাইটও বাঁচাতে পারে: <=>a-b?d:c


12

দীর্ঘ অ্যারেগুলির জন্য পৃথক স্ট্রিং

বেশিরভাগ ভাষায় একটি স্ট্রিংকে কোনও ধরণের টোকেনের চারপাশে স্ট্রিংয়ের অ্যারেগুলিতে বিভক্ত করার উপায় রয়েছে। দৈর্ঘ্যটি কোনও ভাষা নির্ভর থ্রেশহোল্ডে পৌঁছালে এটি অনিবার্যভাবে অ্যারে আক্ষরিকের চেয়ে কম হবে, কারণ স্ট্রিং প্রতি অতিরিক্ত ওভারহেড দুটি স্ট্রিং ডিলিমিটরের পরিবর্তে (কমপক্ষে) এক-চর টোকেনের একটি অনুলিপি হবে।

গল্ফস্ক্রিপ্টে যেমন

["Foo""Bar""Baz""Quux"]  # 23 chars

হয়ে

"Foo
Bar
Baz
Quux"n/  # 20 chars

কিছু ভাষার ক্ষেত্রে, প্রান্তিকতা একটি স্ট্রিংয়ের মতো কম। যেমন জাভা,

new String[]{"Foo"}  // 19 chars

হয়ে

"Foo".split("~")  // 16 chars

6
উল্লেখযোগ্য ব্যতিক্রম রুবি, যা আক্ষরিক একটি অ্যারের অফ স্ট্রিং যা স্বয়ংক্রিয়ভাবে দুই বাইট খরচে শূণ্যস্থান উপর splits প্রদান করে: %w{Foo Bar Baz Quux}
মার্টিন এেন্ডার

1
পার্ল অনুরূপ কিছু সরবরাহ করে: qw(Foo Bar Baz Quux)স্ট্রিংগুলির তালিকাতে পরিণত হয়।
বেনগোল্ডবার্গ

12

অন্য লোকেরা কী করেছে তা বুঝুন

মজা করার পাশাপাশি, আপনি যদি অন্য ব্যক্তির কোড পরীক্ষা করেন তবে আপনি কখনও কখনও একটি ভাল অ্যালগরিদম আবিষ্কার করতে পারেন যা সম্পর্কে আপনি ভাবেননি বা এমন কৌশল (কখনও কখনও একটি স্পষ্টতই) যা আপনি উপেক্ষা করেন।

কখনও কখনও একটি বিদ্যমান উত্তর থাকে যা আপনি অন্য ভাষায় অনুবাদ করতে পারেন এবং অন্য ভাষার গুডিজ থেকে উপকার পেতে পারেন।


10

আপনার অপারেটর অগ্রাধিকার জানুন

যখনই আপনি বেশ কয়েকটি এক্সপ্রেশন একত্রিত করেন, আপনার বন্ধুত্বগুলি সংরক্ষণ করার জন্য আপনি স্টাফটিকে পুনরায় অর্ডার করতে পারবেন কিনা তা দেখতে আপনার ভাষার জন্য অপারেটর অগ্রাধিকার সারণীটি পরীক্ষা করুন।

উদাহরণ:

  • আমি জানি যে সমস্ত ভাষায়, বিটওয়াইজ অপারেটরগুলির বুলিয়ান অপারেটরগুলির চেয়ে বেশি অগ্রাধিকার রয়েছে: (a&b)&&cকোনও বন্ধনী প্রয়োজন নেই: a&b&&cঠিক তেমনটিও (a*b)+cনয়।
  • a+(b<<c)হিসাবে আবার লিখতে পারেন a+b*2**c
    এটি এই উদাহরণের জন্য কিছুই সংরক্ষণ করতে পারে না, তবে এটি যদি cএকটি ছোট পূর্ণসংখ্যার আক্ষরিক হয় (<14)।
  • Bitwise অপারেশন সবচেয়ে গাণিতিক অপারেশন তুলনায় একটি নিম্ন প্রাধান্য আছে, তাই যদি আপনার ভাষায় পরোক্ষভাবে বুলিয়ান কাস্ট int জন্য, আপনাকে একটি বাইট সংরক্ষণ করতে পারবেন a<b&&c<dসঙ্গে a<b&c<d(যতক্ষণ না আপনি শর্ট সার্কিট মূল্যায়ন প্রয়োজন)

7

লুপগুলির জন্য ছোট

আপনি যদি Xবিবৃতি {ভিতরে }আপনার জন্য-লুপ, আপনি স্থানান্তর করতে পারেন X-1বিবৃতি (ভিতরে )দ্বিতীয় সেমিকোলন পর জন্য-লুপ for(blah;blah;HERE)3 বাইট সংরক্ষণ করুন। (কমা ব্যবহার করে বিবৃতি পৃথক করুন ,)

পরিবর্তে

for(int i=0;i<9;){s+=s.length();println(i++);}

আপনি অন্যটি ছাড়ার সময় একটি বিবৃতিটি লুপের (ধনুর্বন্ধনীতে স্থানান্তর করতে পারেন)

for(int i=0;i<9;println(i++))s+=s.length();

এবং 3 বাইট সংরক্ষণ করুন (আরও 1 টি বাইট @ETHProductions ধন্যবাদ ধন্যবাদ)


সহজভাবে করা,

পরিবর্তে

for(blah;blah;){blah 1;blah 2;...;blah X}

বিবৃতিগুলি প্রায় সরান যাতে আপনি এটি দিয়ে শেষ হন

for(blah;blah;blah 2,...,blah X)blah 1;

এবং 3 বাইট সংরক্ষণ করুন



এবং যদি for;
এটির

7

এবং এর ~জন্য অবিচ্ছিন্ন ব্যবহার করুনa-b-1a+b+1

ছাড়াও @Lynn এর সংক্রান্ত পরামর্শ x+1-~x; এবং x-1~-x , আপনি গল্ফ a-b-1এবং a+b+1

a-b-1    // 5 bytes
a+~b     // 4 bytes

a+b+1    // 5 bytes
a-~b     // 4 bytes

এটি এমন এক টিপের মতো দেখতে পাওয়া যায় যা আপনি প্রায়শই ব্যবহার করবেন না, কিন্ডার ~xপরিবর্তে ব্যবহারের মতো -x-1প্রায়শই ঘটে না, তবে এটি এখানে দরকারী টিপ হিসাবে দেখার জন্য আমি যথেষ্ট সময় ব্যবহার করেছি। বিশেষত অ্যারে-ইনডেক্সিংয়ের সাথে আপনি কিছু ক্ষেত্রে এগুলি উপরে ব্যবহার করতে পারেন।


6

সংক্ষিপ্ত বা / এবং রেখাঙ্কন

অ্যান্ডস দ্বারা শৃঙ্খলাবদ্ধ শর্তগুলির দীর্ঘতর ধারাটিকে চেপে ধরার চেষ্টা করার সময় আমি সহজ কৌশলটি নিয়ে এসেছি (বা এই ক্ষেত্রে কেবল 'সমস্ত' কে 'কোনও' দিয়ে প্রতিস্থাপন করুন)।

উদাহরণ:

if a>0 and a<10 and a+b==4 and a+3<1:

হয়ে

if all([a>0,a<10,a+b==4,a+3<1]):

এটি একটি দুর্দান্ত, আমি এটি চেষ্টা করতে হবে!
স্টকাস্টিক

4
কোন ভাষায় all(array-of-Booleans)অন্তর্নির্মিত আছে?
পিটার টেলর

3
রুবি আছে। [a>0,a<10,a+b==4,a+3<1].all?
কর্নিগ

4
যদিও এটি পাইথন থাকলে আপনি এমন কিছু ব্যবহার করতেনif 10>a>0 and a+b==4>1>a+3:
Sp3000

@ পিটারটেলর হাস্কেল খুব
গর্বিত

6

প্রয়োজনীয় পারফরম্যান্স সরবরাহ করতে সংকলকটির উপর নির্ভর করুন।

কম্পাইলার এবং কোনটি অপ্টিমাইজেশন স্তরে কোন অপ্টিমাইজেশনের গ্যারান্টিযুক্ত তা নিশ্চিত হয়ে সেগুলি উদারভাবে ব্যবহার করুন sure এমনকি যদি পারফরম্যান্স কোনও উদ্বেগের প্রয়োজনীয়তা না হয় তবে আপনি এখনও অপ্টিমাইজেশন দিয়ে পরীক্ষা করতে পারেন এবং তারপরে কেবলমাত্র একটি চরিত্র ছাড় করবেন কারণ আপনার কোডটি এখনও সংকলক পতাকা ছাড়া প্রযুক্তিগতভাবে বৈধ is

2 ute n গণনা করতে নিম্নলিখিত হাস্কেল ফাংশনটি বিবেচনা করুন (হাস্কেলের ইতিমধ্যে বিল্ট-ইন এক্সপেনসিয়েশন অপারেটর বা তিনটি) (২৩ টি অক্ষর) এই বিষয়টি উপেক্ষা করুন:

p 0=1;p x=p(x-1)+p(x-1)

সমস্যাটি হ'ল - এটি ভয়াবহভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলে। এটি আপনার কোডটিকে অকেটেযোগ্য করে তুলতে পারে বা প্রশ্নের দ্বারা প্রদত্ত কোনও কার্য সম্পাদনের বাধা ব্যর্থ করতে পারে। পুনরাবৃত্তি ফাংশন কলগুলি (25 টি অক্ষর) এড়াতে আপনাকে অস্থায়ী পরিবর্তনশীল বা তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন আক্ষরিক ব্যবহার করতে প্ররোচিত হতে পারে:

p 0=1;p x=(\y->y+y)$p$x-1

তবে সংকলকটি ইতিমধ্যে আপনার জন্য এটি করতে পারে, আপনার কেবল -Oসংকলক পতাকা হিসাবে সেট করা দরকার ! ম্যানুয়ালি সাধারণ সুব্যাকশনগুলি দূর করতে সাইটের জন্য অতিরিক্ত কয়েকটি অতিরিক্ত অক্ষর ব্যয় করার পরিবর্তে, পুরো প্রোগ্রামটি জুড়ে এক বা দুটি চরিত্রের গ্র্যান্ড মোট জন্য আপনার জন্য বেসিক অপটিমেশন করার জন্য কেবল কম্পাইলারকে বলুন।


@ এথ প্রডাকশন হ্যাঁ, দুঃখিত, আমি করেছি
জন ডিভোরাক

প্রথম উদাহরণটি কি কেবল হওয়া উচিত নয় p(x-1)*2?
সাইয়েস

5

কিছুটা সুস্পষ্ট হতে পারে তবে ...

অপারেটরের রিটার্ন মানগুলি ব্যবহার করুন

মনে রাখবেন যে অ্যাসাইনমেন্ট অপারেটর একটি মান ফেরত দেয়!

উদাহরণস্বরূপ, আপনি যদি y তে x যুক্ত করতে চান এবং তার পরে এক্স কোনও কিছুর চেয়ে বড় কিনা তা পরীক্ষা করতে পারেন

if(25<x+=y)

পরিবর্তে

x+=y;if(x>25)

অথবা আপনি স্ট্রিংটি ছাঁটাই করার পরে এটির দৈর্ঘ্য সন্ধান করতে চান:

strlen(s=trim(s))

বরং

s=trim(s);strlen(s)

আপনি কোন ভাষায় একটি কলের ভিতরে অ্যাসাইনমেন্ট করতে পারেন ? বা এটি একটি কীওয়ার্ড আরগ?
বিড়াল

2
আমি মনে করি অ্যাসাইনমেন্টগুলি কমপক্ষে সি, সি ++, সি #, এবং জাভাতে এক্সপ্রেশন (তাদের এক্সপ্রেশন মান হিসাবে নির্ধারিত ভেরিয়েবলের নতুন মান সহ) are a = (b=c)+1;সেট bকরে c, এবং তারপরে সেট aকরে b+1
লিন

@ লিন চেষ্টা করুন a=1+b=c। এবং আপনি আপনার তালিকায় পিএইচপি এবং জাভাস্ক্রিপ্ট যুক্ত করতে পারেন।
তিতাস

2
রুবি এটি সেরা করে। এটি =অপারেটরটিকে ডানদিকের চেয়ে বাম দিকে উচ্চতর অগ্রাধিকার দেয় তাই 1+x=2বৈধ এবং মূল্যায়ন3
সাইওস

@ কোয়েস আফাইক এটি সমস্ত ভাষায় যেখানে একটি অ্যাসাইনমেন্ট একটি অভিব্যক্তি হয় way
তিতাস

5

ভাষার সংস্করণ / সংকলক / পরিবেশ quirks / নতুন বৈশিষ্ট্য ব্যবহার করুন

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


4

এবং / অথবা সম্ভব হলে চেকগুলি ব্যবহার করে একাধিক / নেস্টেড একত্রিত করুন।

অর্থাৎ,

if (a && (b || c)) {

}

পরিবর্তে:

if (a) {
    if (b) {
        //Do Stuff
    } elseif (c) {
        //Do same stuff
    }
}

5
এছাড়াও, &আরও অক্ষর অপসারণ করতে বিটি কন্ডিশনাল ( , `|) ব্যবহার করুন ।
এফইউজেডএক্সএক্সএল

2
যদিও কিছু ক্ষেত্রে 1 বর্ণের &পরিবর্তে বিটওয়াইজ ব্যবহার &&করা অপারেটরটির অগ্রাধিকারটিকে বিভ্রান্ত করে এবং এটিকে কার্যকর করার জন্য আপনাকে প্রথম বন্ধনী লিখতে হবে wise এটি বুদ্ধিমানের সাথে ব্যবহার করুন।
ডলারঅক্ষয়ে

4

আপনার ভেরিয়েবলকে আরম্ভ করার জন্য আরও ভাল উপায়গুলি সন্ধান করুন

আরও কিছু উত্তর ইতিমধ্যে এটি উল্লেখ করার কাছাকাছি এসেছিল, তবে অনেকগুলি (কঠোরভাবে টাইপ করা হয়েছে?) ভাষায়, xখালি স্ট্রিংয়ের মতো এটি আরম্ভ করা সংক্ষিপ্ত :

x:=""

বা xখালি রুন (চর) হিসাবে:

x:=''

চেয়ে

var x string

এবং

var x rune

পূর্বনির্ধারিত মানগুলি ব্যবহার করা স্পষ্টতই পছন্দসই, তবে এত সহজ নয়।

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