Mẹo chơi golf trong C #


62

Bạn có lời khuyên chung nào cho việc chơi golf trong C #? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf nói chung ít nhất là cụ thể đối với C # (ví dụ: "xóa bình luận" không phải là một câu trả lời). Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.

- mượn từ ý tưởng của marcog;)


TIP TỐT NHẤT => Sử dụng một cái gì đó bên cạnh .NET nếu bạn không muốn gửi câu trả lời dài nhất cho thử thách. .NET được thiết kế rất dài dòng và để IDE thực hiện việc gõ. Điều này thực sự không tệ như nó có vẻ như đối với lập trình chung miễn là bạn có cái nạng IDE đó nhưng đối với môn đánh gôn thì chiến lược đó chắc chắn thất bại.
krowe

Hãy tha thứ cho tôi về hình ảnh của một tờ lịch, đó là tất cả những gì tôi có thể tìm thấy trong một thông báo ngắn.
undergroundmonorail

Câu trả lời:


59

Thay vì sử .ToString()dụng +""cho số và các loại khác có thể được đúc thành chuỗi một cách an toàn.

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

5
Điều này cũng hoạt động trong JS.
Cyoce

1
Đây thực sự thường là 5 ký tự nếu bạn cần sử dụng chuỗi sau đó để bao gồm cả niềng răng ...(1+"").DoSomethingWith1String();
TheLethalCoder

1
Nếu bạn cần chuỗi bạn thường lưu trữ nó. Chỉ cần sử dụng bất kỳ cách sử dụng nào khác có thể suy ra ToString () ...
jcolebrand

1
Lưu ý rằng điều này thực sự gọi tĩnh String.Concat(object)với đối số, thay vì gọi ảo object.ToString(). Concatchuyển đổi rõ ràng thành nullchuỗi trống ( xem nguồn tham khảo ). Không có 'đúc gốc' đang diễn ra, bạn có thể chuyển đổi bất cứ thứ gì như thế này, chỉ là kết quả có thể không hữu ích trong một số trường hợp! (nhưng hành vi null cũng có thể được).
VisualMelon

1
Thay thế - nội suy chuỗi :$"{n}"
Andriy Tolstoy

41

Tôi đã từng cố tình đặt chương trình của mình vào namespace Systemđể tôi có thể rút ngắn quyền truy cập vào một lớp cụ thể. So sánh

using System;using M=System.Math;

đến

