2024-12-29
共通テスト用プログラミング言語を目指す、DNCL3。Geo3x3の実装ができるようになりました。


「DNCL3 → AST → like JavaScript → output」
src on GitHub

緯度経度精度を1つの文字列にするエンコードは比較的素直な実装。

function encode(lat, lng, level) { res = "E" if lng < 0 { res = "W" lng = lng + 180 } lat = lat + 90 # 180:the North Pole, 0:the South Pole unit = 180 for i = 1 to level - 1 { unit = unit / 3 x = lng // unit y = lat // unit res = res + (x + y * 3 + 1) lng = lng - x * unit lat = lat - y * unit } return res }

文字列の足し算で組み立てています。整数の割り算できる演算子「//」が使えるので、JavaScriptよりシンプルに書けます。

Geo3x3の文字列から緯度経度精度に戻すデコードに必要な一工夫。文字列は配列のようにアクセスできるとして、領域外は空文字列を返すことにし、繰り返しの途中で抜ける break コマンドと、配列としての値も実装。文字列に対応する数を返す関数 char2n と共に無事実装完了!

function char2n(c) { if c == "0" { return 0 } else if c == "1" { return 1 } else if c == "2" { return 2 } else if c == "3" { return 3 } else if c == "4" { return 4 } else if c == "5" { return 5 } else if c == "6" { return 6 } else if c == "7" { return 7 } else if c == "8" { return 8 } else if c == "9" { return 9 } return -1 } function decode(code) { flg = 0 if code[0] == "W" { flg = 1 } unit = 180 lat = 0 lng = 0 level = 1 while 1 { n = char2n(code[level]) if n <= 0 { break } unit = unit / 3 n = n - 1 lng = lng + n % 3 * unit lat = lat + n // 3 * unit level = level + 1 } lat = lat + unit / 2 lng = lng + unit / 2 lat = lat - 90 if flg { lng = lng - 180 } return [lat, lng, level, unit] }

エンコード、デコード共にできました。

Geo3x3のリポジトリでも実行できます。

「taisukef/Geo3x3: a simple geo-coding system for WGS84」

AppleScript版に続く、108言語目の対応となりました。

links
- 英語っぽい文法で記述するプログラミング言語、AppleScriptで表現するGeo3x3 with ChatGPT
- オープンソースの新プログラミング言語、共通テスト用プログラム表記「DNCL3」を実装と共に提案
- 共通テスト手順記述標準言語 (DNCL)と共通テスト用プログラム表記をMarkdown化しIssuesを作成

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS