No.8117 Simple Programming Language
タグ : / 解いたユーザー数 54
作問者 : 👑


問題文
シンプルで洗練されたものが大好きなforループさんは、$\color{red} 2$ 重以上のネストがすることができないプログラミング言語「Simplang」を作りました。
Simplang を用いて、以下の問題を解くプログラムを作成してください。
問題
問題文
縦 $H$ マス, 横 $W$ マスのグリッドが $2$ つ与えられ、それぞれグリッド $A,~$グリッド $B$ とします。
グリッドの上から $i$ 番目、左から $j$ 番目のマスをマス $(i, j)$ といいます。
グリッド $A$ のマス $(i, j)$ は整数 $A_{i, j}$ が、グリッド $B$ のマス $(i, j)$ は整数 $B_{i, j}$ が書かれています。
ここで、$A_{i, j} \neq B_{i, j}$ なるマス $(i, j)$ がちょうど一つ存在することが保証されます。そのようなマス $(i, j)$ を求めてください。
制約
- $H, W$ は $1 \leq H, W \leq 10$ を満たす整数である。
- $A_{i, j}, B_{i, j}$ は $1 \leq A_{i, j}, B_{i, j} \leq 100$ を満たす整数である。
- $A_{i, j} \neq B_{i, j}$ なるマス $(i, j)$ がちょうど一つ存在する。
入力
- $H$ は定数
H
として与えられる。 - $W$ は定数
W
として与えられる。 - $A_{i, j}$ は定数
A[i,j]
($1 \leq i \leq H, ~ 1 \leq j \leq W$) として与えられる。 - $B_{i, j}$ は定数
B[i,j]
($1 \leq i \leq H, ~ 1 \leq j \leq W$) として与えられる。
出力
答えとなる $(i, j)$ を return
文を用いて出力してください。
サンプル
入力
H: 3 W: 3 A: 1 2 3 4 5 6 7 8 9 B: 1 2 3 4 5 6 7 9 9
出力
(3,2)
グリッド$A$ のマス $(3, 2)$ には整数 $8$ が書いていますが、グリッド $B$ のマス $(3, 2)$ には整数 $9$ が書かれています。
よって $A_{3, 2} \ne B_{3, 2}$ となるため、$(3, 2)$ を出力してください。
ここで、Simplang の言語仕様の概要は以下の通りです。
この仕様を満たさない Simplang プログラムを出力した場合、ジャッジ結果は WA となることに注意してください。
プログラミング言語「Simplang」の概要
特筆すべき Simplang の仕様は以下の通りです。
サンプルプログラムやインタプリタのソースコードは Qiita: yukicoder April Fool Contest 2025 「Simple Programming Language」(限定公開) を参照してください。
- 値リテラルは $0$ 以上 $10^{100}$ 未満の整数を使うことができる。(例えば、$314$ を定義したいときは
314
とすれば良い。) - 変数は
$n
($n$ は $0$ 以上 $10^{100}$ 未満の整数)の形式で使用できる。 - 例えば、
$0
,$1
,$998244353
などを使用することができる。 - すべての変数ははじめ $0$ で初期化されている。
変数 = 値
の形式で変数に値を代入する。例えば、$1 = 2
で変数 $1$ に整数 $2$ を代入することができる。- 値の計算には、二項演算子
+
,-
,*
,/
,%
を用いることができる。 +
は加算を表す。例えば、$1 + $2
で(変数 $1$) $+$ (変数 $2$) を表し、$1 + 1
で(変数 $1$) $+$ $1$ を表す。-
は減算を表す。例えば、$1 - $2
で(変数 $1$) $-$ (変数 $2$) を表し、$1 - 1
で(変数 $1$) $-$ $1$ を表す。*
は乗算を表す。例えば、$1 * $2
で(変数 $1$) $\times$ (変数 $2$) を表し、、$1 * 10
で(変数 $1$) $\times$ $10$ を表す。/
は切り捨て除算を表す。例えば、$1 / $2
は(変数 $1$) $\div$ (変数 $2$) 以下の整数で最大の値を表す。%
は剰余演算を表す。例えば、$1 % $2
は(変数 $1$) を(変数 $2$) で割った余りを表す。C
,C++
,Java
などと切り捨て除算や剰余演算の仕様が異なることに注意せよ。- 計算順序は通常の四則演算と同様であり(ただし、剰余演算は乗算・切り捨て除算と同じ優先順位である)、括弧
()
を用いることで計算の優先順位を変更することができる。 - 計算過程で $x < |10^{100}|$ の範囲を超えるような整数 $x$ ができるようにしてはならない。
- 計算過程で $0$ で切り捨て除算または $0$ で割った余りを求めようとしてはならない。
- 単項演算子や複合代入演算子は存在しないことに注意せよ。
- 各定数は値として使うことができるが、新たに値を代入することはできない。
- 例えば、
$0 = A[H,$1]
としたとき、変数 $0$ にグリッド $A$ のマス $(H, $ 変数 $1)$ に書かれた整数を代入する。 A[i,j]
,B[i,j]
について、$i, j$ は $1 \leq i \leq H, ~ 1 \leq j \leq W$ を満たす整数値である必要がある。- 1-indexed であること注意せよ。
- 制御構文として、
if
-end
文、while
-end
文のみを使うことができる。 if
-end
文、while
-end
の条件を表す際は、比較演算子 $op$ を用いて値 op 値
の形式で書く必要がある。- 比較演算子に使える演算は以下の通りである。
<
: 左辺が右辺よりも小さいならば真、そうでないならば偽である。例えば、$1 < H
のとき(変数 $1$) $<$ $H$ のとき真が返される。<=
: 左辺が右辺以下であるならば真、そうでないならば偽である。例えば、$1 <= H
のとき(変数 $1$) $\leq$ $H$ のとき真が返される。>
: 左辺が右辺よりも大きいならば真、そうでないならば偽である。例えば、$1 > H
のとき(変数 $1$) $>$ $H$ のとき真が返される。>=
: 左辺が右辺よりも小さいならば真、そうでないならば偽である。例えば、$1 >= H
のとき(変数 $1$) $\geq$ $H$ のとき真が返される。==
: 左辺が右辺と等しいならば真、そうでないならば偽である。例えば、$1 == H
のとき(変数 $1$) $=$ $H$ のとき真が返される。!=
: 左辺が右辺と等しくないならば真、そうでないならば偽である。例えば、$1 != H
は(変数 $1$) $\ne$ $H$ のとき真が返される。- 条件を変数に代入することはできない。
- マス $(i, j)$ と答えるとき、
return
文はコードの最終行に以下の形式で書く。
if
- end
文とは?
if
- end
文とは、以下の形式で記述する制御構文です。
if(条件) 条件が真であるときのみ実行される ... end
例えば、変数 $1$ の絶対値を取るプログラムは以下の通りです。
if($1 < 0) $1 = 0 - $1 end
while
- end
文とは?
while
- end
文とは、以下の形式で記述する制御構文です。
while(条件) 条件が真である間だけ繰り返し実行される ... end
例えば、$A_{1, 1}, A_{1, 2}, \cdots, A_{1, W}$ の総和を変数 $0$ に格納するプログラムは以下の通りです。
$1 = 1 while($1 <= W) $0 = $0 + A[1,$1] $1 = $1 + 1 end
return(i,j)
- $i$ 行目と $j$ 行目の両方とも、
end
を部分文字列として含む。 - 任意の $i < k < j$ なる $k$ について、$k$ 行目に
if
,while
を部分文字列として含まない。
「$2$ 重以上のネストをすること」とは?
$2$ 重以上のネストをしているとは、以下の条件を満たす $1 \leq i < j \leq P$ ($P$ は提出したプログラムの行数) が存在することを指します。
例えば、以下のプログラムは $2$ 重以上のネストをしているため、正しい Simplangのプログラムではありません。
$0 = 0 $1 = 0 while($0 < 3) if($0 == 2) $1 = $0 end $0 = $0 + 1 end return($0, $1)
逆に、以下のプログラムは $2$ 重以上のネストをしているわけではなく、なおかつ正しい Simplang のプログラムです。
$0 = 0 while($0 < 3) $0 = $0 + 1 end if($0 == 3) $1 = $0 + 1 end return($0, $1)
$1 = H
: 変数 $1$ に定数 $H$ が代入されます。while($0 < 2)
: 変数 $0$ が $2$ より小さいならばwhile
-end
文の処理を繰り返します。変数 $0$ は $0$ で初期化されているため、条件を満たします。$0 = $0 + 1
: 変数 $0$ に 変数 $0$ $+$ $1$ を代入します。$1 = $1 - W
: 変数 $1$ に 変数 $1$ $-$ 定数 $W$ を代入します。while($0 < 2)
: 条件を確認します。今回は条件を満たします。$0 = $0 + 1
: 同様に加算します。$1 = $1 - W
: 同様に減算します。while($0 < 2)
: 条件を確認します。今回は条件を満たさないため、end
文の直後にジャンプします。return($0,$1)
: $($変数 $0$, 変数 $1)$ と解答します。
プログラム実行の流れの具体例
例えば、以下の Simplang プログラムを考えます。
$1 = H while($0 < 2) $0 = $0 + 1 $1 = $1 - W end return($0, $1)
このとき、以下の順番で実行されます。
このようにして、$9$ 回の実行で処理を完了します。
入力
標準入力から与えられる入力はありません。ジャッジでは、標準出力に出力された Simplang プログラムに対して $H, W, A, B$ が与えられます。
出力
問題文の条件を満たすマス $(i, j)$ を求める Simplang のプログラムを、標準出力に出力してください。
Simplang のコードを直接書いたとき、提出する言語として Text (cat 8.3)
を選択することで、そのまま提出することができます。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。