เคล็ดลับสำหรับการตีกอล์ฟใน C #


62

คุณมีเคล็ดลับทั่วไปเกี่ยวกับการเล่นกอล์ฟใน C # อย่างไร ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ C # (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ

- ยืมมาจากความคิดของ Marcog;)


BEST TIP => ใช้บางอย่างที่อยู่ข้าง. NET หากคุณไม่ต้องการส่งคำตอบที่ยาวที่สุดสำหรับความท้าทาย .NET ถูกออกแบบมาให้ละเอียดมากและให้ IDE ทำการพิมพ์ ซึ่งจริงๆแล้วไม่เลวเท่าที่ควรสำหรับการเขียนโปรแกรมทั่วไปตราบใดที่คุณมี IDE crutch แต่สำหรับการเขียนโค้ดที่กลยุทธ์ล้มเหลว
krowe

ยกโทษให้ฉันสำหรับภาพของปฏิทินมันคือทั้งหมดที่ฉันสามารถหาได้ในการแจ้งเตือนสั้น ๆ
undergroundmonorail

คำตอบ:


59

แทนที่จะ.ToString()ใช้+""สำหรับตัวเลขและประเภทอื่น ๆ ที่สามารถส่งไปยังสตริงได้อย่างปลอดภัย

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

5
ยังใช้งานได้ใน JS
Cyoce

1
โดยปกติแล้วจะเป็น 5 ตัวอักษรหากคุณต้องการใช้สตริงหลังจากนั้นเพื่อรวมวงเล็บปีกกา ...(1+"").DoSomethingWith1String();
TheLethalCoder

1
หากคุณต้องการสตริงที่คุณมักจะเก็บไว้ การใช้งานอื่น ๆ สามารถอนุมาน ToString () ...
jcolebrand

1
โปรดทราบว่านี้จริงเรียกว่าคงมีการโต้แย้งมากกว่าโทรเสมือนString.Concat(object) แปลงเป็นสตริงว่างอย่างชัดเจน( ดูแหล่งอ้างอิง ) ไม่มี 'การคัดเลือกนักแสดงพื้นเมือง' เกิดขึ้นคุณสามารถแปลงอะไรเช่นนี้ได้ แต่ผลที่ได้อาจไม่เป็นประโยชน์ในบางกรณี! (แต่พฤติกรรมที่เป็นโมฆะอาจเป็นไปได้) object.ToString()Concatnull
VisualMelon

1
ทางเลือก - การแก้ไขสตริง :$"{n}"
Andriy Tolstoy

41

ฉันตั้งใจวางโปรแกรมของฉันไว้namespace Systemเพื่อที่ฉันจะได้สั้นลงในชั้นเรียนที่เฉพาะเจาะจง เปรียบเทียบ

using System;using M=System.Math;

ไปยัง

namespace System{using M=Math;

9
เพียงจำไว้ว่าเป็นการดีกว่าที่จะจัดคลาส / ฟังก์ชั่นให้ครบถ้วนเมื่อใช้เพียงครั้งเดียวแก้ปัญหาได้ สิ่งนี้มีประโยชน์ก็ต่อเมื่อคุณต้องเรียกบางสิ่งมากกว่าหนึ่งครั้งและแม้กระทั่งสำหรับไอเท็มในSystemเนมสเปซเท่านั้น
Nick Larsen

using System;class P...นอกจากนี้คุณยังสามารถเพียงแค่ทำ
ldam

@Logan: มันไม่เพียงusing System;เกี่ยวกับการมีนามแฝงสำหรับคลาสในเนมสเปซเดียวกันซึ่งสั้นกว่าที่ฉันแสดงไว้ที่นี่
Joey

มันสั้นกว่าที่จะทำusing static System.Math;ใน C # 6 (เพิ่มคุณสามารถใช้ฟังก์ชั่นเหล่านั้นราวกับว่าพวกเขาเป็นโลกอย่างแท้จริง - ไม่ได้อยู่ในชั้นเรียน) คำแนะนำดั้งเดิมอาจยังสั้นกว่าusing staticถ้าคุณต้องการเข้าถึงหลายคลาส
นม

@ นม: staticคำหลักเพิ่มเติมมักจะยาวกว่าการประหยัดจากการออกจากM.วิธีการโทร แต่ใช่มันเป็นตัวเลือก
Joey

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 #ของTimwi )


2
FWITW นี้เรียกว่าreduction-reduction
ThreeFx

เป็นที่รู้จักกันว่าสไตล์"ชี้ฟรี"
Jonathan Wilson

5
สำหรับเราในทางปฏิบัติมากขึ้นมันสั้นลงเพียง: -þ
Joey

23

โปรดจำไว้ว่าโปรแกรมที่คอมไพล์ได้เล็กที่สุดใน C # คือ 29 ตัวอักษร:

class P
{
    static void Main()
    {   
    }
}

ดังนั้นเริ่มต้นด้วยการลบสิ่งนั้นออกจากความยาวของคุณ C # ไม่สามารถแข่งขันกับภาษาอื่นเมื่อพูดถึงการพิมพ์หรือการอ่านซึ่งเป็นหัวใจของ[code-golf]ปัญหาส่วนใหญ่ดังนั้นอย่ากังวลไป ในฐานะนักกอล์ฟ C # คุณต้องแข่งขันกับภาษาจริงๆ

สิ่งอื่น ๆ ที่ควรทราบ:

  • ลดลูปและifคำสั่งทั้งหมดเป็นบรรทัดเดียวถ้าเป็นไปได้เพื่อที่จะลบวงเล็บ
  • หากกำหนดตัวเลือกระหว่าง stdin และ command line ให้ใช้ command line เสมอ!

โดยปกติจะเกี่ยวข้องกับบุคคลที่สามเช่นกัน)
jcolebrand

1
As a C# golfer, you're really competing against the language เกี่ยวข้องอย่างไม่น่าเชื่อ
dorukayhan

1
จริงๆแล้วมันไม่จริง มันรวบรวมการใช้static int Main()เช่นกันซึ่งจะเป็น 28 ตัวอักษร
Metoniem

1
@Metoniem ที่ต้องมีreturnบางสิ่งบางอย่าง
user202729

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 ?? "";(ฉันรัก coalesces ของฉัน)
jcolebrand

มีบางครั้งที่มันอยู่ไกลจากการเป็นตัวเลือกที่อ่านได้มากขึ้นโดยเฉพาะอย่างยิ่งเมื่อi < 1เป็นคำสั่งที่ซับซ้อนหรือเมื่อชื่อของjมีความยาว IMO ก็ยังไม่สามารถถ่ายทอดผลข้างเคียงได้เป็นอย่างดี ในกรณีที่if (i < 1)เป็นสิ่งที่ต้องการif (SendEmail(recipient))ผลตอบแทนจริง / เท็จขึ้นอยู่กับความสำเร็จของผลข้างเคียงที่ฉันชอบถ้า / แล้วสัญกรณ์
Nick Larsen

11
ไม่จำเป็นต้องใช้วงเล็บในกรณีที่สอง - j=i<1?1:0;ก็เพียงพอแล้ว
Danko Durbić

3
คำถามถามถึงเคล็ดลับที่ค่อนข้างเฉพาะเจาะจงกับ C # นี้เป็นหนึ่งรวมอยู่ในเคล็ดลับสำหรับทุกภาษา
Peter Taylor

4
@PeterTaylor ฉันตอบคำถามนี้เมื่อ 3 ปีที่แล้วก่อนที่จะมีการสร้างเธรดที่คุณเชื่อมโยง
Nellius

15

การใช้อย่างมีประสิทธิภาพ

คุณสามารถแทนที่ float (ซึ่งเป็นชื่อแทนSystem.Single) ด้วยการzใช้z=System.Single;

แล้วแทนที่z=System.Single;ด้วยz=Single;โดยการวางโปรแกรมในการ Systemnamespace (เช่นเดียวกับคำตอบของ Joey)

สิ่งนี้สามารถนำไปใช้กับประเภทค่าอื่น ๆ (ใช้สิ่งที่พวกเขาเป็นนามแฝง), structs และชั้นเรียน


14

หากคุณจำเป็นต้องใช้Console.ReadLine()รหัสของคุณหลายครั้ง (ขั้นต่ำ 3 ครั้ง) คุณสามารถทำได้:

Func<string>r=Console.ReadLine;

แล้วก็ใช้

r()

แทน


ฉันคิดว่าคุณต้องลบออก()จากบรรทัดแรก
mellamokb

@mellamokb ถูกต้องขอบคุณ! แก้ไขแล้ว.
Cristian Lupascu

1
ทำauto r=Console.ReadLine;ไม่ได้เหรอ
Claudiu

2
@claudiu ไม่โชคดีไม่ได้ideone.com/jFsVPX
Cristian Lupascu

@Claudiu 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++]);
}

คุณสามารถบันทึกอักขระโดยใช้บล็อก try / catch เพื่อค้นหาจุดสิ้นสุด:

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

สิ่งนี้ใช้กับอาเรย์ใด ๆ ภายในอาเรย์เช่น:

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

7
มันน่ากลัวจริงๆ ... ฉันรักมัน!
Alex reinking

อึศักดิ์สิทธิ์นี้เป็นอัจฉริยะจริง ๆ แล้วฉันเพิ่งบันทึกตัวละครในขณะที่วนรอบอาร์เรย์
Gaspa79

นี่คือความชั่วร้ายอย่างแท้จริง!
GreatAndPowerfulOz

13

ใช้ lambdas เพื่อกำหนดฟังก์ชั่นใน 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 สามารถทำได้ภายในฟังก์ชั่นอื่นเพื่อสร้างฟังก์ชั่นในท้องถิ่น ฉันสงสัยว่าสิ่งนี้จะช่วยในขณะที่เล่นกอล์ฟ แต่มันก็เป็นเพียงเคล็ดลับที่จะรู้
TehPers

1
นั่นไม่ใช่แลมบ์ดาอย่างเป็นทางการ มันเป็นสมาชิกแสดงออกฉกรรจ์
เรียกซ้ำ

13

LINQ

แทนที่จะใช้:

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

จะได้รับการ Enumerable กับผลลัพธ์ของการทำงานfสำหรับทุกคนintใน[0,y]ที่คุณสามารถใช้

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

หากคุณต้องการstringหรืออะไรก็ตามที่ใช้Enumerableในโปรแกรมของคุณคุณสามารถใช้มันได้เช่นกัน

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

ผมใช้เคล็ดลับนี้ในของฉันคำตอบสำหรับShamir ความลับของการแบ่งปันความท้าทาย
aloisdg

ฉันไม่คิดว่าส่วนสตริงจะทำงานถ้าคุณไม่ได้วนซ้ำด้วยการเพิ่มประสิทธิภาพใน เพิ่งล้มเหลวสำหรับฉันจนกว่าฉันจะทำ. ToArray (); นอกจากนั้นเคล็ดลับที่น่าทึ่ง!
Gaspa79

ใช่นับไม่ได้ขี้เกียจ แต่นั่นเป็นความจริงสำหรับตัวอย่างทั้งสามไม่ใช่เฉพาะกับสตริง
raggy

11

หากคุณจำเป็นต้องใช้รหัสทั่วไปDictionary<TKey, TValue>อย่างน้อยสองครั้งในรหัสของคุณคุณสามารถประกาศคลาสพจนานุกรมเช่นในตัวอย่างนี้:

class D:Dictionary<int,string>{}

แล้วก็ใช้

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

แทนการทำซ้ำDictionary<int,string>สำหรับทุก instantiation

ฉันใช้เทคนิคนี้ในคำตอบนี้


2
และ "D d" แทน "var d"
Zukki

@ Zukki เห็นได้ชัด! ฉันกำลังคิดอะไรอยู่ :)
Cristian Lupascu

ทางเลือก:using D = System.Collections.Generic.Dictionary<int,string>;
Andriy Tolstoy

10

คุณสามารถใช้floatและdoubleตัวอักษรเพื่อบันทึกไม่กี่ไบต์

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

เมื่อคุณต้องการintเลขคณิตเพื่อส่งคืน a 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
และทำให้ชั้นเรียนหนึ่งตัวอักษรเท่านั้น :-)
Joey

2
โอ้และอีกสิ่งที่ดีโดยนัยที่นี่: Mainไม่จำเป็นต้องมีข้อโต้แย้งใด ๆ ในทางตรงกันข้ามกับ Java ตัวอย่างเช่น
Joey

