Apa tips umum yang Anda miliki untuk bermain golf di C #? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk C # (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
- dipinjam dari ide marcog;)
Jawaban:
Alih-alih menggunakan
.ToString()
digunakan+""
untuk numerik dan jenis lain yang dapat dilemparkan ke string secara aman.sumber
(1+"").DoSomethingWith1String();
String.Concat(object)
dengan argumen, daripada panggilan virtualobject.ToString()
.Concat
secara eksplisit mengkonversinull
ke string kosong ( lihat sumber referensi ). Tidak ada 'casting asli' yang terjadi, Anda dapat mengonversi sesuatu seperti ini, hanya saja hasilnya mungkin tidak terlalu berguna dalam beberapa kasus! (tetapi perilaku null mungkin).$"{n}"
Saya pernah sengaja menempatkan program saya
namespace System
sehingga saya dapat mempersingkat akses ke kelas tertentu. Membandingkanuntuk
sumber
System
namespace.using System;class P...
.using System;
tetapi juga tentang memiliki alias untuk kelas di namespace yang sama, yang lebih pendek seperti yang saya tunjukkan di sini.using static System.Math;
di C # 6 (tambahkan Anda dapat menggunakan salah satu dari fungsi-fungsi itu seolah-olah mereka benar-benar global - bukan di kelas). Saran asli mungkin masih lebih pendek daripadausing static
jika Anda perlu mengakses beberapa kelas.static
kata kunci tambahan sering kali lebih lama daripada penghematan untuk tidakM.
menggunakan pemanggilan metode, tapi ya, itu adalah pilihan, tetapi ia datang dengan biaya dimuka yang besar dan membutuhkan banyak panggilan untuk diamortisasi.Gunakan
var
untuk mendeklarasikan dan menginisialisasi variabel (tunggal) untuk menyimpan karakter pada tipe:menjadi
int
Tentu saja tidak diperlukan .sumber
var
tidak dapat memiliki beberapa deklarator, misalnyavar x="x",y="y";
tidak mungkin.Jika menggunakan LINQ, Anda dapat meneruskan metode secara langsung
Select
daripada membuat lambda.Jadi, bukannya
Anda dapat gunakan
langsung.
(Ditemukan baru-baru ini ketika memperbaiki salah satu jawaban C # Timwi .)
sumber
Ingatlah bahwa program kompilasi terkecil di C # adalah 29 karakter:
Jadi mulailah dengan menghapus itu dari panjang Anda dan menilai jawaban Anda pada berapa banyak yang dibutuhkan. C # tidak dapat bersaing dengan bahasa lain dalam hal mencetak atau membaca input, yang merupakan jantung dari sebagian besar
[code-golf]
masalah, jadi jangan khawatir tentang itu. Sebagai pegolf C #, Anda benar-benar bersaing melawan bahasa.Beberapa hal lain yang perlu diingat:
if
pernyataan ke satu baris jika memungkinkan untuk menghapus tanda kurung.sumber
As a C# golfer, you're really competing against the language
static int Main()
juga, yang akan menjadi 28 karakter.return
sesuatu .Dari pada
melakukan
Jika Anda memerlukan banyak variabel, gunakan ini (disarankan oleh @VisualMelon )
sumber
bool a=0<1,b=!a;
Mendukung operator ternary lebih dari
if
..else
blok mana yang sesuai.Sebagai contoh:
lebih efisien:
sumber
var x = input ?? "";
(Saya sukai < 1
pernyataan yang kompleks atau ketika namaj
panjang. IMO, ternyata juga gagal menyampaikan efek samping dengan sangat baik. Dalam kasus di manaif (i < 1)
ada sesuatu sepertiif (SendEmail(recipient))
yang mengembalikan benar / salah tergantung pada keberhasilan efek samping, saya lebih suka notasi if / then.j=i<1?1:0;
sudah cukup.Penggunaan penggunaan yang efektif
Anda dapat mengganti
float
(yang merupakan alias untukSystem.Single
) denganz
menggunakanz=System.Single;
Kemudian ganti
z=System.Single;
denganz=Single;
dengan menempatkan program di namespaceSystem
. (Seperti dengan jawaban Joey)Ini dapat diterapkan untuk tipe nilai lainnya (gunakan apa yang mereka alias), struct dan kelas
sumber
Jika Anda perlu menggunakan
Console.ReadLine()
beberapa kali dalam kode Anda (minimal 3 kali), Anda dapat melakukan:dan kemudian gunakan saja
sebagai gantinya
sumber
()
dari baris pertama.auto r=Console.ReadLine;
?auto
adalahC++
kata kerja.var
adalah untukC#
. Alasan ini tidak dapat dilakukan adalah karenaConsole.ReadLine
kelebihan beban sehingga tanda tangan fungsi perlu ditentukan untuk memberi tahu kompiler mana kelebihan beban yang diinginkan.Saat membaca setiap karakter argumen baris perintah, alih-alih merangkak ke panjang string:
Anda dapat menyimpan karakter dengan menggunakan blok coba / tangkap untuk menemukan akhir:
Ini berlaku untuk sembarang array dalam array seperti:
string[]
int[][]
IList<IList<T>>
sumber
Gunakan lambdas untuk mendefinisikan fungsi dalam C # 6
Di C # 6, Anda bisa menggunakan lambda untuk mendefinisikan fungsi:
Ini lebih pendek daripada mendefinisikan fungsi seperti ini:
sumber
LINQ
Alih-alih menggunakan:
untuk mendapatkan Enumerable dengan hasil dari fungsi
f
untuk setiapint
di[0,y]
Anda dapat menggunakanjika Anda membutuhkan
string
atau apa pun yang mengimplementasikanEnumerable
dalam program Anda, Anda dapat menggunakannya jugasumber
Jika Anda perlu menggunakan generik
Dictionary<TKey, TValue>
setidaknya dua kali dalam kode Anda, Anda bisa mendeklarasikan kelas kamus, seperti dalam contoh ini:dan kemudian gunakan saja
bukannya mengulangi
Dictionary<int,string>
untuk setiap instantiation.Saya telah menggunakan teknik ini dalam jawaban ini
sumber
using D = System.Collections.Generic.Dictionary<int,string>;
Anda dapat menggunakan
float
dandouble
literal untuk menyimpan beberapa byte.Ketika Anda membutuhkan
int
aritmatika untuk mengembalikanfloat
ataudouble
Anda dapat menggunakan literal untuk memaksa konversi.Jika Anda pernah mengalami situasi di mana Anda harus melakukan cast, Anda dapat menyimpan beberapa byte dengan menggunakan multiplikasi sebagai gantinya.
sumber
(x-y)*1d/x/y;
Ingat di mana privat atau publik melekat, seperti berikut ini:
jika dibandingkan dengan
sumber
Main
, tidak perlu argumen yang berbeda dengan Java.Untuk ekspresi lambda satu-baris, Anda dapat melewati tanda kurung dan titik koma. Untuk ekspresi satu-parameter, Anda dapat melewati tanda kurung.
Dari pada
Menggunakan
sumber
SomeCall(DoSomething)
bahkan lebih baikLooping:
Deklarasi variabel:
menjadi:
Dan jika Anda perlu atau bekerja dengan variabel i hanya sekali, Anda bisa mulai dari -1 (atau 0 tergantung pada keadaan loop) dan kenaikan sebaris:
untuk
Dan itu berkurang satu karakter, dan sedikit mengaburkan kode juga. Hanya lakukan itu pada
i
referensi PERTAMA , seperti: (diberikan optimasi satu karakter tidak banyak, tetapi mereka dapat membantu)untuk
ketika loop tidak harus bertambah
i
(loop urutan terbalik):sumber
++
dalam kasus seperti itu langsung ke header loop:for(;++i<max;)
yang lebih mudah diikuti dan lebih sulit untuk salah.for
header juga, yang kemudian akan menyimpan karakter lagi.for(;i<max;)
kewhile(i<max)
. Jumlah byte yang sama, tetapi bagi saya itu hanya terlihat lebih bersih.Ada keadaan ketika parameter output dapat menyimpan karakter. Inilah contoh yang sedikit dibuat-buat, algoritma skor bowling 10 pin.
Dengan pernyataan pengembalian:
Dan dengan parameter output:
Parameter output di sini menyimpan total 5 karakter.
sumber
Dalam C #, kami tidak diizinkan melakukan
if(n%2)
untuk memeriksa apakahn
nomor genap. Jika kita lakukan, kita mendapatkancannot implicity convert int to bool
. Penanganan naif akan dilakukan:Cara yang lebih baik adalah menggunakan:
Saya menggunakan ini untuk mendapatkan satu byte di sini .
perhatikan bahwa ini hanya berfungsi untuk angka positif, karena
-1%2==-1
dianggap bahkan dengan metode ini.sumber
Interpolasi String
Peningkatan hemat-ruang yang sangat sederhana adalah interpolasi. Dari pada:
cukup gunakan
$
untuk inline expressions:Ini, bersama dengan badan ekspresi baru di C # 6.0 harus membuat tantangan kalkulasi string sederhana cukup mudah di C #.
sumber
i+$" bottles of beer";
lebih pendek dari$"{i} bottles of beer"
.$
.{i}
Gunakan C # lambda. Karena PPCG memungkinkan lambda untuk input / output, kita harus menggunakannya.
Metode C # klasik terlihat seperti ini:
Sebagai lambda, kami akan menulis
Lambda anonim juga diizinkan:
Hapus semua kebisingan dan fokus!
Memperbarui:
Kita bisa meningkatkan satu langkah lagi dengan currying sebagai @TheLethalCoder komentar:
Contoh arus oleh @Felix Palmen: Bagaimana menghitung kunci WPA?
Ini akan sangat membantu ketika Anda memiliki tepat 2 parameter, maka variabel kosong yang tidak digunakan
_
akan lebih baik. Lihat meta pos tentang ini . Saya menggunakan trik ini di sini . Anda harus mengubah sedikit fungsinya. Contoh: Coba online!sumber
s=>c=>...
s=>s.Contains
.(string s,char c)=>s.Contains(c)
Buat nama kelas hanya satu huruf. Meningkatkan Tips untuk kode-golf di C # kita mulai
untuk
yang merobohkan 6 karakter lain dalam kasus ini.
sumber
The
Compute
contoh metodeSystem.Data.DataTable
, memungkinkan untuk mengevaluasi ekspresi string sederhana, misalnya:C # (Visual C # Compiler) , 166 byte
Cobalah online!
Tidak terlalu "golfy", tetapi kadang-kadang mungkin bermanfaat.
sumber
Bertukar dua variabel
Biasanya, untuk menukar dua variabel, Anda harus mendeklarasikan variabel sementara untuk menyimpan nilai. Ini akan terlihat seperti sesuatu di sepanjang baris ini:
Itu 16 byte! Ada beberapa metode pertukaran lainnya yang lebih baik.
Tiga yang terakhir hanya berfungsi untuk nilai numerik, dan seperti yang ditunjukkan ASCII saja, dua yang terakhir mungkin menghasilkan pengecualian ArithmeticOverflow. Semua hal di atas adalah 12 byte, penghematan 4 byte dibandingkan dengan contoh pertama.
sumber
Menggunakan LinqPad akan memberi Anda kemungkinan untuk menghapus semua overhead program karena Anda dapat menjalankan pernyataan secara langsung. (Dan itu harus sepenuhnya legal dalam codegolf ... Tidak ada yang mengatakan Anda memerlukan .exe)
Output dilakukan dengan menggunakan
.Dump()
metode ekstensi.sumber
.Dump()
;)(Kasus khusus untuk mengetahui prioritas operator Anda !)
Gunakan
%
untuk pengurangan terbatas (agak) yang mengikat ketat. Ini dapat menghemat sepasang kurung di sekitar pengurangan, yang hasilnya ingin Anda gandakan atau bagi dengan sesuatu; tapi hati-hati, ini memiliki keterbatasan serius.Dari pada
Mempertimbangkan
Contoh:
Saya baru saja menemukan ini, dan saya merasa itu akan menjadi hal yang berharga untuk diingat setiap kali bekerja dengan ASCII di masa depan. (Saat ini saya bermain golf di suatu tempat di mana saya menggunakan ASCII untuk representasi numerik yang ringkas, tetapi perlu mengalikan dengan
1
atau-1
berdasarkan kondisi lain, dan ini bergaris 2 byte)sumber
Jika Anda perlu memasukkan beberapa
using
s yang semuanya jatuh dari hierarki yang sama, seringkali lebih pendek untuk menggunakan yang terlama sebagainamespace
:vs:
sumber
Ditemukan malam ini "di parit" sambil meningkatkan beberapa kode golf ... jika Anda memiliki kelas untuk pemrosesan Anda, Anda dapat melakukan pekerjaan di konstruktor untuk menyimpan mendeklarasikan metode.
Saya menemukan ini sambil mengurangi aplikasi konsol - karena ada
static void Main()
, semua fungsi dan variabel harus dinyatakan statis. Saya membuat kelas bersarang dengan fungsi dan variabel anggota, dengan pekerjaan utama dilakukan di konstruktor. Ini juga menyimpan karakter dalam kode panggilan.mis. Kelas dengan metode:
Kelas dengan pekerjaan di konstruktor:
Contoh ini menyimpan 9 karakter.
sumber
Gunakan
Action
sukaFunc
untuk mengatur fungsi ke variabel.Action
mengembalikan apa-apa (void
) sehingga sangat bagus untuk mencetak.Sebagai contoh:
Tips ini terinspirasi oleh @ W0lf contoh penggunaan
Func
denganReadLine
.sumber
Deklarasikan string kosong / cocok bersama-sama
Jika Anda perlu mendeklarasikan beberapa string kosong / cocok, Anda dapat menyimpan beberapa byte dengan yang berikut:
Sayangnya
var a="",b=a,c=a;
ilegal, karenaimplicitly type variable cannot have multiple declarators
sumber
var a=b=c=""
di javascript?