namespace System{using M=Math;

9
Chỉ cần nhớ rằng tốt hơn là đủ điều kiện các lớp / hàm khi một lần sử dụng giải quyết được vấn đề. Điều này chỉ hữu ích nếu bạn phải gọi một cái gì đó nhiều lần và thậm chí sau đó chỉ cho các mục trong Systemkhông gian tên.
Nick Larsen

Bạn cũng có thể làm using System;class P....
ldam

@Logan: Đây không chỉ là về using System;mà còn có bí danh cho một lớp trong cùng một không gian tên, ngắn hơn cách tôi đã trình bày ở đây.
Joey

Nó thậm chí còn ngắn hơn để làm using static System.Math;trong C # 6 (thêm bạn có thể sử dụng bất kỳ chức năng nào trong số đó như thể chúng thực sự toàn cầu - không phải trong một lớp). Đề xuất ban đầu có thể vẫn ngắn hơn using staticnếu bạn cần truy cập vào nhiều lớp.
sữa

@milk: statictừ khóa bổ sung thường dài hơn bất kỳ khoản tiết kiệm nào khi bỏ qua M.các cuộc gọi phương thức, nhưng vâng, đó là một lựa chọn, nhưng nó có chi phí trả trước rất lớn cần rất nhiều cuộc gọi để khấu hao.
Joey

30

Sử dụng varđể khai báo và khởi tạo biến (đơn) để lưu các ký tự trên loại:

string x="abc";

trở thành

var x="abc";

Tất nhiên là không cần thiết cho inthạt.


2
Hãy nhớ rằng varkhông thể có nhiều người khai báo, ví dụ var x="x",y="y";là không thể.
Ian H.

29

Nếu sử dụng LINQ, bạn có thể truyền trực tiếp một phương thức Selectthay vì tạo lambda.

Vì vậy, thay vì

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

bạn có thể dùng

foo.Select(int.Parse)

trực tiếp

(Được phát hiện gần đây khi cải thiện một trong những câu trả lời C # của Timwi's .)


2
FWITW này được gọi là giảm η
ThreeFx

Nó còn được gọi là phong cách "không có điểm"
Jonathan Wilson

5
Đối với thực tế hơn của chúng ta, nó chỉ đơn giản là ngắn hơn : -þ
Joey

23

Hãy nhớ rằng chương trình có thể biên dịch nhỏ nhất trong C # là 29 ký tự:

class P
{
    static void Main()
    {   
    }
}

Vì vậy, hãy bắt đầu bằng cách loại bỏ nó khỏi chiều dài của bạn và đánh giá câu trả lời của bạn về số tiền đó. C # không thể cạnh tranh với các ngôn ngữ khác khi in hoặc đọc đầu vào, vốn là [code-golf]vấn đề cốt lõi của hầu hết các vấn đề, vì vậy đừng lo lắng về điều đó. Là một người chơi gôn C #, bạn thực sự cạnh tranh với ngôn ngữ.

Một số điều khác cần ghi nhớ:

  • Giảm tất cả các vòng lặp và ifcâu lệnh xuống một dòng nếu có thể để xóa dấu ngoặc.
  • Nếu được cung cấp tùy chọn giữa stdin và dòng lệnh, luôn luôn sử dụng dòng lệnh!

Điều này thường không liên quan đến ternary là tốt;)
jcolebrand

1
As a C# golfer, you're really competing against the language Liên quan không thể tin được
dorukayhan

1
Thật ra, điều đó không đúng. Nó cũng biên dịch bằng static int Main()28 ký tự.
Metoniem


21

Thay vì

bool a = true;
bool b = false;

làm

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

Nếu bạn cần nhiều biến, hãy sử dụng biến này (được đề xuất bởi @VisualMelon )

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

Lưu ý rằng nếu bạn cần nhiều biến cùng loại thì thường rẻ hơn khi khai báo kiểu dấu phẩy tách biệt các khai báobool a=0<1,b=!a;
VisualMelon

18

Ủng hộ các nhà điều hành ternary hơn if.. elsekhối khi thích hợp.

Ví dụ:

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

hiệu quả hơn:

j=i<1?1:0;

15
Tôi có phải là người duy nhất cảm thấy rằng trường hợp thứ hai vốn đã dễ đọc hơn đối với những thứ như thế này nói chung không? Tôi làm điều đó thường xuyên. Ngoài ra, nếu tôi cần tránh một điều kiện null (như trên chuỗi), tôi sẽ làm một cái gì đó như var x = input ?? "";(tôi thích sự kết hợp của mình)
jcolebrand

Có những lúc nó không phải là lựa chọn dễ đọc hơn, đặc biệt là khi i < 1một câu lệnh phức tạp hoặc khi tên của jnó dài. IMO, nó cũng không truyền tải tác dụng phụ rất tốt. Trong trường hợp if (i < 1)một cái gì đó giống như if (SendEmail(recipient))trả về true / false tùy thuộc vào sự thành công của các tác dụng phụ, tôi thích ký hiệu if / then.
Nick Larsen

11
Không cần dấu ngoặc trong trường hợp thứ hai - j=i<1?1:0;là đủ.
Danko Durbić

3
Câu hỏi yêu cầu các mẹo có phần cụ thể đối với C #. Đây là một trong những lời khuyên cho tất cả các ngôn ngữ .
Peter Taylor

4
@PeterTaylor Tôi đã trả lời câu hỏi này hơn 3 năm trước, trước khi chủ đề bạn liên kết được tạo ra
Nellius 18/03/2016

15

Sử dụng hiệu quả sử dụng

Bạn có thể thay thế float (là bí danh cho System.Single) bằng zcách sử dụngz=System.Single;

Sau đó thay thế z=System.Single;bằng z=Single;bằng cách đặt các chương trình trong không gian tên System. (Như câu trả lời của Joey)

Điều này có thể được áp dụng cho các loại giá trị khác (sử dụng cái mà chúng là bí danh), cấu trúc và lớp


14

Nếu bạn cần sử dụng Console.ReadLine()nhiều lần trong mã của mình (tối thiểu 3 lần), bạn có thể làm:

Func<string>r=Console.ReadLine;

và sau đó chỉ cần sử dụng

r()

thay thế


Tôi nghĩ bạn cần loại bỏ ()từ dòng đầu tiên.
mellamokb

@mellamokb đúng vậy, cảm ơn! đã sửa.
Cristian Lupascu

1
Bạn không thể làm gì auto r=Console.ReadLine;?
Claudiu

2
@claudiu không, đáng tiếc không phải ideone.com/jFsVPX
Cristian Lupascu

@Claudiu, autolà một C++động từ. varlà cho C#. Lý do điều này không thể được thực hiện là do Console.ReadLinebị quá tải nên chữ ký hàm cần được chỉ định để báo cho trình biên dịch biết quá tải nào là muốn.
GreatAndPowerfulOz

14

Khi đọc từng ký tự của một đối số dòng lệnh, thay vì lặp theo chiều dài của chuỗi:

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

Bạn có thể lưu một ký tự bằng cách sử dụng khối thử / bắt để tìm kết thúc:

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

Điều này áp dụng cho bất kỳ mảng nào trong một mảng như:

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

7
Điều đó thực sự khủng khiếp ... Tôi yêu nó!
Alex Reinking

Holy crap đây là thiên tài, tôi thực sự vừa cứu một nhân vật trong khi lặp một mảng
Gaspa79

Điều này thực sự xấu xa!
GreatAndPowerfulOz

13

Sử dụng lambdas để xác định hàm trong C # 6

Trong C # 6, bạn có thể sử dụng lambda để xác định hàm:

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

Điều này ngắn hơn so với việc xác định một chức năng như thế này:

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

3
C # 6 cung cấp một loạt khả năng mới về môn đánh gôn
jcolebrand

Trong C # 7, điều này có thể được thực hiện bên trong một chức năng khác để tạo các chức năng cục bộ. Tôi nghi ngờ điều này sẽ giúp ích trong khi chơi golf, nhưng nó vẫn chỉ là một mẹo gọn gàng để biết.
TehPers

1
Đó không phải là chính thức một lambda. Đó là một thành viên thân thể .
đệ quy

13

LINQ

Thay vì sử dụng:

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

để có được Vô số với kết quả của chức năng fcho mọi người inttrong [0,y]bạn có thể sử dụng

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

nếu bạn cần stringhoặc bất cứ điều gì thực hiện Enumerabletrong chương trình của bạn, bạn cũng có thể sử dụng chúng

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

Tôi sử dụng mẹo này trong câu trả lời của mình cho thử thách Chia sẻ bí mật của Shamir .
aloisdg

Tôi không nghĩ rằng phần chuỗi sẽ thực thi nếu bạn không lặp lại vô số với tối ưu hóa. Chỉ thất bại cho tôi cho đến khi tôi đã làm .ToArray ();. Ngoài ra, mẹo tuyệt vời!
Gaspa79

Có liệt kê là lười biếng nhưng điều đó đúng cho cả ba ví dụ không chỉ một ví dụ với chuỗi.
giẻ rách

11

Nếu bạn cần sử dụng chung Dictionary<TKey, TValue>ít nhất hai lần trong mã của mình, bạn có thể khai báo một lớp từ điển, như trong ví dụ này:

class D:Dictionary<int,string>{}

và sau đó chỉ cần sử dụng

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

thay vì lặp đi lặp lại Dictionary<int,string>cho mỗi lần khởi tạo.

Tôi đã sử dụng kỹ thuật này trong câu trả lời này


2
Và cũng "D d" thay vì "var d"
Zukki

@Zukki Rõ ràng! Tôi đã nghĩ gì? :)
Cristian Lupascu

