はじめに
ここではd,r,s等のコマンドについて解説します。
f
これはスタックの内容を上から順に全て出力します。
自分のコードが正しく動いているかの確認などに使えます。
7 2 5f
出力 | 7 2 5 |
---|
d
一番上のデータを複製して一番上に積みます。
2d
r
一番目と二番目のデータを入れ替えます。
3 2r
s x , l x
一番上のデータを取り出し、s x で x という名前の変数に入れます。l x で x のデータをスタックの一番上に積みます。 x は一文字のものに限ります。数字でも正常に動きます。
1 2 3sxlxlx
P
文字列をスタックに積むときは[characters]と書きます。
「P」はスタックの一番上の文字列を取り出し、改行を付けずに出力します。一番上が数値であればその数値が文字コードになる文字を出力します。数値が256以上であれば256進数に直して、文字を2文字以上出力します。
[cde]24930PP
出力 | abcde |
---|
$24930=97\times256+98$
で97はa、98はbなのでabを出力しています。
R
一番上の数値nを取り出し、残ったスタックの上からn番目のデータを一番上に持ってきます。
一番上の数値が-n (n>0) の場合は一番上のデータを上からn番目になるように入れ替えます。
[f][e][d][c][b][a]4R
[f][e][d][c][b][a]0 4-R
nがデータの数よりも大きいときはnがデータの数と同じときのふるまいをします。
実際の問題
入力 | 4 7 |
---|
?r/p
出力 | 1 |
---|
入力 | 1 2 |
---|
?n[ ]Pp
出力 | 2 1 |
---|
空白の文字コードは32であるため、[ ]の部分は32としてもよい
入力 | 7 3 |
---|
??dd4Rr%-r%p
出力 | 2 |
---|
入力をa,bとします。「dd4Rr」でまずデータを意図した順に並べます。次に$b-a%b$でいくつ買い足すかを求めますが、これだと買い足す必要がないときの答えが$b$になってしまうのでこれをbで割った余りにしています。
下はRのコマンドを知る前に私の書いたコードです。
入力 | 7 3 |
---|
?d1-?dsa/1+la*r-p
出力 | 2 |
---|
入力をa,bとします。$a \leqq bn$を満たす最小のnを求めて$bn-a$を答えとしています。$bn=a$となる場合のために「1-」をしています。
おわりに
ここまでの知識で解ける問題があるのでこちらの「基本的なコマンドを用いる」の箇所にある問題を解いてみましょう。
次回はif文を使うような場合の操作を勉強します。