STEINS;GATE(シュタインズ・ゲート) 問題セット | paizaラーニング Python解答例

paizaでPythonを学ぼう
スポンサーリンク

はじめに

この記事ではpaizaラーニングのレベルアップ問題集にあるSTEINS;GATE 問題セットのPython解答例を掲載する。解答例へのリンク一覧はpaizaでPythonを学ぼうに掲載。

paizaは2021年7月28日、株式会社MAGES.が提供する大人気ゲーム「STEINS;GATE(シュタインズ・ゲート)」とコラボしたプログラミングゲーム「電脳言語のオルダーソンループ」STEINS;GATE(シュタインズ・ゲート)をリリースした。これに伴って公開されたのがこの問題集である。

そのプログラミングゲームへのリンクはこちら。ゲーム内に出てくる問題を切り出した問題集はこちら。下はYoutubeにアップされたCM動画。

リンク先に飛べば分かるように、色々とキャンペーンをやっているので興味のある人は参加してみると良いかもしれない。宣伝っぽい書き方になったが当ブログはpaizaとの広告契約はない。

この問題集は難易度がバラバラなのだが、最後の「ネット・ガーディアンの奮闘」は私が今までpaizaで解いた問題の中で一番難しいと感じた。Sランクに挑戦するぐらいの力が付くまでは後回しにしておいても良いと思う。

このキャンペーンをきっかけにプログラミングに興味を持った未経験者の方はプログラミング未経験者向けpaizaを使ったPython基礎学習ガイドという記事も合わせてお読み頂きたい。

問題文まで引用すると無駄に長くなるのでこの記事には掲載しない。問題設定は必要に応じて別タブなどで開いてご確認頂きたい。

正則表現のエントリーポイント(Dランク)

標準入力で受け取ったものを変数に入れてセミコロン(;)で結合して出力すれば解ける。

a = input()
b = input()
print(a + ';' + b)

練習のために無理矢理def文を使うとこうなる。

def function():
    a = input()
    b = input()
    return a + ';' + b


print(function())

この問題が解けなかった人はpaizaの動画講座Python体験編を見れば必要な知識が身につくはず。

性能解析タイプセーフ(Cランク)

標準入力を小数点を受け取る時にはintではなくfloatを使う必要がある。それさえわかれば、後はちょっとした計算ロジックを組めば解けるはず。

まずは、x_iをリストに一度格納してsumで合計値を出すやり方。ちょうど割り切れる場合と、足りない場合に分けてifを設定する必要がある。

n, k = input().split()
n, k = int(n), float(k)
list1 = [float(input()) for _ in range(n)]
list1_sum = sum(list1)

if list1_sum % k == 0:
    print(int(list1_sum // k))
else:
    print(int((list1_sum // k) + 1))

次にx_sumという変数を用意してx_iを次々と足していく方法。こちらも練習のためにdef文で書いてみる。

def function(x_sum, k):
    if x_sum % k == 0:
        print(int(x_sum // k))
    else:
        print(int((x_sum // k) + 1))


n, k = input().split()
n, k = int(n), float(k)
x_sum = 0
for i in range(n):
    x_sum += float(input())

function(x_sum, k)

例外処理のタブーサーチ(Bランク)

ここからはコードを分解して多少解説を加えていく。

command_listというリストを作って、そこに各コマンドのパラメータ変化量を格納する。パラメータ列の時系列データの時刻1に当たる部分はstatus_quoという変数に入れる。

N, M, L = map(int, input().split())
command_list = [[int(_) for _ in input().split()] for _ in range(N)]

# status_quoは最新の状態を表す変数
status_quo = [int(_) for _ in input().split()]

時刻2以降のパラメータをnext_turnに入れる。gapにはstatus_quonext_turnの差分を格納する。checkという関数を別途定義して、そこでどのコマンドが入力されたのかを判別する。

for i in range(L - 1):
    next_turn = [int(_) for _ in input().split()]
    gap = []  # gapは次のターンとの変化量を取るための空リスト
    for j in range(M):
        gap.append(next_turn[j] - status_quo[j])
    print(check(N, command_list, gap))
    status_quo = next_turn

checkでは差分gapcommand_listのどこに一致するのかcounterでカウントしながら判定していく。一致したらcounterの数を返す。

def check(N, command_list, gap):
    counter = 0
    for k in range(N):
        counter += 1
        if gap == command_list[k]:
            return counter

コード全体はこちら。

def check(N, command_list, gap):
    counter = 0
    for k in range(N):
        counter += 1
        if gap == command_list[k]:
            return counter


N, M, L = map(int, input().split())
command_list = [[int(_) for _ in input().split()] for _ in range(N)]

# status_quoは最新の状態を表す変数
status_quo = [int(_) for _ in input().split()]

for i in range(L - 1):
    next_turn = [int(_) for _ in input().split()]
    gap = []  # gapは次のターンとの変化量を取るための空リスト
    for j in range(M):
        gap.append(next_turn[j] - status_quo[j])
    print(check(N, command_list, gap))
    status_quo = next_turn

進化戦略のプロシージャ(Aランク)

準備中

ネット・ガーディアンの奮闘(Aランク)

準備中

paizaのレベルアップ問題集の中で一番難しい気がする。個人的にはSランク扱い。

コメント

当ブログのコンテンツが気に入ったら広告ブロックの解除(ホワイトリスト化)をご検討下さい。

Please disable your adblocker or whitelist this site!

タイトルとURLをコピーしました