Thay thế:using D = System.Collections.Generic.Dictionary<int,string>;
Andriy Tolstoy

10

Bạn có thể sử dụng floatvà bằng doublechữ để lưu một vài byte.

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

Khi bạn cần một số số inthọc để trả về một floathoặc doublebạn có thể sử dụng chữ để buộc chuyển đổi.

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

Nếu bạn từng gặp phải tình huống phải phân vai, bạn có thể lưu một vài byte bằng cách sử dụng phép nhân thay thế.

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

Thậm chí ngắn hơn:(x-y)*1d/x/y;
đệ quy

9

Hãy nhớ nơi riêng tư hoặc công cộng vốn có, chẳng hạn như sau:

class Default{static void Main()

so với

public class Default { public static void Main()

5
Và luôn luôn chỉ viết một chữ cái trong lớp :-)
Joey

2
Ồ, và một điều tốt đẹp khác, ngụ ý ở đây: Mainchẳng hạn như không cần bất kỳ đối số nào tương phản với Java.
Joey

@Joey: và cũng không cần phải công khai.
R. Martinho Fernandes

1
@martinho ~ bạn đã đọc câu trả lời của tôi chưa? ;) không công khai trên chính
jcolebrand

@Joey ~ Tôi đã cố gắng giữ nó cho mỗi bài viết;) ... hình dung người khác sẽ đăng bài về chính hoặc các lớp chỉ là một chữ cái. Xem như cách mà không ai khác có, tôi cũng sẽ tiếp tục và thêm cái đó nữa.
jcolebrand

