Hatena::Grouprubyist

krystal: プログラミング超初心者(文系)

2008-11-28 (Fri)たのしいRuby練習問題

P230 - num2astriskを定義しよう

19:12

  • "12"といった数値による文字列を、"************"というように、その数だけ「*」が並ぶ文字列に変換するメソッドnum2astriskを定義しよう。
  • ただし、Numericクラス(またはそのサブクラス)のオブジェクトやメソッドを使わないこと。
def num2astrisk(num)
  i = 1
  astrisk = "*"
  while i < num.to_i
    astrisk.concat("*")
    i += 1
  end
  return astrisk
end
p num2astrisk("10")  #=> "**********"

Stringクラスにも「+」があるから、セーフ?

parin30parin302008/11/29 13:33(*゚ー゚)これは駄目なのかにゃ?
"*" * num.to_i

rochefortrochefort2008/11/29 14:52↑すっきり!ですね。

rubyはカウンタ使わないでループ処理ができるので(イテレータ)
あえてそういう書き方をすると
こういう感じになりました。

def num2astrisk(num)
astrisk = "*"
out = ""
num.to_i.times{|x| out << astrisk}
out
end

prinypriny2008/11/29 17:35私も書いてみました。

def num2astrisk(num)
Array.new(num.to_i, "*").join
end

Numeric クラスのメソッドは使ってないと思う。
num.to_i がグレーなかんじ。
「最初から Numericクラス(またはそのサブクラス)の
オブジェクト」を使ってなければいいのかな?う~ん。

krystalkrystal2008/11/30 20:03>parin30さん
コメントをありがとうございます。
「*」はNumericではなくStringクラスやArrayクラスのメソッドでしたね。使えますね

>rochefortさん
コメントありがとうございます。
イテレータですね!
「ループ」を見るとついついwhileを使ってしまいます...

>prinyさん
コメントありがとうございます。
短いですね!
joinは文字列を返すメソッドでしたね。なるほどです。

holysugarholysugar2008/12/01 01:53ええと、問題の条件から、

1 は Numeric な Object なので、登場した時点でアウトでしょう。( 1.is_a? Numeric )
"1".to_i も 1 というオブジェクトを評価することになるので同様だと(自分は)思います。

ちゃんと題意に沿った方法があるので、もう少し探してみてはいかがでしょうか。

krystalkrystal2008/12/01 10:52>holysugarさん
コメントありがとうございます。
intにしたらアウトですか...
はい、もう少し考えてみます。

rubikitchrubikitch2008/12/01 12:28String#*は既出なので。

def num2astarisk(num)
("1"..num).map{"*"}.join
end
num2astarisk "4" # => "****"

krystalkrystal2008/12/01 19:17>rubikitchさん
コメントありがとうございます。
範囲オブジェクトは("1".."4")のようにも使えるんですね!知らなかったです。
数字とアルファベットにしか使えないと思ってました。