Tips untuk bermain golf di D2

10

Apa tips umum yang Anda miliki untuk bermain golf di D ? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk D (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.

kucing
sumber

Jawaban:

1

Lihat, tidak ada orangtua!

Fungsi D dan fungsi templat dapat disebut sebagai nilai, metode (tidak akan membantu), dan properti.

Saya tidak percaya belum ada yang mengatakan ini. Saya akan mencantumkan yang menyimpan byte:

  • fun()dan fun!()()disingkat menjadi fun(dengan asumsi tidak ada variabel fun).
  • fun(par)disingkat menjadi par.fun(dengan asumsi partidak memiliki properti / metode fun, serta partidak menjadi ekspresi seperti 5+2).
  • fun!(T)() disingkat menjadi fun!T
  • fun!(T)(par)disingkat menjadi par.fun!T(dengan asumsi partidak memiliki properti / metode fun)

Dan dengan benda-benda:

  • new cls()disingkat menjadi new cls(Lebih JavaScript siapa saja?)
  • obj.fun()dan obj.fun!()()disingkat menjadiobj.fun
  • obj.fun!(T)() disingkat menjadi obj.fun!T

Satu hal terakhir, gunakan versi lama . Ini memungkinkan Anda untuk menggunakan fitur usang yang mempersingkat kode Anda. Yang mengatakan, saran terbaik: D tidak baik untuk kode-golf. Ini adalah bahasa yang hebat, tidak untuk golf kode.

Zacharý
sumber
Terima untuk sekarang :)
kucing
Ya, senang tahu masih ada penggemar D di sini.
Zacharý
1

D adalah JavaScript.


Tentu saja tidak. Tetapi, ketika berurusan dengan float, doubledan real, nanadalah nilai yang harus ditangani, dan, sebagaimana ditentukan oleh IEEE 754, NaN tidak membandingkan sama dengan dirinya sendiri.

writeln(double.nan == double.nan); // false

Berarti,

writeln(value!=value); // only true for nan

jauh lebih pendek dari

import std.math;
writeln(isNaN(value));

Jelas, selalu menggunakan math.isNaNuntuk nyata kode. ;)

kucing
sumber
0

D memiliki tipe inferensi dan autokata kunci. Jika objek tidak int, maka automungkin lebih pendek.

kucing
sumber
Apakah autoberfungsi ketika membangun array asosiatif dengan KeyType[ValueType]sintaks?
Alex A.
@AlexA. auto asd = ["a":1, "b": 2];berfungsi, tetapi karena KeyType[ValueType]akan menggantikan autokata kunci, saya tidak tahu apakah itu akan selalu bekerja dengan jenis yang literalnya tidak dapat dikonstruksi
cat
@AlexA. auto arr = ["a": true, "b": 6];berfungsi, kunci dan nilai harus dari jenis yang kompatibel
cat
0

D hebat dalam metode chaining, tetapi:

str.toLower.strip().split("").sort();

sama dengan

sort(split(strip(str.toLower),""));

dan biasanya yang tidak dirantai lebih pendek, yang baru saya sadari, yang memungkinkan saya mempersingkat jawaban saya untuk Kelola Sampah Jadi : D

kucing
sumber
Ini titik-titik itu
CalculatorFeline
0

Seperti C / C ++, mainbisa intatau void, tetapi void main(){}akan selalu lebih pendek dari int main(){return my_func_returning_int;}.

kucing
sumber
Jika pertanyaannya meminta untuk mengeluarkan integer tidak int main(){return output}akan lebih pendek?
andlrc
@ dev-null jika pertanyaannya meminta program lengkap menulis integer ke stdout, maka import std.stdio;void main(){write(7);}itulah yang dibutuhkan. Saya ragu pertanyaan akan mengamanatkan program mengembalikan nomor karena banyak bahasa tidak dapat menetapkan kode kembali
cat
@ dev-null Namun, ya, dalam hal itu tidak boleh ditulis ke stdout tetapi dikembalikan, itu akan lebih pendek
cat
2
Biasanya Anda diizinkan untuk mengembalikan / menampilkan cara yang paling nyaman untuk bahasa Anda. Tapi saya kira D hanya mendukung kode keluar dari 0-255?
andlrc
@ dev-null sebenarnya, POSIX hanya mendukung kode keluar hingga 255. Saya tidak tahu tentang Windows, tetapi pada Unix / Linux kode keluar lebih dari 255 membungkus, karena melimpah.
kucing
0

