問題一覧 > ネタ問題

No.8117 Simple Programming Language

レベル : / 実行時間制限 : 1ケース 1.000秒 / メモリ制限 : 256 MB / スペシャルジャッジ問題 (複数の解が存在する可能性があります)
タグ : / 解いたユーザー数 54
作問者 : 👑 loop0919 / テスター : yimiya(いみや) Iroha_3856
12 ProblemId : 12027 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2025-04-02 21:43:58

問題文

シンプルで洗練されたものが大好きな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 文とは?

      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
      

  • 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 文はコードの最終行に以下の形式で書く。
    • return(i,j)

  • $\color{red} 2$ 重以上のネストをすることはできない。
    • 「$2$ 重以上のネストをすること」とは?

      $2$ 重以上のネストをしているとは、以下の条件を満たす $1 \leq i < j \leq P$ ($P$ は提出したプログラムの行数) が存在することを指します。

      • $i$ 行目と $j$ 行目の両方とも、end を部分文字列として含む。
      • 任意の $i < k < j$ なる $k$ について、$k$ 行目に if, while を部分文字列として含まない

      例えば、以下のプログラムは $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)
      

  • プログラム内の半角スペースやタブは実行時すべて無視される。

  • プログラムの行数は $100$ 行以下である必要があり、なおかつ各行に含まれる文字は $100$ 文字以下 (半角スペース、タブを含む) である必要がある。
  • プログラムを実行する際、各行の実行回数の総和は $10^5$ 回以下である必要がある。
    • プログラム実行の流れの具体例

      例えば、以下の Simplang プログラムを考えます。

      $1 = H
      while($0 < 2)
        $0 = $0 + 1
        $1 = $1 - W
      end
      return($0, $1)
      

      このとき、以下の順番で実行されます。

      1. $1 = H: 変数 $1$ に定数 $H$ が代入されます。
      2. while($0 < 2): 変数 $0$ が $2$ より小さいならば while - end 文の処理を繰り返します。変数 $0$ は $0$ で初期化されているため、条件を満たします。
      3. $0 = $0 + 1: 変数 $0$ に 変数 $0$ $+$ $1$ を代入します。
      4. $1 = $1 - W: 変数 $1$ に 変数 $1$ $-$ 定数 $W$ を代入します。
      5. while($0 < 2): 条件を確認します。今回は条件を満たします。
      6. $0 = $0 + 1: 同様に加算します。
      7. $1 = $1 - W: 同様に減算します。
      8. while($0 < 2): 条件を確認します。今回は条件を満たさないため、end 文の直後にジャンプします。
      9. return($0,$1): $($変数 $0$, 変数 $1)$ と解答します。

      このようにして、$9$ 回の実行で処理を完了します。

入力

標準入力から与えられる入力はありません。
ジャッジでは、標準出力に出力された Simplang プログラムに対して $H, W, A, B$ が与えられます。

出力

問題文の条件を満たすマス $(i, j)$ を求める Simplang のプログラムを、標準出力に出力してください。
Simplang のコードを直接書いたとき、提出する言語として Text (cat 8.3) を選択することで、そのまま提出することができます。

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。