সি # তে কোড-গল্ফ করার টিপস


62

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

- মার্কোগের ধারণা থেকে ধার করা;)


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

কোনও ক্যালেন্ডারের ছবির জন্য আমাকে ক্ষমা করুন, এটিই আমি সংক্ষিপ্ত বিজ্ঞপ্তিতে খুঁজে পেতে পারি।
আন্ডারগ্রাউন্ডোমোনাইল

উত্তর:


59

এর পরিবর্তে ব্যবহার করার .ToString()ব্যবহার +""numerics এবং অন্যান্য ধরনের যে নেটিভ নিরাপদে একটি স্ট্রিং কাস্ট করা যেতে পারে।

.ToString() <-- 11 chars
+""         <--  3 chars

5
এটি জেএসেও কাজ করে।
সাইয়েস

1
ধনুর্বন্ধনী অন্তর্ভুক্ত করার জন্য যদি পরে স্ট্রিংটি ব্যবহার করতে হয় তবে এটি সাধারণত 5 টি অক্ষর হয় ...(1+"").DoSomethingWith1String();
TheLethalCoder

1
আপনার যদি স্ট্রিংয়ের প্রয়োজন হয় তবে আপনি সাধারণত এটি সঞ্চয় করে রাখেন। অন্য যে কোনও ব্যবহার সম্পর্কে স্থানীয়ভাবে টস্ট্রিং () ... অনুমান করা যায় ...
jcolebrand

1
দ্রষ্টব্য যে এটি প্রকৃতপক্ষে String.Concat(object)ভার্চুয়াল কলিংয়ের পরিবর্তে যুক্তি দিয়ে স্থিতিকে কল করে object.ToString()Concatস্পষ্টতই nullখালি স্ট্রিংয়ে রূপান্তরিত হয় ( রেফারেন্স উত্স দেখুন )। এখানে কোনও 'দেশীয় ingালাই' চলছে না, আপনি এরকম কিছু রূপান্তর করতে পারেন, এটি কেবলমাত্র কিছু ক্ষেত্রে ফলাফল খুব কার্যকর নাও হতে পারে! (তবে নালার আচরণ ভাল হতে পারে)।
ভিজ্যুয়েলমেলন


41

আমি একবার আমার প্রোগ্রামটি ইচ্ছাকৃতভাবে রেখেছি namespace Systemযাতে আমি একটি নির্দিষ্ট শ্রেণীর অ্যাক্সেসকে সংক্ষিপ্ত করতে পারি। তুলনা করা

using System;using M=System.Math;

প্রতি

