クトゥルフ神話TPRG x AtCoder 「存在しない提出者」

>100 Views

September 24, 26

スライド概要

現代怪異 x Python x AtCoder B 問題

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

クトゥルフ神話TRPG × AtCoder 『存在しない提出者』 現代怪異 × Python × AtCoder B問題 自分の記憶より、 提出履歴のほうが正しいとしたら? 1

2.

第1 話 覚えのないAC 2

3.

夜のABC 水城蓮、21歳。大学3年生。 PythonでAtCoderを学んでいる。 A問題は安定して解ける。 B問題は、まだ少し考え込む。 通話相手は、親友の佐伯悠斗。 悠斗は高校時代から、蓮が時々会話や時間を失うことを知っている。 けれど、責めない。 分からなくなったら、 今分かることだけ並べよう。 3

4.

Discord通話 深夜のABC。 蓮と悠斗は、いつものように通話をつなぐ。 悠斗: Bで詰まったら条件を書き出せ。 蓮: 毎回それ言うな。 悠斗: 毎回お前が問題文にない条件を増やすからだろ。 それは競プロの助言であり、 蓮が現実を見失わないための合図でもあった。 4

5.

23時過ぎ A問題はAC。 B問題は解けない。 蓮は眠気に負け、通話を切る。 今日は無理。寝る。 悠斗は笑う。 明日見直せ。 変な条件を足してないか確認しろ。 蓮は「また少し記憶が飛ぶかもしれない」と思った。 けれど、いつものことだと片づけた。 5

6.

翌朝 A AC B AC 6

7.

提出時刻 蓮には、B問題を解いた記憶がない。 提出履歴には、確かに記録が残っている。 Submission Problem: B Result: AC Time: 23:47 悠斗も覚えている。 お前、寝るって言って落ちただろ。 7

8.

コードの最後 提出コードは、蓮の書き方そのものだった。 変数名。 空行。 コメントの癖。 ただし最後に一行。 # DO NOT COUNT THE FOURTH 蓮は理由も分からず、息が詰まる。 8

9.

第1話:AtCoder問題 B - Forbidden Word 文字列 S が与えられます。S の中に FOURTH が含まれていれば YES 、含まれていなければ NO を出力してください。 9

10.

B - Forbidden Word:入出力 入力 S 出力 YES 制約 または NO 1 <= len(S) <= 100 。S は英大文字のみ。 10

11.

B - Forbidden Word:入力例 DO_NOT_COUNT_THE_FOURTH 出力例 YES 11

12.

B - Forbidden Word:考え方 in を使うと、文字列の中に特定の文字列が含まれているか判定できます。 12

13.

模範解答 forbidden_word.py s = input() if "FOURTH" in s: print("YES") else: print("NO") 13

14.

コード解説 "FOURTH" in s が真なら、S の中に FOURTH が含まれます。条件分岐で出力を切り替えます。 14

15.

AC Accepted 15

16.

第1話の終わり 蓮は画面を閉じられない。 # DO NOT COUNT THE FOURTH 四人目を数えるな。 その言葉を知っている気がする。 小さな食卓。 四脚の椅子。 空席を指差す母。 そして、父の声。 無理して見なくていい。 思い出そうとすると、 記憶の手前で何かが止まる。 16

17.

第2 話 四人目 17

18.

大学の勉強会 蓮、悠斗、美咲、拓真。 今日は普通に四人で集まっている。 悠斗が飲み物を置く。 四本な。 何も起きない。 四という数そのものが怖いわけではない。 18

19.

先週の話 美咲が言う。 先週の四人目の人、説明うまかったよね。 蓮は止まる。 四人目? 先週は、蓮、美咲、拓真の三人だったはず。 悠斗はその日、来ていない。 19

20.

写真 写真には、 椅子が四脚 PCが四台 飲み物が四本 そして、四人写っている。 悠斗にも分かる。 ……確かに四人いる。 蓮には、一人だけ認識できない。 20

21.

分かるものだけ数える 悠斗は強く否定しない。 一回、分かるものだけ数えよう。 椅子。 PC。 飲み物。 すべて四つ。 人だけが、蓮には三人。 美咲が小さく言う。 蓮くん、本当に見えてないの? 21

22.

