競技プログラミングサイトAtCoder にて、「初心者の方はまずこの問題を解いてみよう！」という趣旨の

AtCoder Beginners Selection - AtCoder Beginners Selection | AtCoder

というページが出来ていました。

最近全然プログラミングやってなかったのと、図書館で借りたこの本



を読んでテンションがあがっていたのもあり、Schemeで問題を解いていくことにしました。

11問あるんですが、この記事では8問目からラストまで。

前編はコチラ↓

AtCoder Beginners Selection を Scheme(Lisp)で解く 前編 - プログラミングを上達させたい

11問目

ABC086C: Traveling - AtCoder Beginners Selection | AtCoder

移動できるかに関しては

・そもそも時間的に間に合うか

・ちょうどぴったり着地できるか(1秒に1段動かなきゃいけない＝偶奇の一致)

の2つをチェックしなければいけません。

また、スタート地点(0秒後に(0,0))を忘れずに！

( define N ( read )) ( define time-and-position ( lambda ( a b c ) ( cons a ( cons b ( cons c '()))))) ( define time ( lambda ( list ) ( car list ))) ( define xpos ( lambda ( list ) ( car ( cdr list )))) ( define ypos ( lambda ( list ) ( car ( cdr ( cdr list ))))) ( define N-read ( lambda ( n ) ( if ( = n 0 ) '() ( let* (( first ( read )) ( second ( read )) ( third ( read )) ( element ( time-and-position first second third ))) ( cons element ( N-read ( - n 1 ))))))) ( define canmove? ( lambda ( t-pos1 t-pos2 ) ( let (( move-dis ( + ( abs ( - ( xpos t-pos1 ) ( xpos t-pos2 ))) ( abs ( - ( ypos t-pos1 ) ( ypos t-pos2 ))))) ( move-time ( + ( abs ( - ( time t-pos1 ) ( time t-pos2 )))))) ( and ( <= move-dis move-time ) ( = ( modulo move-dis 2 ) ( modulo move-time 2 )))))) ( define check ( lambda ( list ) ( cond (( null? list ) "Yes" ) (( null? ( cdr list )) "Yes" ) (( canmove? ( car list ) ( car ( cdr list ))) ( check ( cdr list ))) ( #t "No" )))) ( display ( check ( cons '( 0 0 0 ) ( N-read N )))) ( newline )

無事なんとか、Scheme(Lisp)で初級問題を解ききることができました。

難しい問題も解いていかなければ・・・苦手なグラフとかも・・・

あと、カリー化などちゃんと勉強して、よりエレガントなコードを書けるように頑張っていきたいです。

ひとまずこれ読まなきゃ。



おわり。