LoginSignup
0
1

More than 1 year has passed since last update.

ChatGPTで競技プログラミングの問題を生成してもらった

Posted at

はじめに

ChatGPTに自分のレベルに応じた問題を生成して貰えば効率よく競プロの勉強ができるのでは?と思ったので頼んでみた。

自分のAtcoderのレートが緑なので緑コーダー向けの問題生成を頼んでみる。

1問目

問題:
整数Nが与えられます。1からNまでの整数を順番に表示しますが、以下の条件に従って表示内容を変更します。

3で割り切れる場合は、その数の代わりに "Fizz" を表示します。
5で割り切れる場合は、その数の代わりに "Buzz" を表示します。
3と5の両方で割り切れる場合は、その数の代わりに "FizzBuzz" を表示します。
上記のいずれの条件にも該当しない場合は、その数をそのまま表示します。

出力例(N=15)

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

回答例(Python)

def fizzbuzz(N):
    for i in range(1, N+1):
        if i % 15 == 0:
            print("FizzBuzz")
        elif i % 3 == 0:
            print("Fizz")
        elif i % 5 == 0:
            print("Buzz")
        else:
            print(i)

# 入力の受け取り
N = int(input())

# 解答の出力
fizzbuzz(N)

制約が出力されなかったが、問題と解答は良い感じ。
少し簡単な気がするので、もう少し難しい問題を生成するように頼んでみる。

2問目

問題:
N個の整数からなる数列Aが与えられます。数列Aの中で、連続する要素の和が最大となる部分列の和を求めてください。

制約:
1 <= N <= 10^5
-10^9 <= A[i] <= 10^9

入力:
N (数列Aの要素数)
A[1], A[2], ..., A[N] (スペース区切りの整数列)

出力:
連続する要素の和が最大となる部分列の和

回答例(Python)

def max_subarray_sum(N, A):
    max_sum = A[0]
    current_sum = A[0]
    
    for i in range(1, N):
        current_sum = max(A[i], current_sum + A[i])
        max_sum = max(max_sum, current_sum)
    
    return max_sum

# 入力の受け取り
N = int(input())
A = list(map(int, input().split()))

# 解答の計算と出力
answer = max_subarray_sum(N, A)
print(answer)

やはり問題と回答例は良い感じだが、狙ったレベルの問題を生成してもらうのは難しそう

まとめ

問題と回答例は良い感じ
解答例を言語指定で出力してくれるのはありがたい
難易度調整には課題が残るかも

0
1
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
1