सी # में कोड-गोल्फिंग के लिए टिप्स


62

C # में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं? मैं उन विचारों की तलाश कर रहा हूं, जो सामान्य रूप से सी # के लिए कुछ हद तक विशिष्ट कोड गोल्फ समस्याओं पर लागू हो सकते हैं (उदाहरण के लिए "टिप्पणियां हटाएं" एक उत्तर नहीं है)। कृपया प्रति उत्तर एक टिप पोस्ट करें।

- मार्कोग के विचार से उधार लिया गया;)


BEST TIP => यदि आप चुनौती के लिए सबसे लंबे समय तक जवाब प्रस्तुत नहीं करना चाहते हैं, तो .NET के पास कुछ का उपयोग करें। .NET को बहुत वर्बोज़ बनाया गया है और IDE टाइपिंग करने के लिए। जो वास्तव में उतना बुरा नहीं है जितना सामान्य प्रोग्रामिंग के लिए लगता है जब तक आपके पास वह आईडीई बैसाखी है लेकिन कोड गोल्फ के लिए वह रणनीति निश्चित रूप से विफल है।
क्रोव जूल

एक कैलेंडर की तस्वीर के लिए मुझे माफ कर दो, यह सब मुझे शॉर्ट नोटिस पर मिल सकता था।
अंडरग्राउंडोरल

जवाबों:


59

संख्यात्मक और अन्य प्रकार के लिए उपयोग .ToString()करने के बजाय जो +""मूल रूप से एक स्ट्रिंग को सुरक्षित रूप से डाली जा सकती है।

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

5
जेएस में भी यह काम करता है।
सायोस

1
यह आमतौर पर 5 वर्ण है यदि आपको ब्रेसिज़ को शामिल करने के लिए बाद में स्ट्रिंग का उपयोग करने की आवश्यकता है ...(1+"").DoSomethingWith1String();
TheLethalCoder

1
यदि आपको स्ट्रिंग की आवश्यकता है तो आप इसे आमतौर पर संग्रहीत कर रहे हैं। बस किसी भी अन्य उपयोग के बारे में मूल रूप से ToString () ...
jcolebrand

1
ध्यान दें कि यह वास्तव में स्टेटिक String.Concat(object)को कॉलिंग के बजाय आभासी कॉलिंग के साथ कहता है object.ToString()Concatस्पष्ट रूप nullसे रिक्त स्ट्रिंग में परिवर्तित होता है ( संदर्भ स्रोत देखें )। कोई 'मूल कास्टिंग' नहीं चल रही है, आप कुछ भी इस तरह से बदल सकते हैं, यह सिर्फ इतना है कि परिणाम कुछ मामलों में बहुत उपयोगी नहीं हो सकता है! (लेकिन अशक्त व्यवहार अच्छी तरह से हो सकता है)।
VisualMelon


41

मैंने एक बार जानबूझकर अपना कार्यक्रम रखा था namespace Systemताकि मैं एक विशिष्ट वर्ग तक पहुंच को छोटा कर सकूं। तुलना

using System;using M=System.Math;

सेवा

