ABC 343

ABC 343 に参加しました。 4 完 (A ~ D) でした。

A 問題

問題文を素直にコードに落としました:

main :: IO ()
main = do
  (!a, !b) <- ints2
  print . head . filter (/= a + b) $ [0 .. 9]

B 問題

グリッドを V.Vector (U.Vector Int) の形で読むと各行処理がしやすいです。 findIndices を使ってスマートに解答できました:

main :: IO ()
main = do
  !n <- ints1
  !xs <- V.replicateM n intsU
  V.forM_ xs $ \vec ->
    putLnBSB . unwordsBSB . U.map succ $ U.findIndices (== 1) vec

C 問題

\(x^3\) が回文であるか判定します。回文の判定においては、文字列として比較するか、 10 進数の各桁に分解して比較することができます。

D 問題

multiset に対応するデータ型を持っていると楽できます。ハイライト:

main :: IO ()
main = do
  (!n, !t) <- ints2
  !iws0 <- U.replicateM t (first pred <$> ints2)

  let !ms0 = (1, IM.singleton 0 n)
  !ws <- UM.replicate n (0 :: Int)
  (\f -> U.foldM'_ f ms0 iws0) $ \ms (!i, !dw) -> do
+    !w <- UM.read ws i
+    UM.write ws i (w + dw)
+    let ms' = (incMS (w + dw) . decMS w) ms
    print $ fst ms'
    return ms'

Mutliset僕の実装はこれ です。

E 問題

小学校でやったような 3 集合のベン図を書くのですが、実装がバグっていてダメでした。

F 問題

平方分割を試みました。実装が間に合わず、 upsolve しようにも TLE して完敗です。

その他メモ

キーボード操作

キー数を減らす方向に舵を切って情報収集しています。

34 キー操作

Keyball 44 を 34 キーで操作するようになりました。 34 はかなり余裕のあるキー数で (そんな馬鹿な) 、余るキーも多いです。

34 キーの代表的なキーボードは Sweep です。操作は柔軟で見栄えも良く、この辺りがエンドゲームかと思います。キーボード界の i3 かもです。

34 キーでは装飾キーの数が足りないため、 Tap-Hold によって装飾キーを入力します。これはファームウェアの機能です。

16 キー操作

ファームウェアの主な機能

16 キー操作を理解するため、 ZMK ファームウェア の一部機能をメモしました。

Layers

レイアウトを切り替える機能です。切り替え方式は主に 3 つです。

  1. トグル
  2. ホールドしている間のみ
  3. 入力後、次の 1 キーのみ (スマホの Shift キー相当)
Combos

複数キーの同時押しを別キーとして解釈する機能です。

Ben Vallack 氏は combo のファンでは無いらしく、複数キーを素早く入力 (rolling) したときに誤作動すると述べていました。

Hold-Tap

長押しを別キーとして解釈する機能です。 Hold/Tap の優先度を調整できるっぽいです。

Piano (Ben Vallack)

事前知識を蓄えたところで、 Ben Vallack 氏の Has Your Keyboard Got Too Many Keys? を観ました。 16 キーのキーボード操作を、レイヤ切り替えのみで (combo 無しで) 実現しています。

Home-Row Mods

A guide to home row mods

ASDFGHJKL といった home ポジションの row キーの長押しを modifier キーとして解釈する方式です。 Piano も同様に、キーの長押しで装飾キーの入力やレイヤ切り替えができます。

レイヤ切り替え

主にスマホのシフトキー相当のレイヤ切り替えを行っています。たとえば左手キーの長押しで記号レイヤに入り、右手で記号を入力すると、元のレイヤに戻ってきます。このように、主に 2 回の打鍵で 1 つのキーを入力する のが Ben Vallack 式だと理解しました。

レイヤ切り替えが見れる部分 (12:11)

装飾キーを押せるのか?

装飾キーは、ほぼレイヤ 1 にしか無いようです。他のレイヤのキーに装飾キーを付与する方法が気になります。

8 キー操作

ARTSEY (artsey.io) は combo (複数キーの同時押し) を活かして 8 キーによる入力を実現しています。僕が隻腕になったら、フリック入力の次にこれを試すと思います。

Introduction: ARTSEY One Handed Keyboard - Youtube

まとめ

34 キー操作を習得し、 16 キー操作 (Piano), 8 キー操作 (ARTSEY) をざっと見ました。未知の部分が小さくなり、そこそこ満足しました。 16 キー操作は自分でも試してみたいかもです。

Misc

MiniAxe

MiniAxe の基盤を破壊してしまいました。今年一番落ち込みました。

今後は先に基盤にハンダを塗ることにします。再注文しました。