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

[1](https://qiita.com/shogo314/items/abdf5e8e9e213bafe837) [2](https://qiita.com/shogo314/items/059094162959029cce3e) **3** [4](https://qiita.com/shogo314/items/a7b6668602bb976ef940) 5(執筆中)

# はじめに
ここではd,r,s等のコマンドについて解説します。

# f
これはスタックの内容を上から順に全て出力します。
自分のコードが正しく動いているかの確認などに使えます。

```
7 2 5f
```

|出力|7<br>2<br>5|
|:-:|:-|

![b03_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/169bdc5c-c0f6-1561-4ac3-eb09d63c639c.png)

# d
一番上のデータを複製して一番上に積みます。

```
2d
```
![b03_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/a3a0aada-8447-c709-0680-1b199f8170b4.png)

# r
一番目と二番目のデータを入れ替えます。

```
3 2r
```
![b03_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/1bcf1463-332e-8b8f-d423-bd9f07355337.png)

# s *x* , l *x*
一番上のデータを取り出し、s *x* で *x* という名前の変数に入れます。l *x* で *x* のデータをスタックの一番上に積みます。 *x* は一文字のものに限ります。数字でも正常に動きます。

```
1 2 3sxlxlx
```

![b03_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/19449942-1442-42de-27a5-6797dd01f76c.png)

# P
文字列をスタックに積むときは[*characters*]と書きます。
「P」はスタックの一番上の文字列を取り出し、改行を付けずに出力します。一番上が数値であればその数値が文字コードになる文字を出力します。数値が256以上であれば256進数に直して、文字を2文字以上出力します。

```
[cde]24930PP
```

|出力|abcde|
|:-:|:-|

![b03_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/04d181f8-db03-a855-00e5-2b2989812472.png)

$24930=97\times256+98$<br>で97はa、98はbなのでabを出力しています。

# R
一番上の数値nを取り出し、残ったスタックの上からn番目のデータを一番上に持ってきます。<br>一番上の数値が-n (n>0) の場合は一番上のデータを上からn番目になるように入れ替えます。

```
[f][e][d][c][b][a]4R
```

![b03_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/be8e4188-8f32-874f-4d0d-8bbd6e0c534a.png)

***

```
[f][e][d][c][b][a]0 4-R
```

![b03_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/20be0428-6d23-94c8-fb9e-776739948f15.png)

nがデータの数よりも大きいときはnがデータの数と同じときのふるまいをします。

# 実際の問題
[ABC005](https://atcoder.jp/contests/abc005/tasks/abc005_1)

|入力|4 7|
|:-:|:-|

```
?r/p
```

|出力|1|
|:-:|:-|

![a005_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/d27a7f90-9614-e077-e63e-c5708d90b4f2.png)
***
[ABC012](https://atcoder.jp/contests/abc012/tasks/abc012_1)

|入力|1 2|
|:-:|:-|

```
?n[ ]Pp
```

|出力|2 1|
|:-:|:-|

![a012_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/0a8a5c58-6f75-7a95-15a6-cf4360b04a8f.png)
空白の文字コードは32であるため、[ ]の部分は32としてもよい
***
[ABC014](https://atcoder.jp/contests/abc014/tasks/abc014_1)

|入力|7<br>3|
|:-:|:-|

```
??dd4Rr%-r%p
```

|出力|2|
|:-:|:-|

![a014_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/664356f0-9ea2-8e0a-8c82-5c414d9acaad.png)

入力をa,bとします。「dd4Rr」でまずデータを意図した順に並べます。次に$b-a\%b$でいくつ買い足すかを求めますが、これだと買い足す必要がないときの答えが$b$になってしまうのでこれをbで割った余りにしています。

下はRのコマンドを知る前に私の書いたコードです。

|入力|7<br>3|
|:-:|:-|

```
?d1-?dsa/1+la*r-p
```

|出力|2|
|:-:|:-|

![a014_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327735/1c894551-120e-62e3-15f8-c95bb35db801.png)

入力をa,bとします。$a \leqq bn$を満たす最小のnを求めて$bn-a$を答えとしています。$bn=a$となる場合のために「1-」をしています。

# おわりに
ここまでの知識で解ける問題があるので[こちら](https://qiita.com/shogo314/items/fff4be1573d2f86dba2a#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E7%94%A8%E3%81%84%E3%82%8B)の「基本的なコマンドを用いる」の箇所にある問題を解いてみましょう。
次回はif文を使うような場合の操作を勉強します。

#
[1](https://qiita.com/shogo314/items/abdf5e8e9e213bafe837) [2](https://qiita.com/shogo314/items/059094162959029cce3e) **3** [4](https://qiita.com/shogo314/items/a7b6668602bb976ef940) 5(執筆中)