2011年8月13日土曜日

「ランダム文字列」をGaucheで解いてみる



お題:ランダム文字列 - No Programming, No Lifeを書いてみる。


すっきり。#[\w]は文字集合、\wは単語を構成する文字の集合でa-zA-Z_。#[a-zA-Z0-9_]でもいいかな。


char-set->stringで文字集合を文字列に変換するためにsrfi-14


文字列をshuffleでシャッフルするのにgauche.sequence


16文字抜き打すのにsrfi-13のstring-takeを使っています。


追記


さっき



(use gauche.sequence)
(use srfi-13)
(use srfi-14)
(string-take (shuffle (char-set->string #[a-zA-Z0-9_])) 16)


こんなの書いてましたが誤りです。これだと同じ文字が2連続しない。ランダムではない。恥ずかしい。


これでどうだ!



(use gauche.sequence)
(use srfi-14)
(use srfi-42)
(string-ec (: i 16) (~ (shuffle (char-set->string #[a-zA-Z0-9_])) 0))


また追記


実行時間をはかろうとしてtimeしたら



gosh> (time (length '(1 2 3)))
ERROR: failed to link /usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.0.1/gauche--auxsys.so dynamically: dlopen(/usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.0.1/gauche--auxsys.so, 10): Symbol not found: _environ

Referenced from: /usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.0.1/gauche--auxsys.so
Expected in: flat namespace
in /usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.0.1/gauche--auxsys.so
Stack Trace:
_______________________________________
0 (sys-times)
[unknown location]

こんな表示が。


後でググろう…


さっきのだと遅いかな、と思って書き直してみた



実行時間をはかる。

前のをちょっと変えたのをa.scmと今のをb.scmに書いて実行する


前の

a.scm



(use gauche.sequence)
(use srfi-14)
(use srfi-42)
(dotimes (n 1000)
(let ((src (char-set->string #[a-zA-Z0-9_])))
(string-ec (: i 16) (~ (shuffle src) 0))))



$ time gosh a.scm

real 0m1.475s
user 0m1.463s
sys 0m0.010s

今の

b.scm



(use srfi-14)
(use srfi-27)
(use srfi-42)
(dotimes (n 1000)
(let* ((src (char-set->string #[a-zA-Z0-9_]))
(src-len (string-length src)))
(string-ec (: i 16) (~ src (random-integer src-len)))))



$ time gosh b.scm

real 0m0.105s
user 0m0.098s
sys 0m0.006s

もっといい方法があるに違いない。





0 件のコメント:

コメントを投稿