scheme / commonLispで解く競技プログラミング (1)
lispをもう少しだけ詳しくなりたかった.
Lispってなに?
- とても古い言語
- C言語と比べてとてもシンプルな言語.
- emacsLispとかで息してる言語.
Lisp言語を選ぶメリット
- ないと思います.
- オレオレ言語を作りたいとき,Lispライクな言語設計にすると,とても実装が楽.
- 共通設計
commonLispってやつを選べばいいのかなー?
- 派生がたくさんある.
- schemeだと,yukicoderでもAtCoderでも対応している.
- commonLispはAtCoderで対応している.
- 昔はcodeIQでも対応してた.
- https://codeiq.jp/tools/sandbox/ でコードが書けます.
知識度
- B3の講義でやった
- carとかcdrとかどっちがどっちか忘れた
- ループやってない,再帰だけ
- 割と調べまくってます
common Lisp で解く
ABC043-A
- Submission #1418725 - AtCoder Beginner Contest 043 | AtCoder
- 実は変数宣言知らないです.
let
があるらしい. defun
で関数を作り,引数として変数宣言する.
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)