$30 off During Our Annual Pro Sale. View Details »

Haskell を武器にして挑む競技プログラミング ─ 操作的思考から意味モデル思考へ

Avatar for Naoya Ito Naoya Ito
December 12, 2025

Haskell を武器にして挑む競技プログラミング ─ 操作的思考から意味モデル思考へ

Avatar for Naoya Ito

Naoya Ito

December 12, 2025
Tweet

More Decks by Naoya Ito

Other Decks in Technology

Transcript

  1. )BTLFMM ͸͜ΜͳϓϩάϥϛϯάݴޠͰ͢ • ७ਮؔ਺ܕݴޠ • ࣜ ஋ͷੈքͰಈ͘ࢀরಁ໌ͳݴޠ – ໋ྩܕݴޠ $

    ΍ 1ZUIPOͳͲ ͱ͸ࠜఈͷύϥμΠϜ͕ҟͳΔ • ੩తܕ෇͚ɺܕΫϥεɺܕਪ࿦ɺߴ֊ؔ਺ • ෆมσʔλͱؔ਺ͷ߹੒ – NBQGPME߹੒ʹΑΔҙຯߏ଄ͰΞϧΰϦζϜΛهड़͢Δ • ӬଓσʔλϓϩάϥϛϯάɺӬଓσʔλߏ଄ • ஗ԆධՁ • Ϟφυ • Մมσʔλɺ໋ྩܕϓϩάϥϛϯά΋Ͱ͖Δ
  2. ·ͣ͸งғؾΛɻྫ͑͹ "#$$ .BOZ3FQMBDFNFOUͷ࣮૷ main :: IO () main = do

    _ <- getInt s <- getLine q <- getInt qs <- replicateM q $ auto @(Char, Char) let acc' = foldl' f ['a' .. 'z'] qs where f acc (c, d) = [if x == c then d else x | x <- acc] ix = listArray @UArray ('a', 'z') acc' putStrLn $ map (ix !) s
  3. )BTLFMMͰ TVN f x y = x + y main

    = do -- 1 + 2 + 3 + 4 = 10 let s = f 4 (f 3 (f 1 2)) print s ؔ਺ͷ໭Γ஋ʹ࠶౓ؔ਺Λద༻͢Δɺͭ·Γʮ࠶ؼʯͰɺෆมͳ஋Ͱ΋ঢ়ଶભҠΛදݱͰ͖Δ sum acc [] = acc sum acc (x : xs) = sum (acc + x) xs main = do print $ sum 0 [1 .. 10] -- 55 ϦετΛ෼ղ͠ͳ͕Β࠶ؼతʹؔ਺Λద༻͢Δ͜ͱͰTVNؔ਺Λ࣮૷Ͱ͖Δ
  4. GPMEuuu TVNΈ͍ͨͳϦετ࠶ؼͷύλʔϯΛҰൠԽͨ͠΋ͷ • GPMEͷҙຯ uuu ৞ΈࠐΈɺू໿ ࠶ؼతͳߏ଄Λ݁߹نଇ ೋ߲ԋࢉ ʹΑͬͯͻͱͭͷ஋ʹ৞ΈࠐΉ •

    ΑΓந৅తʹ͸ϞϊΠυԋࢉͷҰൠԽ uuu ݁߹ɺ୯Ґݩ • ʮTVN͸ ʹΑΔ৞ΈࠐΈʯ main = do let s = foldl' (+) 0 [1 .. 10] print s -- 55
  5. ৞ΈࠐΈͷաఔΛ࢒͢ͱྦྷੵ࿨ • scanl ͸ fold աఔͰಘΒΕΔྦྷੵঢ়ଶ͢΂ͯΛฦ͢ • fold ͷҙຯܭࢉͷي੻Λશ෦Ϧετʹ্࣋ͪ͛ͯฦ͢ͷ͕ scanl

    main = do let s = scanl' (+) 0 [1 .. 10] print s -- [0,1,3,6,10,15,21,28,36,45,55] foldl' :: [a] -> b scanl' :: [a] -> [b] -- 状態遷移の軌跡
  6. )BTLFMMͰ͸ NBQ΍ GJMUFSɺGPMEͳͲΛ࢖ͬͯ໰୊Λղ͘ main = do [n, _] <- getInts

    as <- getInts bs <- getInts let a = listArray @UArray (1, n) as ans = foldl' (+) 0 $ map (a !) bs print ans ͜ͷͱ͖ࢲͷ಄ͷதͰ͸ʮCTΛࣸ૾ͯ͠ɺ Ͱ৞ΈࠐΈʯͱߟ͑Δ map ΍foldl' Ͱ஋͕Ͳ͏มΘ͍͔ͬͯ͘͸೴಺γϛϡϨʔγϣϯ͠ͳ͍
  7. 8 12 40 4 6 20 2 3 10 ۮ਺͔͠ͳ͍ͷͰૢ࡞͢Δ

    ·ͩۮ਺͔͠ͳ͍ͷͰૢ࡞͢Δ ح਺͕ग़͖ͯͨͷͰऴΘΓ
  8. ໋ྩܕϓϩάϥϛϯάͰ࣮૷ uuu ୹໋σʔλߏ଄Λ܁Γฦ͠ॻ͖׵͑ͯ౴͑ΛಘΔ count = 0 while all(a % 2

    == 0 for a in as): for i in range(n): as[i] //= 2 count += 1 print(count)
  9. ʮҙਤ JOUFOUJPO ʯͰ͸ͳ͘ʮҙຯ NFBOJOH ʯ • ࠓ೔ͷ࿩Ͱͷʮҙຯʯ uuu ϓϩάϥϜࣗ਎͕΋ͭߏ଄తɾ਺ֶతͳʮԿΛද͔͢ʯͷ͜ͱ –

    ϓϩάϥϚ͕ԿΛҙਤ͔ͨ͠ͱ͍͏ಈػɾҙਤͰ͸ͳ͘ɺϓϩάϥϜͦͷ΋ͷ͕࣋ͭߏ଄ɾؔ܎ɾҐஔ ͚ͮͷ࿩ – ʮͳͥͦ͏͔ͨ͠ʯͰ͸ͳ͘ʮͦΕ͸Կͱͯ͠ଘࡏ͍ͯ͠Δ͔ʯ
  10. )BTLFMMͰ͸ʮࣸ૾ɺ߹੒ɺू໿ʯ ᴷͦͷҙຯͷ··࣮૷Ͱ͖Δ main = do [ha, wa] <- getInts gridA

    <- getCharGrid ((1, 1), (ha, wa)) [hb, wb] <- getInts -- (省略) -- -- グリッド (二次元配列) を Set 表現に写像 let [a, b, x] = map (fromArrayGS (== '#')) [gridA, gridB, gridX] cs = [ c | dx <- [-100 .. 100], -- X 方向、Y 方向の移動範囲の直積 (合成) dy <- [-100 .. 100], let a' = Set.map (+ (dx, dy)) a -- 平行移動 (写像) c = Set.union a' b -- 集合の和 (結合) ] printYn $ any (`isShiftedGS` x) cs
  11. ͜ͷͱ͖ͷࢲͷࢥߟ • ʮ"Λ͋Δఔ౓ͷൣғɺฏߦҠಈͯ͠ #ͱॏͶͯɺ9ͱಉ͡ܗΛ͍ͯ͠Δ͔Λ֬ೝ͢Ε͹Αͦ͞͏ͩ ͳʯ • ʮ"Λಈ͔͢ൣғ͸ Yํ޲ͱ Zํ޲ͷೋํ޲Λ ʙ

    ͙Β͍Ͱे෼ͩΖ͏ʯ • ʮฏߦҠಈ͸ ࣸ૾ NBQ ɺ"ͱ #ΛॏͶΔͷ͸ू߹࿨ VOJPO ɺ୳ࡧൣғ͸ Yͱ ZͷҠಈൣғͷ௚ ੵɺಉ͡ܗΛ͍ͯ͠Δ͔͸ࣸ૾ ࠩ෼ͷू໿Ͱ൑ఆʯ ͜͏ͯ͠ߟ͑ͨ͜ͱΛ۩ମతૢ࡞ʹม׵͢Δ͜ͱͳ͘ɺͦͷ··࣮૷Ͱ͖Δ
  12. ϓϩάϥϜΛૢ࡞ͷཏྻͰ͸ͳ͘ɺҙຯͷߏ଄Ͱهड़Ͱ͖Δ ˠ໰୊ΛҙຯͰߟ࡯Ͱ͖ΔΑ͏ʹͳΔ main = do [ha, wa] <- getInts gridA

    <- getCharGrid ((1, 1), (ha, wa)) [hb, wb] <- getInts -- (省略) -- -- グリッド (二次元配列) を Set 表現に写像 let [a, b, x] = map (fromArrayGS (== '#')) [gridA, gridB, gridX] cs = [ c | dx <- [-100 .. 100], -- X 方向、Y 方向の移動範囲の直積 (合成) dy <- [-100 .. 100], let a' = Set.map (+ (dx, dy)) a -- 平行移動 (写像) c = Set.union a' b -- 集合の和 (結合) ] printYn $ any (`isShiftedGS` x) cs
  13. )BTLFMM͸࠶ؼతσʔλߏ଄Λσʔλߏ଄ͷجຊͱ͍ͯ͠Δ data List a = Nil | Cons a (List

    a) • )BTLFMMͷσʔλߏ଄ uuu ୅਺తσʔλܕʹΑΔ࠶ؼతσʔλߏ଄ • ࠶ؼతσʔλߏ଄ʹదͨ͠࠷খͷૢ࡞͕ NBQͱ GPME – NBQ͸ a -> b Λ֤ཁૉʹద༻͠ɺߏ଄Λอͬͨ··ม׵ ࠶ؼߏ଄ʹର͢Δؔ਺ద༻ͷ࠷খ୯Ґ – SFEVDF GPME ͸ͦͷߏ଄Λյ͠ͳ͕ΒҰͭͷ஋ʹ৞ΈࠐΉ ߏ଄ΛͨͨΉ࠶ؼతύλʔϯͷ࠷খ୯Ґ
  14. ૢ࡞Ͱ͸ͳ͘ҙຯͰهड़͢Δͱɺίʔυ͕ʮҙຯͷ·ͱ·Γʯʹ • ໋ྩܕɾखଓ͖ܕϓϩάϥϛϯά – GPSจ JGจ ୅ೖจ – ܭࢉػ΁ͷ໋ྩ –

    ໋ྩΛ૊Έ߹ΘͤͯϓϩάϥϜΛߏ੒͢Δ ˠૢ࡞ͷ·ͱ·Γ • )BTLFMM – ࠶ؼɺNBQɺGPMEʜ – ࣜɻࣜ͸ҙຯΛ࣋ͭ – ҙຯΛ૊Έ߹ΘͤͯϓϩάϥϜΛߏ੒͢Δ ˠҙຯͷ·ͱ·Γ ໋ྩܕ͸ɺ૊Έ্͕ͬͨίʔυͷղऍʹ࣌ؒతखଓ͖ ૢ࡞ ͷ௥੻͕ඞཁ )BTLFMMͷͦΕ͸ҙຯʹࢹ఺͕౰ͯ΍͍͢
  15. )BTLFMMͷσʔλߏ଄͸ جຊతʹ Ӭଓσʔλߏ଄ main = do let as1 = [1,

    2, 3, 4, 5] as2 = 100 : as1 as3 = as2 ++ [500] as4 = delete 3 as3 print as1 -- [1,2,3,4,5] print as2 -- [100,1,2,3,4,5] print as3 -- [100,1,2,3,4,5,500] print as4 -- [100,1,2,4,5,500] • σʔλߏ଄Λߋ৽ͨ͠ޙ΋ɺߋ৽લͷͦΕ͕࢒ΓΞΫηεͰ͖Δ • σʔλߏ଄શମͷίϐʔ͸ൃੜ͓ͯ͠ΒͣɺϝϞϦۭؒͱܭࢉྔ͸খ͘͞཈͑ΒΕΔ
  16. Ӭଓσʔλߏ଄ʹΑΓɺΠϛϡʔλϒϧͳ஋ ࣜࢦ޲Ͱ΍Δ͜ͱͱύϑΥʔϚϯεΛཱ྆ main = do -- 10^6 個の要素をもつ Set let

    s0 = Set.fromList [1 .. 10 ^ 6] -- 10^6 個値を追加していく、その過程の 10^6 個の Set 全部をメモリに残す ss = scanl' (flip Set.insert) s0 [2 * 10 ^ 6, 2 * 10 ^ 6 - 1 .. 10 ^ 6 + 1] print $ length ss -- 10^6 + 1 個 print $ Set.size (last ss) -- 2 * 10^6 個 େྔͷ 4FUΛେྔʹߋ৽ͯͦ͠ͷաఔͷେྔͷ 4FUΛϝϞϦʹ࢒ͯ͠΋໰୊ͳ͍
  17. Ӭଓσʔλߏ଄ͳΒʮճసɺฏߦҠಈͨ͠શ෦඼ 4FU Λ·ͣྻڍʯ͢Δ͜ͱ͕Ͱ͖Δ main = do [gridA, gridB, gridC] <-

    replicateM 3 $ getCharGrid ((1, 1), (4, 4)) let [a, b, c] = map (fromArrayGS (== '#')) [gridA, gridB, gridC] -- グリッド (二次元配列) を Set に写像 ds = [(dx, dy) | dx <- [0 .. 3], dy <- [0 .. 3]] -- 平行移動の範囲 (直積) -- 回転、平行移動を行ったポリオミノの全パターンを写像で作り出す as = [Set.map (+ d) (normalizeGS a') | a' <- take 4 $ iterate rotateRightGS a, d <- ds] bs = [Set.map (+ d) (normalizeGS b') | b' <- take 4 $ iterate rotateRightGS b, d <- ds] cs = [Set.map (+ d) (normalizeGS c') | c' <- take 4 $ iterate rotateRightGS c, d <- ds] -- (続く) -- )BTLFMMͰ͸Ϧετ͸ʮՄೳੑͷҰཡʯͱ͍͏จ຺ͱݟͳͤΔ ϙϦΦϛϊ"ͷશՄೳੑɺϙϦΦϛϊ#ͷશՄೳੑɺϙϦΦϛϊ$ͷશՄೳੑΛͦΕͧΕྻڍͨ͠ ӬଓσʔλϓϩάϥϛϯάͳΒۤ΋ͳͦ͘Ε͕Ͱ͖Δ
  18. ͦΕ͕Ͱ͖ͨΒɺ͋ͱ͸શ૊Έ͋ΘͤΛ୳ࡧ ௚ੵ ɺ݁߹ ू໿ ͯ͠൑ఆ main = do -- (省略)

    -- res = [ isSquare (Set.unions [x, y, z]) | x <- as, y <- bs, z <- cs, all (¥(p, q) -> Set.disjoint p q) (comb2 [x, y, z]) ] printYn $ or res isSquare s | Set.size s /= 16 = False | otherwise = all (¥v -> Set.member v s) (range ((1, 1), (4, 4)))
  19. )BTLFMMͷ഑ྻ "SSBZ let as = listArray (1, 5) [10, 20,

    30, 40, 50] print $ as ! 3 -- 30 let as = listArray ('a', 'z') [1 .. 26] print $ as ! 'r' -- 18 • ࡧҾͷߏ଄ɺԼքɺ্քΛࣗ෼ͰܾΊΔ͜ͱ͕Ͱ͖Δ
  20. )BTLFMMͷ഑ྻͷߏ଄͸ɺཁૉଆͷߏ଄Ͱ͸ͳ͘ɺࡧҾͷߏ଄Ͱܾ·Δ • )BTLFMMͷ഑ྻ͸஋ͷํ͸ߏ଄Խ͞Ε͓ͯΒͣϑϥοτ • ڥքͰ͋Δ     

    ͷࢦఆͰͦͷߏ଄Λࢦఆ͢Δ main = do -- 3 x 3 の配列 -- 1,2,3 -- 4,5,6 -- 7,8,9 let as = listArray @UArray ((1, 1), (3, 3)) [1 .. 9 :: Int] print $ as ! (2, 2) -- 5
  21. ࡧҾʹࣗ෼Ͱએݴͨ͠σʔλܕΛ࢖͏͜ͱ΋Ͱ͖Δ • ࡧҾ͕ҙຯ͢Δ΋ͷʢʹϞσϧʣΛɺܕͱͯ͠એݴ͢Δ͜ͱͰఆٛͰ͖Δ data Direction = L | R |

    U | D deriving (Eq, Ord, Enum, Ix) main = do let dist = listArray @UArray (((1, 1), L), ((h, w), D)) [ ... ] print $ dist ! ((2, 2), R)
  22. ഑ྻ͸ʮࡧҾू߹ ˠཁૉʯ΁ͷࣸ૾ɻࡧҾۭؒΛࣗ༝ʹઃܭ͢Δ͜ͱ͕Ͱ͖Δ • ࡧҾۭؒΛͲ͏ઃܭ͢Δ͔ʹʹΑͬͯɺ഑ྻͷʮ࣍ݩʯ΍ʮҙຯʯΛܾఆͰ͖Δ – *OUuuu ྫάϥϑ – *OU *OU

    uuu ྫάϦου – *OU *OU #PPM uuu ྫঢ়ଶ͖ͭάϦου – *OU *OU %JSFDUJPO uuu ྫํ޲͖ͭάϦου • ಺෦දݱ͸Ұ࣍ݩ഑ྻͰ΋ɺҙຯͱͯ͠͸ଟ࣍ݩʹ΋ߏ଄ʹ΋Ͱ͖Δ – )BTLFMM͸഑ྻͷࡧҾɺͷΑ͏ͳͪΐͬͱͨ͜͠ͱͰ΋ந৅౓͕ߴ͍ ͜Ε͕ΞϧΰϦζϜͷந৅Խʹ େ͖ͳ໾ׂΛՌͨ͠·͢
  23. άϥϑΛʮྡ઀Ϧετʯʹߏ଄Խͯ͠ #'4 ෯༏ઌ୳ࡧ ͢Δ main = do [n, m] <-

    getInts uvs <- replicateM m getTuple -- 1 => [(2, 1), (4, 1)] という構造の「隣接リスト」にする let g = accumArray @Array (flip (:)) [] (1, n) $ concatMap (¥(u, v) -> [(u, (v, 1)), (v, (u, 1))]) uvs -- 幅優先探索する dist = bfs g [(1, 0)] for_ [1 .. n] $ ¥s -> print $ dist ! s
  24. ઌͷ #'4 ͷ࣮૷ bfs :: (Ix v, IArray a [(v,

    e)], Num e, Eq e) => a v [(v, e)] -> [(v, e)] -> Array v e bfs g v0s = runSTArray $ do dist <- newArray (bounds g) (-1) for_ v0s $ ¥(v0, d0) -> do writeArray dist v0 d0 aux (Seq.fromList [v0 | (v0, _) <- v0s]) dist return dist where aux Empty _ = return () aux (v :<| queue) dist = do acc <- readArray dist v us <- filterM ( ¥(u, _) -> (fmap (== -1) . readArray dist) u ) (g ! v) queue' <- foldForM queue us $ ¥q (u, w) -> do writeArray dist u $! acc + w return $ q |> u aux queue' dist ௕͍ɻຖճॻ͖ͨ͘ͳ͍ɻ ϥΠϒϥϦԽ͠Α͏
  25. ந৅౓Λ্͛Δ uuuάϥϑͷσʔλߏ଄ʹґଘ͠ͳ͍ؔ਺ʹ • (g !) uuuʮ௖఺W͔ΒḷΕΔ௖఺͸ ʯͱ͍͏ࣸ૾ – ʮ௖఺ ͔Β͸ɺ௖఺

    ̎ ͱ௖఺ ΁ɺͦΕͧΕॏΈ ͰભҠͰ͖ΔʯΛهड़͢Δؔ਺ – f v = g ! v • ڑ཭ͷ݁߹ԋࢉ (+) • (1, n) uuu CGT ؔ਺͕಺෦Ͱར༻͍ͯ͠Δ഑ྻͷࡧҾΛ֎෦͔Βύϥϝʔλͱͯ͠౉͢ let dist = bfs (g !) (+) (-1) (1, n) [(1, 0)]
  26. ࡧҾͷߏ଄ͱɺભҠͷؔ਺ΛܾΊͯ౉ͤ͹໰୊͕ղ͚Δ main = do [h, w] <- getInts grid <-

    getCharGrid ((1, 1), (h, w)) let dist = bfs f (+) (-1) (bounds grid) [((1, 1), 0)] where f v = [ (u, 1) | d <- [(1, 0), (0, 1), (-1, 0), (0, -1)], let u = v + d, inRange (bounds grid) u, case (grid ! v, grid ! u) of ('s', 'n') -> True ('n', 'u') -> True ('u', 'k') -> True ('k', 'e') -> True ('e', 's') -> True _ -> False ] printYn $ dist ! (h, w) /= -1 ʮϚε WˠW͔Β౸ୡͰ͖ΔϚε VͷϦετʯ ͱ͍͏ࣸ૾ άϦουͷ্Լࠨӈʹ৚݅Λຬͨ͢ભҠઌ͕͋ΔͳΒ ͦΕΛྻڍ
  27. main = do [a, n] <- getInts let bounds =

    (1, 10 ^ 6 + 1 :: Int) let dist = bfs f (+) (-1) bounds [(1, 0 :: Int)] where f x | x >= 10 && x `mod` 10 /= 0 = [(x', 1) | x' <- [rotate x, a * x], inRange bounds x'] | otherwise = [(a * x, 1) | inRange bounds (a * x)] rotate y = let ys = toDigits 10 y in fromDigits 10 (last ys : init ys) print $ dist ! n ಉ༷ʹղ͚Δ
  28. ୳ࡧର৅ͷۭؒΛεΠονͷঢ়ଶΛؚΉߏ଄ʹͯ͠ #'4 lrud@[left, right, up, down] = [(0, -1), (0,

    1), (-1, 0), (1, 0)] :: [(Int, Int)] main = do [h, w] <- getInts grid <- getCharGrid ((1, 1), (h, w)) let start = fromJust $ findArrayIndex (== 'S') grid goal = fromJust $ findArrayIndex (== 'G') grid let dist = bfs f (+) (-1) (((1, 1), False), ((h, w), True)) [((start, True), 0)] where f (v, flag) = [ ((u, flag'), 1) | d <- lrud, let u = v + d, inRange (bounds grid) u, if flag then grid ! u `elem` ['S', '.', 'o', 'G', '?'] else grid ! u `elem` ['S', '.', 'x', 'G', '?'], let flag' = if grid ! u == '?' then not flag else flag ] -- (省略) --
  29. վΊͯ #'4ʹ౉͍ͯ͠ΔύϥϝʔλͷҙຯΛߟ͑ͯΈΔ let dist = bfs f (+) (-1) bounds

    [(1, 0 :: Int)] • ࡧҾͷߏ଄ bounds ͱ f Λهड़͢Δ͚ͩͰ໰୊͕ղ͚Δ͕͜ΕΒ͸Կऀ – bounds : ୳ࡧ͢Δۭؒ (ঢ়ଶͷू߹) Λنఆ͢Δ΋ͷ = ঢ়ଶۭؒ – f : ͋Δঢ়ଶ͔ΒͲ͜΁ભҠͰ͖Δ͔ = ભҠنଇ 💡#'4͸೚ҙͷঢ়ଶۭؒʹ͓͚Δঢ়ଶભҠΛ࠷୹εςοϓͰ୳ࡧ͢Δ൚༻ϑϨʔϜ
  30. )BTLFMMͰந৅Խ͠ɺࣗ෼Ͱ࣮૷ͨؔ͠਺ͷҙຯΛߟ͑Δ͏ͪ #'4ͷϝϯλϧϞσ ϧ͕Ξοϓσʔτ͞ΕΔ • #'4͸άϥϑΛ୳ࡧ͢ΔΞϧΰϦζϜ • #'4͸άϦουΛ୳ࡧ͢ΔΞϧΰϦζϜ uuu άϦου΋άϥϑͷҰछ •

    #'4͸ঢ়ଶΛ୳ࡧ͢ΔΞϧΰϦζϜ uuu ͲΜͳ཭ࢄঢ়ଶۭؒͰ΋ભҠنଇΛهड़ͨؔ͠਺͕ ͋Ε͹ಈ͘ )BTLFMM͸ҙຯࢥߟΛ༠ൃ͢Δ͚ͩͰͳ͘ɺࣗ෼Ͱॻ͍࣮ͨ૷ͷҙຯΛ࠶ൃݟͤͯ͘͞ΕΔ
  31. ʮૢ࡞ʯ͔Βʮҙຯʯ΁ • )BTLFMM ͸ૢ࡞Ͱ͸ͳ͘ɺҙຯͰهड़ɺࢥߟ͢Δ͜ͱΛଅਐ͢Δϓϩάϥϛϯάݴޠ ͩͱ উखʹࢥ͍ͬͯΔ • )BTLFMM ʹΑͬͯϓϩάϥϛϯάɺΞϧΰϦζϜʹର͢ΔϝϯλϧϞσϧ͕ߋ৽͞ΕΔ •

    ࠓ೔঺հͨ͠ཁૉҎ֎ʹ΋ʮҙຯϞσϧࢥߟʯΛଅਐ͢Δཁૉ͸΄͔ʹ΋͋Δ – ୅਺తσʔλܕ – ܕɺܕΫϥε ਺ֶత੍໿͕ܕΫϥεͰܗࣜԽ͞Ε͍ͯΔ FUD – Ϟφυ ΑΓந৅౓ͷߴ͍ܭࢉߏ଄ͷҙຯ – ༥߹ม׵ ม׵Λҙຯ୯Ґʹ෼ׂͯ͠΋ύϑΥʔϚϯεΛ٘ਜ਼ʹ͠ͳ͍ – ஗ԆධՁ
  32. ΅͘͸ૢ࡞తਪ࿦ʹ͞΄Ͳڧ͘ͳ͔ͬͨɻ͔ͩΒڝϓϩ΋ڧ͘ͳΕͳ͍ͱࢥ͍ࠐΜͰ͍ͨ • ࣗ෼ͷ͜Ε·ͰͷਓੜͰʮ਺ֶʯͱ͔ʮ໰୊Λղ͘ʯͱ͍͏Α͏ͳྖҬͰɺࣗ෼͕ͦΕΛಘ ҙͱࢥ͑Δ͜ͱ͸ͳ͔ͬͨ – ͲͪΒ͔ͱ͍͑͹ɺۤखͳํͩͬͨ – Ռͨͯࣗ͠෼͸ϓϩάϥϚʹ޲͍͍ͯΔͷ͔ ͱࣗ໰ࣗ౴͢Δ͜ͱ΋ଟ͔ͬͨ •

    ϓϩάϥϜΛૢ࡞Ͱ͸ͳ͘ҙຯͰଊ͑Δͱ͍͏ࢥߟ͸ࣗ෼ʹ߹͍ͬͯͯɺಘҙͩͱײ͡ΒΕ ͨɻ͜ͷ͜ͱʹؾ͔ͮͤͯ͘Εͨͷ͕ɺ)BTLFMM ڝٕϓϩάϥϛϯάͩͬͨ ࣗ෼ͷڧΈʹ߹ͬͨɺϓϩάϥϛϯά΁ͷ޲͖߹͍ํ ೥ؒϓϩάϥϚΛ΍͖ͬͯͯॳΊͯɺࣗ෼͕ϓϩάϥϛϯάΛಘҙͩͱ֬৴Ͱ͖ͨॠؒͰͨ͠
  33. )BTLFMMͰ͸ෆมͳσʔλߏ଄͔͠࢖͑ͳ͍ • )BTLFMM Ͱ͸Մมͳσʔλߏ଄ ྫՄม഑ྻ ."SSBZ ΋ѻ͑·͢ɻܭࢉػ΁ͷ໋ྩɺͭ·Γखଓ͖త ϓϩάϥϛϯάͰѻ͏ͱָͰ͢ɻϞφυ͕ͦΕΛՄೳʹ͠·͢ɻ • ηάϝϯτ໦΍

    6OJPO'JOEͳͲͷ࣮૷ͰύϑΥʔϚϯεΛ༏ઌ͢ΔͷʹՄม഑ྻΛ࢖͏͜ͱ͸Α͋͘ Γ·͢ • ·ͨՄม഑ྻͰखଓ͖తʹ࣮૷͢Δ΄͏ָ͕ͳ໰୊Ͱ͸ɺී௨ʹՄม഑ྻΛ࢖͍·͢
  34. )BTLFMMͷ଎౓ ੩తܕ෇͚ • ଎౓ײ uuu ஗͘͸ͳ͍͚Ͳ଎͘΋ͳ͍ – $ ΍ 3VTUΑΓ͸౰વɺͣͬͱ஗͍

    – $΍ (PΑΓ΋஗͍ – εΫϦϓτݴޠΑΓ͸݁ߏ଎͍ • ੩తܕ෇͚ – ڧྗͳܕਪ࿦͕͋ΔͷͰɺܕ͕࣮૷εϐʔυͷ଍ᐫʹ͸ͳΒͳ͍ – ಈతܕ෇͚ݴޠΛॻ͍ͯΔͷͱಉ͡Α͏ͳײ৮ – Ή͠Ζܕ͕͋Δ͓͔͛Ͱɺຌϛεʹؾ͖ͮ΍͍͢ ͜͏͍͏ධՁ࣠Ͱબ ୒͢Δͷ͸͓͢͢Ί ͠ͳ͍
  35. ࢀߟ )BTLFMMʹΑΔΞϧΰϦζϜந৅ͱ୅਺తߏ଄ • ࠶ؼతσʔλߏ଄͸ࣸ૾ͱ݁߹ʹࣗવʹؐݩͰ͖Δ • ঢ়ଶͷʮ఻ൖʯͱʮू໿ʯ͸୅਺తੑ࣭Λඞཁͱ͢Δ – ʮ఻ൖʯ֤ঢ়ଶΛ৽͍͠ঢ়ଶʹࣸ͢ ˠࣸ૾ –

    ʮू໿ʯෳ਺ͷ݁ՌΛҰͭʹ·ͱΊΔ ˠ݁߹ – ͜Ε͕݁߹తͰͳ͚Ε͹࠶ؼɾޮ཰Խ͕೉͍͠ ˠ୅਺తߏ଄ͷཁ੥ ΞϧΰϦζϜΛந৅Խ͢Δͱࣸ૾ͱ݁߹͕ܭࢉͷຊ࣭తͳߏ੒ཁૉͱͯ͠ݱΕΔ ঢ়ଶۭؒΛू߹ͱΈͳ͢ͱɺ୅਺తߏ଄ʢ'VODUPS .POPJE 4FNJSJOHʣʹରԠ͢Δ )BTLFMMͷܕͱߴ֊ؔ਺͸ɺͦͷߏ଄ΛࣗવʹΠϯλϑΣʔεͱͯ͠࿐ग़ͤ͞Δ ந৅Խ͸ʮܭࢉͷ୅਺ʯΛՄࢹԽ͢ΔաఔͰ΋͋Δ https://speakerdeck.com/naoya/guan-shu-xing-yan-yu-dejing-ji-puroguramingu ΑΓৄ͘͠͸