00:03
デンソークリエイトプログラミングコンテスト2023)
AtCoder Beginner Contest 309)
A問題9。問題文。
以下のような1から9までの数字が書かれた3×3の盤面があります。
1以上9以下の整数ABが与えられます。
ただし、A小なりBです。
Aが書かれたマスとBが書かれたマスが左右に隣接しているか判定してください。
マス目は固定なんですね。
携帯の番号みたいな123で開業C56開業789というような3×3のマス目になっています。
ABが与えられてそれぞれ隣接しているかなので
123のグループに入っているC56のグループに入っている789のグループに入っているかどうかというのを出したらいいですね。
ABイコールマップイントインプットドットスプリット
どうしようかな。
プリントESIFALLAIN
どうしようかな。
ちょっとやってみましょうか。
これを2つ作ればいいですね。
これはちょっとあれだな。書きましょうか。
03:02
大文字のAイコール123。
大文字のBイコールC56。
大文字のCイコール789。
それぞれがこの中にあるか。
Aイン大文字A、Bイン大文字AとAイン大文字B、Bイン大文字Bで大文字Cのパターンを作って、どれかが真であればESが出るんじゃないかなこの関数で。
エルスの最近見つけたエニーオール関数を試してみようと思います。
78だったらイエス。
エラーが出た。
ALL TAKES EXACTLY ONE ARGUMENT
引数1つか2つって書いてる。
じゃあORにしましょうか。
ORこれでどう。
あ、ダメだ。
アンマチド括弧括りが1個多い。
めっちゃエラー出るな。
ALL TAKES EXACTLY ONE ARGUMENT
え、ALLって1個しかダメなの?
そんな。
っていうか多分書き方が違うっぽいですねこれ。
じゃあもうAND ORで普通にやりますか。
OR A IN B B IN B が AND
OR A IN C B IN C が AND
これでいけるでしょう。
イエス。
2はノー。
19はノー。
ノー。
34はノー。
ノーですね。
06:05
あれ?ALL ANY関数結構いいなと思ったんだけどな。
ちょっとまだ理解できてないっぽいですね。
提出します。
ACしたのでB問題いきます。
B問題。
ROTATE
回転?
回転苦手なんだよな。
問題文。
N行N列のマス目が与えられます。
上からI行目、左からJ列目のマスには整数AIJが書かれています。
ここでAIJは0か1であることが保証されます。
マス目の外側のマスに書かれた整数を
時計回りに1個ずつずらしたときのマス目を出力してください。
ただし外側のマスとは1行目、N行目、1列目、N列目の
いずれか1つ以上に属するマスの集合のことを指します。
外枠ってことか。
行列が与えられます。
Nが100なので20ループとかでいけそうだな。
ずらしたマスを出してください。
01を時計回りに。
だから一番左の10は1個上に。
一番上の行は1個右に。
一番右は1個下に。
一番下は1個左にっていう風にずらしてくださいですね。
どうしようかな。
なんていうの。
やり方っていうのがありそうではあるけど
愚直にやっても解けそうな気がするのでちょっとやってみましょうか。
nイコールintのインプット。
で、nイコールリストのインプットを
なんちゃらインベンジNかな。
で、ちょっと確認。プリントL。
ちゃんとインプットができているかどうか。
これだとリストの中にリスト作るか。
分解されてないっぽいので。
これで二重リストになりました。
で、4iインレンジN。
4jインレンジNで。
09:16
回転。
ちょっと分かんないな。
反転させるじゃないんですもんね。
なんかABSで絶対値をとって
元の数と移動させる対象の数をマイナスさせてみたいなのも考えましたが
ちょっと違うっぽい気がするので調べます。
行列。
外側でできるのかな。
外側回転パイソン回転行列。
回転行列だと中のものも動いちゃうよね。
だから回転行列させた二重リストの中を無視して
回転行列させた外側プラス普通のやつの真ん中
っていう風に組み合わせるしかないのかな。
回転行列パイソン。
行列の90度右回転。
上下逆にさせた後点値させればいい。
上下逆にした後点値。
12:00
インプット4xインジープ。
逆転させて。
逆転させて点値。
一回ちょっとこれをこのままコピー。
あっぶねーコードテスト消しかけた。
コピペして。
4xインジープ。
アスタリスク。
L括弧。
コロンコロン。
コロンかこれ。
ダブルコロン。
ダブルコロン。
マイナス1。
で閉じてプリント。
アスタリスクx。
sepイコール。
空の文字列。
そうだね。これ行回転できてるね。
できてるので。
できてるので。
どっかを入れ替えどうしようかな。
これを一回入れるか。
新しいリストに。
hansイコール空のリストにして
hans.append
アスタリスクx
リストアスタリスクxかな。
っていうかアスタリスクいらないかなじゃあ。
でプリントhans。
OKそうですね。
右回転させたものを再度
二重リストに。
リストじゃないけどなんかタプルになってるけど。
入れられました。
で
15:01
4iインレンジ
n
4jインレンジ
n
if iイコールイコール0
だったら
lのij番目は
ん?えっと
ij0
そうだね。
ij番目は
イコール
hansの
hansのij番目でいいのかな。
lif
iイコールイコール
n-1だったら
いや
orでいいのかここ。
if iイコール0
or
iイコールイコール0
or iイコールイコールn-1だったら
lのij番目はhansのij番目だと。
jでも
いけるかこれ。
jは
jが
いけそうだね。
jの方も
同じでいきますか。
or
jイコールイコール0
or
jイコールイコールn-1
で
5文字lイン
lの
アスタリスクエル
入れ替えができているはず。
ジョインかなこれ。
sepイコールでさっきのやつと同じ感じで
出してみると
関係ないね。
ジョインってどうやるんだっけこれ。
ダブルコロン
コロンじゃねえわ。
ダブルクオーテーション
ドットジョイン
アスタリスクエル
18:00
lじゃないわ。
5文字lだ。
じゃあジョインとかもいらないかな。
あーでもこれだと
あれか。
えーと
スペースが空いちゃうんですね。
入れ替えは
できてるね。よしよし。
ので
んーと
ダブルクオーテーション
ドットジョイン
アスタリスク小文字エルですね。
これほんとに
B問題?
あれ?
ダメだ。
stuart.join
takes exactly on arguments
じゃあアスタリスク消したらどう?
うん。出ましたね。
入力例2は全部1なんでやる必要なし。
入力例3
えーと
大丈夫そうかな?
あ、いやちょっと変わってる。
ダメだ。
ん?
あ、いやいいのか。
あ、大丈夫そうですね。
大丈夫そうですね。
提出します。
あ、びっくりした。
回転行列の
作り方をちょっと
スッと出るようにしたわーだー
WAが出た。
あれ?AC2つだ。
サンプル
2つミスってるじゃん。
あれ?
妙だな。
うーん
解説を見ましょうか。
ちょっと長いこと
時間かけちゃってるんで。
外側のマスがどのように動くかを考えると
以下の4通りに場合分けてきます。
1小なりイコールi小なりイコールn-1を満たす整数iに対して
マス1iに書かれている整数は
マス1iプラス1に移動する。
うんうん。
移動する方向ですね。
上は
一番上は右に1個
という最初に言ったやつですね。
よって、それぞれのマスが外側のマスかどうか判定し
外側のマスならば定規に従って動かし
そうでないならば動かさないことで
操作後のマス名を求めることができます。
計算量はオーダーnの2乗です。
また入力を受け取る際にintなどの整数型で受け取ってしまうと
1011のような一列の入力を整数1011として受け取ってしまうため
21:04
文字型列で、文字列型で受け取ってから
一文字ずつ分解するなどの工夫が必要です。
C++で書いてるな。
んーと、C++ですが
見たところ
んーと
やっぱりアンサーでリスト作ってるっぽいですね。
で、二重ループして
いっちゃん最初というか
私が書いたような
i イコール0 j イコール0
i イコール n マイナス1 j イコール n マイナス1の場合
って書いてる。
if i イコールイコール0 and
j 小なり n マイナス1の場合
アンス i の j プラス1は
a の ij
んー
p を作っておいてっていうことかな。
んーちょっと
やっぱりC++だとよくわかんないな。
他のC++じゃない
Pythonの方の解説を見ておこうと思います。
久しぶりのB問題アウトパターンですね。
では、また次回。お疲れ様です。