namespace System{using M=Math;

9
কেবল মনে রাখবেন যে ক্লাস / ফাংশনগুলি সম্পূর্ণরূপে যোগ্যতা অর্জন করা ভাল যখন কোনও একক ব্যবহার সমস্যার সমাধান করে। এটি কেবল তখনই কার্যকর যখন আপনাকে একাধিকবার কিছু কল করতে হবে, এবং তারপরেও কেবলমাত্র Systemনামের জায়গার আইটেমগুলির জন্য ।
নিক লারসেন

আপনি ঠিক করতে পারেন using System;class P...
ld

@ লোগান: এটি কেবল using System;একই নামের জায়গাতে ক্লাসের জন্য একটি উপাধি সম্পর্কে নয়, যা আমি এখানে দেখিয়েছি তার চেয়ে ছোট।
জোয়

এটি using static System.Math;সি # 6 এ করা আরও ছোট (যুক্ত করুন you আপনি যে কোনও ফাংশন ব্যবহার করতে পারেন যেমন তারা সত্যিকার অর্থে বিশ্বব্যাপী - কোনও শ্রেণিতে নয়)। using staticআপনার যদি একাধিক ক্লাস অ্যাক্সেস করতে হয় তবে মূল পরামর্শটি এখনও কম হতে পারে may
দুধ

@ মিল্ক: অতিরিক্ত staticকীওয়ার্ডটি প্রায়শই M.পদ্ধতি কলগুলি ছেড়ে যাওয়া থেকে কোনও সঞ্চয় থেকে দীর্ঘতর হয় তবে হ্যাঁ, এটি একটি বিকল্প, তবে এটি প্রচুর পরিমাণে ব্যয় হয় যার জন্য প্রচুর কল প্রয়োজন হয়।
জোয়ি

30

varধরণের অক্ষরগুলি সংরক্ষণ করতে (একক) ভেরিয়েবলগুলি ঘোষণা এবং শুরু করার জন্য ব্যবহার করুন :

string x="abc";

হয়ে

var x="abc";

intঅবশ্যই, অবশ্যই এর জন্য বিশদভাবে প্রয়োজনীয় নয় ।


2
মনে রাখবেন যে varএকাধিক ঘোষক থাকতে পারে না, উদাহরণস্বরূপ var x="x",y="y";এটি সম্ভব নয়।
ইয়ান এইচ।

29

লিনকিউ ব্যবহার করা থাকলে আপনি ল্যাম্বদা Selectতৈরির পরিবর্তে সরাসরি কোনও পদ্ধতি পাস করতে পারেন ।

সুতরাং, পরিবর্তে

foo.Select(x=>int.Parse(x))

তুমি ব্যবহার করতে পার

foo.Select(int.Parse)

সরাসরি।

( টিমভির সি # উত্তরগুলির একটিতে উন্নতি করার সময় সম্প্রতি আবিষ্কার করা ।)


2
এফডব্লিউআইটিডব্লিউ এটাকে বলা হয় η-হ্রাস
থ্রিএফএক্স


5
আমাদের আরও বাস্তবের কাছে , এটি কেবল সংক্ষিপ্ত : -þ
জোয়

23

মনে রাখবেন যে সি # এর মধ্যে ক্ষুদ্রতম সংকলনযোগ্য প্রোগ্রামটি 29 টি অক্ষর:

class P
{
    static void Main()
    {   
    }
}

সুতরাং এটি আপনার দৈর্ঘ্য থেকে সরিয়ে শুরু করুন এবং এটি কতটা বেশি লাগে সে সম্পর্কে আপনার উত্তরটি বিচার করুন। ইনপুট মুদ্রণ বা পড়ার ক্ষেত্রে সি # অন্যান্য ভাষার সাথে প্রতিযোগিতা করতে পারে না, যা বেশিরভাগ [code-golf]সমস্যার কেন্দ্রস্থল , তাই এটি নিয়ে চিন্তা করবেন না। সি # গল্ফার হিসাবে, আপনি সত্যিই ভাষার বিরুদ্ধে প্রতিযোগিতা করছেন।

মনে রাখা অন্যান্য কয়েকটি বিষয়:

  • ifবন্ধনীগুলি সরানোর জন্য সম্ভব হলে সমস্ত লুপ এবং স্টেটমেন্টগুলিকে একটি লাইনে কমিয়ে দিন ।
  • যদি স্টিডিন এবং কমান্ড লাইনের মধ্যে বিকল্প দেওয়া হয় তবে সর্বদা কমান্ড লাইনটি ব্যবহার করুন!

এটি সাধারণত ত্রৈমাসিকীও জড়িত;)
jcolebrand


1
আসলে, এটা সত্য নয়। এটি static int Main()পাশাপাশি ব্যবহার করে সংকলন করে , যা ২৮ টি অক্ষর হবে।
মেটোনিয়াম


21

পরিবর্তে

bool a = true;
bool b = false;

করা

var a=0<1;
var b=1<0;

আপনার যদি একাধিক ভেরিয়েবলের প্রয়োজন হয় তবে এটি ব্যবহার করুন ( @ ভিজুয়ালমেলন প্রস্তাবিত )

bool a=0<1,b=!a;

মনে রাখবেন যদি আপনি একই ধরনের একাধিক ভেরিয়েবল প্রয়োজন এটি সাধারণত টাইপ ডিক্লেয়ার একটি কমা করতে সস্তা ঘোষণা আলাদাbool a=0<1,b=!a;
VisualMelon

18

টার্নারি অপারেটরের উপর if.. elseযথাযথ যেখানে ব্লকগুলি পছন্দ করুন।

উদাহরণ স্বরূপ:

if(i<1)
    j=1;
else
    j=0;

আরও দক্ষতার সাথে:

j=i<1?1:0;

15
আমি কি কেবলমাত্র একাই মনে করি যে সাধারণভাবে এই জাতীয় জিনিসগুলির জন্য দ্বিতীয় ক্ষেত্রে সহজাতভাবে আরও পাঠযোগ্য? আমি এটি নিয়মিত করি। var x = input ?? "";
তদতিরিক্ত

এমন সময়গুলি আসে যখন এটি বেশি পঠনযোগ্য বিকল্প হতে পারে না, বিশেষত যখন i < 1কোনও জটিল বিবৃতি হয় বা যখন নামটি jদীর্ঘ হয় is আইএমও, এটি খুব ভাল পার্শ্ব প্রতিক্রিয়া জানাতে ব্যর্থ। ক্ষেত্রে যেখানে পার্শ্ব প্রতিক্রিয়া সাফল্যের উপর নির্ভর করে সত্য / মিথ্যা প্রত্যাবর্তনের if (i < 1)মতো এমন কিছু আছে if (SendEmail(recipient)), আমি যদি / তার পরে স্বরলিপিটি পছন্দ করি।
নিক লারসেন

11
দ্বিতীয় ক্ষেত্রে বন্ধনীগুলির প্রয়োজন নেই - j=i<1?1:0;যথেষ্ট।
ডানকো দুর্বিć

3
প্রশ্নটি টি-র জন্য জিজ্ঞাসা করে যা কিছুটা সি-এর সাথে নির্দিষ্ট। এটি সমস্ত ভাষার টিপসের অন্তর্ভুক্ত ।
পিটার টেলর

4
@ পিটারটেলর আমি এই প্রশ্নের উত্তর 3 বছর আগে দিয়েছি, আপনি সংযুক্ত থ্রেডটি তৈরি করার আগে
নেলিয়াস

15

ব্যবহারের কার্যকর ব্যবহার

আপনি ব্যবহারের মাধ্যমে (যা একটি উপাধি ) প্রতিস্থাপন করতে পারেনfloatSystem.Singlezz=System.Single;

তারপর প্রতিস্থাপন z=System.Single;সঙ্গে z=Single;নামস্থান প্রোগ্রাম স্থাপন দ্বারা System। (জয়ের উত্তর হিসাবে)

এটি অন্যান্য মান ধরণের (স্ট্রাক্টস এবং ক্লাসগুলির জন্য তারা কীসের একটি নাম ব্যবহার করুন) প্রয়োগ করতে পারেন


14

আপনি যদি Console.ReadLine()আপনার কোডে একাধিকবার (কমপক্ষে 3 বার) ব্যবহার করতে চান তবে আপনি এটি করতে পারেন:

Func<string>r=Console.ReadLine;

এবং তারপরে কেবল ব্যবহার করুন

r()

পরিবর্তে


আমার মনে হয় আপনার ()প্রথম লাইন থেকে সরিয়ে নেওয়া দরকার ।
মেল্লামোকব

@ মেল্লামোকব ঠিক আছে, ধন্যবাদ! স্থির করেছি।
ক্রিশ্চিয়ান লুপাস্কু

1
তুমি কি পারবে না auto r=Console.ReadLine;?
ক্লাদিউ

2
@ ক্লাডিউ না, দুর্ভাগ্যজনকভাবে আদর্শ নয় //jFsVPX
ক্রিশ্চিয়ান লুপাস্কু

@ ক্লাদিউ, autoএকটি C++ক্রিয়াপদ। varজন্য C#। এটি করা যায় না তার কারণ Console.ReadLineহ'ল ওভারলোড হয়েছে তাই কোন ওভারলোডটি চাওয়া হয়েছে তা সংকলকটি জানানোর জন্য ফাংশনের স্বাক্ষর নির্দিষ্ট করা দরকার।
গ্রেটঅ্যান্ডপাওয়ারফুল ওজ

14

কমান্ড লাইন আর্গুমেন্টের প্রতিটি অক্ষরটি পড়ার পরিবর্তে, স্ট্রিংয়ের দৈর্ঘ্য পর্যন্ত লুপ না করে:

static void Main(string[]a){
    for(int i=0;i<a[0].Length;)Console.Write(a[0][i++]);
}

শেষটি খুঁজে পেতে আপনি চেষ্টা / ক্যাচ ব্লক ব্যবহার করে একটি অক্ষর সংরক্ষণ করতে পারেন:

static void Main(string[]a){
    try{for(int i=0;;)Console.Write(a[0][i++]);}catch{}
}

এটি অ্যারের মধ্যে যে কোনও অ্যারের ক্ষেত্রে প্রযোজ্য যেমন:

  • string[]
  • int[][]
  • IList<IList<T>>

7
এটা সত্যিই ভয়াবহ ... আমি এটা ভালবাসি!
অ্যালেক্স রিঙ্কিং

পবিত্র জঞ্জাল এটি প্রতিভা, আমি ঠিক একটি অ্যারে লুপ করার সময় একটি চরিত্র সংরক্ষণ করেছি
গ্যাসপা 79৯

এটা সত্যিই খারাপ!
গ্রেটঅ্যান্ডপাওয়ারফুলফজ

13

সি # 6 এ কোনও ফাংশন সংজ্ঞায়িত করতে ল্যাম্বডাস ব্যবহার করুন

সি # 6 এ, আপনি কোনও ফাংশন সংজ্ঞায়িত করতে ল্যাম্বডা ব্যবহার করতে পারেন:

int s(int a,int b)=>a+b;

এটি এই জাতীয় ফাংশন সংজ্ঞায়িত করার চেয়ে সংক্ষিপ্ত:

int s(int a,int b){return a+b;}

3
সি # 6 কোড-গল্ফের সম্পূর্ণ নতুন পরিসীমা দেয়
jcolebrand 11'15

সি # 7 এ, স্থানীয় ফাংশন তৈরি করতে এটি অন্য ফাংশনের অভ্যন্তরে করা যেতে পারে। আমি সন্দেহ করি যে এটি গল্ফ করার সময় সাহায্য করবে, তবে এটি এখনও সবেমাত্র একটি পরিষ্কার কৌশল trick
তেহপার্স 4'17

1
এটি আনুষ্ঠানিকভাবে একটি ল্যাম্বডা নয়। এটি একটি বহিরাগত সদস্য সদস্য
পুনরাবৃত্তি

13

LINQ

পরিবর্তে ব্যবহার করুন:

Enumerable.Range(0,y).Select(i=>f(i))

ফাংশনের ফলাফল নিয়ে একটি গণনীয় পেতে fযে জন্য int[0,y]আপনি ব্যবহার করতে পারেন

new int[y].Select((_,i)=>f(i))

আপনার যদি প্রয়োজন হয় stringবা Enumerableআপনার প্রোগ্রামে প্রয়োগকারী কিছু রয়েছে তবে আপনি সেগুলিও ব্যবহার করতে পারেন

var s="I need this anyway";
s.Select((_,i)=>f(i))

আমি শামির গোপনীয় ভাগ করে নেওয়ার চ্যালেঞ্জের জন্য আমার উত্তরে এই কৌশলটি ব্যবহার করি ।
এলোইসডি

আমি মনে করি না যে আপনি যদি অপ্টিমাইজেশনের মাধ্যমে অসুস্থতার পুনরাবৃত্তি না করেন তবে স্ট্রিং অংশটি কার্যকর হবে। আমি না করা পর্যন্ত কেবল আমার জন্য ব্যর্থ .ToArray ();। তা ছাড়া আর আশ্চর্য টিপ!
গ্যাসপা79

হ্যাঁ গণনা অলস তবে এটি কেবল তিনটি উদাহরণের ক্ষেত্রেই স্ট্রিংয়ের সাথে এক নয়।
রাগী

11

যদি আপনার কোডটিতে Dictionary<TKey, TValue>কমপক্ষে দুবার জেনেরিক ব্যবহার করার প্রয়োজন হয় তবে আপনি অভিধানের ক্লাস ঘোষণা করতে পারেন, উদাহরণস্বরূপ:

class D:Dictionary<int,string>{}

এবং তারপরে কেবল ব্যবহার করুন

D d=new D{{1,"something"},{2,"something else"}};

পরিবর্তে Dictionary<int,string>প্রতিটি তাত্পর্য জন্য পুনরাবৃত্তি ।

আমি এই উত্তরে এই কৌশলটি ব্যবহার করেছি


2
এবং "ভার ডি" এর পরিবর্তে "ডি ডি"
জুলুকি

@ Zukki অবশ্যই! আমি কি ভাবছিলাম? :)
ক্রিশ্চিয়ান লুপাস্কু