第2話:AtCoder問題 B - Missing Number 1 から N までの整数のうち、1つだけ欠けています。与えられた N-1 個の整数から、欠けている整数を出力してください。 22

23.

B - Missing Number:入出力 入力 1行目に N。2行目に N-1 個の整数 A_i。 出力 欠けている整数を出力。 制約 2 <= N <= 100 。A_i は 1 以上 N 以下で重複しない。 23

24.

B - Missing Number:入力例 5 1 2 3 5 出力例 4 24

25.

B - Missing Number:考え方 set を使い、1 から N までを順に確認します。存在しない数を見つけたら、それが答えです。 25

26.

模範解答 missing_number.py n = int(input()) a = list(map(int, input().split())) seen = set(a) for x in range(1, n + 1): if x not in seen: print(x) break 26

27.

コード解説 seen に与えられた数を入れます。 x not in seen で、欠けている数を判定します。 27

28.

AC Accepted 28

29.

見つけた 出力は、 4 蓮が提出する。 AC その瞬間、背後から声がする。 見つけた。 振り返る。 誰もいない。 29

30.

第3 話 23時47分 30

31.

履歴調査 蓮と悠斗は提出履歴を調べ始める。 記憶にない提出は、一度だけではなかった。 23:46 23:47 23:49 23:47 23:48 ほとんどが、同じ時刻に集中している。 31

32.

スマートフォン 蓮は寝ていたはずの日の記録を見る。 23:13 0歩 23:58 2,184歩 悠斗: 寝ながら歩数増やすタイプ? 蓮は笑えない。 32

33.

大学の入退室記録 23:31 Ren Mizuki 蓮は、夜中に大学へ入っている。 しかし記憶がない。 監視カメラの映像を確認する。 蓮は廊下で、 誰かと話しているように見える。 33

34.

画像認識 Persons detected: 2 34

35.

見え方の違い 蓮には一人しか見えない。 悠斗には、二人目の輪郭だけ見える。 だが、顔を説明できない。 悠斗: 顔を見てるはずなのに、 説明しようとすると抜ける。 蓮は初めて思う。 自分だけの問題ではないのかもしれない。 35

36.

第3話:AtCoder問題 B - Late Logs N 個の時刻が HH:MM 形式で与えられます。23:40 以上 23:49 以下の時刻がいくつあるか数えてください。 36

37.

B - Late Logs:入出力 入力 1行目に N。続く N 行に時刻 T_i。 出力 条件を満たす時刻の個数を出力。 制約 1 <= N <= 100 。 37

38.

B - Late Logs:入力例 5 22:10 23:46 23:47 23:59 23:40 出力例 3 38

39.

B - Late Logs:考え方 時刻を分に変換します。23:40 は 1420 分、23:49 は 1429 分です。 39

40.

模範解答 late_logs.py n = int(input()) count = 0 for _ in range(n): t = input() h, m = map(int, t.split(":")) minutes = h * 60 + m if 23 * 60 + 40 <= minutes <= 23 * 60 + 49: count += 1 print(count) 40

41.

コード解説 HH:MM を split(':') で分け、時間を分に変換します。あとは範囲内かどうかを if で確認します。 41

42.

AC Accepted 42

43.

第3話の終わり 蓮は、記憶より記録を信じ始める。 提出履歴。 歩数。 監視カメラ。 画像認識。 すべてが同じことを示している。 蓮は一人ではなかった。 43

44.

第4 話 判決 44

45.

父に会う 「四人目を数えるな」 その言葉を聞いた父親は、表情を変えた。 蓮の家は、もともと三人家族だった。 父。 母。 蓮。 だが母親は、三人だけの食卓にいつも四脚目の椅子を置いた。 蓮は言う。 俺、知らないままの方が怖い。 45

46.

母親のDV 父親は話し始める。 母親は蓮に、失敗を何度も謝らせた。 食事を抜き、長く立たせ、記憶を否定した。 そんなことはしていない。 お前が間違えて覚えている。 父親にも暴力は向いた。 携帯の監視。 交友関係の制限。 物を投げる。 逃げようとすると、母は言った。 この子を二度と会わせない。 46

47.

