質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

632閲覧

「python」paizaのゲームで正解できないが、何が原因になっているのかがわからない。

aozora2

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2024/08/22 03:33

0

1

初めてプログラミングを学んでいますが、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週間ほどしか学習していないのでそういった点は指摘してくださるととてもうれしいです。

助力いただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/08/22 04:58

> その「不正解となる状況」が見つけ出せなくて困っている 例えば以下の様な入力の場合、出力結果が ababef になります。(正しくは ababcdef) 3 abab ab abcdef
tmp

2024/08/22 08:50

これまでに結合された文字列より追加される文字列の方が長くて重なる場合です。 例1 2 abc bcdef 例2 2 a ab
guest

回答1

0

ベストアンサー

全体のロジックの流れと、「文字列と文字列をルールに従って結合」のコードが混ざっているので、分離すると見通しが良くなると思います。

Python

1n =int(input()) 2words = [input() for i in range(n)] 3 4def foo(x,y): 5 文字列xとyをルールに従って結合してそれをreturnする関数を書く 6 7ans = "" 8for word in words: 9 ans = foo(ans,word) 10 11print(ans)

また、

一番長く一致するように
を素直に実現すると、短い方の文字列の長さを3とすると、[1,2,3]でループするのでなく、[3,2,1]でループします。
・3文字一致したらそれが一致部分と確定
・そうじゃなくて2文字一致したらそれが一致部分と確定
・そうじゃなくて1文字一致したらそれが一致部分と確定
・そうじゃなければ一致部分は無かった

投稿2024/08/22 14:18

otn

総合スコア86380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aozora2

2024/08/23 14:39 編集

皆さん回答ありがとうございます。忙しくてなかなか学習に取り組めないのですが、日曜日の夜にまた時間が取れるはずなのでそこでチャレンジしたいと思います。
aozora2

2024/08/26 11:51

3人ともありがとうございました。無事正解することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問