বিকল্প:using D = System.Collections.Generic.Dictionary<int,string>;
অ্যান্ড্রি টলস্টয়

10

আপনি কয়েকটি বাইট সংরক্ষণ করতে floatএবং doubleআক্ষরিক ব্যবহার করতে পারেন ।

var x=2.0;
var y=2d;         // saves 1 byte

যখন আপনাকে কিছু intগাণিতিক প্রয়োজন যখন ফেরত দিতে floatবা doubleআপনি রূপান্তরকে বাধ্য করার জন্য আক্ষরিক ব্যবহার করতে পারেন।

((float)a+b)/2;  // this is no good
(a+b)/2.0;       // better
(a+b)/2f;        // best      

আপনি যদি কখনও এমন পরিস্থিতিতে পৌঁছে যান যেখানে আপনাকে castালাই করতে হবে আপনি তার পরিবর্তে গুণক ব্যবহার করে কয়েকটি বাইট সংরক্ষণ করতে পারবেন।

((double)x-y)/(x*y);
(x*1d-y)/(x*y);      // saves 5 bytes

এমনকি সংক্ষিপ্ত:(x-y)*1d/x/y;
পুনরাবৃত্তি

9

নীচের মতো ব্যক্তিগত বা পাবলিক সহজাত যেখানে মনে রাখবেন:

