2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python 10進数で回文

Last updated at Posted at 2019-08-13

#問題
10進数、2進数、8進数の何で表現しても回文数となる数のうち、
10進数の10以上で最小の値を求めてください。
例)9(10進数)= 1001(2進数)= 11(8進数)
 ※この例は10進数で10未満なので対象外
引用「プログラマ脳を鍛える数学パズル 著者 増井敏克」

#回答

answer.py
num = 11
while num > 0:
    if str(num) == str(num)[::-1] and format(num, "b") == format(num, "b")[::-1] and format(num, "o") == format(num, "o")[::-1]:
        print("RESULT: ", num)
        break
    num += 2

# => RESULT: 585

#修正後

answer_after.py
num = 11
while True:
    if all(f'{num:{t}}' == f'{num:{t}}'[::-1] for t in 'dob'):
        print("RESULT:", num)
        break
    num += 2

#つまづいたところ
10進数を変換!ということで、
はじめに安易に組み込み関数のbin()oct()を使ってしまいました。
しかしそれぞれにプレフィックスが追加されてしまい、
回文数になりませんでした。
formatに直したところうまくいきました。
また、スライスのところもreversed()から修正したところになります。
初めてスライスを使ったような気がします。

#修正追記
@shiracamus様にコメントをいただきそのまま修正後としました、
ご教示いただきありがとうございました。

こちらの方がかなりスッキリしていますね。
all関数を使い、if文中の全ての要素がTrueの時だけ、
print("RESULT:", num)を返します。
これでとりあえずandはいらなくなりますね。

f-stringとジェネレータ式によって中身がガラッと変わりました。
f-stringは文字列の前にfまたはFを置きます。
そうすると文字列中の置換箇所{}内に変数をそのまま指定することができます。
f'{num:{t}}'numは11、13、15・・・となるわけですね。

次にtの部分です。
ここでジェネレータ式が関わってくると思うんですが理解が及ばず・・・
わかった範囲では、
f'{num:{t}}'tには'dob'をfor文で回したdobが入るみたいです。

f-stringとジェネレータ式によって、
f'{num:{t}}'ははじめにf'{11:d}'になります。
さらにtの部分がdなら10進数に変換、
obならそれぞれ8進数、2進数に変換となるわけですね。

あとはそのままの状態と反転させた時がTrueであれば、
その値を返してbreakで終了、
Trueでなければ2加算して・・・と繰り返しとなります。

こんなところで追記は以上となります。
ご拝読ありがとうございました。

2
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?