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 して完敗です。
その他メモ
-
PrimMonad
は『
IO
またはST
』 よりもちょっと便利
たとえばStateT s IO
にPrimMonad
が実装されているため、liftIO
を書かずに済みます。同様に、STRef
やIORef
よりも MutVar の方が少し便利です。
-
Heap
vsIntSet
Heap
においてはキーが重複した要素も格納できます。
-
IntSet
の高速な 2 分割
spanAntitone を知りました。
キーボード操作
キー数を減らす方向に舵を切って情報収集しています。
34 キー操作
Keyball 44 を 34 キーで操作するようになりました。 34 はかなり余裕のあるキー数で
(そんな馬鹿な) 、余るキーも多いです。
34 キーの代表的なキーボードは
Sweep
です。操作は柔軟で見栄えも良く、この辺りがエンドゲームかと思います。キーボード界の
i3
かもです。
34 キーでは装飾キーの数が足りないため、 Tap-Hold
によって装飾キーを入力します。これはファームウェアの機能です。
16 キー操作
ファームウェアの主な機能
16 キー操作を理解するため、
ZMK ファームウェア
の一部機能をメモしました。
Layers
レイアウトを切り替える機能です。切り替え方式は主に 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
ASDFGHJKL といった home ポジションの row キーの長押しを modifier
キーとして解釈する方式です。 Piano
も同様に、キーの長押しで装飾キーの入力やレイヤ切り替えができます。
レイヤ切り替え
主にスマホのシフトキー相当のレイヤ切り替えを行っています。たとえば左手キーの長押しで記号レイヤに入り、右手で記号を入力すると、元のレイヤに戻ってきます。このように、主に
2 回の打鍵で 1 つのキーを入力する のが Ben Vallack 式だと理解しました。
装飾キーを押せるのか?
装飾キーは、ほぼレイヤ 1
にしか無いようです。他のレイヤのキーに装飾キーを付与する方法が気になります。
- 実は他のレイヤでも hold が装飾キーになる?
- 装飾キーもロックされる (スマホの shift キー相当) ?
8 キー操作
ARTSEY (artsey.io) は combo (複数キーの同時押し) を活かして
8
キーによる入力を実現しています。僕が隻腕になったら、フリック入力の次にこれを試すと思います。
Introduction: ARTSEY One Handed Keyboard - Youtube
まとめ
34 キー操作を習得し、 16 キー操作 (Piano), 8 キー操作 (ARTSEY)
をざっと見ました。未知の部分が小さくなり、そこそこ満足しました。 16
キー操作は自分でも試してみたいかもです。
Misc
MiniAxe
MiniAxe
の基盤を破壊してしまいました。今年一番落ち込みました。
今後は先に基盤にハンダを塗ることにします。再注文しました。