マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201)https://atcoder.jp/contests/abc201↓の提出コードを見ながらの聴取を推奨いたしますA:https://atcoder.jp/contests/abc201/submissions/53461883B:https://atcoder.jp/contests/abc201/submissions/53461943C:https://atcoder.jp/contests/abc201/submissions/53462357Atcoderホームページ:https://atcoder.jp/home2・7・11・17・23日更新予定#競技プログラミング #Python #podcast
BGMタイトル: Doghouse 作者: Blue Dot Sessions 楽曲リンク: https://freemusicarchive.org/music/Blue_Dot_Sessions/Warmbody/Doghouse/ ライセンス: CC BY-SA 4.0
サマリー
マイナビプログラミングコンテスト2021のAtCoder Beginner Contest 201では、参加者がA問題やシークレットナンバー問題に取り組む様子が描かれています。彼らは数列の並び替えや暗証番号の可能性について考え、実装に挑戦します。また、ITおよびプログラミングの課題解決に取り組む様子も示されており、特にitertoolsやコンビネーションに関する知識を活かして問題を解く過程が詳細に説明されています。
A問題の挑戦
マイナビプログラミングコンテスト2021、AtCoder Beginner Contest 201、A問題、タイニー・アリスメティック・シークエンス問題文、長さ3の数列A、A1、A2、A3が与えられます。
Aを適切に並び替えて動作数列にすることはできますか。すなわち、A3-A2、A2-A1を満たすように並び替えることはできますか。
並び替えて動作数列にできるならイエス、できないならノーと出力せよ。
入力例1、5、1、3、例えば、1、3、5と並び替えることで動作数列になります。
Aイコール、リストのマップ、イント、インプット、ドット、スプリットの、鍵括弧、ダブルコロン、ダブルコロン、マイナス1、
違うわ、ドットソートですね。普通にそのままドットソートすれば小さい順になるはずなので、
513でしたっけ?513だね。コードテストで513を確認しておいて、
フォーアインレンジ2にしておいて、イフ、フォー文にするまでもないか。
プリント、イエス、イフ、A2マイナス、A1コールコール、A1マイナス、A0、エルス、ノーでいいはずです。
エラーが出た。インプットドット、スプリットになってないね。スプリアール間違ってます。
こじっていたので書き直しして、ノンタイプ、オブジェクト、イーツ、ノット、サブスクリプテイブル。
なんで?プリント、A、Aの2がないですよって言われてますけど、ノーンになっちゃってるんだ。
想定とリストマップイントインプットドットスプリット。ドット相当そのまま変数に入れるとおかしくなるんですね。これでいかがでしょうか。
イエス。入力例2はノー。入力例3は555でイエス。イエスが出たので提出していきます。
A問題いきます。
アットコーダー国にはN個の山があり、I個目の山の名前はSI、高さはTIです。
2番目に高い山の名前を答えてください。N個の山の名前、高さはそれぞれI個となることが保証されます。
N個は2以上1000個以下なので4分でもそのままやっちゃったらいいですかね。
入力例をコードテストに入れて、Nイコールイントのインプット、ANSイコールからの文字列。
どうしようかな。ANSイコールからのリストでいいか。
コアインレンジNABイコールインプットドットスプリットBイコールかっこ、イントかっこBで数字に変えて、
1個もう設定しておきましょうか。
ANSイコール4分の中でやったインプットスプリットでAB入れてBを数字にするのを4分の外で1回やって、
ANSイコールリストのAB。
1番でかいのじゃなくて2番目にでかいの出さないといけないから、このやり方だとちょっと部が悪いですね。
Lイコールリスト、どうやるんだっけ複数のリスト入れるのって。
リスト、かっこリスト、インプット、コアインレンジNかな。
プリントリストしたら、1文字ずつになっちゃうんだ。
インプットドットスプリットですね。
というかですね、というかだなこれは。
Lイコール空のリスト作って、コアインレンジNでさっきと同じことをすればいいですね。
ABイコールインプットドットスプリットして、BイコールイントのBして、LドットアペンドBを優先すればいい。
BAを入れたらいいですね。
確認でプリントL。
数字が先に入ってます。
もうあとはプリントソーテットLしたら小さい順になるので後ろから2番目ですね。
Lのかっこマイナス2の0番目を出せばいい。
0番目じゃないわ1番目だね。
名前だから。
を出せばいいですね。
入力例1はK2。
入力例2は北が出ればOK。
入力例3はQCFIUMが出たらOK。
入力例クリアしたので提出していきます。
ACしました。新問題いきましょう。
シークレットナンバー問題
シークレットナンバー問題文。
高橋くんは暗証番号を忘れてしまいました。
暗証番号は0から9までの数字のみからなる4桁の文字列で0から始まる場合もあります。
0から9までの各数字について高橋くんは以下のように記憶しています。
彼の記憶は長さ10の文字列S0からS9によって表されます。
SIが◯の時数字iは暗証番号に確実に含まれていた。
SIが×の時数字iは暗証番号に確実に含まれていなかった。
SIが◯の時数字iが暗証番号に含まれているかわからない。
高橋くんが忘れてしまった暗証番号としてあり得るものは何通りありますか?
入力例1。〇〇〇。××××
出力例1は108個あります。
例えば0123や0021などがあり得ます。
確実に含まれていた?含まれていなかった?
分からない。
あり得る暗証番号が存在しない、すなわち答えがゼロ通りになる場合もあります。
丸の数が異様に多い。4桁って書いているのに入力例には4個以上丸があるのでおかしいよってことですね。
つまり丸が4つある場合は1通りだけなんですね。
というとこから詰めていこうかな。 sイコールインプットイフ s.カウント
丸というかオーですね。小文字のオー。イコールイコール4だったらプリント
エグジットプリント1通り。
else if a.countOが4より多かったら
exitプリント0。
ここからですね、分かっているのが3個以下でハテナが含まれている場合
どうしたらいいのっていうことなんですが
丸が3つあるのであれば どういう考え方をすればいいんだ?
sは丸×x…ん?丸×ハテナのみからなる長さ10の文字列。
だからどれくらいその数列を作る
なんて言ったらいいんだこれ。計算量ってあってるのかな。がオーバーしないのであれば
enumrateだっけな。
enumrateじゃないな。コレクションでしたっけ。なんか重複割で
数字を順番に作るみたいなのがあったはずなんでちょっと調べますね。
pythonコレクションズ。
コレクションモジュールのカウンターオーダーデフォルトでいくと
どこだ?コレクションズじゃなかったっけな。なんだっけなあれ。
python組み合わせ、相当たり、重複なし、全通り全流、あ、itertoolsだ。
読み方合ってるかわかんないけど。itertools
import itertoolsを1行目に入れといて
permutation
順列を求めるとき。 重複ありは
組み合わせ。並べる際の順序を無視する場合は組み合わせとなります。
直席。 重複組み合わせ、あった。
重複順列をやったので重複組み合わせもついでにやっておきます。
combinations with replacement
itertools.combinations with replacement
が
4。 4桁の文字列。
4桁の文字列を
s.count
丸が4だったらと4以上だったらを弾いた後
これは普通にfor a in range 10指定
でその前にaイコールからのリストを作っておいて
if si
==
〇は si==はてなだったら入れる
a.append
×だったら関係ないので除外します。 でこの中から
ですね
可能性がある a から あーでもそうか
丸があると確実に入れないといけないのか めんどくせー
うん そっか丸は確実に入れてはてなは入れない場合もある
でなると重複組み合わせじゃ使えないのかな いや重複組み合わせで作った後丸が入っていないものは除外すればいいんだ
丸の数字が入ってないやつは除外すればいいんだ 一回やってみますか悩んでいても仕方ないので
プログラミング問題の解決
ans==itertools.combination__with__replacement で使うのはリストAで4文字
というのを暗数並列に暗数変数に入れました ちょっとプリントしてみます
えーっと なんか違うところでエラーになってる
line6 lsf プリント lsif じゃないか lsif か
python って itertools.combination__with__replacement object
じゃなくて これそのままプリントするしかないの?変数に入れらんないのか
これを変数に入れてから精査したいんですが あーっと どうなってるんだ
itertools.combination__with__replacementを
リスト かっこリストしないといけないのか リストで括って
あ 出た出た出た 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 4 5 6 7 っていうのをずーっと
順繰りで試してくれてます というのを
ans変数に入れまして
で
cnt==0 にして
ここはインレンジ さてどうする
丸があるところをカウントしたい 丸があるところをカウントしたいので
二重ループになっちゃうけどいけるかな 最大10
の数字全部がはてなの可能性があって その場合は
何通りになるんだ まあでも4桁だから1万
10万通りか 0 0 0 0 から9999までですよね
10万通り の中で
4分10個入れるのはありか 1回やってみましょうか
アンスリスト イターツールズ
大文字 i in ans
4i インレンジ 10して
if si==0 だったら
if
i not in
大文字 i この時はもうブレーク
して cnt プラスイコール1かな プリント cnt
125
だいぶ近いですが消せきれてないのがありますね 丸の数字が入っていなかったら
ブレーク ブレークじゃ意味ないのか
いやあってるはず cnt プラスイコール1
プリント cnt プラスイコール1した時にプリント大文字 i
どの数列を入れているかをチェックしましょうか 012
が入っていないとアウト もう一発目からアウトですね 000入れているので もしここがなかった場合に
true false をつけておくか
大文 if もし
数字が入ってなかったら 大文字 t イコールフォルスして
if t が true だったら cnt プラスイコール1して
else だったら
t を true に戻す ループの外で一回 t を
true にしておく
true のスペルがわかんなくなっちゃった ture で合ってる 色変わんないけど
フォルス トゥルー
ブール ブーリアン型
ツレ true true
あ true r というの場所間違えてました
true 一回これで
だんだん何やってるかわかんなくなってきた 000 入ってるねー
入ってるねー ブレイクしちゃったらダメなのかなこれはブレイクを消して
もっかい確認 000
違う8 プラス1する奴が何かだけを見ればいいので
if t イコールトゥルーの時の あーでも 000 入れてますねー
1050 になっている増えてら ブレイクを消したからですねこれは
もう一回ちょっと上から見るか アンスリストイターツールズコンビネーション
with リプレイスメント a から4つ取ります
しぬ t イコールゼロ t イコールトゥルー アンスから一つずつ出しますフォーアインレンジ中
if si が丸だった場合丸だった場合&でいいですねここ if 分
の中に if 分入れなくていいや if si イコール丸&
このインデックス0番目1番目っていうのが 数列になかったらフォルスにします
ゼロの時点でフォルスだから カウントされないはずなんですけどね
なんでだ あ違う
s の中に入ってるな入ってるから そうか t がトゥルーかフォルスかっていうのはこの10のカウント全部終わってから
だ だから1個インデックスを減らして
フォルスにするかどうかだけを入れておきますでフォルスにしたらもうブレイク していいねこれ
もう除外するので 0012
はい66になっちゃった違うんだよなぁ これの重複通りが欲しいんだけど
0012 あれこれ重複してない
違うなこれ重複組み合わせになってなさそうですね うーん
と 順繰り順繰りで出したいイターツール図をちょっとパイソンの公式の
サイトから見てみましょうか イテレーター
accumulate 組み合わせイテレーター ソートされた順で重複なし重複あり
combination with replacement a a b これだなプロダクト
デカルト席ネストしたフォーループと投下 プロダクトリピートイコール4
108 オッケー オッケー オッケー オッケー で 入力例2は0 0 入力例3は15
はい よし コードテストはクリア しましたので提出していきましょう
久しぶりになんか c 問題を 自力で解けた気がする
解けたかどうかわかんないけど 泡が出た
うん 溶けてなかったですね
泡が1個だなでも 実行時間は10秒
10秒 秒じゃないねこれ ms だから
多分 正解
ランタイムエラーではないので 数字が異様に大きいとかではない
ただサンプルはクリアしているし他の18ケースも ac している1個だけ wa
誤答になってますね どこで引っかかったんだろう
カウント 0が4だったら
1 はてな 4 c 問題もう1回見ようか
0から9までの各数字について 4桁の文字列
0の時は確実に含まれていた 0 2が多いですね 丸の時は含まれていた 罰の時は含まれていなかった
はてなの時はわからない 高橋くんが忘れてしまった暗証番号としてあり得るものは何通りありますか
忘れてしまった暗証番号は 暗証番号の
通りですよね だから そうだ
丸が4つって 1通りじゃないですね
0 1 2 3が丸だったら 0 1 2 3と
8 1 2 3 4 1 2 3 0とっていうのがあるので そこで引っかかってるっぽいな
なので
カウント 丸が4より多かったら
プリント0なのは変わりない 丸が4つだけだったらどうなるんだろう ちょっとこれだけ
コードテストで試してみましょうか 1 2 3 4 x x x x x x
ほい 24通りあるっぽいです 提出し直してみましょうか
4 x 3 x 2 x 1だけ 3 12
あ そうですね 24通り あるっぽいですね
あーいったいった 一番最初の考えが間違っていただけですね
丸が4つあったらっていうのが 組み合わせするっていうのが抜けてました
ACしました あっ すっきり
ちょっとじゃあ 30分超えてるので D問題はまた今度にしましょう
提出と反省
今日はここまでにしておきます ではまた次回 お疲れ様です
34:24
コメント
スクロール