質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python

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

Q&A

解決済

1回答

1921閲覧

Pythonを使ったプログラミングの問題について教えてください。

zero1132

総合スコア4

Python

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

0グッド

0クリップ

投稿2020/08/03 01:22

編集2020/08/03 01:30

[問題]

  1. 相性をチェックする二人の名前を並べた英小文字からなる文字列を入力します。
  2. "a" を 1、"b" を 2、...、"z" を 26 として、文字列を数列に変換します。この数列を A とします。
  3. 数列 A の隣り合う 2 つの数を足して前から順番に並べた新しい数列 A' を作り、これを新たに A とします。このとき、A の要素の大きさが 101 を超えていた場合、その要素から 101 を引きます。
  4. 数列 A の要素数が 1 になるまで 3. の手順を繰り返します。A の要素数が 1 となったとき、残った要素の値を「二人の相性」とします。

名前の並べ方は 2 通りあります。そこで、あなたは相性占いの結果として、 2 通りの方法で計算した「二人の相性」のうち大きい方を出力するようにプログラムを組むことにしました。

たとえば、ai さんと ueo さんの名前を "aiueo" として並べたとき、「二人の相性」は 97 になります。
[1, 9, 21, 5, 15]
[10, 30, 26, 20]
[40, 56, 46]
[96, 1]
[97]

ueo さんの名前を先に持ってきて "ueoai" とすると、「二人の相性」は 43 になります。
[21, 5, 15, 1, 9]
[26, 20, 16, 10]
[46, 36, 26]
[82, 62]
[43]

相性占いをする二人の人物の名前が与えられたとき、相性占いの結果を出力するプログラムを作成してください。

Python

1a , b = input().split() 2abc = {'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'i':9,'j':10,'k':11,'l':12,'m':13,'n':14,'o':15,'p':16,'q':17,'r':18,'s':19,'t':20,'u':21,'v':22,'w':23,'x':24,'y':25,'z':26} 3c = a+b 4l = [] 5 6for i in range(len(c)): 7 8 x = c[i] 9 10 y = abc[x] 11 12 l.append(y) 13 14 15print(l) 16 17m = [] 18count = 0 19 20for i in range(len(c)-1): 21 count = l[i] + l[i+1] 22 if count > 101: 23 count -= 101 24 m.append(count) 25 26print(m) 27 28n = [] 29p = 0 30 31for i in range(len(c)-2): 32 p = m[i] + m[i+1] 33 if p > 101: 34 p -= 101 35 n.append(p) 36 37print(n) 38 39q = [] 40j = 0 41 42for i in range(len(c)-3): 43 j = n[i] + n[i+1] 44 if j > 101: 45 j -= 101 46 q.append(j) 47 48print(q) 49 50v = [] 51h = 0 52for i in range(len(c)-4): 53 h = q[i] + q[i+1] 54 if h > 101: 55 h -= 101 56 v.append(h) 57 58print(v)

上のコードの通り、5文字までは実行でき解答を求めることができるのですが、a b の標準入力の範囲が1 ≦ (a の長さ) ≦ 1,000、1 ≦ (b の長さ) ≦ 1,000の時のプログラムの書き方が思いつきません。
np.cumsumを使って解くのかなと思ったのですが、できませんでした。
プログラミングに詳しい方、
入力例 alice bob
出力 97
などの上記の範囲(1 ≦ (a の長さ) ≦ 1,000、1 ≦ (b の長さ) ≦ 1,000)に対応するプログラムの書き方を教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示コードで繰り返し書いている部分をリストの要素が1個になるまでといったループにおさめればよいです。

Python

1def calc(s): 2 cur = [ ord(c)-ord('a')+1 for c in s] # 数値リストに変換 3 4 # リストの要素が1個になるまで 5 while( len(cur) > 1): 6 next = [] 7 for i in range(len(cur)-1): 8 v = cur[i] + cur[i+1] 9 if v > 101: 10 v -= 101 11 next.append(v) 12 cur = next 13 return cur[0] 14 15 16a, b= 'ai', 'ueo' 17 18print(calc(a+b)) # 97 19print(calc(b+a)) # 43

投稿2020/08/03 01:54

can110

総合スコア38278

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

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

zero1132

2020/08/03 02:28

回答ありがとうございます。答えを導くことができたのですが、私の知識不足で理解できない部分がありますので、ご教授ください。 cur = [ ord(c)-ord('a')+1 for c in s] # 数値リストに変換のところで、 aiueo[1, 9, 21, 5, 15] ueoai[21, 5, 15, 1, 9]となっていると思うのですが、ord(c)-ord('a')+1の部分を教えてください。
can110

2020/08/03 02:32

ord関数については調べてみましたでしょうか?
zero1132

2020/08/03 02:48 編集

調べてみました。print(ord('a'))の時は97と出力されるみたいなのですが、今回の場合ではaの時に1になるのがよく分かりませんでした。
can110

2020/08/03 02:48

「ord('a') - ord('a') + 1」で「a」の時は1になります。 「ord('b')」は98なので同じように2になります。
zero1132

2020/08/03 02:57

なるほど、そういうことだったんですね。 理解でました。有り難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問