LoginSignup
9
3

More than 1 year has passed since last update.

競技プログラミングでdcを使う(1/?)

Last updated at Posted at 2021-06-12

1 2 3 4 5(執筆中)

はじめに

この記事はAtCoderのABCのA問題をdcで解くためのものです。
私は全くの初心者であり、ネットで適当に拾ってきた情報から自分なりに解釈したものなので間違っている部分があればお教えください。C言語やPythonなどの一般的な言語を扱える(A問題やB問題がその言語で解ける)ことを前提としているので、説明をとばしている部分があります。

dcを勉強するにあたってこちらのページ(以下、参考ページ)を参考にしました。

dcについて

まずdcが何かについてはWikipediaでも見てください。私はそもそもUNIXが何かすらわかっていません。私が認識しているのはAtCoderで使える言語の中で単純な計算問題ならばdcが最も短く書けるということだけです。ただ速く解きたいだけの私にはそれで十分なのです。

本題

この記事と対応するように問題を分類した記事を作成しました。
AtCoderのABCのA問題でdcで書きやすいものまとめ

単純な計算

実際に問題を見ていきましょう。
ABC004
数字をひとつ読み込んでそれを二倍したものを出力すればよいです。コードは

?2*p

こうなります。短いですね。これを読み解くと、
「?」で数字を読み込む→「2*」で読み込んだ数字に2を掛ける→「p」でその数字を出力する

という流れになります。「2」と「*」の順番が気になると思いますが、2を掛けるという言葉の通りの順番だと解釈しましょう。
「*」以外にも「+」「-」「/」「%」などが同様に扱えます。また「^」で累乗の計算もできます。


少し練習しましょう。
ABC007
数字をひとつ読み込んでそれから1引いたものを出力すればよいです。

?1-p

2回以上の演算も行えます。
ABC009
読み込んだ数字を2で割って切り上げたものを出力すればよいです。
つまり読み込んだ数字に1を足して2で割ります。

1を足す理由ほとんどの言語において整数の割り算は計算結果を切り下げたものになります。dcはちょっと複雑なのですが、A問題を解くときは数字は常に整数型であると思っておいて問題ないでしょう。このような切り捨てになる割り算において、切り上げの計算にしたいときは、割られる数に割る数を足して1引いておきます。つまり
⌈a÷b⌉=⌊(a+b-1)÷b⌋ (⌈⌉:天井関数 ⌊⌋:床関数 参考)
となります。if文を使う必要がなくなるので是非覚えておきましょう。

?1+2/p

普通なら「*」や「/」を「+」よりも先に計算しますがdcでは言葉で説明したときと同じ順になります。


dcでは「A」「B」「C」「D」「E」「F」はそれぞれ「10」「11」「12」「13」「14」「15」と解釈されます。なぜか微妙に16進数を採用しているのです。また、おもしろいことに「BD」と書くと「123」と認識されます。これは10の位に11が入って、1の位に13が入るためです。

ABC013

?9-p

「?」は本来文字は読めないのですが、この問題で使う文字はA~Eなので読めてしまいます。

おわりに

これらの知識だけで解ける問題があるのでこちらの「単純な計算」の箇所にある問題を解いてみましょう。

ここまででも十分速くなりますが、残念ながらA問題といえども、これだけで解ける問題は少ないです。次の記事ではスタックについて勉強します。

1 2 3 4 5(執筆中)

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3