証拠 父親は何年もかけて証拠を集めた。 録音 写真 医療記録 相談記録 蓮への虐待の記録 そして、離婚裁判を起こした。 母親は反論した。 夫こそ加害者だ。 蓮は父親に言わされている。 47

48.

蓮の怒り 蓮は父に言う。 どうしてもっと早く助けてくれなかったのか。 父は沈黙する。 長い沈黙のあと、言う。 ……怖かった。 俺も、お母さんが怖かった。 蓮は許したわけではない。 ただ、父も被害者だったことを知る。 48

49.

離婚成立 裁判では、証拠が積み重なった。 最終的に離婚が成立する。 蓮は父親と暮らすことになった。 父は思った。 これで終わった。 だが、終わらなかった。 49

50.

母親の失踪 離婚成立から数日後。 母親は突然消えた。 携帯電話、財布、衣類は残されたまま。 銀行口座にも動きはない。 警察にも相談されたが、見つからない。 失踪した翌朝、幼い蓮は言った。 今度は三人になった。 50

51.

四脚の椅子 父は最後に告白する。 母親は昔から、三人家族の食卓に四人分を並べていた。 椅子を四脚 皿を四枚 箸を四膳 蓮が「三人しかいない」と言うと、母は空席を指差した。 ちゃんと四人いるでしょう。 そして母が消えた日の夜、 家にはまた椅子が四脚あった。 父は三脚しか出した覚えがなかった。 51

52.

第4話:AtCoder問題 B - Evidence Count N 個の証拠記録があります。各記録は OK または NG です。 OK の数が K 個以上なら YES 、そうでなければ NO を出力して ください。 52

53.

B - Evidence Count:入出力 入力 1行目に N と K。2行目に N 個の文字列 S_i。 出力 YES 制約 または NO 。 1 <= K <= N <= 100 。S_i は OK または NG 。 53

54.

B - Evidence Count:入力例 5 3 OK NG OK OK NG 出力例 YES 54

55.

B - Evidence Count:考え方 OK の数を数え、K 以上かどうか判定します。 55

56.

模範解答 evidence_count.py n, k = map(int, input().split()) records = input().split() ok_count = 0 for record in records: if record == "OK": ok_count += 1 if ok_count >= k: print("YES") else: print("NO") 56

57.

コード解説 for で記録を1つずつ見ます。 OK のときだけ数を増やし、最後に K 以上か判定します。 57

58.

AC Accepted 58

59.

第4話の終わり 裁判記録は現実を固定する。 録音。 写真。 証言。 判決。 それでも、母親がどこへ消えたのかは分からない。 そして、四脚目の椅子だけが残った。 59

60.

第5 話 子供部屋 60

61.

保管された荷物 蓮と悠斗は、父が保管していた荷物を調べる。 古い写真。 幼稚園の絵。 子どものノート。 蓮はページをめくるたび、 知らない自分に近づいていく。 61

62.

絵 父。 母。 蓮。 その横に、黒く塗りつぶされた人型。 顔はない。 輪郭も曖昧。 だが、確かに四人目として描かれている。 62

63.

ノート 幼い文字。 4にんっていわないと おかあさんがおこる 別のページ。 みない かぞえない 悠斗は何も言わず、ページを押さえる。 63

64.

書き足された文字 ノートの最後。 明らかに幼児期とは違う筆跡。 ゆうとにいう 悠斗: これ、高校入ってからの字じゃないか? 蓮には、書いた記憶がない。 64

65.

第5話:AtCoder問題 B - Hidden Message 文字列 S と、K 個の位置 P_i が与えられます。S の P_i 文字目を順に取り出して、できる文字列を出力してください。位置は 1indexed です。 65

66.

B - Hidden Message:入出力 入力 1行目に S。2行目に K。3行目に K 個の整数 P_i。 出力 取り出した文字を連結して出力。 制約 1 <= len(S) <= 100 。 1 <= P_i <= len(S) 。 66

67.

B - Hidden Message:入力例 YUXUUTO 4 1 3 5 7 出力例 YUTO 67

68.

B - Hidden Message:考え方 Pythonの添字は0から始まります。1-indexed の P_i は P_i - 1 に直して使います。 68

69.

模範解答 hidden_message.py s = input() k = int(input()) positions = list(map(int, input().split())) answer = "" for p in positions: answer += s[p - 1] print(answer) 69

