buyoh.hateblo.jp

残念な競技プログラミング参加者による学習記録

scheme / commonLispで解く競技プログラミング (1)

lispをもう少しだけ詳しくなりたかった.

Lispってなに?

  • とても古い言語
  • C言語と比べてとてもシンプルな言語.
  • emacsLispとかで息してる言語.

Lisp言語を選ぶメリット

  • ないと思います.
  • オレオレ言語を作りたいとき,Lispライクな言語設計にすると,とても実装が楽.
    • 共通設計

commonLispってやつを選べばいいのかなー?

知識度

  • B3の講義でやった
  • carとかcdrとかどっちがどっちか忘れた
  • ループやってない,再帰だけ
  • 割と調べまくってます

common Lisp で解く

ABC043-A

ABC044-A

ABC012-A

  • Submission #1420194 - AtCoder Beginner Contest 012 | AtCoder
  • 出力に戸惑う.
  • ((write 1) (write 2))と記述すると,12と出力されてしまう.
  • 文字を出力するためにprincを使う.
  • (princ " ")で半角スペースが出力できた.でもこれは最適ではないかもしれない.
  • (write "Hello")"Hello"とダブルクオート付きで出力される.prin1を使う.
    • printは出力前に改行する.

ABC013-A

  • Submission #1420243 - AtCoder Beginner Contest 013 | AtCoder
  • 直感的じゃないと思う仕様.
    • 例えば,標準入力にABCという文字列がある.
    • コードが(write (subseq (read) 1))とする.
    • このとき,ABCは文字じゃないよ!と言ってエラーを吐く.
    • 標準入力が"ABC"ならば,文字列と認識される.
  • なので,標準入力から文字列を読み込む場合,readは使えない.
    • 行ごと文字列とみなし読み込む read-lineがある.
  • …でも所詮1文字なので,1文字だけ読み込むread-charを使う.

scheme で解く

#181797 No.9001 標準入出力の練習問題(テスト用) - yukicoder

  • 半角スペース出力は(display " ")を使う.
  • 文字列を読み込み,出力しているように見えるが,このコードには罠がある.
    • readで読み込んでいるので,commonLispのそれと同様に,文字列と認識していない.
    • 文字列と認識していないものを,そのままwriteで出力している.
    • 何やってるんだろう…

ABC058-A

Submission #1370482 - AtCoder Beginner Contest 058 | AtCoder

  • let使った.
  • (let ((変数 値) (変数 値)...) (プログラム) )

調べたが使わなかった

scheme
(string->list s)
(list->string ls)
  • ループを持ち出していないので,その辺りを次回にやろう.
  • 結局commonLispで進めるかschemeで進めるか決められず.
  • もうLispで文字列は触りません.死ね.