9

Đối với biểu thức lambda một dòng, bạn có thể bỏ qua dấu ngoặc và dấu chấm phẩy. Đối với các biểu thức một tham số, bạn có thể bỏ qua dấu ngoặc đơn.

Thay vì

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

Sử dụng

SomeCall(x=>DoSomething);

11
Tôi không bao giờ viết dấu ngoặc đơn cho lambdas một tham số, ngay cả trên mã sản xuất.
R. Martinho Fernandes

Tôi luôn sử dụng dấu ngoặc vì tôi muốn chia lambda thành nhiều dòng để dễ đọc.
Juliana Peña

3
SomeCall(DoSomething)thậm chí còn tốt hơn
GreatAndPowerfulOz

9

Vòng lặp:

Khai báo biến:

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

trở nên:

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

Và nếu bạn chỉ có nhu cầu hoặc làm việc với biến i một lần, bạn có thể bắt đầu ở -1 (hoặc 0 tùy thuộc vào hoàn cảnh vòng lặp) và tăng nội tuyến:

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

đến

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

Và điều đó làm giảm một ký tự và cũng làm xáo trộn mã một chút. Chỉ làm điều đó với itham chiếu FIRST , như vậy: (được tối ưu hóa một ký tự không nhiều, nhưng chúng có thể giúp)

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

đến

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

khi vòng lặp không phải tăng i(vòng lặp thứ tự ngược):

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

Tôi thường đặt các ++trường hợp như vậy trực tiếp vào tiêu đề vòng lặp: for(;++i<max;)cả hai đều dễ theo dõi hơn và khó bị sai hơn.
Joey

@Joey Trong những trường hợp đó, tôi có xu hướng chuyển sang while (++ i <max) có cùng độ dài nhưng dễ đọc hơn.
ICR

ICR: tùy thuộc vào việc bạn có thể đặt câu lệnh khác (trước đó) vào fortiêu đề hay không, sau đó sẽ lưu lại một ký tự.
Joey

Bạn có thể di chuyển cả hai khai báo trở lại mệnh đề for để tiết kiệm byte 1.
đệ quy

Tôi thích thay đổi for(;i<max;)để while(i<max). Cùng một số byte, nhưng đối với tôi nó trông gọn gàng hơn.
Ayb4btu