namespace System{using M=Math;

9
बस याद रखें कि एकल उपयोग समस्या को हल करने के लिए वर्गों / कार्यों को पूरी तरह से योग्य बनाना बेहतर है। यह केवल तभी उपयोगी है जब आपको एक से अधिक बार कुछ कॉल करना हो, और तब भी केवल Systemनामस्थान में आइटम के लिए ।
निक लार्सन

आप भी कर सकते हैं using System;class P...
ldam

@ लोगन: यह सिर्फ using System;उसी नामस्थान में एक वर्ग के लिए एक उपनाम होने के बारे में नहीं था , जो मेरे द्वारा दिखाए गए तरीके से कम है।
जॉय

यह using static System.Math;C # 6 में करने के लिए छोटा है (आप उन कार्यों में से किसी का उपयोग कर सकते हैं जैसे कि वे वास्तव में वैश्विक थे - एक कक्षा में नहीं)। मूल सुझाव अभी भी कम हो सकता है using staticयदि आपको कई वर्गों तक पहुंचने की आवश्यकता है।
दूध

@milk: अतिरिक्त staticकीवर्ड अक्सर M.मेथड कॉल्स पर बाहर जाने से किसी भी बचत से अधिक होता है , लेकिन हां, यह एक विकल्प है, लेकिन यह एक मोटी लागत पर आता है, जिसे अमॉर्ट करने के लिए बहुत सारे कॉल्स की आवश्यकता होती है।
जॉय

30

varवर्णों को सहेजने के लिए एकल (एकल) चर घोषित करने और आरंभ करने के लिए उपयोग करें :

string x="abc";

हो जाता है

var x="abc";

के लिए आवश्यक कण नहीं है int


2
याद रखें कि varकई घोषणाकर्ता नहीं हो सकते हैं, उदाहरण के लिए var x="x",y="y";संभव नहीं है।
इयान एच।

29

यदि LINQ का उपयोग करते हैं तो आप लैम्बडा Selectबनाने के बजाय एक विधि को सीधे पास कर सकते हैं ।

तो, के बजाय

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

आप उपयोग कर सकते हैं

foo.Select(int.Parse)

सीधे।

(हाल ही में जब टिमवी के C # उत्तरों में से एक में सुधार हुआ है )


2
एफडब्ल्यूआईटीडब्ल्यू इसे called- कटौती
थ्रीएफएक्स


5
हम में से अधिक व्यावहारिक के लिए, यह बस छोटा है : -þ
जोय

23

याद रखें कि C # में सबसे छोटा संकलन प्रोग्राम 29 वर्ण है:

class P
{
    static void Main()
    {   
    }
}

इसलिए इसे अपनी लंबाई से हटाकर शुरू करें और इस पर अपना जवाब दें कि यह कितना अधिक है। जब मुद्रण या पढ़ने के इनपुट की बात आती [code-golf]है, तो सी # अन्य भाषाओं के साथ प्रतिस्पर्धा नहीं कर सकता है, जो ज्यादातर समस्याओं का दिल है, इसलिए इसके बारे में चिंता न करें। C # गोल्फर के रूप में, आप वास्तव में भाषा के खिलाफ प्रतिस्पर्धा कर रहे हैं।

ध्यान रखने वाली कुछ अन्य बातें:

  • ifकोष्ठक हटाने के लिए यदि संभव हो तो सभी छोरों और कथनों को एक पंक्ति में कम करें।
  • यदि स्टड और कमांड लाइन के बीच विकल्प दिया जाता है, तो हमेशा कमांड लाइन का उपयोग करें!

इसमें आमतौर पर टर्नरी शामिल होता है;)
jcolebrand

1
As a C# golfer, you're really competing against the language अविश्वसनीय रूप से संबंधित
dorukayhan

1
वास्तव में, यह सच नहीं है। यह भी उपयोग static int Main()करता है, जो 28 अक्षरों का होगा।
मेटोनीम


21

के बजाय

bool a = true;
bool b = false;

करना

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

यदि आपको कई चर चाहिए, तो इसका उपयोग करें ( @VisualMelon द्वारा सुझाए गए )

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लंबा हो। IMO, यह साइड इफेक्ट्स को अच्छी तरह से बताने में भी विफल रहता है। मामले में जहां if (i < 1)कुछ ऐसा है if (SendEmail(recipient))जो साइड इफेक्ट्स की सफलता के आधार पर सही / गलत रिटर्न देता है, मैं इफ / नोटेशन पसंद करता हूं।
निक लार्सन

11
दूसरे मामले में कोष्ठक की आवश्यकता नहीं है - j=i<1?1:0;पर्याप्त है।
डेन्को डर्बीच

3
प्रश्न उन युक्तियों के लिए पूछता है जो कुछ हद तक C # के लिए विशिष्ट हैं। यह सभी भाषाओं की युक्तियों में शामिल है ।
पीटर टेलर

4
@PeterTaylor मैंने 3 साल पहले इस सवाल का जवाब दिया, इससे पहले कि आपके द्वारा जोड़ा गया धागा बनाया जाए
Nellius

15

का प्रभावी उपयोग

आप कर सकते हैं की जगह float (जिसके लिए एक उपनाम है System.Single) के साथ zका उपयोग करz=System.Single;

तब की जगह z=System.Single;के साथ z=Single;नाम स्थान में कार्यक्रम रखकर System। (जोय के जवाब के साथ)

यह अन्य मूल्य प्रकारों के लिए लागू किया जा सकता है (वे किसके लिए एक उपनाम हैं), संरचना और कक्षाएं


14

यदि आपको Console.ReadLine()अपने कोड में कई बार (न्यूनतम 3 बार) का उपयोग करने की आवश्यकता है , तो आप कर सकते हैं:

Func<string>r=Console.ReadLine;

और फिर उपयोग करें

r()

बजाय


मुझे लगता है कि आपको ()पहली पंक्ति से हटाने की आवश्यकता है ।
मेलमोकब

@ ममलोकब सही है, धन्यवाद! तय की।
क्रिस्टियन लुपस्क्यू

1
क्या तुम नहीं कर सकते auto r=Console.ReadLine;?
क्लाउडीयू

2
@claudiu नहीं, दुर्भाग्य से नहीं ideone.com/jFsVPX
क्रिस्टियान

@ कलैडु, autoएक C++क्रिया है। varके लिए है C#। इसका कारण यह नहीं किया जा सकता है क्योंकि Console.ReadLineअतिभारित है इसलिए संकलक को यह बताने के लिए फ़ंक्शन हस्ताक्षर की आवश्यकता है कि जो अधिभार चाहता है।
GreatAndPowerfulOz

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
यह वास्तव में भयानक है ... मुझे यह पसंद है!
एलेक्स रिंकिंग

पवित्र बकवास यह प्रतिभा है, मैंने वास्तव में एक सरणी को लूप करते हुए सिर्फ एक चरित्र को बचाया
Gaspa79

यह वास्तव में बुराई है!
GreatAndPowerfulOz

13

C # 6 में एक फ़ंक्शन को परिभाषित करने के लिए लैम्ब्डा का उपयोग करें

C # 6 में, आप किसी फ़ंक्शन को परिभाषित करने के लिए लैम्बडा का उपयोग कर सकते हैं:

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

यह इस तरह एक समारोह को परिभाषित करने से कम है:

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

3
C # 6 कोड-गोल्फ की पूरी नई रेंज देता है
jcolebrand

C # 7 में, यह स्थानीय फ़ंक्शन बनाने के लिए किसी अन्य फ़ंक्शन के अंदर किया जा सकता है। मुझे संदेह है कि यह गोल्फ करते समय मदद करेगा, लेकिन यह अभी भी जानने के लिए एक साफ चाल है।
तेहपर्स

1
वह औपचारिक रूप से लंबोदर नहीं है। यह एक अभिव्यक्ति शारीरिक सदस्य है
पुनरावर्ती

13

LINQ

के बजाय का उपयोग करने का:

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

आप उपयोग कर सकते हैं में fहर के लिए समारोह के परिणाम के साथ एक Enumerable पाने के लिएint[0,y]

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

यदि आपको जरूरत है stringया कुछ भी जो Enumerableआपके कार्यक्रम में लागू होता है तो आप उनका भी उपयोग कर सकते हैं

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

मैं इस ट्रिक का उपयोग शमीर की सीक्रेट शेयरिंग चुनौती के लिए अपने उत्तर में करता हूं ।
अलिस्दग

मुझे नहीं लगता कि यदि आप ienumerable को अनुकूलन के साथ पुनरावृत्त नहीं करते हैं तो स्ट्रिंग भाग निष्पादित होगा। मेरे लिए बस तब तक असफल रहा जब तक मैंने .ToArray (); इसके अलावा, अद्भुत टिप!
गस्पा 79

हाँ enumerables आलसी हैं लेकिन यह तीनों उदाहरणों के लिए सही है न कि केवल एक स्ट्रिंग के साथ।
रागिनी

11

यदि आपको Dictionary<TKey, TValue>अपने कोड में कम से कम दो बार जेनेरिक का उपयोग करने की आवश्यकता है , तो आप इस उदाहरण में एक शब्दकोश वर्ग घोषित कर सकते हैं:

class D:Dictionary<int,string>{}

और फिर उपयोग करें

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

Dictionary<int,string>हर पल के लिए दोहराने के बजाय ।

मैंने इस उत्तर में इस तकनीक का उपयोग किया है


2
और "D d" के बजाय "D d" भी
Zukki

@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      

यदि आप कभी ऐसी स्थिति में आते हैं, जहां आपको कास्ट करना है, तो आप इसके बजाय गुणा का उपयोग करके कुछ बाइट्स बचा सकते हैं।

((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
@martinho ~ क्या आपने मेरा जवाब पढ़ा? ;) मुख्य पर कोई जनता नहीं
jcolebrand

@ जॉय ~ मैं इसे प्रति पोस्ट करने के लिए रखने की कोशिश कर रहा था;) ... लगा कि कोई और मुख्य या कक्षाओं के बारे में केवल एक पत्र होने के बारे में पोस्ट करेगा। यह देखते हुए कि किसी और के पास कैसे है, मैं आगे जाऊंगा और उस एक को भी जोड़ूंगा।
jcolebrand

9

एक-पंक्ति के लंबोदर भावों के लिए, आप कोष्ठक और अर्धविराम को छोड़ सकते हैं। एक-पैरामीटर अभिव्यक्तियों के लिए, आप कोष्ठकों को छोड़ सकते हैं।

के बजाय

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

उपयोग

SomeCall(x=>DoSomething);

11
मैं एक-पैरामीटर लैम्ब्डा के लिए कोष्ठक कभी नहीं लिखता, यहां तक ​​कि उत्पादन कोड पर भी।
आर। मार्टिनो फर्नांडिस

मैं हमेशा कोष्ठक का उपयोग करता हूं, क्योंकि मैं पठनीयता के लिए लंबो को कई लाइनों में विभाजित करना पसंद करता हूं।
जुलियाना पेना

2
SomeCall(DoSomething)और भी बेहतर है
GreatAndPowerfulOz

9

लूपिंग:

परिवर्तनीय घोषणाएँ:

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

बनना:

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

और अगर आपको केवल एक बार 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;)जो गलत होने के लिए आसान और कठिन दोनों प्रकार के होते हैं।
जोए