70.

コード解説 p - 1 でPythonの添字に変換します。取り出した文字を answer に足していきます。 70

71.

AC Accepted 71

72.

第5話の終わり 蓮が覚えていない時間に、 誰かがノートを開いていた。 誰かが悠斗の名前を書いた。 それは敵なのか。 味方なのか。 まだ分からない。 72

73.

第6 話 零 73

74.

見覚えのないファイル 蓮のPCに、知らないファイルがある。 REN_READ_THIS.txt 蓮と悠斗は、並んで画面を見る。 悠斗: 開けるぞ。 74

75.

メッセージ 蓮へ。 僕はお前じゃない。 でも、お前でもある。 怖いとき、 僕が代わりに起きていた。 蓮は息を止める。 悠斗は、画面から目を逸らさない。 75

76.

零 メッセージの主は、自分を「零」と呼んでいた。 零は悪人格ではない。 母親の怒声。 両親の激しい争い。 四人目を数えろと言われた夜。 蓮が耐えられない場面で、 代わりに記憶を抱えていた自己状態だった。 蓮を壊すためではない。 蓮を守るために。 76

77.

AtCoderを使った理由 零は書いていた。 メモは捨てられる。 ファイルは消せる。 蓮は夢だったと思う。 でもAtCoderの提出履歴なら、蓮は必ず見る。 覚えのない提出は、 零が残した外部記憶だった。 77

78.

悠斗は信用していい ファイルの最後。 悠斗は信用していい。 悠斗は小さく息を吐く。 零は、高校時代から悠斗を知っていた。 蓮が記憶を失った時、 悠斗は責めず、事実だけを並べてくれた。 78

79.

警告 四人目を認識するな。 お前があれを人間として数えたら、 あれもお前を完全に認識する。 蓮は、提出コードの一行を思い出す。 # DO NOT COUNT THE FOURTH 79

80.

第6話:AtCoder問題 B - Only Once N 個の文字列が与えられます。ちょうど1回だけ出現する文字列を、入力順で最初に出力してください。存在しない場合は None を出力してください。 80

81.

B - Only Once:入出力 入力 1行目に N。続く N 行に文字列 S_i。 出力 条件を満たす文字列、または None 。 制約 1 <= N <= 100 。 81

82.

B - Only Once:入力例 5 ren zero ren yuto zero 出力例 yuto 82

83.

B - Only Once:考え方 辞書で出現回数を数えます。その後、入力順に見て、回数が1のものを探します。 83

84.

模範解答 only_once.py n = int(input()) words = [] count = {} for _ in range(n): s = input() words.append(s) if s not in count: count[s] = 0 count[s] += 1 for s in words: if count[s] == 1: print(s) break else: print("None") 84

85.

コード解説 count 辞書に出現回数を保存します。最後に元の順番で確認することで、最初に1回だけ出る文字列を出力できます。 85

86.

AC Accepted 86

87.

第6話の終わり 蓮は、初めて零を敵ではないと感じる。 零は蓮を乗っ取っていたのではない。 蓮を守っていた。 けれど零が警告する相手は、 まだこちらを完全には見ていない。 87

88.

第7 話 母が消えた日 88

89.

三人で調べる 蓮。 悠斗。 父親。 三人は、母親が失踪した日の記録を並べる。 裁判の後。 離婚が成立した後。 母親が消えた、その日。 89

90.

ログ 18:31 父と蓮が帰宅 20:13 母の携帯が旧自宅付近で通信 21:04 母から父へ着信 21:17 防犯カメラに母 21:18 記録不明 23:47 母の携帯通信停止 空白は、21:18。 90

91.

零の記憶 母親は最後に、父と蓮の前に現れていた。 母親。 父親。 蓮。 三人。 だが母親は、空席を見る。 違うよ。 四人でしょう。 91

92.

迎え 父親は蓮を抱き寄せる。 蓮、見るな。 母親は笑う。 もう遅いよ。 母親は空席へ手を伸ばす。 まるで誰かに手を握られたように。 やっと迎えに来てくれた。 92

93.

その後 母親が本当にその場から消えたのか。 外へ歩いていったのか。 零にも分からない。 ただ、零は書いていた。 僕は母親からお前を守っていた。 母親が見ていたものからも守っていた。 93

