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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

意見交換

クローズ

3回答

399閲覧

AtCoder, ABC303-A, より簡潔なコードにするにはどうしたらよいでしょうか?

ikazirou

総合スコア0

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2023/06/01 06:45

0

0

テーマ、知りたいこと

https://atcoder.jp/contests/abc303/tasks/abc303_a
上の問題に関して,自分の書いた解答をより簡潔なものにしたいです.
自分ならこうする,ここが冗長だなどありましたらお聞かせください.

前提

・私はプログラミングをかじったことがある程度です.
・未経験のIT企業への就職が決まったため,アルゴリズムの勉強を兼ねてAtCoder関連の問題を解いています.
・他者から見て分かりやすい,簡潔なコードをかけるようになりたいです.
・言語はPythonを使用します.

コード

Python

1def decision_sim(S, T): 2 N = len(S) 3 count = 0 4 S_dig = [str(digS) for digS in S] 5 T_dig = [str(digT) for digT in T] 6 7 for i in range(N): 8 if S_dig[i] == "l": 9 S_dig[i] = "1" 10 if S_dig[i] == "o": 11 S_dig[i] = "0" 12 13 if T_dig[i] == "l": 14 T_dig[i] = "1" 15 if T_dig[i] == "o": 16 T_dig[i] = "0" 17 18 for i in range(N): 19 if not S_dig[i] == T_dig[i]: 20 count += 1 21 break 22 23 if count == 0: 24 print("Yes") 25 else: 26 print("No") 27 28 29 30 31 32def main(): 33 N = int(input()) 34 S = input() 35 T = input() 36 decision_sim(S, T) 37 38main()

実装のプロセス

  1. S, Tの文字を一文字ずつ配列に格納
  2. S, Tの両者に関して"l"を"1"に"o"を"0"に変換
  3. 違う文字を発見したらカウンターを1増やす
  4. カウンターが0(初期値なら)"Yes", それ以外なら"No"を表示

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

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

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

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

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

回答3

#1

melian

総合スコア19825

投稿2023/06/01 07:06

python

1def decision_sim(S, T): 2 trans_tbl = str.maketrans({'l': '1', 'o': '0'}) 3 S_dig = S.translate(trans_tbl) 4 T_dig = T.translate(trans_tbl) 5 print("Yes" if S_dig == T_dig else "No") 6 7if __name__ == '__main__': 8 N = int(input()) 9 S = input() 10 T = input() 11 decision_sim(S, T)

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

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

#2

can110

総合スコア38266

投稿2023/06/01 08:17

・他者から見て分かりやすい,簡潔なコードをかけるようになりたいです.

「他者から見て分かりやすい」とはとてもいえませんが、簡潔=短いコードとして考えると以下で解けそうです。

Python

1print(['Yes','No'][len(set(map(lambda s:s.translate(s.maketrans('ol','01')),list(map(input,' '))[1:])))-1])

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

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

#3

TakaiY

総合スコア12779

投稿2023/06/01 09:23

他の方の回答からわかるように、「より簡潔なもの」と「他者から見て分かりやすい」というのは異なる場合が多いです。

自分が「他者から見て分かりやすい」について気にしながら書くと以下のような感じでしょうか。

python

1def similar_char(char_1, char_2): 2 if char_1 == char_2: 3 return True 4 elif (char_1 == 'l' and char_2 == '1') \ 5 or (char_1 == '1' and char_2 == 'l'): 6 return True 7 elif (char_1 == '0' and char_2 == 'o') \ 8 or (char_1 == 'o' and char_2 == '0'): 9 return True 10 else: 11 return False 12 13 14def similar_string(str_1, str_2): 15 result = True 16 for c1, c2 in zip(str_1, str_2): 17 if not similar_char(c1, c2): 18 result = False 19 return result 20 21 22def main(): 23 N = int(input()) # Do not use. 24 S = input() 25 T = input() 26 27 if similar_string(S, T): 28 print('Yes') 29 else: 30 print('No') 31 32 33main()
  • 処理の流れが把握しやすいように関数化する。
    similar_stringと similar_char に分けた。こうすることでどういう目的の処理なのか明確にできる。特にsimilar_charは、出題=仕様どおりの実装にしてある。
    それぞれの関数はもっと短くできますけど、するかどうかはチームの考えかたによる。

  • 関数がやっていることがわかるように書く。
    手続だけ書いてしまうと意図がわかりにくくなる。
    main()は、「入力されたSとTがsimilar_stringであったら Yes、 そうでなければ No と出力する」という処理。関数名も何をするのかわかるような名前 is_similar_string()でもいいかもしれない。
    similar_string()は、「中の文字をそれぞれsimilar_charで調べて、1つでも違うものがあればFalse」=「全てsimilar_charであればTrue」という処理。

見る人のスキルによってまったく異なります。

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

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

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問