MN-Core2 上でのFizzBuzzゴルフ実装

MN-Core2 上でのFizzBuzzゴルフ実装

2024/08/28- 2024/09/23 に開催した MN-Core Challenge の参加者による、最終問題の解説の資料です。

Avatar for Preferred Networks

Preferred Networks PRO

September 26, 2024
Tweet

More Decks by Preferred Networks

Other Decks in Programming

Transcript

  1. 自己紹介 • 自称 angel、各種IDには p57 つけてます • SNS: X(Twitter)上で主に活動、へのへのもへじネコが目印 •

    本業はBrainf**ker ※Brainf**k案件のオファーはまだありません!! • メシの種としてしがないIT技術者やってます • 1タイトル特化でゲーム攻略・RTAもやってます (SFC/セプテントリオン) • 今回総合5位(!) FizzBuzz最短は最終日に抜かれました…
  2. 時系列 • 「FizzBuzz?絶対大変じゃん、やる余裕ないのでは?」 • 「あ、なるほどこれ Count Upの類題だ」 • 「カーネル(コア部分実装)組めればワンチャン勝負になる?」 •

    150行程度の見積もりでカーネル考案→「勝負するか!」 ※その時はtailsさんの195行実装のみ • 143行で最初の提出(最終日前日早朝) ※ついでに折角だし解説やっとくかと決意 • ちょこちょこ直して112行でフィニッシュ • コンテスト終了直後、最短抜かれてることを知る…
  3. Count UpとFizzBuzzの類似性 • Count Up PEの位置を元に連番ブロックを 生成 • FizzBuzz PEの位置を元にFizzBuzzの8

    文字ブロックを生成 1,2 3,4 5,6 7,8 ・・・ 1n2n Fizz n4nB uzzn Fizz n7n8 nFiz znBu ・・・ L2B L2B L2B L2B L2B L2B L2B L1B MAB PE PE PE PE
  4. FizzBuzzの規則性 • FizzBuzz大ブロックサンプル ◦ blkid 1900~1978 ⇔ 3000~3119 のFizzBuzz大ブロック ◦

    blkid 1950 は6つ目の小ブロック6~13文字目(”uzzn3076”) FizzBuzz n3001n30 02nFizzn 3004nBuz znFizzn3 007n3008 nFizznBu zzn3011n Fizzn301 3n3014nF izzBuzzn 3016n301 7nFizzn3 019nBuzz nFizzn30 22n3023n FizznBuz zn3026nF izzn3028 n3029nFi zzBuzzn3 031n3032 nFizzn30 34nBuzzn Fizzn303 7n3038nF izznBuzz n3041nFi zzn3043n 3044nFiz zBuzzn30 46n3047n Fizzn304 9nBuzznF izzn3052 n3053nFi zznBuzzn 3056nFiz zn3058n3 059nFizz Buzzn306 1n3062nF izzn3064 nBuzznFi zzn3067n 3068nFiz znBuzzn3 071nFizz n3073n30 74nFizzB uzzn3076 n3077nFi zzn3079n BuzznFiz zn3082n3 083nFizz nBuzzn30 86nFizzn 3088n308 9nFizzBu zzn3091n 3092nFiz zn3094nB uzznFizz n3097n30 98nFizzn Buzzn310 1nFizzn3 103n3104 nFizzBuz zn3106n3 107nFizz n3109nBu zznFizzn 3112n311 3nFizznB uzzn3116 nFizzn31 18n3119n FizzBuzz n3121n31 22nFizzn 3124nBuz znFizzn3 127n3128 nFizznBu zzn3131n Fizzn313
  5. FizzBuzzの規則性 • 計算式(4桁のn部分) ◦ パラメータは3種 ▪ 桁数=4 ▪ blkid補正=75 ▪

    小ブロック番号補正=0 ◦ 導出パラメータは2種 ▪ 小ブロックサイズ=桁数+6=10 ▪ 大ブロックサイズ=(桁数+6)×8-1=79
  6. FizzBuzzの規則性 • 計算式(4桁のn部分) ◦ 大ブロック位置計算 q,r = divmod(blkid + blkid補正,

    大ブロックサイズ) ◦ 小ブロック位置計算 x,y = divmod(r, 小ブロックサイズ) ◦ 計算結果 通算小ブロック番号 = q×8 + x - 小ブロック番号補正 小ブロック内位置 = y×8 + x ◦ 計算例 blkid=1950 → q,r = divmod(1950+75, 79) = 25,50 x,y = divmod(50, 10) = 5,0 通算小ブロック番号 = 25×8 + 5 - 0 = 205 ( 205×15~205×15-1 小ブロック ) 小ブロック内位置 = 0×8 + 5 = 5 ( FizzBuzzn3076n3077nFizz…の6文字目から )
  7. 実装にあたっての課題 • 桁数の違いへの対応 ◦ 数字部分の桁数、1~4とバリエーションがあるよね? → 桁数に応じて処理を分ける?  コード量4倍なんて受け容れられるか!!(#^ω^) → パラメータの違いで吸収

    & 数字は4桁で固定して考える ◦ 結局桁数の違いどうすんの? 文字位置を桁数に応じてスライドさせて対応 ※位置さえ分かれば、LM0のTレジスタ相対でなんとかなる
  8. 桁数に関する懸念事項 • ところで異なる桁数が混じると困らない? ◦ 桁数が変わるところは、9,10 や 99,100、999, 1000 の部分に相当 ◦

    つまり、”FizznBuzzn” という固定長バリアとして機能 桁数が混じるブロックは考えなくて良い → FizzBuzz考案者はブロック化FizzBuzzを  考慮していたに違いない!!
  9. その他実装上の課題 • 除算・剰余算の多用 ◦ 数値 → 数字換算も含め、divmod をたくさん使いますね? Mod 3

    みたいなことしないといけないの?? ※ x % 3 = ( x + x / 3 ) & 3 = ( x + x × 119 × 2^(-9) ) & 3 的な話 → 除数によって処理変わっちゃうじゃん!!(#^ω^) ◦ 数値を浮動小数点数で扱えば乗算使える 逆数だけ自前で用意して、fvmul → ffloor → fvfma で divmod ※数字換算の場合は、fvadd ( +48.0 ) と fftoi も追加
  10. パラメータの決定 • 1~4桁対応のためのパラメータ ◦ blkid→桁数換算のための閾値も必要 ◦ 導出パラメータは計算して作るが、逆数は自前で用意 桁数 開始blkid blkid補正

    小ブロック 番号補正 小ブロックサイズ 逆数 大ブロックサイズ 逆数 1 0 8 1 1/7=0.14285… 1/55=0.01818… 2 3 49 6 1/8=0.125 1/63=0.01587… 3 50 35 3 1/9=0.11111… 1/71=0.01408… 4 583 75 0 1/10=0.1 1/79=0.01265…
  11. • 実装コード上の処理の流れ 処理の流れ const blkid select position canvas ftos4 slide

    makeblk merge 定数準備 blkid計算 パラメタ選択 位置情報等計算 キャンバス準備 4桁の数字化×8 スライド用オフセット 準備 8文字抽出+1長語へ の縮約 L1BM→… →DRAMへマージ
  12. • ステージ別の行数内訳(初提出時) ◦ ftos4やslideが結構重い 行数内訳(初提出時) ステージ 行数 const 22 blkid

    10 select 5 ステージ 行数 position 14 canvas 19 ftos4 24 ステージ 行数 slide 23 makeblk 18 merge 8 合計 143
  13. • ステージ別の行数内訳(最終版) ◦ ftos4やcanvasを重点的に削れた 行数内訳(最終版) ステージ 行数 const 20 blkid

    9 select 5 ステージ 行数 position 14 canvas 2 ftos4 15 ステージ 行数 slide 23 makeblk 16 merge 8 合計 112