#問題
10進数、2進数、8進数の何で表現しても回文数となる数のうち、
10進数の10以上で最小の値を求めてください。
例)9(10進数)= 1001(2進数)= 11(8進数)
※この例は10進数で10未満なので対象外
引用「プログラマ脳を鍛える数学パズル 著者 増井敏克」
#回答
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
#修正後
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文で回したd
、o
、b
が入るみたいです。
f-stringとジェネレータ式によって、
f'{num:{t}}'
ははじめにf'{11:d}'
になります。
さらにt
の部分がd
なら10進数に変換、
o
、b
ならそれぞれ8進数、2進数に変換となるわけですね。
あとはそのままの状態と反転させた時がTrueであれば、
その値を返してbreakで終了、
Trueでなければ2加算して・・・と繰り返しとなります。
こんなところで追記は以上となります。
ご拝読ありがとうございました。