お題:文字列を先頭から見て同じところまで除去 - No Programming, No Life
をGaucheで解いてみた。多分0.9じゃないと動かないです。
とりあえずこんな感じです
(use srfi-13)
(define (q . los)
(map (^s (string-drop s (apply min (map (^s (string-prefix-length (car los) s)) los)))) los))
つぶやける長さになった!
学校卒業するまでの間はSchemeいっぱい書いて生きたい。
追記
あまりにも説明なさ過ぎな気がしたのでちょっとだけ説明も書いてみる。
後述するstring-prefix-lengthっていう便利な関数を使うため(use srfi-13)でSchemeのライブラリsrfi-13を読み込む。
(define (q . los) ~)のように書くとqに渡された引数が全て入ったリストがlosに束縛される。
qの中身を内側から見て行く。
srfi-13に用意されているstring-prefix-lengthを使うと2つの文字列の先頭から見て同じとこまでの長さが得られる。
(map (^s (string-prefix-length (first los) s)) los)
(^s ~)は(lambda (s) ~)のシンタックスシュガー、Gaucheの機能。
mapを使ってlosの全ての文字列sとlosの最初の文字列、2つの文字列の「先頭から見て同じとこまでの長さ」のリストを得る。
(apply min ~)でもっとも短い「先頭から見て同じとこまでの長さ」を取り出す。
そしてstring-dropでlosの全ての文字列sから、もっとも短い「先頭から見て同じとこまでの長さ」の分の文字を取り除く。
そんな流れです。
自分の理解を助けるためにも、もう一度さっくりまとめると
- 2つの文字列の「先頭から見て同じとこまでの長さ」を返す便利な関数、string-prefix-lengthがsrfi-13で定義されてるのでそれを使う。
- 関数に渡された全ての引数(文字列)をリストとして受け取る
- 全ての文字列と最初に渡された文字列との「先頭から見て同じとこまでの長さ」を求める
- 一番短い「先頭から見て同じとこまでの長さ」まで文字を取り除いた文字列を返す。
以上です。まじめに書こうとすると日本語難しい。
追記
何も考えず別解。
引数の中に空文字列か、先頭の1文字が他のと同じでない文字列があったら引数をそのまま返す。
それ以外の場合は引数の文字列を先頭から1文字取り除いて再帰
再帰! 再帰!
0 件のコメント:
コメントを投稿