class Default{static void Main()

তুলনামুলকভাবে

public class Default { public static void Main()

5
এবং সর্বদা ক্লাসকে কেবল একটি অক্ষর তৈরি করুন :-)
জোয়

2
ওহ, এবং অন্য একটি সুন্দর জিনিস, এখানে নিহিত: Mainউদাহরণস্বরূপ জাভার বিপরীতে কোনও যুক্তির প্রয়োজন নেই।
জোয়ে

@ জোয়ী: এবং এটির জনসাধারণ হওয়ারও দরকার নেই।
আর মার্টিনহো ফার্নান্দেস

1
@ মার্টিনহো you আপনি আমার উত্তরটি পড়েছেন? ;)
মূলতে

@ জোয়াই ~ আমি এটি প্রতি পোস্টে একটিতে রাখার চেষ্টা করছিলাম;) ... অন্য কোনও ব্যক্তি কেবল চিঠি থাকার কারণে মূল বা শ্রেণি সম্পর্কে পোস্ট পোস্ট করবে ured অন্য কারও কীভাবে নেই তা দেখে, আমি এগিয়ে যাব এবং সেটিকেও যুক্ত করব।
jcolebrand

9

এক-লাইন ল্যাম্বদা এক্সপ্রেশনগুলির জন্য, আপনি বন্ধনী এবং সেমিকোলনটি এড়িয়ে যেতে পারেন। এক-প্যারামিটার এক্সপ্রেশনগুলির জন্য, আপনি প্রথম বন্ধনী ছেড়ে যেতে পারেন।

পরিবর্তে

SomeCall((x)=>{DoSomething();});

ব্যবহার

SomeCall(x=>DoSomething);

11
আমি কখনও ওয়ান-প্যারামিটার ল্যাম্বডাসের জন্য প্রথম বন্ধনী লিখি না, এমনকি উত্পাদন কোডেও।
আর মার্টিনহো ফার্নান্দেস

আমি সবসময় বন্ধনী ব্যবহার করি কারণ আমি পড়ার যোগ্যতার জন্য ল্যাম্বডাকে একাধিক লাইনে বিভক্ত করতে পছন্দ করি।
জুলিয়ানা পেনা


9

looping:

পরিবর্তনীয় ঘোষণা:

int max;
for(int i=1;i<max;i++){
}

পরিণত:

int max,i=1;
for(;i<max;i++){
}

এবং যদি আপনার কেবলমাত্র একবার আই ভেরিয়েবলের সাথে কাজ করার প্রয়োজন হয় বা কাজ করে থাকেন তবে আপনি -1 (বা 0 লুপের পরিস্থিতি অনুসারে) এবং ইনক্রিমেন্ট ইনলাইন শুরু করতে পারেন:

int max,i=1;
for(;i<max;i++){
  Console.WriteLine(i);
}

প্রতি

int max,i=1;
for(;i<max;){
  Console.WriteLine(++i);
}

এবং এটি একটি অক্ষর দ্বারা হ্রাস, এবং সামান্য কোড অবিচ্ছিন্নভাবে। কেবল প্রথম iসূত্রের রেফারেন্সে এটি করুন : যেমন একটি চরিত্রের অনুকূলিতকরণ খুব বেশি নয় তবে তারা সহায়তা করতে পারে)

int max,i=1;
for(;i<max;i++){
  Console.WriteLine(i + " " + i);
}

প্রতি

int max,i=1;
for(;i<max;){
  Console.WriteLine(++i + " " + i);
}

যখন লুপটি বৃদ্ধি করতে হবে না i(বিপরীত ক্রমের লুপ):

for(int i=MAX;--i>0;){
      Console.WriteLine(i);
}

আমি সাধারণত ++এ জাতীয় ক্ষেত্রে সরাসরি লুপ শিরোনামে for(;++i<max;)রাখি : যা অনুসরণ করা সহজ এবং ভুল হওয়া শক্ত both
জোয়