D, sebagai bahasa pemrograman sistem multi-paradigma (Objek Fungsional), tampaknya merangkul TIMTOWTDI, atau Ada Lebih Dari Satu Cara Untuk Melakukannya.

Contoh kasus, menulis argumen program:

import std.stdio, std.array, std.algorithm;

void main(string[] args) {
    for(int i=0;i<args.length;writeln(args[i++])){};

    foreach(a;args)writeln(a);

    each!writeln(args);
}

Perhatikan bahwa C-style for-loop membutuhkan {}sebagai blok kosong dan tidak akan menerima titik koma atau tidak sama sekali sebagai pernyataan kosong, dalam hal ini . Biasanya, atau ;tidak ada operasi.

kucing
sumber
Bisakah Anda menggunakan char*tempat stringuntuk menyimpan byte?
Alex A.
@AlexA. function D main parameters must be main() or main(string[] args)selain itu, charsecara harfiah satu karakter, char*adalah penunjuk ke harfiah satu karakter dan char[]merupakan array literal karakter (string berbeda). D! = C || C ++
cat
1
OKI. Tidak pernah menggunakan D, hanya menebak.
Alex A.
0

D memiliki beberapa jenis ekspresi lambda gaya C #, yang dapat ditetapkan dan berdiri sendiri:

(int a,int b)=>a*b;

auto a=(int a,int b)=>a*b;

Namun, tidak seperti C #, tipe tanda tangan masih diperlukan karena D tidak memiliki tipe kesimpulan Haskell.

https://dlang.org/spec/expression.html#Lambda

kucing
sumber
Templat fungsi untuk memasukkan jenis golf? T f(T)(T a,T b){return a + b}harus menyimpulkan T sebagai int dif(5);
s fede.
@fedes. Halo teman! Ya, Anda memang benar (tapi saya pikir / berharap lambda "tidak diketik" akan lebih pendek dari ekspresi fungsi yang diketik).
kucing
Ah, tentu saja! Ketika saya memutuskan untuk melihat D lagi, siapa yang saya temukan? : DI secara obyektif menyatakan Anda memiliki selera bahasa yang baik
fede s.
@fedes. Ah, mengapa terima kasih! : P yang menyiratkan Anda juga (tapi saya belum menghabiskan cukup waktu di depan Smalltalk, toh :))
cat
0

Memanggil fungsi pada objek tanpa argumen lain

reverse(x);

hampir selalu dapat dipersingkat menjadi

x.reverse;

untuk mencukur satu byte atau lebih.

Ini karena .LHS menjadikan argumen pertama yang implisit, dan templating memungkinkan kita memilih fungsi yang tepat untuk argumen tersebut.

kucing
sumber
Bintik bagus? Ini membingungkan ...
CalculatorFeline
@CatsAreFluffy ketika tidak ada argumen. Ketika ada argumen lain, x.reverse(y, z)itu lebih lama karena titik
kucing
1
x.reverse(y,z)dan reverse(x,y,z)memiliki jumlah byte yang sama.
Zacharý
@ ZakaryT Eh, yeah ...
kucing
Apakah Anda membandingkan x.reverse(y, z)ke x.reverse?
Zacharý
0

Jika pertanyaannya membutuhkan program lengkap, moduledeklarasi itu secara mengejutkan tidak diperlukan.

* batuk * Jawa, siapa pun? * membersihkan tenggorokan * Sebenarnya , modulesistem D lebih tua dari Java.

kucing
sumber