こんにちは。nasuoです。
皆さんはPaizaの新作ゲーム、電脳少女プログラミング2088で遊んでますでしょうか。
僕はといえば、レイミとストーリーを進めていく最中に、
「廃マンションの一室」という問題に出会いました。
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_c_02
今までの常識を見つめ直させる良問だなと思いながら、
攻略できた!よっしゃー!
十進数や三進数の仕組みを見直す、良い機会になりました。
(レイミが褒めてくれる親切な設計、すごくいいですね。)
では、早速コード解説に参りましょう。
廃マンションの一室 解答:python3
def san(n):
q = (n + 1) // 3
r = (n + 1) % 3
if q == 0:
return ""
else:
return san(q) + "201"[r]
n = int(input())
if n == 0:
print(0)
exit()
hugou = "1"
if n < 0:
hugou = "2"
print(hugou + san(n))
コードの概要としては、
1,定義
2,符号決定
3,出力
の3つからなります。
1,定義
入力された値から1を足した数字に、三で割った商と余りをqとrとしておきます。このアルゴリズムについては、下記の動画の説明がわかりやすかったです。ぜひ参考にしてみてください。
入力された値から1を足しているのは、[2,0,1]の並びを-1,0,1と対応させたかったからです。2をどのように-1として実装するのかが、この問題を解く上で重要だったと思います。
2,符号決定
まず、0を除外します。都合の悪い数字を早めに退場させたい時に、exit()は本当に便利。
入力された値が自然数なら1を、そうでないなら2を一番左におきます。
3,出力
符号と定義に通した入力値を、結合させて完成です。
やっぱりプログラミングって、すごく楽しいし面白いですね!