|
|
||
http://rubyist.g.hatena.ne.jp/krystal/20081128/1227867175
正規表現でやるごり押し感なのが好きだけど、でも思いついたのはこれ。
def num2astrisk(n) counter = "0" result = "" while counter != n result << "*" counter.succ! end result end
holysugar2008/12/02 12:27succ できるなら Range 作れるよなあ。勉強になります。("1"..n).map{"*"}.join でいいね。
どう書いたらどう見えるのかさっぱり忘れてた。
parin30∑( ̄□ ̄;)1行で!見事です!!
マニュアル調べたけどブロックなしでもいけますね(*゚ー゚)
(0..1000).map.join.count('0')
krystalCode Golf的に言うと優勝かも。
mapの使い方、調べます。
parin30∑( ̄□ ̄;)そんな方法まで!!素敵です!!
priny高校生のころ、先生が自分で板書した数式を腕を組みながら見つめて、「う~ん、美しい」って言ったことあったたけど、今、その気持ちがわかったような。
シンプルで、しかも、わかりやすいっていいですね。
話は変わりますが、[*0..10]みたいに、0 の前に「*」をつけると、[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] になるのは、どんなカラクリですか?
調べてみたけど、わからなかったです。
p (0..10).class したときは Range が返ってくるけど、p (*0..10).class したらエラーになりました。
回答 or ヒントお願いしますm(_ _)m
holysugar「0 の前」じゃなくて、「0..10 の前」ですね。「*(0..10)」 と解釈されています。
また、「*」については、 http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html の最初の項の中にあります。
まあ、この例は Golf 的でやりすぎだと思うので実際のコードの参考にしないでくださいね。:)
# しかし、配列式は厳密にはメソッドじゃないはずなのに * が使えるのはなぜだろう。
holysugarあとはるびきちさんの「Array.new(1001, &:to_s).join.count('0')」はなるほどと思いました。まだまだ修行が足りてません > 自分。
priny勉強になります。ありがとうございます。
どんなことが起きているかわかったら、どうして [*0..1000].join.count('0') のほうが処理が遅そうなのかわかるかと思ったのですが、処理速度を理解できるようになるには、もっともっと精進しなくちゃいけないみたいです。
自分でも歩きながら考えたり,さっき検索したら[ruby-dev:19155]ってのも出てきてやっぱり設計的(?)に手抜きすぎかと.
まぁ,もちろん普段はそんなの書かないんですが,ではどこで使ってしまうかというと.
Rails で param[:hoge] が複数の値を取るとすると,(GETだと)パラメータは ?hoge[]=alice;hoge[]=bob のような形になると思うんですが,?hoge=foo と書かれた時も同じように扱いたい場合が出てきて,それが増えたらいつのまにか使いまくっていた,という…….やっぱりどう見ても手抜きですね.
あとこう書けるのを今更知りました.
*label = label # 配列でなければ配列化
*label = *label # 配列でなければ配列化
ちなみに Object#to_a は警告が出るので使わないようにしています.でもString#to_aは(Object#to_a相当の機能に思えるのに)警告が出ないなぁ.Enumerable だからか.
*a = aだと a = [a] と同じ.
*a = *aだと a = Array(a) と同じ.意図するのはこちらでした. マニュアルの該当箇所 しかし,これを書くなら素直に a = Array(a) でいい気はします.