0
0

プログラミング初心者が最難関問題をAIに解いてもらった【村人の友好関係 (paizaランク S 相当)】

Posted at

はじめに

プログラミング初心者がpaizaラーニングの最難関問題をAIに解いてもらった結果と、実装されたコードについてのメモをまとめた記事です。
詳しいことはあまり分からないのでコメントなどで私の知識を補ってくださる方はぜひコメントをお願いします。

問題内容

以下を参照
【殿堂入りキャンペーン】村人の友好関係 (paizaランク S 相当)

使用したAI

ChatGPT (無料版) GPT-4o

AIが実装したコード

import sys
input = sys.stdin.read
data = input().splitlines()

# 入力をパース
N, M, Q = map(int, data[0].split())
friendship = [[0] * (N + 1) for _ in range(N + 1)]

# 友好度情報の格納
for i in range(1, M + 1):
    a, b, f = map(int, data[i].split())
    friendship[a][b] = f
    friendship[b][a] = f

# 同好会グループの管理
club = set()
results = []

# クエリの処理
for i in range(M + 1, M + 1 + Q):
    op, q = data[i].split()
    q = int(q)

    if op == '+':
        # 村人qをグループに追加
        club.add(q)
    elif op == '-':
        # 村人qをグループから削除
        club.remove(q)

    # グループの人気度を計算
    max_friendship = 0
    for member in club:
        for outsider in range(1, N + 1):
            if outsider not in club:
                max_friendship = max(max_friendship, friendship[member][outsider])

    results.append(max_friendship)

# 結果を出力
sys.stdout.write("\n".join(map(str, results)) + "\n")

結果

83点(不合格)
どうやらこのコードの場合、関係の数が多すぎるとタイムアウトして失敗になってしまうようです。
ただ、コード自体は単純で現時点の自分の知識でも理解できたためよしとしました。

コードについてのメモ

import sys
input = sys.stdin.read
data = input().splitlines()

・sysライブラリを読み込み
・sys.stdin.readで入力をまとめてinput変数?に保存(このinputが1行下のinput()とどんな関係があるのかは不明。ただこの行を消すとエラーが出るので何かしら使われてはいる?)
・各行ごとにリストとして分割し、dataに格納

N, M, Q = map(int, data[0].split())
friendship = [[0] * (N + 1) for _ in range(N + 1)]

・dataの最初の内容(入力の1行目)をmapでまとめて数値化しながらsplitで3つの変数に分割して保存
・ループを使ってfriendshipに村人リストを作る(N+1にすることでリストのインデックスと村人のナンバリングを一致させている?)

for i in range(1, M + 1):
    a, b, f = map(int, data[i].split())
    friendship[a][b] = f
    friendship[b][a] = f

・関係性の数と同じ回数のループを設定し、dataの2つ目以降の内容をsplitで3分割
・村人間の関係性とひっくり返したものをそれぞれ異なる変数に保存?

club = set()
results = []

・グループに所属する村人を管理するために空集合を用意
・グループ人気度を格納しておくためのリストを用意

for i in range(M + 1, M + 1 + Q):
    op, q = data[i].split()
    q = int(q)

    if op == '+':
        # 村人qをグループに追加
        club.add(q)
    elif op == '-':
        # 村人qをグループから削除
        club.remove(q)

・入退会のデータをループとsplitで「行ったのは入退会のどちらか」と「誰が入退会したか」に分割
・ifでclubに入退会情報をまとめる。

max_friendship = 0
for member in club:
    for outsider in range(1, N + 1):
        if outsider not in club:
            max_friendship = max(max_friendship, friendship[member][outsider])
results.append(max_friendship)

・max_friendship変数を用意
・ifで所属していない村人を選別しつつ、二重ループで総当たりして最大の有効度をmax_friendshipに保存する
・内側のループが終了するたび、resultsにmax_friendshipを格納する(これによって入退会が発生するタイミングごとの最大値を記録する)
・ところでこのfriendship[member][outsider]、リストの中のリストを呼び出す書き方なのだろうか?

sys.stdout.write("\n".join(map(str, results)) + "\n")

・最終的にresultsリストを書き出して完了

感想

AIの進歩ってすごい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0