@ โจอี้: และไม่จำเป็นต้องเปิดเผยต่อสาธารณะ
R. Martinho Fernandes

1
@martinho ~ คุณอ่านคำตอบของฉันแล้วเหรอ? ;) ไม่มีสาธารณะในหลัก
jcolebrand

@ โจอี้ ~ ฉันพยายามที่จะเก็บไว้หนึ่งโพสต์ต่อ;) ... คิดว่าคนอื่นจะโพสต์เกี่ยวกับหลักหรือชั้นเรียนเป็นเพียงจดหมายฉบับเดียว เห็นว่าไม่มีใครมีฉันจะไปข้างหน้าและเพิ่มหนึ่งนั้น
jcolebrand

9

สำหรับการแสดงออกแลมบ์ดาหนึ่งบรรทัดคุณสามารถข้ามเครื่องหมายวงเล็บและเครื่องหมายอัฒภาคได้ สำหรับนิพจน์ที่มีพารามิเตอร์เดียวคุณสามารถข้ามวงเล็บได้

แทน

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

ใช้

SomeCall(x=>DoSomething);

11
ฉันไม่เคยเขียนวงเล็บสำหรับ lambdas แบบพารามิเตอร์เดียวแม้แต่ในรหัสการผลิต
R. Martinho Fernandes

ฉันมักจะใช้วงเล็บเพราะฉันชอบที่จะแยกแลมบ์ดาเป็นหลายบรรทัดเพื่อให้อ่านง่าย
Juliana Peña

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;)ซึ่งง่ายต่อการติดตามและยากที่จะผิด
Joey

@ โจอี้ในกรณีเหล่านั้นฉันมักจะเปลี่ยนเป็น while (++ i <max) ซึ่งมีความยาวเท่ากัน แต่อ่านง่ายกว่า
ICR

ICR: ขึ้นอยู่กับว่าคุณสามารถใส่คำสั่ง (ก่อนหน้า) อีกอันในforส่วนหัวด้วยซึ่งจะบันทึกอักขระอีกครั้ง
Joey

คุณสามารถย้ายการประกาศทั้งสองกลับไปไว้ใน clause เพื่อการประหยัด a1 byte
เรียกซ้ำ

ผมชอบการเปลี่ยนแปลงไปfor(;i<max;) while(i<max)จำนวนไบต์เท่ากัน แต่สำหรับฉันมันดูสะอาดกว่า
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"
aloisdg

1
@aloisdg ในกรณีแรกคุณควรออก$ไป
Metoniem

@Metoniem แน่นอน! ผมปล่อยให้มันเพราะในกรณีเดิมของฉันฉันมีสอง{i}หนึ่งในด้านหน้าและเป็นหนึ่งในกลาง;)
aloisdg

@aloisdg Ahh ฉันเข้าใจแล้ว ใช่ความคิดเห็นที่น่าอับอายไม่สามารถแก้ไขได้ :(
Metoniem

6

ใช้ C # lambda เนื่องจาก PPCG อนุญาตแลมบ์ดาสำหรับอินพุต / เอาท์พุตเราจึงควรใช้มัน

วิธีการแบบคลาสสิก C # มีลักษณะเช่นนี้:

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);

ตัวอย่างของการประมวลผลโดย @Felix Palmen: คำนวณคีย์ WPA อย่างไร

มันจะมีประโยชน์เมื่อคุณมีพารามิเตอร์ 2 ตัวแน่นอนตัวแปรที่ไม่ได้ใช้_จะว่างเปล่าจะดีกว่า ดูโพสต์เมตาเกี่ยวกับเรื่องนี้ ผมใช้เคล็ดลับนี้ที่นี่ คุณจะต้องเปลี่ยนฟังก์ชั่นเล็กน้อย ตัวอย่าง: ลองออนไลน์!


1
ไม่แน่ใจว่ามันอยู่ที่อื่นในเคล็ดลับ แต่สำหรับตัวอย่างนี้คุณสามารถใช้ currying เกินไป ...s=>c=>...
TheLethalCoder

@TheLethalCoder แน่นอนเราทำได้! ฉันจะอัปเดตคำตอบขอบคุณ!
aloisdg

