お題:文字列を先頭から見て同じところまで除去
プログラミングお題の一覧はこちら
※みなさんもこのお題をお気に入りの言語で解いてみて下さい。解いたらこの記事にトラックバックをお願いします。
説明
複数の文字列を受け取り、受け取った文字列をそれぞれ先頭から見てゆき、すべてが同じ内容であれば除去した内容の文字列を返却する関数を書いて下さい。 ※関数の引数と戻り値については複数の文字列が受け渡しできれば型や方法は問いません*1。 例1)hoge("abcdef", "abc123") 戻り値 => "def" と "123" ("abc" が除去される) 例2)hoge("あいうえお", "あいさんさん", "あいどる") 戻り値 => "うえお", "さんさん", "どる" ("あい" が除去される) 例3)hoge("12345", "67890", "12abc") 戻り値 => "12345", "67890", "12abc" (一致なしのため、そのまま返却される) 例4)hoge("a", "ab", "abc") 戻り値 => "", "b", "bc" 例5)hoge(null, "a", "ab") 戻り値 => null, "b", "bc" (どこかにnullがあれば、一致なしと見なしそのまま返却される) 例6)hoge("", "a", "ab") 戻り値 => "", "b", "bc" (どこかに空文字があれば、一致なしと見なしそのまま返却される)
Twitterでの反応
@nouvelleluneさん by Scala
def q(s:String*)=if(s.size<2)s else{val h=s.minBy(_.size);s.map(_.drop((for(x<-0 to h.size;if s.forall(_.take(x)==h.take(x)))yield x).max))}
2011-08-13 01:47:40 via web
先日のコード改善+バグも修正。 RT def q(s:String*)=s.map{_.drop(s(0).indices.reverse.map(_+1).find{x=>s.forall(_.take(x)==s(0).take(x))}.getOrElse(0))}
2011-08-15 18:12:16 via web
@kanno_kannoさん by Ruby
returnがダサイ / def foo(*args) args[0].chars {|c| args.each{|s| s[0] = ''} if args.all?{|s| s.start_with?(c)} }; return args; end
2011-08-13 03:39:16 via web
@xuwei_kさん by Scala
def q(s:String*)=if(s.size<2)s else{s.map(_.drop((0 to s(0).size).filter{x=>s.forall(_.take(x)==s(0).take(x))}.max))} URL
@ksauzzさん by Erlang
Erlangでやってみた URL / お題:文字列を先頭から見て同じところまで除去 - No Programming, No Life (id:fumokmm / @fumokmm) URL
お題:文字列を先頭から見て同じところまで除去 http://bit.ly/oby7HE — Gist
コメント欄から
- ujihisaさん
Haskellで書いてみました
ujihisa's
gist: 1145718 — Gist
clojureで解いてみました http://hiroftp.blogspot.com/2011/08/clojure.html
更新履歴
- 2011-08-20 例4・例5・例6を追加しました。
via
a("a", "aa")もfailしますね。引数なし/nullは @fumokmm さんのリファレンス実装でも考慮されていないようなので、考慮しなくてもよいかもしれませんが。RT @xuwei_k:空文字だと例外? RT @k_matsuzaki: def a(s:String
2011-08-20 00:13:39 via Tweedroid88 to @xuwei_k
*1:文字列配列で受け取り、文字列配列で返却するなど。