@ जॉय उन मामलों में, जब मैं (++ मैं <अधिकतम) स्विच करता हूं, जो समान लंबाई है लेकिन पढ़ने में आसान है।
आईसीआर

ICR: इस बात पर निर्भर करता है कि क्या आप forहेडर में एक और (पहले) स्टेटमेंट डाल सकते हैं , जो फिर एक कैरेक्टर को फिर से सेव करेगा।
जॉय

आप a1 बाइट बचत के लिए क्लॉज के लिए दोनों घोषणाओं को वापस ले जा सकते हैं।
पुनरावर्ती

मुझे बदलना पसंद for(;i<max;)है while(i<max)। बाइट्स की एक ही संख्या है, लेकिन मेरे लिए यह सिर्फ क्लीनर दिखता है।
22b पर Ayb4btu

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

C # में, हमें यह 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})"

यह, C # 6.0 में नए एक्सप्रेशन बॉडी के साथ मिलकर C # में किसी भी साधारण स्ट्रिंग-गणना चुनौती को बहुत ही महत्वपूर्ण बना सकता है।


3
यह भी ध्यान दें कि इससे i+$" bottles of beer";छोटा है $"{i} bottles of beer"
एलोइसडग जूल

1
@aloisdg उस पहले मामले में आपको $बाहर निकलना चाहिए , हालाँकि।
मेटोनीम