94.

第7話:AtCoder問題 B - Sort the Logs N 個のログが HH:MM event の形式で与えられます。時刻順に並べたとき、K 番目の event を出力してください。 94

95.

B - Sort the Logs:入出力 入力 1行目に N と K。続く N 行に時刻 T_i とイベント E_i。 出力 時刻順で K 番目のイベント名。 制約 1 <= K <= N <= 100 。イベント名は英小文字のみ。 95

96.

B - Sort the Logs:入力例 4 2 21:17 camera 18:31 home 23:47 stop 20:13 phone 出力例 phone 96

97.

B - Sort the Logs:考え方 HH:MM を分に変換して、時刻とイベントのペアをソートします。 97

98.

模範解答 sort_logs.py n, k = map(int, input().split()) logs = [] for _ in range(n): t, event = input().split() h, m = map(int, t.split(":")) minutes = h * 60 + m logs.append((minutes, event)) logs.sort() print(logs[k - 1][1]) 98

99.

コード解説 時刻を分に直してタプル (minutes, event) として保存します。タプルは先頭要素から比較されるため、時刻順に並びます。 99

100.

AC Accepted 100

101.

第7話の終わり 母親は消えた。 けれど、逃げたのか。 連れていかれたのか。 それは誰にも分からない。 ただ一つ。 23:47に、通信は止まった。 101

102.

第8 話 存在しない提出者 102

103.

23:47 23:47 103

104.

存在しない問題 蓮のAtCoder画面だけに、問題が表示される。 B - Count the People 悠斗にURLを送る。 悠斗の画面では、 404 Not Found 104

105.

入力 問題は、人物の入退室ログを処理するものだった。 入力の中に、見覚えのある名前が並ぶ。 FATHER MOTHER REN UNKNOWN 蓮は理解する。 これは家族の記録だ。 105

106.

止める声 零: 解くな。 悠斗: その問題、本当に解かなきゃいけないのか? 蓮: ここまで来たんだ。 悠斗: 答えが出ても、 それがお前の現実全部じゃないからな。 106

107.

第8話:AtCoder問題 B - Count the People N 個の入退室ログが与えられます。 enter name なら部屋に追加し、 leave name なら部屋から削除します。最後に部屋に残 っている人数を出力してください。 107

108.

B - Count the People:入出力 入力 1行目に N。続く N 行に action と name。 出力 最後に部屋に残っている人数。 制約 1 <= N <= 100 。action は enter または leave 。 108

109.

B - Count the People:入力例 5 enter FATHER enter MOTHER enter REN leave MOTHER enter UNKNOWN 出力例 3 109

110.

B - Count the People:考え方 現在部屋にいる人を set で管理します。入室なら追加、退室なら削除します。 110

111.

模範解答 count_the_people.py n = int(input()) inside = set() for _ in range(n): action, name = input().split() if action == "enter": inside.add(name) else: inside.discard(name) print(len(inside)) 111

112.

コード解説 set は重複しない集合です。 add で追加、 discard で存在すれば削除します。最後に len で人数を数えます。 112

113.

AC Accepted 113

114.

提出 蓮は提出する。 Output: 2 Result: AC その瞬間、部屋の空気が変わる。 零の声が遠ざかる。 114

115.

指定ラスト 蓮は部屋を見る。 椅子が二脚ある。 一脚には自分。 そしてもう一脚。 ずっと「空席」だと思っていた場所。 初めて、 そこに誰かが座っていることを認識する。 115

116.

その人物が言う。 「ようやく、私を人間として数えたね」 暗転。 最終話へ続く 116

117.

第9 話 正しく数える 117

118.

侵食 蓮の現実が書き換わり始める。 家族写真。 四人。 昔の記録。 四人。 裁判記録にまで、 最初から四人目がいたような情報が現れる。 118

119.

母親は失踪していない 記録が変わる。 母親は失踪していなかった。 父親に電話する。 蓮: うちって三人家族だったよな? 父親: 何言ってる? 四人だっただろ。 119

120.

