Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-05-21

10分でコーディング x 2 〜リストの破壊的操作篇〜

| 21:36 | 10分でコーディング x 2 〜リストの破壊的操作篇〜 - わだばLisperになる を含むブックマーク はてなブックマーク - 10分でコーディング x 2 〜リストの破壊的操作篇〜 - わだばLisperになる

今日の問題はかなり簡単です。

できるだけ短い時間でエレガントなコードを書きましょう。

あまりに簡単なので制限時間を10分としてやってみてください。

これ以上かかった人は

自分はLisperの癖にかなり破壊的リスト操作プログラミングができない。

とつらい事実を認識しましょう。

そして、これからすごくなりましょう。

では、10分だけこの問題に付き合ってみてください。

スタート!!

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

その1(nalist-to-plist)

難易度 激簡単 目標時間10分以内

alist 例.((foo . 1) (bar .2) ...)とplist 例.(foo 1 bar 2 ....)の使うコンスセル数は同じことが知られています。

ということは、alistからplistへの変換は、余計なコンシングを一切せずに組み換えることができるということです。

alistを破壊的にplistに変換する関数を書いて下さい。

CLなら、nalist-to-plist、Schemeなら、alist->plist!のような命名になりそうです。

CLで書いてみたものをテストすると下記のようになる筈です。

(nalist-to-plist (copy-tree '((foo . 1) (bar . 2) (baz . 3))))
;=> (FOO 1 BAR 2 BAZ 3)

;; alistからplistへの変換を計測
(prog ((data (loop :repeat 100000 :collect (cons 1 2))))
      (time (nalist-to-plist data)))
;=> NIL
----------
Evaluation took:
  0.003 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  0.00% CPU
  6,267,654 processor cycles
  0 bytes consed
  ^^^^^^^^^^^^^^

;; 非破壊版
(prog ((data (loop :repeat 100000 :collect (cons 1 2))))
      (time (loop :for (x . y) :in data :collect x :collect y)))
;=> NIL
----------
Evaluation took:
  0.023 seconds of real time
  0.020000 seconds of total run time (0.020000 user, 0.000000 system)
  [ Run times consist of 0.020 seconds GC time, and 0.000 seconds non-GC time. ]
  86.96% CPU
  56,597,643 processor cycles
  3,198,976 bytes consed
  ^^^^^^^^^^^^^^^^^^^^^^

その2(nplist-to-alist)

ついでなので、nplist-to-alistも作ってみて下さい。

こちらの方が難しい気がしますが、前の問題で馴れたと思うので同じく10分で。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

難易度 超簡単 目標時間10分以内

(nplist-to-alist (list 'foo 1 'bar 2 'baz 3))
;=> ((FOO . 1) (BAR . 2) (BAZ . 3))

※註. とりあえず煽った方が面白いかと思って煽り気味で書いていますw

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20090521