cLayがこうなればいいなあリスト

cLayとは

rsujskf.s602.xrea.com

競プロでよく使うアルゴリズムに加えて、高速な入出力や多数の糖衣構文が組み込まれています。開発者のlaycrsさんご自身が強いので安心して使えます。とても便利です。一度使うと素のC/C++を書くのがばからしくなります。なぜもっと流行らないのか不思議でなりません。

cLayのソースをC++のソースに変換する形で使いますが、yukicoderではcLayのソースをそのまま提出できます。(ショートコードで非常に有利です。しかも、高速なので、ショートコードを狙って提出したコードが意図せず最速も取ってしまうこともあります。)

以下は、cLayが今後のバージョンでこうなればいいなあという希望です。「現状」は20200920-1版に基づいています。最新版では既に対処されているかもしれません。

wt() の引数の三項演算子の型推定

wt(x>0?"Yes":"No");

現状

上記のコードを変換した際に、出力C++ソースに

void wt_L(const char c[]){...}

の定義が含まれないのでコンパイルエラーになる。

なお、ダミーで

if(0)wt("");

などと書くことで一応回避できる。

希望

ダミーなしでコンパイルが通る。

説明

Yes/No や possible/impossible を出力する問題が割とあるので対応されると嬉しいです。

| や & で区切られた不等式

a<b | c<d

現状

a<b | c && b | c<d

に変換される。元の式の意図は明確なのに、変換後の式には意味を見出しがたい。

希望

不等号より優先度の低い演算子を含んでいる式は、全体を変換するのではなく、演算子で区切って両辺の式をそれぞれ変換する。

説明

短絡評価する必要のない場面では || の代わりに | と書けると嬉しい事情がありあす。どのくらい嬉しいかというと、 1 Byte くらいです。 && を & と書くことについても同様です。 A && (B || C) を A && B | C と書きたいという事情もあります。 ^ も余分な括弧なしで書けると嬉しいです。

segtree_rg が要求する関数名

現状

void segtree_rg_func(SVAL &res, SVAL a, SVAL b){ hoge; }
void segtree_rg_func(SVAL &res, SFUN f, SVAL a){ hoge; }
void segtree_rg_func(SFUN &res, SFUN f, SFUN g){ hoge; }

希望

void segtree_rg_merge(SVAL &res, SVAL a, SVAL b){ hoge; }
void segtree_rg_apply(SVAL &res, SFUN f, SVAL a){ hoge; }
void segtree_rg_compose(SFUN &res, SFUN f, SFUN g){ hoge; }

関数名が別々になると嬉しい。(具体的な名前を上記のとおりにしてほしいということではない。)

説明

関数を型でなく名前で識別すれば、RMQ程度の単純なセグ木を segtree_rg<ll,ll> と簡単に書けるようになると思います。

そもそも関数名が同じだと紛らわしいと思います(特に変換後のC++コードではこれらの関数の呼び出しがたくさんあるので)。

余談ですが、これらの関数の第2・第3引数を参照で受けるとき、第1引数とインスタンスが同じ場合があるのが、ちょっとしたハマリポイントになっています(行列の乗算をしようとして破壊してしまうなど)。上でいう segtree_rg_compose() とかは割り切って2引数でもいいかもしれません。

配列変数をまとめて定義

現状

ll a[1d5],b[1d5],c[1d5];

希望

ll (a,b,c)[1d5];

または

ll (a,b,c)(1d5);

説明

同じ要素数の複数の配列が必要になることが割とよくあるので、 rd() や wt() の引数と同様に、変数の定義もまとめて書けると嬉しいです。

sum[i=a---b](式)

説明

min[i=a---b](式) の sum 版があったら便利だと思います。現状、(配列でない任意の式の) sum を求めるには、

  • 変数 s を定義し 0 で初期化する
  • ループを回して s に加算する
  • s の値を参照する

を書く必要がありますが、これが sum[i=a---b](式) 一発でできれば変数 s の存在を隠蔽できてかなりすっきりすると思います。結果型の指定はあってもいいと思います。