プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

コードゴルフっぽいもの

◯問題
標準入力に与えられた英単語のうち、重複のない文字で一番最初に来るものを標準出力として表示するRubyのコードを書け。

google => l
apple => a




これは実は某社で最近受けたRubyの問題なのだけど、テンパッて書いた答えはこんな感じでした。

◯いけてない解答

words = gets.chomp.split(//)
double_char = []
word.each_with_index do |s, i|
  others = words[(i+1)..-1]
  if others.include? s
    double_char << s
  else
    unless double_char.include? s
      puts s
    break
  end
end

まぁ他の言語やってるとこの発想は一番最初に出てくる気はするけど、Rubyだともっとうまく書ける。

どこまで短く書けるかそのあと少し考えた。

◯ひとまずここまで

word = gets.chomp
word.each_char.detect{|x| word.count(x) == 1}

なんといっきに2行まで減らせた。

一番大きいのはdetectを使ったこと。これを使えば条件にマッチする一番最初のものを返してくれる。

次に、わざわざ文字の配列にせずともeach_charを使えばEnumerableが返ること。

しかしここまで来たら1行で書きたい。

◯最終的にこうなった

gets.each_char.detect{|x| $_.count(x) == 1}

まずchompで改行文字列取り除いてたけどこれ消した。
次に、どうしてもgetsの結果を代入する必要から2行で書いてたけど、最後にgetsしたものは$_というグローバル変数で取得できるということに気づいてからそれもいらなくなった。

僕のアタマじゃこれが限界だったので、さらに短いものがあったら教えて下さい!