@ জোয় সে ক্ষেত্রে আমি যখন (++ i <সর্বাধিক) স্যুইচ করতে চাই যা একই দৈর্ঘ্য তবে পড়া সহজ।
আইসিসি

আইসিআর: আপনি forশিরোনামে অন্য একটি (পূর্বের) বিবৃতিও রাখতে পারবেন কিনা তার উপর নির্ভর করে যা আবার কোনও অক্ষরকে সংরক্ষণ করতে পারে।
জোয়

আপনি উভয় ঘোষণাগুলি এ 1 বাইট সাশ্রয়ের জন্য ধারাটিতে ফিরিয়ে আনতে পারেন।
পুনরাবৃত্তি

আমি পরিবর্তন for(;i<max;)করতে while(i<max)। বাইটের একই সংখ্যা, তবে আমার কাছে এটি কেবল পরিষ্কার দেখায়।
আইয়ব

8

এমন পরিস্থিতিতে রয়েছে যখন কোনও আউটপুট প্যারামিটার অক্ষরগুলি সংরক্ষণ করতে পারে। এখানে কিছুটা স্বীকৃত উদাহরণ, একটি 10 ​​পিন বোলিং স্কোর অ্যালগরিদম।

একটি রিটার্ন বিবৃতি সহ:

........10........20........30........40........50........60........70........80........90.......100.......110.......120.......130.......140.......150..
public double c(int[]b){int n,v,i=0,X=10;double t=0;while(i<19){n=b[i]+b[i+1];v=b[i+2];t+=(n<X)?n:X+v;if(b[i]>9)t+=b[i+(i>16|v!=X?3:4)];i+=2;}return t;}

এবং একটি আউটপুট প্যারামিটার সহ:

........10........20........30........40........50........60........70........80........90.......100.......110.......120.......130.......140.......
public void d(int[]b,out double t){int n,v,i=0,X=10;t=0;while(i<19){n=b[i]+b[i+1];v=b[i+2];t+=(n<X)?n:X+v;if(b[i]>9)t+=b[i+(i>16|v!=X?3:4)];i+=2;}}

এখানে আউটপুট প্যারামিটার মোট 5 টি অক্ষর সংরক্ষণ করে।


8

সি # তে, আমাদের সমান সংখ্যা if(n%2)কিনা nতা যাচাই করার অনুমতি দেওয়া হয় না । আমরা যদি করি তবে আমরা একটি পাই cannot implicity convert int to bool। একটি নিষ্পাপ হ্যান্ডলিং করতে হবে:

if(n%2==0)

একটি ভাল উপায় ব্যবহার করা হয়:

if(n%2<1)

আমি এখানে একটি বাইট অর্জন করতে এটি ব্যবহার করেছি ।

নোট করুন যে এটি কেবল ধনাত্মক সংখ্যার জন্যই কাজ করে, যেমন -1%2==-1এটি এই পদ্ধতির সাথেও বিবেচিত হয়।


6

স্ট্রিং ইন্টারপোলেশন

সত্যই স্থান সাশ্রয় করার একটি উন্নতি হ'ল আন্তঃসম্পাদন। পরিবর্তে:

string.Format("The value is ({0})", (method >> 4) + 8)

শুধু $ইনলাইন এক্সপ্রেশন ব্যবহার করুন :

$"The value is ({(method >> 4) + 8})"

এটি, সি # 6.0 এর নতুন এক্সপ্রেশন সংস্থাগুলির সাথে একসাথে কোনও সাধারণ স্ট্রিং-গণনা চ্যালেঞ্জকে সি # তে বেশ গল্ফযোগ্য করে তুলবে।


3
যে i+$" bottles of beer";চেয়ে কম খাটো $"{i} bottles of beer"
aloisdg

1
@aloisdg সেই প্রথম ক্ষেত্রে আপনাকে ছেড়ে $দেওয়া উচিত , যদিও।
মেটোনিয়াম

পছন্দ করুন আমি এটি ছেড়ে দিয়েছি কারণ আমার আসল ক্ষেত্রে আমার {i}সামনে দুটি ছিল এবং মাঝখানে একটি ছিল;)
অ্যালয়েডডগ

