頑張らないように頑張る。

努力と怠惰の狭間

10進数の理解が難しい🔢

2進数とか10進数とかのあれ。

日常生活だと1から始まるのに、

何で0から始まるんだろうね。謎。


💻「アルファベット進数」のプログラム組んでみた

正確には「アルファベット進数」じゃなくて「列名変換」と言われてるらしいけど、そんな事は気にしない()

そもそものきっかけ

Pythonのモジュール「openpyxl」を使っていて、「最大行・最大列の範囲を指定する」をしようとした際、方法論が見当たらなかった事がそもそものきっかけ。

# モジュールをインポートして、
# Excelファイルを取得し、
# Sheet1を指定して、
# A1:X3の範囲を取得する。
import openpyxl
book = openpyxl.load_workbook("hoge.xlsx")
sheet = book.get_sheet_by_name('Sheet1')
row = sheet["A1:X3"]  # ←問題箇所

上記のコードでは「A1:X3」とハードコーディングで指定しているが、実際のプログラムでこんな事をする訳がない。

sheet.max_columnsheet.max_rowを使えば何とかできそうな気もしたけど、列名を取得する方法が見当たらない。。。

「だったら作ってしまえ!」っていうのがきっかけ( '-' )

プログラム

qiita.com

今回は「与えられた数値を元に、後ろから確定させていく」という形で組んでみた。 (「731」が与えられた場合、答えは「ABC」になるので、「C→B→A」の順で確定させていく)

いただいたコメント

現時点で2件のコメントをいただいた。

  • c-yanさんver.
    • 組み込み関数ord(),chr()を用いて再帰処理で実装
    • 「A」を基点として、与えられた数値を26で割った剰余を加算して、後ろから確定させていく
  • shiracamusさんver.
    • yieldを用いる事で再帰処理をしない方法で実装
    • アルファベット文字列のインデックスを、与えられた数値を26で割った剰余で求め、後ろから確定させていく

前者は、組み込み関数を用いる方法なんて考えもしなかった。 確かにコードポイントを「A」を基点に加算すれば、欲しいアルファベットが求まる。 なるほど、凄い。

後者は、yieldの使い方がイマイチ分かってなかったので断念してた部分を再現してくれた。 とても嬉しい。

あと、両者とも//を使っているが、これが「商のみ取得」ができる事を知らなかった。 僕はmath.floor()でわざわざ切り捨てたりしてた、、、恥ずかしい。


ただ、全体的な方向性は合っていたので安心した。 「後ろから確定させていくために剰余を用いて、商が26より大きい場合に再帰処理する」というというのは外れではなかった。 これはちゃんと嬉しい。


🔢10進数の理解

コメントをいただいたのが嬉しくて、彼女に説明をした。 ただ、彼女はIT業界の人間ではないのでPythonなんて分からないし、そもそも数字も得意ではない。 なので「10進数の説明」から始めた。 (もちろん彼女も10進数については理解しているが、復習も兼ねて)

ただ、説明するのが難しいのなんの、、、


僕「0から9まで10種類あるから10進数って言ってね、」
彼女「何で0始まりなの?人間界だと1始まりじゃん。」

僕「10種類使い切ったら桁上りが発生するから10になってね、」
彼女「何で10なの?00とか他にならないのは何で?」

はい、ごもっともです。感覚で答えてました、ごめんなさい(反省)


なんだろう、感覚では答えれるし頭でも分かってるはずだけど、明確な説明ができないこの感じ、、、

ちゃんと説明できる大人ってどれくらいいるんだろうか。


🙂まとめ

頭で分かってても、手法を知らなければ遠回りしてしまう。

その遠回りを他人に見せる事で、近道を教えてもらえるかもしれない。


というか「頭で分かってるけど説明できない事」というのは、本当に分かっているのだろうか。

「分かっている」とは何なんだろう...(哲学)


🤔そんな事より、

スコーピオン Season2」の6話で出てきたこれ。

f:id:hanakayui:20181126112520j:plain

「"x"に入る数値は何?」という問題。

僕も何人かに試してみて、ほとんどみんな頭を抱える中、一人だけ5秒くらいで「分かった」って答えてきてビックリした( '-' )すごい