2012年3月30日

夢か

漠然とだけど、好きなプログラミング言語使って好きなように自由にプログラムが作ることかな
GUIで無い、サーバーで動くようなものやライブラリなんか作りたいね
SQLを使わなくてもよくて、別にRDBとかとやり取りをしないものとかいいね
RDBとかSQLにはなんか嫌われてる気がするから
やっぱりGUIでもいいや、GUI楽しいもんね
なんか便利なライブラリとかあるんだったらGUIでもいいね
.NET Frameworkだとライブラリとしては少し物足りないけど
WPFとかどうなんだろうか、まあいいや
誰にでも動かせるように実行環境に制限があるようなものじゃなくてこっちで環境を指定できるようなものとかいいね
PHPしか動かないからPHPで作るとか最悪、吐き気モヨオス、ゲロゲロ
そうなるとJavaScriptで全部ダウンロードしてもらうことになるとできそうだな
一番現実味がありそうだな
だけどなるべくなら静的に型付けされている言語の方がいいような気がするんだけど
今まで動的型付けの言語で本格的に開発したことないから良く分からないんだよね
他には要求とかイチイチ考えなくてもいい、これ作れって指示されてそれを作るだけ
黙々とプログラム書くだけ
要求仕様を考えなくてよくてプログラムのことだけ考えればいい
どんなもん作るかは勝手に考えてくれてその機能を実現するだけ
使い方を俺に決めさせたら俺が一番使いやすい物になるに決まってるじゃんか
少し具体的に言うとHaskellでなにか作るってのが理想に近いんじゃないかなと思う
本当はCommon Lisp使いたいのだけど少し不安
Common Lispはとても魅力的だけど理想状態を考えるとHaskellの方が理想に近そう
あるいはErlangでもいいかな
なんか面白そうなプログラミング言語使って好きなようにプログラムできるんだったらなんか良さそうだなと思う
それが具体的になんなのかさっぱり分からないけど
エディタなんかもいいかもね
でもエディタだったらVimがあるからな
なんか楽しそうな案件ないかな

2012年3月26日

Google Code Jam練習問題

2011の予選問題に挑戦

Problem C.

相変わらず問題の意味は良く分からないですがとりあえずxorすればいいのかなってことで解きました
xorでまとめただけです


(defun compute (lst)
  (if (zerop (reduce #'logxor lst))
    (reduce #'+ (cdr (sort lst #'<)))
    "NO"))

(dotimes (i (read))
  (let ((r nil))
    (dotimes (j (read))
      (setf r (cons (read) r)))
    (format t "Case #~A: ~A~%" (1+ i) (compute (nreverse r)))))

2012年3月22日

Google Code Jam練習問題

Google Code Jam 2012のエントリー受付中なので早速登録しました
Lisper目指してますので回答はCommon Lispで挑戦していきます
事前準備と言うことで練習問題に挑戦しました

2011の予選問題に挑戦

Problem A.
は問題のまま素直にプログラム組むとターンで繰り返すようになりますが、そうすると遅そうなので距離をまとめて引き算して次のスイッチの距離までを一気に計算するようにしました
BなのかOなのかの判断がイマイチ野暮ったい回りくどい記述になっているなと思います
この辺りをなんとかするともう少しスッキリしたものになるんじゃないかなと

(defun operate (input)
  (labels ((getrobot (lst) (car (car lst)))
    (getdistance (lst) (cdr (car lst)))
    (getnextpos (robot lst) (if (assoc robot lst) (cdr (assoc robot lst)) 0))
    (getdiff (pos lst) (abs (- pos (getdistance lst))))
    (getpos (pos target dist)
     (cond ((< pos target) (if (< (+ pos dist) target) (+ pos dist) target))
    (t (if (< (- pos dist) target) target (- pos dist)))))
    (rec (lst bpos opos turn)
  (cond ((null (cdr lst))
         (if (eq 'b (getrobot lst))
    (+ turn (getdiff bpos lst))
    (+ turn (getdiff opos lst))
    ))
        ((eq 'b (getrobot lst))
         (let ((diff (getdiff bpos lst)))
    (rec (cdr lst) (getdistance lst) (getpos opos (getnextpos 'o lst) (1+ diff)) (1+ (+ turn diff)))))
        (t
   (let ((diff (getdiff opos lst)))
     (rec (cdr lst) (getpos bpos (getnextpos 'b lst) (1+ diff)) (getdistance lst) (1+ (+ turn diff)))))
        )
  )
    )
    (rec input 1 1 1)
    )
  )

(dotimes (i (read) i)
  (let ((r nil))
    (dotimes (j (read) j)
      (setf r (cons (cons (read) (read)) r)))
    (format t "Case #~A: ~A~%" (1+ i) (operate (nreverse r)))))


Problem B.
は問題の意味が分からない
英語が辛いです