Codeforces #215 A in D

プログラミングがしたくなったけど特にすることがなかったので適当に競プロの問題を解いていた。ら、めっちゃ時間かかった。でも最終的にはかなり可読性の高い感じのするプログラムに。UFCS っょぃ。アルゴリズム自体は何でもないただの貪欲法(だよね……?)だけど D 言語的に得るところが結構多かったのでメモしておく。

解いていたのはこちらの問題

自分の解答はこちら。

L4:配列の宣言。大きさの決まっていない配列は宣言することが出来ない。Ruby 脳なのでハマってしまった。要素数の分からないデータを配列に取り込む時ってどうすればいいんだろう。1 個ずつ length を広げながら代入するとか、予め十分大きな配列を用意しといて init なままの要素を消すとか?

L5:foreach で配列の中身を初期化する。1 個目の elem は配列の中の要素の代表を表す。配列の中身を変更するような操作をする時は、ref を付けて参照にしないといけない。

L6:std.array.map の返り値は MapResult とかいう謎の型で、これは map を評価する前の中間物みたいなもの。つまりこの時点で map はまだ評価されてない。ということなのだと思う。この型に直接 sort とかするためには std.array.array を送る。そうすると map を評価させて int[] とかが得られる。

L10:これも上のと同じ。ちなみに std.array.sort は SortedRange を返す。困ったら typeid(var).writeln; すれば型名が分かる。

L16, 18:std.array.reduce は先行評価らしい。ちゃんと最終的な結果をすぐに返す。

ところで UFCS の関数呼出し演算子の省略っていつから出来るようになったんですかね? もしかして最初から? 実行したら普通に動いて後から括弧忘れてたのに気付いた。Ruby は基本的にメソッドチェーンで書くことが多いけど writeln とかにも UFCS が使えるのはいいですよね。括弧よりもピリオドのほうが断然打ちやすいし。ジェネリック引数の括弧も省略できるみたいだけどそこまでするとかなり見づらい感じがしそうなのでしない。ていうかラムダ式みたいなのを文字列で送るって一体どうなってるんだろう……。

まとめ:D言語基礎文法最速マスターが最強。あと TDPL(ただ誤植が自分でも気付くレベルで多い…… 2 刷に期待)

コメント

このブログの人気の投稿

慶大プレ小論文

改名

org-refresh-category-properties: Invalid function: org-with が出たら