初めてプログラミングを学んでいますが、pythonを学ぶためにプレイしているpaizaの「エンジニアが死滅した世界」というゲームの「高層タワー」というステージで躓いています。
具体的には、与えられた入力例と、私がテスト用に考えた入力例のいずれでも正しい答えが出せているように見えますが、実際に課題を提出すると不正解になってしまう、というものです。
課題を以下にコピペします。
ーーーここから
単語を組み合わせて新単語を作ります。
新単語は N 個の文字列を、前から順に結合して作ります。
この時、冗長さをなくすため、 前から結合した単語の末尾 と 後ろの単語の先端 が一番長く一致するように結合します。
例えば、 入力例 1 の "paiza", "apple", "letter" の場合、
先頭から "paiza", "apple" を条件どおり重ねると "paizapple" となります。
この単語を更に次の単語と重ねると "paizappletter" となります。
なお、必ず前から順番に重ねるため、 入力例 2 の "poh", "p", "oh" を結合する場合は、
"poh" と "p" を重ねた後の単語 "pohp" と "oh" を重ね "pohpoh" となります。
N 個の単語が与えられるので、前から順番に単語を結合した場合の新単語を出力してください。
入力例1
3
paiza
apple
letter
入力例2
3
poh
p
oh
ーーーここまで
これに対して、私が書いたコードが以下のものです。
ーーーここから
#1 単語の入力回数を取得。 処理に必要な変数をあらかじめ定義しておく n =int(input()) #1-2 最初の単語を取得 answer =str(input()) #1-3 2つ目以降の単語を比較していくため、#1のn-1回分ループ for i1 in range (n-1): #2 2つ目以降の単語をループの頭で取得 その他このループで必要な変数を定義 chara = ""#2つ目以降に入力される空の単語を定義 chara = str(input()) length = 0 test = ""#単語ごとに重なり合う部分を省いたものを一時保存する変数 overlap = False #2-2 直前の文字列と新しく入力された単語の長さを比較して少ないほうの文字数をlengthに代入 if len(answer) > len(chara): length = len(chara) else: length = len(answer) #2-3文字列の重なりを判定するため、length回ループ for i2 in range (1,length+1): #3追加された単語の文字列がすべて直前の文字列に含まれる場合はそのままループを終了 if chara == answer[-(len(chara)):]: test = "" overlap = True break #3-2 重なりがあるかを確認し、ababなどの繰り返しに対応するため重なりを省いた部分をtestに一時保存。overlapをTrueに if answer[-i2:] == chara[:i2]: test = chara[-(length-i2):] overlap = True #2-4 文字列に重なりが確認されていれば重複部分を省いてanswerに追加。なければそのまま追加 if overlap: answer += test else: answer += chara #1-4 結果を出力 print(answer)
ーーーここまで
提示された入力例以外にも誤動作を招きそうな入力例を考えていくつか入力してみましたがうまく処理できていました。
しかしゲームの判定は不正解でした。
このゲームは成否の判定はしてくれますが不正解の原因としてどんなエラーが起きたかまでは教えてくれないので自分で見つけ出す必要があるのですが、その「不正解となる状況」が見つけ出せなくて困っている、という状況です。
コードが見づらい、質問に不備がある等あるかと思いますがプログラミングはまだ1週間ほどしか学習していないのでそういった点は指摘してくださるととてもうれしいです。
助力いただけたら幸いです。
回答1件
あなたの回答
tips
プレビュー