怪異の声 怪異は母親の声で言う。 君のお母さんは正しかった。 ずっと四人だった。 幼い頃の言葉が重なる。 お前が間違っている。 ちゃんと数えなさい。 蓮は自分の記憶まで疑い始める。 120

121.

零の記録が消える は空白になる。 過去の提出コメントも変わる。 REN_READ_THIS.txt # DO NOT COUNT THE FOURTH が、 # THERE HAVE ALWAYS BEEN FOUR へ変わる。 121

122.

悠斗が駆けつける 第8話で、通話は突然切れていた。 悠斗は蓮の異変を知っている。 だから家へ向かった。 玄関が開く。 蓮! 部屋の中で、蓮は椅子を見つめている。 122

123.

否定しない 蓮: 四人だったんだ。 母さんが正しかった。 悠斗は、すぐに「違う」とは言わない。 そう見えてるんだな。 そしてノートPCを置く。 じゃあ問題解こう。 123

124.

最後の問題 悠斗が昔、冗談で言っていた。 いつかお前用のB問題作ってやるよ。 その問題。 B - Same or Different 左右が同じペアを数えるだけ。 でも今は、それが現実への足場になる。 124

125.

第9話:AtCoder問題 B - Same or Different N 個の整数ペアが与えられます。左右の値が同じペアの個数を出力してください。 125

126.

B - Same or Different:入出力 入力 1行目に N。続く N 行に整数 a_i, b_i。 出力 左右が同じペアの個数。 制約 1 <= N <= 100 。 1 <= a_i, b_i <= 100 。 126

127.

B - Same or Different:入力例 5 3 8 7 7 4 4 9 2 1 1 出力例 3 127

128.

B - Same or Different:考え方 各行を読み、 a == b のときだけカウントします。問題文にない情報は使いません。 128

129.

模範解答 same_or_different.py n = int(input()) count = 0 for _ in range(n): a, b = map(int, input().split()) if a == b: count += 1 print(count) 129

130.

コード解説 入力されたペアだけを見ます。等しいかどうかを確認し、等しい場合だけ count を増やします。 130

131.

AC Accepted 131

132.

入力されたものだけ見ろ 悠斗: Nは? 蓮: 5。 悠斗: 1行目。3 と 8。同じか? 蓮: 違う。 悠斗: じゃあ、それだけ見ろ。 132

133.

問題文にない条件 怪異: 4だ。 母親の声: ちゃんと数えなさい。 悠斗: 今それ、問題文にあるか? 蓮は止まる。 悠斗: 入力されたものだけ見ろ。 133

134.

コードは何て言ってる? 実行結果。 3 怪異: 4。 悠斗: 蓮。コードは何て言ってる? 蓮: ……3。 怪異: 4。 134

135.

蓮の答え 少なくとも、 この入力の答えは3だ。 AC 135

136.

戻る音 エアコン。 車の音。 時計。 呼吸。 日常の音が戻る。 父親からメッセージが来る。 どうした? 急に電話して。 裁判記録は、また元に戻っている。 母親は、失踪したままだ。 136

137.

怪異との会話 怪異: 私を見たのに。 蓮: 見た。 だから、いないとは言わない。 怪異: なら私は人間だ。 蓮: 違う。 137

138.

条件を分ける 蓮: 見えること。 存在すること。 人間であること。 全部、別の条件だ。 怪異は笑う。 ずいぶん問題文を読むのが上手くなったね。 そして、空席へ戻る。 138

139.

数か月後 蓮と悠斗は、またABCに参加している。 悠斗: B何分? 蓮: 18分。 悠斗: 遅。 蓮: うるさい。 139

140.

父との距離 蓮は父親とも、少しずつ話すようになった。 母親がどこへ消えたのかは、今も分からない。 怪異に連れていかれたのか。 自分でどこかへ行ったのか。 結論は出さない。 140

141.

空席 蓮の部屋。 椅子が二脚。 一脚には蓮。 もう一脚は空席。 蓮はもう、無理に数えない。 PCには、 A AC B AC 141

142.

次の問題 C - Recognition 蓮: ……今日はここまで。 悠斗: 逃げた。 蓮: 戦略的撤退。 PCを閉じる。 142

143.

23:47 空席から、小さな声。 23:47 またね。 蓮は振り返らない。 143

144.

『存在しない提出者』 完 144