D2でのゴルフのヒント


10

Dでゴルフをするための一般的なヒントはありますか?私は、コードゴルフの問題全般に適用できる、少なくともある程度Dに固有のアイデアを探しています(たとえば、「コメントの削除」は回答ではありません)。回答ごとに1つのヒントを投稿してください。

回答:


1

かっこなし!

Dの関数とテンプレート関数は、値、メソッド(役に立たない)、およびプロパティとして呼び出すことができます。

まだ誰も言っていないなんて信じられない。バイトを節約するものをリストします:

  • fun()fun!()()短縮しますfun(変数がない場合fun)。
  • fun(par)に短縮されますpar.funparプロパティ/メソッドfunparないこと、およびのような式ではないと想定5+2)。
  • fun!(T)() 短縮する fun!T
  • fun!(T)(par)短縮par.fun!Tparプロパティ/メソッドがないと仮定fun

そしてオブジェクトと:

  • new cls()短くnew cls(もっとJavaScriptの誰?)
  • obj.fun()そしてobj.fun!()()短くするobj.fun
  • obj.fun!(T)() 短縮する obj.fun!T

最後に、古いバージョンを使用してください。コードを短縮する非推奨の機能を使用できます。とはいえ、最良のアドバイス:Dはコードゴルフには向いていません。それは素晴らしい言語です、ただコードゴルフのためではありません。


とりあえず受け入れる:)
cat

ええ、まだDのファンがいるのを知って良かったです。
ザカリー

1

DはJavaScriptです。


明らかにそうではありません。扱う場合には、floatdoubleおよびrealnanIEEE 754で指定され、処理され、されなければならない値であり、NaNはそれ自体と等しく比較しません。

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

意味、

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

よりずっと短い

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

もちろん、常に実際のコードに使用math.isNaNしてください。;)


0

Dには型推論とautoキーワードがあります。オブジェクトがない場合にはint、その後、autoおそらく短いです。


構文でauto連想配列を作成するときに機能しKeyType[ValueType]ますか?
Alex A.

@AlexA。auto asd = ["a":1, "b": 2];動作しますが、以降KeyType[ValueType]の代わりに行くautoのキーワードそれは常にリテラルを構築することができないため種類で動作するかどうか、私は知らない

@AlexA。auto arr = ["a": true, "b": 6];動作します。キーと値は互換性のあるタイプである必要があります
cat

0

Dはメソッドチェーンが得意ですが、

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

と同じです

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

そして通常、非連鎖の方が短いので、気づきましたが、ゴミ箱管理するための私の答えを短くできます:D


それはそれらの点です
CalculatorFeline

0

C / C ++と同様に、またはにmainすることができますが、常により短くなります。intvoidvoid main(){}int main(){return my_func_returning_int;}


整数を出力するように質問する場合、int main(){return output}短くないでしょうか?
andlrc 2016

@ dev-nullの質問で、整数をstdoutに書き込む完全なプログラムがimport std.stdio;void main(){write(7);}必要な場合は、それが必要です。私は質問が義務付けはないだろうプログラムは多くの言語は、リターンコードを設定することはできませんので、数を返す
猫を

@ dev-nullただし、はい、標準出力に書き込まに返す必要がある場合は、短くなります
cat

2
通常、あなたはあなたの言語にとって最も便利な方法を返す/出力することが許可されています。しかし、Dは0〜255の終了コードしかサポートしていないと思いますか?
andlrc 2016

@ dev-null実際、POSIXは255までの終了コードしかサポートしていません。Windowsについては知りませんが、Unix / Linuxではオーバーフローのため、255を超える終了コードがラップアラウンドします。
猫、

0

Dは、マルチパラダイム(オブジェクト機能)システムプログラミング言語として、TIMTOWTDIを採用しているようです。

適切な例として、プログラムのargvを記述します。

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

forループC-スタイルを注意することは必要で{}、空のブロックとしてや、空白文としてセミコロンまたは何も受け付けません。この場合には。通常、または;何もしません。


char*代わりに使用しstringてバイトを保存できますか?
Alex A.

@AlexA。function D main parameters must be main() or main(string[] args)さらに、charは文字通り1文字でchar*あり、文字通り1文字へのポインタであり、char[]文字リテラルの配列です(文字列は異なります)。D!= C || C ++

1
OIC。Dを使用したことはなく、推測しただけです。
Alex A.

0

DにはいくつかのタイプのC#スタイルのラムダ式があり、割り当ててスタンドアロンで使用できます。

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

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

ただし、C#とは異なり、DにはHaskellレベルの型推論がないため、署名の型は依然として必要です。

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


タイプをゴルフするための関数テンプレート?Tint in としてT f(T)(T a,T b){return a + b}推測する必要がありますf(5);
fede s。

@fedes。こんにちは!はい、あなたはまったく正しいです(しかし、「型なし」ラムダは型付き関数式よりも短くなると思います/望んでいます)。

ああ、ofc!Dをもう一度見直すことにしたとき、誰を見つけますか?:DIは、客観的に言語が上手であることを客観的に宣言します
fede s。

@fedes。ああ、どうしてありがとう!:Pあなたもそうすることを意味します(しかし、私はSmalltalkの前で十分な時間を費やしていませんが、とにかく:))

0

他の引数なしでオブジェクトの関数を呼び出す

reverse(x);

ほとんどの場合、

x.reverse;

バイト以上を剃る。

これは.、LHSを暗黙の最初の引数にし、テンプレート化により、引数に適切な関数を選択できるためです。


ドットはいいですか?これは混乱しています...
CalculatorFeline

引数がない場合の@CatsAreFluffy。別の引数があります場合は、x.reverse(y, z)長いのでドットである

1
x.reverse(y,z)reverse(x,y,z)同じバイト数を持っています。
ザカリー

@ZacharyTええと、ええと...

と比較x.reverse(y, z)しましたx.reverseか?
ザカリー

0

質問が完全なプログラムを必要とする場合、module宣言は驚くほど不必要です。

*咳* Java、誰か?*のどをクリア* 実際には、DのmoduleシステムはJavaのシステムよりも古いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.