Upgrade to Pro — share decks privately, control downloads, hide ads and more …

異世界に転生したら手続き型言語が通じなかった

WA_TLE
August 20, 2018
210

 異世界に転生したら手続き型言語が通じなかった

写真を差し替えて、上げ直しました。自分で言語のインタプリンタ作って、ABC解きました。欲しければABC-106-Dの提出ソースを見るといいとおもいます

WA_TLE

August 20, 2018
Tweet

Transcript

  1. 基本型 • nut型 c++でいうlong intです。 • tuple型 • c++だと、tupleとvectorを合わせたような型です。 •

    いろいろなものをまとめられます • 読み込みと書き出しがlognです
  2. 演算 • + - * / % max min <

    > の二項演算 • とうぜんです。 特別処理がめんどかった • vec a bで要素数a,中身全部bのvectorができる • uni a bでふたつのvectorをつなげる
  3. 演算 • If a b c があって、aはnut型 • aが非0ならb,0ならcを返す 関係ないところは評価し

    ない • [r] [r] a bがあって、aはtuple,bはnut 配列から読みだす • [w] [w] a b c があって、c言語だと a[b]=c;
  4. • その他 • {}で空のtupleが作れる • tupleに関数が適用されると、右側の要素がそんままpush_back • letがある • winn,wins,winhで入力

    • woutn,wouts,wouthで出力 • 遅延評価なのでそこそこ早い • おなじ由来なら何回も呼ばれない(たぶん) • 自由変数の代入はうまくやると関数一つで済む • 実装を頑張ったので再帰が普通に使える (重要)
  5. ABC106-B • winn n • let a ( if (

    < n 105 ) 0 (+ ( / ( - n 75 ) 30) ( > n 188 )) ) • woutn a • 説明埋め込み解 • 105,135,165,195,189なので、けいさんをしている • C++ だと、 if(n<105){return 0;}else{ return (n-75)/30 + (n>=189?1:0));} • < は 条件が正しい時1を返すことに注意
  6. ABC106-C • "wins str", • "winn K", • "let solve

    ( @i if ( - i K ) ( if ( - ( [r] str i ) 49 ) ( [r] str i ) ( solve ( + i 1) )) 49 )", • "let ans ( {} ( solve 0 ) )", • “wouts ans”,再帰を行っているかなり複雑だね • Let ansは、文字を出力するためだけに配列に入れてる
  7. • なにをしているか つぎの行が本質で、その他は入出力 • "let solve ( @i if (

    - i K ) ( if ( - ( [r] str i ) 49 ) ( [r] str i ) ( solve ( + i 1) )) 49 )", • i を受け取って、それがKでないなら ( if ( - ( [r] str i ) 49 ) ( [r] str i ) ( solve ( + i 1) )) • そうでないなら49 これは ’1’ • if部分 strのi番目が’1’でないならそれ ‘1’ならsolve(i+1) • C++だとこうなる • Char solve(int i){ • if( i != K){ • if( str[i]!=‘1’){ return str[i];} • else{return str[i];} • }else{return ‘1’;} • }
  8. "winn n", "winn m", "winn q", "let nyum (+ m

    m)", "winh den nyum", "let nyuq (+ q q)", "winh situ nyuq", //n*nの配列を用意する L*n+R "let bas (@id - (+ (* ([r] den (+ id id)) n) ([r] den (+ id (+ id 1)))) (+ n 1))", "let ruis (@hai @id if (< id m) (ruis ([w] hai (bas id) (+ ([r] hai (bas id)) 1)) (+ id 1)) hai)", "let moto (ruis ( vec (* n ) 0 ) 0)", //"wouth moto", //"wouth moto", //Lを減らす idがn*n-1 ~ nについて、bas-nに増やす "let Lkan (@hai @id if ( < id n ) hai ( Lkan ( [w] hai (- id n) (+ ( [r] hai id ) ([r] hai ( - id n ) )) ) ( - id 1 )))", "let Lowa (Lkan moto (- (* n n) 1))", //"wouth Lowa", //Rを増やすid%nによって変える "let fya (@hai @id [w] hai (+ id 1) (+ ([r] hai id) ([r] hai (+ id 1))))", "let Rkan (@hai @id if (< id (* n n)) (if (- (% id n) (- n 1)) (Rkan (fya hai id)(+ id 1)) (Rkan hai (+ id 1) )) hai)", "let Rowa (Rkan Lowa 0)", //さいごになんとかする "let gbs (@id -(+ (* ([r] situ (+ id id)) n) ([r] situ (+ id (+ id 1))))(+ n 1))", "let que (@hai @id if (< id q) (que ([w] hai id ([r] Rowa (gbs id) )) (+ id 1)) hai)", "let ans (que (vec q 0) 0)", "wouth ans",