「JavaScriptで数値を漢数字に変換する本」を題材にCodeGolfしてみた

584 Views

September 09, 25

スライド概要

このスライドでは、JavaScriptで数値を漢数字に変換するアルゴリズムを題材にしたCode Golfの体験を紹介しています。Code Golfは最短のソースコードで問題を解くプログラミングコンテストであり、特定のルールに従って数値を漢数字に変換する関数の短縮バージョンを制作しました。数値の入力に対して正しい漢数字を返す関数名「n2k」を使用し、文字数を競う楽しさや創意工夫について触れています。また、コードの短縮過程やその結果も共有し、Code Golfの楽しさを伝えています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

「JavaScriptで数値を漢数字 に変換する本」を題材にCode Golfしてみた 2025/08/23 JMLT 2025/08/31 えびてく つつてん

2.

- つつてん(X: @tututen) - サーモン大好き - この人だれ? - 美味しいサーモンに出会いにくくな り、最近は「しゃぶ葉の人」 from:@tututen あさごはーん - 技術スタックはAWS (Lambda・StepFunctions)、 Python

3.

Code Golf https://ja.wikipedia.org/wiki/%E3%82% B3%E3%83%BC%E3%83%89%E3%82 %B4%E3%83%AB%E3%83%95 コードゴルフはコンピュータプログ ラミング・コンテストの一種。参加 者は与えられたアルゴリズムを、 可能な限りもっとも短いソース コードで記述することを競う。バイ ナリサイズではなく、ソースコード の文字数がスコアとなる。

4.

例:1からnまで足した数を返す関数fを作れ 敗者 勝者 余分な空白なんぞ不要

5.

例:1からnまで足した数を返す関数fを作れ 敗者 勝者 冗長な変数名、変数宣言なんぞ不要

6.

例:1からnまで足した数を返す関数fを作れ 敗者 勝者 改行、インデント、可読性なんぞ不要

7.

例:1からnまで足した数を返す関数fを作れ 敗者 勝者

8.

例:1からnまで足した数を返す関数fを作れ 敗者 勝者 和の公式 時に数学に明るいと有利なこともある

9.

例:1からnまで足した数を返す関数fを作れ 敗者 14文字 勝者

10.

例:1からnまで足した数を返す関数fを作れ 敗者 14文字 勝者 13文字 時にCSに明るいと有利なこともある

11.

急にCode Golfしようと思ったのか https://x.com/jsakamoto/status/1949453544345784577

12.

お題 元ネタ: JavaScriptで数値を漢数字に変 換する本 https://techbookfest.org/product/uSth KTCKkN6EUNCQ0Gn4TY?productVari antID=j5gcGUKJ5zvF0J38PBfxP5

13.

お題 元ネタ: JavaScriptで数値を漢数字に変 換する本 https://techbookfest.org/product/uSth KTCKkN6EUNCQ0Gn4TY?productVari antID=j5gcGUKJ5zvF0J38PBfxP5 1 から 9999 の数値を入力とし, 漢数 字の文字列を返す関数

14.

基本ルール - 漢数字は,数を表す 一,二,三,四,五,六,七,八,九 と「くらい (位)」を表す 千,百,十 で構成する。 - ある位の数が 0 であるとき,漢数字の〇は使用せず,その位 は出力に含まない。 - ある位の数が 1 であるとき,一千のような表記は使用せず, 一を含まない「千」のようにする。

15.

n2kの Input/Output 例 - 1→一 - 10 →十 - 1001 → 千一 - 3456 → 三千四百五十六 - 9119 → 九千百十九

16.

言語ルール - 関数名を 「n2k」 とし、Number型の1〜9999のいずれかの 整数値が必ず第1引数に入るものとする - 使用するプログラミング言語はJavaScriptを使用する

17.

AIに作ってもらった コードを短くしたいのであって、問題を解きたい訳では無い

18.

AIに作ってもらった(あ、はい) コードを短くしたいのであって、問題をときたい訳では無い(ぁ

19.

ゴルフ前のコードを見たいかたはこちらから https://gist.github.com/tututen/a460db5c89aa2e6229cadebf6cb70dd3

20.

今回は短くする過程は説明しません - 10人いれば5つくらいの方法が出てきます - その中にはうちが導けた解法より短く解ける場合が よくあります、楽しみにしてます! - 今回は「あのコードがなんでこれに?」を味わっても らいたい - コードはAIに説明させたり、本を買ってお布施しな がら理解しましょう!!

21.

方針: 文字列に整形して 要らない文字を 置換でどうにかする

22.

今回のコードゴルフの結果(ver.0807) $ cat /tmp/a.js n2k=n=>((t="0一二三四五六七八九")[n/1000|0]+"千"+t[n/100%10|0]+"百"+t[n/10%10|0]+" 十"+t[n%10]).replace(/一([千百十])|0[千百十]?/g,(_,a)=>a||"") $ wc /tmp/a.js 0 3 162 /tmp/a.js $ cat /tmp/a.js | python3 -c 'print(len(input()))' 124

23.

今回のコードゴルフの結果(ver.0807)

24.

次の日

25.

今回のコードゴルフの結果(ver.0808) $ cat /tmp/b.js n2k=n=>(t="0一二三四五六七八九",t[n/1e3|0]+"千"+t[n/100%10|0]+"百"+t[n/10%10|0]+" 十"+t[n%10]).replace(/一(.)|0.?/g,"$1") $ wc b.js 1 3 134 b.js $ cat b.js | python -c "print(len(input()))" 107

26.

今回のコードゴルフの結果(ver.0807)

27.

(自分の)詰めが 甘すぎでしたね!!

28.

さらに2日後

29.

今回のコードゴルフの結果(ver.0810) $ cat /tmp/c.js n2k=n=>[..."千百十",""].map((v,i)=>(s=n/10**(3-i)%10|0)>1?"二三四五六七八九"[s-2]+v:s?v||" 一":"").join`` $ wc c.js 1 3 117 c.js $ cat c.js | python -c "print(len(input()))" 92

30.

今回のコードゴルフの結果(ver.0810)

31.

┏━━-┷-━━┓ ┃こ 参 1 ┃ ┃わ 加 0 ┃ ┃が 者 0 ┃ ┃ら み 文┃ ┃せ ん 字┃ ┃ま な 切┃ ┃し を り┃ ┃ょ を┃ ┃う し┃ ┃ て┃ ┗━━━━━━┛ 某サメコラより 著作権配慮

32.

まとめ - Code Golfは楽しいよ! - 切磋琢磨することで、短くなる(ときもある) 162byte/124文字 134byte/107文字 117byte/92文字

33.

引用 - X(Twitter) - https://x.com/jsakamoto/status/195366777101 6839197 - https://x.com/jsakamoto/status/195452091606 0405957

34.

🥛Cheers!!🥛