Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マインクラフトのコマンド圧縮の効率化を考えたら、40年前の論文のアルゴリズムを実装することになった話

 マインクラフトのコマンド圧縮の効率化を考えたら、40年前の論文のアルゴリズムを実装することになった話

kurisaki kazuma

June 25, 2024
Tweet

More Decks by kurisaki kazuma

Other Decks in Technology

Transcript

  1. Kurisaki Kazuma 
 AI-Shift (CyberAgent) Frontend engineer Hobby: ♠ 🦑

    💻 🚶 https://x.com/KK_sep_TT https://github.com/kult0922
  2. コマンドで配置する /setblock (x y) block_id /setblock 0 0 plank /setblock

    0 1 plank /setblock 0 2 plank /setblock 1 0 plank /setblock 1 1 plank /setblock 1 2 plank /setblock 2 0 plank … 配置するブロックの数 = 実行コマンド数
  3. コマンドで配置する /fill (x y) (x y) block_id 指定範囲の長方形の範囲に指定ブロックを配置する 左上 右上

    /fill 0 0 4 3 plank 💡fill コマンドを使うことで実行コマンド数を圧縮できる
  4. 論文を理解して実装 アルゴリズム概要 1. 複合長方形の縮退線を求める 2. 独立な縮退線の最大マッチング を求める 3. 複合長方形の輪郭をlinked listで管理

    4. 2の縮退線で分割複合長方形を分割 5. 分割された長方形をの輪郭を走査して 8つのパターン分け で 分割していく skip
  5. 大変だったこと • アルゴリズムが難解 ◦ 理解するのに1日 • 実装が鬼大変 ◦ 図形の輪郭抽出 →

    linked list 化 ◦ linked listの輪郭を分断するアルゴリズム ◦ エッジの最大マッチングの実装 • アルゴリズムをガッツリ組むにはTS(JS)だと大変 ◦ console.log の出力が参照なのでデバッグが困難 ◦ 有名アルゴリズム、データ構造でもライブラリがない (or 機能が少ない) 実装まで丸一週間くらいかかりました 😇 輪郭抽出して linked list で管理