@Metoniem वास्तव में! मैंने इसे करने दिया क्योंकि मेरे मूल मामले में मेरे {i}सामने दो एक थे और बीच में एक;)
अलोएग्ड

@aloisdg आह, मैं देख रहा हूँ। हाँ, शर्मनाक टिप्पणियों को संपादित नहीं किया जा सकता है :(
Metoniem

6

C # लैम्ब्डा का प्रयोग करें। चूंकि PPCG इनपुट / आउटपुट के लिए लैम्ब्डा की अनुमति देता है, हमें उनका उपयोग करना चाहिए।

एक क्लासिक सी # तरीके इस तरह दिखता है:

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)

सभी शोर निकालें और ध्यान केंद्रित करें!

अपडेट करें:

हम साथ एक कदम और अधिक सुधार कर सकते हैं currying @TheLethalCoder टिप्पणी के रूप में:

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

@ फेलिक्स पालमेन द्वारा कर्लिंग का उदाहरण: WPA कुंजी की गणना कैसे करें?

यह तब सहायक होगा जब आपके पास ठीक 2 पैरामीटर होंगे, तब एक खाली अप्रयुक्त चर _बेहतर होगा। इस बारे में मेटा पोस्ट देखें । मैं यहां इस ट्रिक का उपयोग करता हूं । आपको फ़ंक्शन को थोड़ा बदलना होगा। उदाहरण: इसे ऑनलाइन आज़माएं!