8

Có những trường hợp khi một tham số đầu ra có thể lưu các ký tự. Đây là một ví dụ hơi khó hiểu , thuật toán điểm bowling 10 pin.

Với một tuyên bố trở lại:

........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;}

Và với một tham số đầu ra:

........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;}}

Tham số đầu ra ở đây lưu tổng cộng 5 ký tự.


8

Trong C #, chúng tôi không được phép làm if(n%2)để kiểm tra nếu nlà số chẵn. Nếu chúng ta làm, chúng ta nhận được một cannot implicity convert int to bool. Một cách xử lý ngây thơ sẽ là:

if(n%2==0)

Một cách tốt hơn là sử dụng:

if(n%2<1)

Tôi đã sử dụng điều này để đạt được một byte ở đây .

lưu ý rằng điều này chỉ hoạt động đối với các số dương, vì -1%2==-1, nó được xem xét ngay cả với phương pháp này.


6

Nội suy chuỗi

Một cải tiến thực sự tiết kiệm không gian đơn giản là nội suy. Thay vì:

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

chỉ sử dụng $để biểu thức nội tuyến:

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

Điều này, cùng với các thân biểu thức mới trong C # 6.0 sẽ làm cho bất kỳ thử thách tính toán chuỗi đơn giản nào trở nên dễ chơi trong C #.


3
Cũng lưu ý rằng i+$" bottles of beer";ngắn hơn $"{i} bottles of beer".
aloisdg

1
@aloitorg Trong trường hợp đầu tiên, bạn nên rời $khỏi, mặc dù.
Metoniem

@Metoniem Thật vậy! Tôi để nó bởi vì trong trường hợp ban đầu của tôi, tôi có hai {i}cái ở phía trước và một cái ở giữa;)
aloisdg