คุณสามารถใช้การลดค่าใช้จ่ายในกรณีนี้ได้ไหม บางสิ่งเช่นนี้: s=>s.Contains.
corvus_192

โปรดทราบว่าคำตอบ C # และ Java ของวาไรตี้ 'untyped lambda' นั้นไม่ได้รับความนิยมคุณอาจต้องการเข้าร่วมการสนทนาในโพสต์เมตานี้ ทางเลือกที่แนะนำคือ(string s,char c)=>s.Contains(c)
VisualMelon

การสนทนาเกี่ยวกับฟังก์ชั่นที่ไม่มีชื่อ
aloisdg

5

ทำให้ชื่อคลาสเป็นตัวอักษรเดียว การปรับปรุงเคล็ดลับสำหรับการเล่นโค้ดใน C # ที่เราทำได้

class Default{static void Main()

ไปยัง

class D{static void Main()

ซึ่งเคาะออกไปอีก 6 ตัวอักษรในกรณีนี้


1
เหมือนกันกับชื่อตัวแปร
Nellius

11
นี่คือ "อย่างน้อยค่อนข้างเฉพาะกับ C #" อย่างไร
Peter Taylor

5

Computeวิธีการเช่นการSystem.Data.DataTableช่วยให้การประเมินนิพจน์สตริงง่ายเช่น:

C # (คอมไพเลอร์ Visual C #) , 166 ไบต์

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

ลองออนไลน์!

ไม่มาก "Golfy" ต่อ se แต่บางครั้งอาจมีประโยชน์


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 ระบุอย่างชัดเจนเท่านั้นสองรายการสุดท้ายอาจส่งผลให้เกิดข้อยกเว้น ArithmeticOverflow ทั้งหมดข้างต้นคือ 12 ไบต์การประหยัด 4 ไบต์เปรียบเทียบกับตัวอย่างแรก


ใช้กับตัวเลขเท่านั้นและถึงแม้ว่าจะมีสิ่งอื่นใดนอกเหนือจาก tuples และ xor risk ที่ใช้กับขีด จำกัด จำนวนเต็มที่คุณใช้กับจำนวนเต็ม ในบางครั้งประเภทของตัวเลขอื่น ๆ จะมีการ จำกัด เช่นกัน
ASCII- เท่านั้น

4

การใช้ LinqPad จะทำให้คุณสามารถลบค่าโสหุ้ยโปรแกรมทั้งหมดในขณะที่คุณสามารถรันคำสั่งได้โดยตรง (และควรเป็น codegolf อย่างถูกกฎหมาย ... ไม่มีใครบอกว่าคุณต้องการ. 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

VS:

namespace System.Linq
{
    //Some code
}

3

ค้นพบคืนนี้ "ในสนามเพลาะ" ในขณะที่การปรับปรุงรหัสกอล์ฟบางส่วน ... หากคุณมีชั้นเรียนสำหรับการประมวลผลของคุณคุณสามารถทำงานในตัวสร้างเพื่อบันทึกวิธีการประกาศ

ฉันค้นพบสิ่งนี้ในขณะที่ลดแอปพลิเคชันคอนโซล - เนื่องจากมีstatic void Main()ฟังก์ชั่นและตัวแปรทั้งหมดจะต้องประกาศคงที่ ฉันสร้างคลาสที่ซ้อนกันด้วยฟังก์ชั่นสมาชิกและตัวแปรโดยมีงานหลักดำเนินการในตัวสร้าง สิ่งนี้จะบันทึกอักขระในรหัสการโทรด้วย

เช่น Class ด้วยเมธอด:

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

ใช้Actionlike Funcเพื่อตั้งค่าฟังก์ชั่นเป็นตัวแปร Actionไม่ส่งคืนอะไร ( void) จึงเหมาะสำหรับการพิมพ์

ตัวอย่างเช่น:

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

เคล็ดลับนี้เป็นแรงบันดาลใจ @ W0lf ตัวอย่างที่ดีของการใช้FuncReadLineด้วย


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=""ชอบใน javascript ได้ไหม?
corvus_192

@ corvus_192 ไม่ - ไม่น่าเสียดาย
Erresen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.