1
यकीन नहीं होता कि अगर यह कहीं और युक्तियों में है, लेकिन इस उदाहरण के लिए आप करीने का भी उपयोग कर सकते हैं ...s=>c=>...
TheLethalCoder

@ TheLethalCoder वास्तव में हम कर सकते हैं! मैं जवाब को अपडेट करूंगा धन्यवाद!
अलिस्दग

क्या आप इस मामले में एटा-कमी का उपयोग कर सकते हैं? कुछ इस तरह s=>s.Contains:।
corvus_192

ध्यान दें कि 'अनटिप्ड लैम्ब्डा' किस्म के C # और जावा उत्तर पक्ष से बाहर हो रहे हैं, आप इस मेटा पोस्ट पर चर्चा में शामिल होना चाह सकते हैं । सुझाया गया विकल्प है(string s,char c)=>s.Contains(c)
विजुअलमेल


5

केवल एक अक्षर के वर्गनाम बनाएं। सी # में कोड-गोल्फिंग के लिए युक्तियों पर बढ़ाना हम से चलते हैं

class Default{static void Main()

सेवा

class D{static void Main()

जो इस मामले में एक और 6 चार्ट खटखटाता है।


1
चर नामों के साथ
डिट्टो

11
यह "कम से कम कुछ हद तक C #" के लिए कैसे विशिष्ट है?
पीटर टेलर

5

Computeके कहने विधि System.Data.DataTable, एक साधारण स्ट्रिंग अभिव्यक्ति, जैसे मूल्यांकन करने के लिए अनुमति देता है:

सी # (विजुअल सी # कंपाइलर) , 166 बाइट्स

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

इसे ऑनलाइन आज़माएं!

प्रति se बहुत "golfy" नहीं है, लेकिन कभी-कभी उपयोगी हो सकता है।


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 बाइट की बचत।


केवल संख्याओं के लिए ही लागू होता है, और तब भी tuples और xor जोखिम के अलावा कुछ भी आप पूर्णांकों के लिए इसे लागू कर रहे हैं। कभी-कभी, अन्य संख्या प्रकार सीमा में भी चलेंगे
एएससीआईआई-केवल

4

LinqPad का उपयोग करने से आपको ओवरहेड को सीधे निष्पादित करने के रूप में सभी प्रोग्राम को ओवरहेड निकालने की संभावना मिलेगी। (और यह कोडगॉल्फ में पूरी तरह से कानूनी होना चाहिए ... कोई नहीं कहता कि आपको एक .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=""जावास्क्रिप्ट में पसंद कर सकते हैं ?
corvus_192

@ corvus_192 नहीं - दुर्भाग्य से नहीं।
इररेसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.