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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for kurisaki kazuma

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 で管理