haskell-jp / mokumoku-online #55

今日も今日とて脱線が多く、makeMistakesToLearnHaskellを進められただけで終わりました。cabal replの件はもうちょっと思い出しながら延長戦でちょっと進めます。
https://github.com/haskell-jp/makeMistakesToLearnHaskell/commit/10197f35f9a73aba781934a5c3c8f15a0e87dc08
TAlias ModuleName.Canonical Name [(Name, Type)] AliasType からエイリアス右辺の型情報を省いた TAliasElmi ModuleName.Canonical Name [(Name, Type)]データコンストラクタを追加
• 使用箇所にそれに合わせて枝を追加
• Build.loadInterfaces関数とDetails.loadInterfaces関数で読み出し時に穴埋めに必要なaliasesを取れそうなのでここで穴埋めをやるとよさそうだとわかった
• Build.loadiInterfaces内で右辺の型を埋めるfillInAliases関数を実装中
めざせelm 0.19.2
"簡約!? λカ娘" (#7) 読了 モナドを徹底的に圏論で考える記事と Dependent Type Programming が面白い(難解だった)
AtCoder 鉄則本 B68 - ALGO Express 悪戦苦闘中
その後コードを整理して短くなりました。成果報告。
a円 b円 1円 (a
b
1) の3種類のコインを使った最小枚数での払い方。計算量 O(log(b))。
import Data.List (unfoldr)

-- a/b の連分数展開と近似分数
cf a b = unfoldr f (a,b,0,1,1,0) where
  f (_,0,_,_,_,_) = Nothing
  f (a,b,p1,q1,p2,q2) = Just((b,c,p2,q2), (b,a',p2,q2,p,q)) where
    (c, a') = a `divMod` b
    (p, q) = (p1 + c * p2, q1 + c * q2)

chunk [] = []
chunk [(r1,_,p1,q1)] = [(r1,p1,q1, 0,undefined,undefined, undefined)]
chunk ((r1,_,p1,q1):(r2,c2,p2,q2):ds)
  | c' < c2 = [pair]
  | otherwise = pair: chunk ds
  where
    (c, l) = (r1 - p1 + q1) `divMod` (r2 + p2 - q2)
    c' = if c == c2 && l == 0 then c-1 else c
    pair = (r1,p1,q1, r2,p2,q2, c')

-- n円を a円 b円 1円 (a > b > 1) の3種類のコインで払う。計算量 O(log(b))
cmp a b n = (y'+x'+z',(y',x',z')) where
  (y, x) = n `divMod` a
  (y',x',z') = cmp' (chunk $ cf a b) (y,x,0)
  cmp' [] yxz = yxz
  cmp' ((r1,p1,q1, r2,p2,q2, c): ds) (y,x,z)
    | i1 < i = yxz1
    | r2 == 0 = yxz1
    | x1 < r2 = cmp' ds yxz1
    | j2 <= c && y2 >= 0 = cmp' ds yxz2 
    | otherwise = yxz1
    where
      i = x `div` r1
      i1 = if y < i * q1 then y `div` q1 else i
      yxz1@(y1,x1,z1) = (y - i1 * q1, x - i1 * r1, z + i1 * p1)
      (j,x2) = (x1 - r1) `divMod` r2
      j2 = -j
      yxz2@(y2,_,_) = (y1 - j2 * q2 - q1, x2, z1 + j2 * p2 + p1)
@ has joined the channel
こんにちは:exclamation:はじめまして、今日はawsの資格の勉強をしたいと思います:smile:
あとすみませんが15時位に抜けさせて頂きます。
山本悠滋です。出先から戻ってからですが、いつも通りmakeMistakesToLearnHaskellの続きとcabal replの件を進めます。例の如く前者だけになりそうな予感もしますが…:sweat:
こんにちは〜。 アルゴリズム実技検定 の過去問を解いていきます。
Change-Making-Problem(お釣り生成問題:お釣りを最小枚数で払う問題)で硬貨が3種類の場合の効率的なアルゴリズムの実装はできたのでプロパティテストでの検証と余裕があったらブログ書きをやります。
15時過ぎ頃に抜ける予定です。
S.K.です。今週もお世話になります。よろしくお願いします。
Implementing Functional Languages:a tutorial の Mark7 Gマシン Ex. 3.46 の続きから進めようと思います。
先週の続きやっていきます :fire:
プロパティテスト通りました。1000万回テストを何回もかけましたが 今のところすべてパスしているので多分アルゴリズムはあっているでしょう。(未証明だけど)
import Test.QuickCheck

-- 計算量 O(log(u2)) の実装(ただし未証明)
cmp u1 u2 n = 前回書いたコード

-- ナイーブな実装
cmp_naive u1 u2 n = let (y, x) = n `divMod` u1
  in minimum $ [(i+j+k, (i,k,j)) | i <- [(max 0 (y-u2))..y], let (j,k) = (n - i*u1) `divMod` u2]

abn :: Gen (Int,Int,Int)
abn = do
  d1 <- chooseInt (1, 10000)
  d2 <- chooseInt (1, 100000)
  n <- chooseInt (0, 1000000)
  let (u1, u2) = (u2 + d2, 1 + d1)
  return (u1, u2, n)

-- 1000万回テスト
main = do
  quickCheckWith stdArgs { maxSuccess = 10000000 } $ forAll abn $ \(u1,u2,n) -> fst (cmp u1 u2 n) == fst (cmp_naive u1 u2 n)
Ex. 3.46 ですが、Return 命令の遷移規則を変更(スタックの底のアイテムの代わりに一番上のアイテムを残すように)して、
Mark2 TIM と同じ条件で Return 命令を生成するようにしたところ、一応正しく動作しました。
スタックの一番上のアイテムが WHNF の場合に Return 命令を使うということなので、
僭越ながら、これで Ex. 3.46 は完了したことにさせていただきました。
その後は、Mark2 TIM の続きを進めて、一応 Ex. 4.6 が完了しました。
"簡約!? λカ娘" (#8) 読了 「排中律を公理として導入し、それを用いて継続を実装する」 @nushio が面白い
AtCoder 鉄則本 A69 - Bipartite Matching AC なれど 遅ッ! Dinic 法に落とし込んだが枝が密なので遅い
・本日のmakeMistakesToLearnHaskellの進捗 https://github.com/haskell-jp/makeMistakesToLearnHaskell/commit/494ca173bf9df59e1c95a4d607dd104c7c330d50
・cabal replの件は、cabalファイルをパースして書き換える処理が案の定動いていないので、パースする部分からテストを追加しています
第14回アルゴリズム実技検定の過去問を解きました。 Haskell 有利な回の気がします。
細かい仕様がよくわからなくなって調査していて目に見える進捗はいまいちでした
まあこういう日もある
山本悠滋です。例のごとくお昼ご飯を食べてからですが、いつも通りmakeMistakesToLearnHaskellの続きとcabal replの件を進めます。
今日は午前中たっぷり寝たので頑張ります
S.K.です。今週もお世話になります。よろしくお願いします。
Implementing Functional Languages:a tutorial の、以下のいずれかできそうなところを進めようと思います。
・Mark7 Gマシン Ex. 3.46 の再検討 (Return命令の遷移規則をテキスト通りにする)
・Mark1 TIM のガベージコレクション
・Mark2 TIM の Ex. 4.9
・Mark3 TIM のテキスト読解
こんにちは〜。 AHC 020 に出て爆死します
チェシャ猫です。のこり 1 時間そこそこしかないですが、オンライン実行環境のサンプルコードを読み込む部分を進めます。
"簡約!? λカ娘" (#8) 読了「排中律を公理として導入しそれを用いて継続を実装」が圧巻
AtCoder 鉄則本 B69 - Black Company 2 お決まりの最大流問題に帰結で AC なるも 幣 Dinic 実装が遅い問題再燃
結局、Mark3 TIM のテキスト読解を進めました。
Figure 4.3: Compilation schemes for let expressions の途中です。あまり進めらませんでした。
思ったより進まなかったなぁ。
・makeMistakesToLearnHaskellの進捗 https://github.com/haskell-jp/makeMistakesToLearnHaskell/commit/6b3d2d56e22cbdcb252bb7ab04da7254bdddce6b
・cabal replの件: 気がつけばcabal-installのlibraryがhackageに上がっているバージョンでも公開されていたのでそのバージョンに合わせて修正しました。後、パーサーの問題と戦っています
思ったよりも戦えてます!
サンプルコードを選択するドロップダウンリストの部分、ちょっとだけ UI つくった。
@MaxBruchDev has joined the channel
山本悠滋です。いつも通りmakeMistakesToLearnHaskellの続きとcabal replの件を進めます。
S.K.です。今週もお世話になります。よろしくお願いします。
今週も引き続き、Implementing Functional Languages:a tutorial の、以下のいずれかできそうなところを進めようと思います。
・Mark7 Gマシン Ex. 3.46 の再検討 (Return命令の遷移規則をテキスト通りにする)
・Mark1 TIM のガベージコレクション
・Mark2 TIM の Ex. 4.9
・Mark3 TIM のテキスト読解
少し間が空いてしまいました、gksatoです。atcoder lang updateのspreadsheetを更新して、その後max flow algorithmをいじります
toyboot4e です。 atcoder 用ライブラリのファイル分割と Main.hs へのバンドリングをやります
抜けます…spreadsheet更新だけやって寝てしまいました…無念…
"簡約!? λカ娘" (#9) 読了 AlphaGo はもはや昔話の感 IST (Internal Set Theory) 公理的集合論はやっぱり苦手
AtCoder 鉄則本 A70- Lanterns 悪戦苦闘中
Mark1 TIM のガベージコレクション対応にトライしてみました。
テキストの内容が恥ずかしながらよく理解できず、とりあえずテンプレートインスタンス化マシンのマークスキャンガベージコレクタと同じことをしてみようとしているところです。
makeMistakesToLearnHaskellの更新は、
途中で模範解答を大幅に書き換えた方がいいことに気づく
:arrow_right: 書き換えたので久々に実行して合ってるか確かめてみよう
:arrow_right: mmlhコマンドごとビルドし直さないと
:arrow_right: ついでにGHC新しくするか
:arrow_right: 警告の仕様が変わってて -Werror でめっちゃ落ちる!
というYak shavingをしてました :weary:
寝てました……! ファイル分割して haddock を書きました
bunny_hopper isolated
@bunny_hopper isolated has joined the channel
bunny_hopper isolated
初参加です。よろしくおねがいします。AIと組み込み系をやっています。PythonとC/C++などが使えますが、Haskellは初心者です。
今日は三目並べを実装します。
"簡約!? λカ娘 "(#10) ()
あとハシゴで AtCoder 鉄則本 A71 - Homework https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_bs
S.K.です。今週もお世話になります。よろしくお願いします。
今週も引き続き、Implementing Functional Languages:a tutorial の、Mark1 TIM のガベージコレクション対応にトライしてみようと思います。