ソースコード量の比較 schemeとPHP

各言語共通ロジック条件

  • 同じ年月は同じグループとしてカウントして数を求める
  • 最新の年月を降順でソートする
  • 無理やり1行にまとめず、ある程度の可読性は保つようにする
  • 宣言部分、実装メソッドの定義部分などはカウントせず除外する
  • //---(logic)----で囲んだ箇所を比較対象箇所とする
  • 下記「変更前」データーから「変更後」データになるよう標準出力を行う
Scala、Java、PHPでソースコードの量を比較してみる | 深追い Fukaoi.org

なんとなく挑戦
PHP版。foreachで回すのでなく関数使うとちょっと短くなる。

<?php
$yearMonths = array(
                '2009-11', '2009-01',
                '2010-01', '2010-12',
                '2010-01', '2010-04',
                '2010-01', '2010-12',
                '2010-12', '2010-04');

//------(logic)--------------------
$myHash = array_count_values($yearMonths);
krsort($myHash);
print_r($myHash);
//------(logic)--------------------
?>

実行結果。

Array
(
    [2010-12] => 3
    [2010-04] => 2
    [2010-01] => 3
    [2009-11] => 1
    [2009-01] => 1
)

scheme版。絶対もっとうまく書けそうな気がするけど実力不足。

(define year_month '(2009-11 2009-01 2010-01 2010-12 2010-01 2010-04 2010-01 2010-12 2010-12 2010-04))

;------(logic)--------------------
(sort
 (fold (lambda (item hash)
         (cond ((assoc item hash) => 
                (lambda (x) (begin (set-cdr! x (+ (cdr x) 1))
                              hash)))
               (else (cons (cons item 1) hash))))
       '()
       year_month)
 (lambda (x y) (string>? (x->string (car x)) (x->string (car y))))
)
;------(logic)--------------------

実行結果

((|2010-12| . 3) (|2010-04| . 2) (|2010-01| . 3) (|2009-11| . 1) (|2009-01| . 1))

ということでちょっと残念な感じ。