@aloitorg Ahh, tôi hiểu rồi. Vâng, bình luận xấu hổ không thể được chỉnh sửa :(
Metoniem

6

Sử dụng C # lambda. Vì PPCG cho phép lambda cho đầu vào / đầu ra, chúng ta nên sử dụng chúng.

Một phương thức C # cổ điển trông như thế này:

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

Là một lambda, chúng tôi sẽ viết

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

Lambda ẩn danh cũng được cho phép:

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

Loại bỏ tất cả các tiếng ồn và tập trung!

Cập nhật:

Chúng tôi có thể cải thiện một bước nữa với việc currying như bình luận @TheLethalCoder:

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

Ví dụ về dòng điện bởi @Felix Palmen: Cách tính khóa WPA?

Sẽ hữu ích khi bạn có chính xác 2 tham số, sau đó một biến không sử dụng trống _sẽ tốt hơn. Xem bài viết về meta này . Tôi sử dụng thủ thuật này ở đây . Bạn sẽ phải thay đổi một chút chức năng. Ví dụ: Hãy thử trực tuyến!


1
Không chắc chắn liệu nó có ở đâu khác trong các mẹo hay không nhưng với ví dụ này, bạn cũng có thể sử dụng cà ri ...s=>c=>...
TheLethalCoder

@TheLethalCoder Thật vậy, chúng ta có thể! Tôi sẽ cập nhật câu trả lời cảm ơn!
aloisdg

Bạn có thể sử dụng eta-giảm trong trường hợp này? Một cái gì đó như thế này : s=>s.Contains.
corvus_192

Lưu ý rằng các câu trả lời C # và Java của loại 'lambda' chưa được yêu thích, bạn có thể muốn tham gia thảo luận về bài đăng meta này . Giải pháp thay thế được đề xuất là(string s,char c)=>s.Contains(c)
VisualMelon


5

Đặt tên lớp chỉ một chữ cái. Nâng cao về Mẹo chơi golf mã trong C # chúng tôi đi từ

class Default{static void Main()

đến

class D{static void Main()

trong đó đánh bại 6 ký tự khác trong trường hợp này.


1
ditto với tên biến
Nellius

11
Làm thế nào là "ít nhất là phần nào cụ thể cho C #"?
Peter Taylor


5

Hoán đổi hai biến

Thông thường, để hoán đổi hai biến, bạn phải khai báo một biến tạm thời để lưu trữ giá trị. Nó sẽ trông giống như một cái gì đó dọc theo dòng này:

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

Đó là 16 byte! Có một số phương pháp hoán đổi khác là tốt hơn.

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

Ba cái cuối cùng chỉ hoạt động cho các giá trị số và như chỉ ASCII chỉ ra, hai cái cuối cùng có thể dẫn đến ngoại lệ ArithaturesOverflow. Tất cả các mục trên là 12 byte, tiết kiệm 4 byte so với ví dụ đầu tiên.


Tuy nhiên, chỉ áp dụng cho các số và thậm chí mọi thứ khác ngoài rủi ro bộ dữ liệu và rủi ro xor chạy vào giới hạn số nguyên của bạn đang áp dụng điều này cho số nguyên. Đôi khi, các loại số khác cũng sẽ chạy theo giới hạn
ASCII - chỉ

4

Sử dụng LinqPad sẽ cung cấp cho bạn khả năng loại bỏ tất cả chi phí chương trình vì bạn có thể thực hiện các câu lệnh trực tiếp. (Và nó phải hoàn toàn hợp pháp trong codegolf ... Không ai nói rằng bạn cần một .exe)

Đầu ra được thực hiện bằng .Dump()phương pháp mở rộng.


.NetFiddle hỗ trợ .Dump();)
aloisdg

4

(Một trường hợp cụ thể biết ưu tiên nhà điều hành của bạn !)

Sử dụng %cho phép trừ giới hạn chặt chẽ (phần nào). Điều này có thể giúp bạn tiết kiệm được một cặp dấu ngoặc quanh phép trừ, kết quả mà bạn muốn nhân hoặc chia cho một cái gì đó; nhưng hãy cẩn thận, nó có những hạn chế nghiêm trọng

Thay vì

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)

Xem xét

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

Ví dụ:

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

Tôi mới chỉ phát hiện ra điều này và tôi cảm thấy nó sẽ là điều đáng ghi nhớ mỗi khi làm việc với ASCII trong tương lai. (Tôi hiện đang chơi golf ở một nơi nào đó nơi tôi đang sử dụng ASCII cho các biểu diễn số nhỏ gọn, nhưng cần nhân với 1hoặc -1dựa trên một điều kiện khác và 2 byte này bị sọc)


4

Nếu bạn cần bao gồm nhiều usings mà tất cả rơi vào cùng một cấu trúc phân cấp, thì thường ngắn hơn để sử dụng cái dài nhất như namespace:

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

vs

namespace System.Linq
{
    //Some code
}

3

Được phát hiện tối nay "trong các rãnh" trong khi cải thiện một số mã golf ... nếu bạn có một lớp để xử lý, bạn có thể thực hiện công việc trong hàm tạo để lưu khai báo một phương thức.

Tôi đã phát hiện ra điều này trong khi giảm một ứng dụng giao diện điều khiển - vì có một static void Main(), tất cả các hàm và biến phải được khai báo là tĩnh. Tôi đã tạo một lớp lồng nhau với các hàm và biến thành viên, với công việc chính được thực hiện trong hàm tạo. Điều này cũng lưu các ký tự trong mã gọi.

ví dụ: Class với phương thức:

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

Lớp với công việc trong hàm tạo:

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

Ví dụ này lưu 9 ký tự.



3

Khai báo các chuỗi rỗng / khớp với nhau

Nếu bạn cần khai báo nhiều chuỗi trống / khớp, bạn có thể lưu một vài byte bằng cách sau:

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

Thật không may var a="",b=a,c=a;là bất hợp pháp, nhưimplicitly type variable cannot have multiple declarators


Bạn có thể làm var a=b=c=""như trong javascript không?
corvus_192

@ corvus_192 không - tiếc là không.
Erresen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.