Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Pietで競プロしよう

1,707 views

Published on

KMC春合宿で発表した、難解プログラミング言語で競技プログラミングに挑戦するLTです。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Pietで競プロしよう

  1. 1. Pietで競プロをしよう! 2018/03/18 KMC春合宿 base64
  2. 2. 目次 突然ですが皆さん、
  3. 3. 目次 あの!話題の画期的な プログラミング言語
  4. 4. 目次 Pietを 知ってますよね!?
  5. 5. 目次 これがPietだ!!!!
  6. 6. 目次 自己紹介
  7. 7. 目次 自己紹介
  8. 8. 自己紹介  id: base64  名前: ひみつ  身分: 京大工学部計算機科学コース新4回生、39代会計  活動: ボドゲ、競プロ、(Piet)  Twitter: @basemusi とか
  9. 9. Pietのおさらい  ソースコードがドット絵の難解プログラミング言語  慣れればフローチャートをそのまま描いてる気分に  雑に描いても抽象画っぽくなる  最高の言語 バブルソートのプログラム→
  10. 10. 目次 プロコンとは
  11. 11. プロコンとは 競技プログラミング、プログラミングコンテストなどと 呼 ばれるプログラミングのコンテスト
  12. 12. プロコンとは 競技プログラミング、プログラミングコンテストなどと 呼 ばれるプログラミングのコンテスト
  13. 13. プロコンとは 競技プログラミング、プログラミングコンテストなどと 呼 ばれるプログラミングのコンテスト
  14. 14. プロコンとは 競技プログラミング、プログラミングコンテストなどと 呼 ばれるプログラミングのコンテスト
  15. 15. ここまで聞いた方なら もうお分かりですね
  16. 16. 画期的なPietで 競プロをやれば 優勝‼
  17. 17. Pietでコンテストに出る準備 なぜか多くのプログラミングコンテストではPietが使えない Pietから他の言語に変換するツールを用意しよう! Pietのインタプリタを書いてそこにPietの画像データを 埋め込むとかすると簡単にできる
  18. 18. Pietインタプリタの注意 雑に実装するとPietインタプリタが、Pietのroll命令で スタック長NのときO(N)時間かかっていた roll命令は変数の参照にあたる操作にも必要なので頻出 (変数の参照は他の言語でO(1)で可能) Pietのプログラムの実行が遅すぎて、まともに問題が解けない!
  19. 19. Pietでのスタックの操作 Pietで扱えるメモリはスタック1個だけで、 Pietの全命令はpushとpopとrollの3つ操作で表現できる (1, 4, 3) 2 push ↓ 末尾に2を追加 (1, 4, 3, 2) pop ↓ 末尾の要素を削除 (1, 4, 3)
  20. 20. rollとは (1, 2, 3, 4, 5, 6) (4, 1)roll ↓ 末尾4要素を1回転 (1, 2, 6, 3, 4, 5) (2, 1)roll ↓ 末尾2要素を1回転 (1, 2, 6, 3, 5, 4) (3, 2)roll ↓ 末尾3要素を2回転=(3, 1)roll2回 (1, 2, 6, 5, 4, 3) この操作を高速に処理したい
  21. 21. 平衡二分木 を使うと速い!
  22. 22. 高速にrollを処理する  平衡二分木の不思議な力でrollがO(logN)で可能 平衡二分木を用いると数列のsplitとmergeが数列長Nに対しO(logN)で可能 (1, 2, 3, 4, 5, 6)を(5, 2)rollする場合 (1), (2, 3, 4), (5, 6)にsplit (1)と(5, 6)をmerge さらに(2, 3, 4)をmergeして (1, 5, 6, 2, 3, 4)が得られる  ただし、それでも他の言語より結構処理が重いので注意  誰かが「償却O(1)でrollできそう」って言ってたので誰かやってくれ!
  23. 23. Pietで実際に問題を解いてみる Atcoder Beginner Contest 007 D問題 禁止された数  A以上B以下の数の中で4または9を含む数はいくつあるか?  A, Bは整数, 1 <= A, B <= 1e18  例えばA=3, B=15のときは4, 9, 14の3つで3が答え  愚直に数えると計算時間が間に合わないので桁dpを用いる
  24. 24. ABC007 D問題 禁止された数 Pietでの正解例↓
  25. 25. ABC007 D問題 禁止された数 プログラムの内容
  26. 26. PietでABCのD問題が解けた!!! ABCのD問題が解けるとどのくらいすごいか  Atcoder水色(ソフトウェアエンジニアとしてトップレベル?) レーティングぐらい  Paiza Sランク(上位2%?)よりすごい! したがってPietプログラマもトップレベルのプログラマになれる かもしれない気がしてくる
  27. 27. コンテストに出よう!! 3月4日のAtcoder Beginner Contest 089にPietで参加した めざせ全完!!!! 同時開催のAtcoder Regular Contestに参加しなかったのは、 ABCなら失敗してもレーティングが変わらないから
  28. 28. A問題  整数Nが与えられるのでN/3を出力せよ(意訳)  1<=N<=1000 これはやるだけ
  29. 29. B問題  N個の文字が与えられて、その中に“Y”が含まれていた ら“Four”を出力し、そうでなければ“Three”を出力せよ (意訳)  1 <= N <= 100
  30. 30. C問題  三重ループでいい感じに計算する問題  文字列入力もある 三重ループしんどいし、文字列の末尾を判定しながら 文字列を読み込むのもしんどい……
  31. 31. D問題  二次元配列を2重ループで見ながら、その中でループ を回して累積和の配列をつくっていい感じにする問題 高度なループ処理の実装が重い……
  32. 32. 結果  A, Bの2完で1038位(提出のある参加者は1168人) 大敗北
  33. 33. もうだめ  そもそもPietで二重ループを実装するのが しんどい時点で厳しい  Pietプログラマが他の言語のプログラマを 圧倒するなんて夢物語だった
  34. 34. 結論 まともな言語で 競技プログラミングをやろう!!!

×