@ আলয়েসডজি আহ, দেখছি। হ্যাঁ, লজ্জাজনক মন্তব্যগুলি সম্পাদনা করা যায় না :(
মেটোনিয়াম

6

সি # ল্যাম্বডা ব্যবহার করুন। যেহেতু পিপিসিআই ল্যাম্বডাকে ইনপুট / আউটপুট দেওয়ার অনুমতি দেয় আমাদের সেগুলি ব্যবহার করা উচিত।

একটি ক্লাসিক সি # পদ্ধতি এর মতো দেখাচ্ছে:

bool Has(string s, char c)
{
    return s.Contains(c);
}

ল্যাম্বদা হিসাবে, আমরা লিখব

Func<string, char, bool> Has = (s, c) => s.Contains(c);

বেনামে ল্যাম্বদাও অনুমোদিত:

(s, c) => s.Contains(c)

সমস্ত গোলমাল এবং ফোকাস সরান!

হালনাগাদ:

আমরা সঙ্গে এক ধাপ আরও উন্নত করতে পারেন সংবাহন @TheLethalCoder মন্তব্য হিসাবে:

s => c => s.Contains(c);

@ ফেলিক্স প্যালম্যান দ্বারা কার্নিংয়ের উদাহরণ: ডাব্লুপিএ কী গণনা করা যায়?

আপনার পক্ষে ঠিক 2 প্যারামিটার থাকলে এটি সহায়ক হবে, তখন একটি খালি অব্যবহৃত ভেরিয়েবল _আরও ভাল। এই সম্পর্কে মেটা পোস্ট দেখুন । আমি এই কৌশল এখানে ব্যবহার । আপনাকে কিছুটা ফাংশন পরিবর্তন করতে হবে। উদাহরণ: অনলাইনে চেষ্টা করে দেখুন!


1
s=>c=>...
টিপসে

পছন্দ করুন আমি উত্তর আপডেট করব ধন্যবাদ আপনাকে!
aloisdg

আপনি কি এই ক্ষেত্রে এটা-হ্রাস ব্যবহার করতে পারেন? ভালো কিছু: s=>s.Contains
করভাস_192

নোট করুন যে 'টিপড ল্যাম্বডা' জাতের সি # এবং জাভা উত্তরগুলি সুবিধার বাইরে চলেছে, আপনি এই মেটা পোস্টে আলোচনায় যোগ দিতে ইচ্ছুক হতে পারেন । প্রস্তাবিত বিকল্প নেই(string s,char c)=>s.Contains(c)
VisualMelon


5

ক্লাসের নামগুলি কেবল একটি অক্ষর তৈরি করুন। সি # তে কোড-গল্ফিংয়ের জন্য টিপস উন্নত করা from

class Default{static void Main()

প্রতি

class D{static void Main()

যা এই ক্ষেত্রে আরও 6 টি অক্ষর ছোঁড়ে।


1
ভেরিয়েবল নামের
ডিট্টো

11
এটি "সি # তে কমপক্ষে কিছুটা নির্দিষ্ট" কীভাবে?
পিটার টেলর

5

Computeদৃষ্টান্ত পদ্ধতি System.Data.DataTable, একটি সহজ স্ট্রিং অভিব্যক্তি, যেমন নির্ণয় করা অনুমতি দেয়:

সি # (ভিজ্যুয়াল সি # সংকলক) , 166 বাইট

namespace System.Data
{
    class P
    {
        static void Main()
        {
            Console.Write(new DataTable().Compute("30*2+50*5/4",""));
        }
    }
}

এটি অনলাইন চেষ্টা করুন!

প্রতি সেফ খুব "গল্ফাই" নয়, তবে কখনও কখনও এটি কার্যকর হতে পারে।


5

দুটি ভেরিয়েবল অদলবদল করা হচ্ছে

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

var c=a;a=b;b=c;

এটি 16 বাইট! অদলবদলের আরও কিছু পদ্ধতি রয়েছে যা আরও ভাল।

//Using tuples
(a,b)=(b,a);
//Bitwise xoring 
a=a^b^(b=a);
//Addition and subtraction
a=a+b-(b=a);
//Multiplication and division
a=a*b/(b=a);

সর্বশেষ তিনটি কেবলমাত্র সংখ্যাসূচক মানগুলির জন্য কাজ করে এবং কেবলমাত্র ASCII- এ নির্দেশিত হিসাবে, শেষ দুটি সম্ভবত একটি গাণিতিক ওভারফ্লো ব্যতিক্রম হতে পারে। উপরের সমস্তগুলি 12 বাইট, প্রথম উদাহরণের তুলনায় 4 বাইট সঞ্চয়।


শুধুমাত্র সংখ্যার জন্যই প্রযোজ্য, এবং তারপরেও টিপলস এবং জোর ঝুঁকি ব্যতীত অন্য কোনও কিছুই আপনি এটি পূর্ণসংখ্যার সাথে প্রয়োগ করছেন। কখনও কখনও, অন্যান্য সংখ্যা প্রকারগুলিও সীমাতে চলে যাবে
এএসসিআইআই-কেবল

4

লিনকপ্যাড ব্যবহার করা আপনাকে সমস্ত প্রোগ্রামের ওভারহেড অপসারণের সম্ভাবনা দেয় কারণ আপনি সরাসরি বিবৃতি কার্যকর করতে পারেন। (এবং কোডগল্ফে এটি পুরোপুরি আইনী হওয়া উচিত ... কেউ আপনাকে বলেন যে আপনার .exe দরকার নেই)

আউটপুট .Dump()এক্সটেনশন পদ্ধতি ব্যবহার করে সম্পন্ন হয় ।


.NetFiddle সমর্থন .Dump();)
aloisdg

4

( আপনার অপারেটরের অগ্রাধিকার জানার একটি বিশেষ ঘটনা !)

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

পরিবর্তে

char b='5'; // b is some ASCII input
int a=(b-48)*c; // we want to find the numerical value of b, and multiply it by something ('0'==48)

বিবেচনা

char b='5'; // b is some ASCII input
int a=b%48*c; // only good for ASCII within 48 of '0' (positive only)!

উদাহরণ:

'5'%'0'*2 -> 10
'5'%'0'*-1 -> -5
'5'%'0'/2 -> 2

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


4

আপনার যদি একাধিক usingগুলি অন্তর্ভুক্ত করতে হয় যা সমস্ত একই শ্রেণিবদ্ধের বাইরে চলে যায় তবে দীর্ঘস্থায়ী হিসাবে এটি ব্যবহার করা প্রায়শই খাটো হয় namespace:

using System;
using System.Linq;
//Some code

বনাম:

namespace System.Linq
{
    //Some code
}

3

কিছু গল্ফ কোড উন্নত করার সময় আজ রাতে "খাদে" আবিষ্কার হয়েছে ... আপনার প্রসেসিংয়ের জন্য যদি আপনার কোনও ক্লাস থাকে তবে কোনও পদ্ধতি ঘোষণা করে সংরক্ষণের জন্য আপনি কনস্ট্রাক্টরে কাজটি করতে পারেন।

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

যেমন পদ্ধতি সহ ক্লাস:

class a
{
    public void b()
    {
        new c().d("input");
    }
}
class c
{
    public void d(string e)
    {
        System.Console.Write(e.Replace("in", "out"));
    }
}

কনস্ট্রাক্টরের কাজ সহ ক্লাস:

class a
{
    public void b()
    {
        new c("input");
    }
}
class c
{
    public c(string e)
    {
        System.Console.Write(e.Replace("in", "out"));
    }
}

এই উদাহরণ 9 টি অক্ষর সংরক্ষণ করে।


3

ব্যবহার করুন Actionমত Funcএকটি পরিবর্তনশীল করার জন্য একটি ফাংশন সেট করতে। Actionকিছুই দেয় না ( void) সুতরাং এটি মুদ্রণের জন্য দুর্দান্ত।

উদাহরণ স্বরূপ:

Action<string>w=Console.WriteLine;
w("Hello World");

এই টিপসটি @ W0lf এর Funcসাথে ব্যবহারের দুর্দান্ত উদাহরণReadLine দ্বারা অনুপ্রাণিত ।


3

একসাথে খালি / মিলে যাওয়া স্ট্রিংগুলি ঘোষণা করুন

আপনার যদি একাধিক খালি / মিলে যাওয়া স্ট্রিং ঘোষণার দরকার হয় তবে আপনি নিম্নলিখিতটি সহ কয়েকটি বাইট সংরক্ষণ করতে পারেন:

string a="";string b="";string c=""; // 36 bytes
var a="";var b="";var c="";          // 27 bytes
string a="",b="",c="";               // 22 bytes
string a="",b=a,c=a;                 // 20 bytes

দুর্ভাগ্যক্রমে var a="",b=a,c=a;অবৈধ, হিসাবেimplicitly type variable cannot have multiple declarators


আপনি কি var a=b=c=""জাভাস্ক্রিপ্টে পছন্দ করতে পারেন?
করভাস_192

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