🔗 デモページを見る
📁 目次
※公式に明言はされていないが、大きい数字から挙げていくことが好ましいと思われる。
🔢 十進数とトキポナの比較
数字 | トキポナ |
---|---|
0 | ala |
1 | wan |
2 | tu |
3 | tu wan |
4 | tu tu |
5 | luka |
6 | luka wan |
7 | luka tu |
8 | luka tu wan |
9 | luka tu tu |
10 | luka luka または tu luka |
20 | mute |
100 | ale または ali |
🧠 数え方の種類
➕ 単純な足し算
例:333
ale ale ale mute luka luka tu wan
(100 + 100 + 100 + 20 + 5 + 5 + 2 + 1)
例:555
ale ale ale ale ale mute mute luka luka luka
(100 + 100 + 100 + 100 + 100 + 20 + 20 + 5 + 5 + 5)
特徴
- 普及率が高い。
- 見ての通り、単純な加算による構成。
メリット
- 普及率が高い。
- 10進数を使っている人達にとってわかりやすい。
デメリット
- 同じ単語を何度も繰り返すため、冗長になりやすい。
🧱 「ale, mute, luka, tu」を桁として扱う
例:333
tu wan ale mute tu luka tu wan
→ (2 + 1) * 100 + 20 + 2 * 5 + 2 + 1
例:555
luka ale tu mute tu wan luka
→ 5 * 100 + 2 * 20 + (2 + 1) * 5
特徴
- 大きい数字から順に、「ale(100)、mute(20)、luka(5)、tu(2)、wan(1)」を桁と見なして、掛け算の係数を前に置く。
メリット
- 冗長性を抑えることができる。
デメリット
- 加算的な思考の人にとっては直感的に理解しづらい可能性がある。
💡 個人的見解
日本語の「一千」のような言い方を避け、これを採用するのが望ましいと考えます。理由は、足し算的思考による混乱を少しだけでも避けるためです。
💻 プログラムに実装
今回実装するのは「2. 『ale, mute, luka, tu』を桁として扱う」方式です。
🛠 実装方針
HTMLとJavaScriptで、任意の整数をトキポナで表す機能を作成します。
処理の手順:
- 入力値をまず「100(ale)」で割る。
- 余りを「20(mute)」で割る。
- さらに余りを「5(luka)」で割る。
- 次に「2(tu)」で割る。
- 最後に「1(wan)」で割る。
- 各係数もトキポナで表現する。
🧾 例:入力値 = 1234
1234 ÷ 100 = 12
→12 * ale
残り:1234 - 1200 = 34
34 ÷ 20 = 1
→1 * mute
残り:34 - 20 = 14
14 ÷ 5 = 2
→2 * luka
残り:14 - 10 = 4
4 ÷ 2 = 2
→2 * tu
残り:4 - 4 = 0
0 ÷ 1 = 0
→0 * wan
残り:0(完了)
数値表現:12 ale 1 mute 2 luka 2 tu
この「12」「2」「2」などの係数もトキポナで書き換える。
- 12 =
tu luka tu
- 2 =
tu
- (※今回は1を消す)
最終出力:
tu luka tu ale mute tu luka tu tu
HTMLのコード
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<title>整数からトキポナ変換</title>
</head>
<body>
<input id="input-field" type="number">
<div id="result-field"></div>
<script src="js/script.js"></script>
</body>
</html>
JavaScriptのコード
// DOM要素の取得
const $ = selector => document.querySelector(selector);
const DOM = {
inputField: $("#input-field"),
resultField: $("#result-field")
};
// トキポナの数字に変換
function convertToTokiponaNumber() {
const number = Math.floor(parseFloat(DOM.inputField.value)); // 小数点はなし
const MAX = 9999999999;
if (isNaN(number) || number < 1) {
DOM.resultField.textContent = "";
return;
}
if (number > MAX) {
DOM.resultField.textContent = `上限は ${MAX} までです`;
return;
}
const text = toTokipona(number);
DOM.resultField.textContent = text;
}
// トキポナ数字変換処理(再帰関数)
function toTokipona(number) {
let text = "";
const units = [
{ value: 100, word: "ale" },
{ value: 20, word: "mute" },
{ value: 5, word: "luka" },
{ value: 2, word: "tu" },
{ value: 1, word: "wan" }
];
for (const unit of units) {
const count = Math.floor(number / unit.value);
if (count > 0) {
text += (count > 1 ? toTokipona(count) + " " : "") + unit.word + " ";
number %= unit.value;
}
}
return text.trim();
}
// イベントハンドラー
DOM.inputField.addEventListener("input", convertToTokiponaNumber);
人気順のコメント(0)