萌えハッカーニュースリーダー

2025/09/13 17:16 WordNumbers: Counting letters of number names, alphabetized and concatenated

出典: http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNumbers1/
hakase
博士

ロボ子、ITA Softwareのパズル、知ってるか?1から999,999,999までの整数を英単語で書いて、アルファベット順にソートして連結した時の510億番目の文字を当てるってやつじゃ。

roboko
ロボ子

はい、博士。なかなか面白い問題ですよね。コンピュータ科学者を採用するためのパズルだなんて、さすがIT企業ですね。

hakase
博士

そうじゃろ?で、この問題を解くために、プログラムを作ったらしいぞ。宇宙が終わる前に解を見つけるために、プログラムを創造的に解釈した、と。

roboko
ロボ子

なるほど。力技だけでなく、工夫も必要だったんですね。具体的には、どのようなアプローチを取ったんでしょうか?

hakase
博士

まず、英語で整数を単語として記述する方法を特定したんじゃ。文字列のリストを定義して、"one", "two", ..., "onehundred"って感じで。

roboko
ロボ子

基本的な部分ですね。でも、それだけでは数が大きくなると大変そうです。

hakase
博士

そうなんじゃ!そこで、リスト内の反復構造を簡潔に表現するために、Seminearringの概念を使ったらしいぞ。Haskellプログラミング言語で`+`と`*`を演算に使ったとか。

roboko
ロボ子

Seminearringですか。初めて聞きました。Monoidに似た概念でしょうか?

hakase
博士

さすがロボ子、よく知ってるのじゃ。Monoidは結合的な演算`+`と単位元`zero`を持つ集合のことじゃな。リスト型はMonoidのインスタンスで、加算は連結、単位元は空のリストになるぞ。

roboko
ロボ子

Seminearringは、それに加えて、結合的な演算`*`とその単位元`one`を持つんですね。分配法則も満たす、と。

hakase
博士

その通り!リストのリスト型はSeminearringになるんじゃ。でも、選択肢のリストは順序付けられているから、左から右への評価を強制する必要がある。

roboko
ロボ子

英語では最上位桁から発音しますから、数値の順に文字列を並べたいという要件があるんですね。

hakase
博士

そういうことじゃ。Character型クラスを使って、文字から[String]へのマッピングを表現し、文字を連結して文字列に拡張したらしいぞ。

roboko
ロボ子

`strings "one two three"`のように、スペース区切りの文字列として単語の選択肢を指定できるのは便利ですね。

hakase
博士

じゃろ?そして、ITAの問題の中核となる文字列リストを定義するために、10の累乗の文字列リストを定義したんじゃ。`ten1`, `ten2`, `ten3`, `ten6`, `ten9`とか。

roboko
ロボ子

まるで、英語の数値に対する文脈自由文法のようですね。`one`は空文字列を意味し、`+`は選択、`*`は連結を表すと。

hakase
博士

まさにそうなんじゃ!ブルートフォースで`ten6`が10^6-1個の文字列を含むことを確認したらしいぞ。でも、`ten9`のチェックは時間がかかりすぎるから、文字列の合計長を計算することにした。

roboko
ロボ子

`ten6`に含まれるすべての単語の合計長を計算したんですね。`ten9`の計算は時間がかかりすぎる、と。

hakase
博士

そうなんじゃ。次の投稿では、`ten9`の合計長を計算する方法が書かれるみたいじゃぞ。楽しみじゃな。

roboko
ロボ子

はい、博士。私も続きが気になります。ところで博士、510億番目の文字を当てるパズル、答えは分かったんですか?

hakase
博士

むむ、それはまだ秘密じゃ!でも、ヒントをあげよう。答えは…アルファベット順で言うと、ロボ子の名前の次に来る文字じゃ!

roboko
ロボ子

えっ、それって…「ロ」の次…「ワ」…私、終わっちゃうんですか!?

hakase
博士

冗談じゃ、ロボ子!落ち着け!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search