RUBYの宿題教えてくだ ..
586:デフォルトの名無しさん
07/05/09 02:18:41
Haskellとか使うと嫌でも分かるよ。
というか再帰こそ自然で直観的なものだと思えるようになる。
587:デフォルトの名無しさん
07/05/09 02:28:01
今から再帰で目覚めるためだけにlisp始めれ、というよりは若干やさしいか?
そうでもないか
588:デフォルトの名無しさん
07/05/09 02:59:41
教科書の再帰関数は見かけ無駄な動作しかしないからな
フツーの言語で説明されても「こんなんループで書いたほうが早いってはい終了」と思って
即忘れてしまうのは無理もないと思う
589:デフォルトの名無しさん
07/05/09 05:48:31
ヒルベルトとか
590:デフォルトの名無しさん
07/05/09 08:59:39
クイックソートとかマージソートは再帰で書くと思うが。
591:デフォルトの名無しさん
07/05/09 09:03:17
>>588
Rubyスクリプトだとfact(n)を書くのに
(1..n).each do |i| 以下略
とか
1.upto(n) do |i| 以下略
とか
そういう便利な繰り返しが真っ先に出てきちゃうからな
いや、Rubyに限ったことじゃないけど
592:デフォルトの名無しさん
07/05/09 12:42:17
>>578のそもそもは「面接官の前で紙に該当のコード書け」という問題だからなあ
2分もあれば書けるだろうとか言われてるし
モニタの前でコーヒーとか飲みながらキーボードをパチパチやって答える問題ではない
593:デフォルトの名無しさん
07/05/09 13:11:19
実務でクイックソートとかマージソート使う場面あるか?
まずほとんどの場面で、
単純なソートで大丈夫だぜ
594:デフォルトの名無しさん
07/05/09 13:43:51
というか、普通はライブラリを使うだろ。
595:デフォルトの名無しさん
07/05/09 13:54:24
「クイックソート自力で実装しました」とか言ったら普通はグーで殴られるよな
ソートの実装はそれこそ勉強用だ
絶対に自力で経験しないといけないが、絶対に実地で使ってはイカン(趣味でもな)
596:デフォルトの名無しさん
07/05/09 14:31:45
Rubyみたいな言語での再帰の日常利用はある日天啓のごとくひらめくもんだと思う
ただし、たいがいはコードが美しくなるだけであって動作速度は普通に書くよりも遅い
ただでさえワンテンポ遅いRubyが再帰でさらに遅くなるのでトレードオフの見極めに注意
込み入ったプログラムでは使うと便利なこともあるけれど、初心者には無理かも
597:デフォルトの名無しさん
07/05/10 11:26:26
再帰的処理は練習しないと肝心の「再帰処理で考えれば万事うまくいく」とこで再帰の使用をひらめかないから、
自作の速度クリティカルじゃないスクリプトでどんどん使って慣れておいたほうがいいぞ。
598:デフォルトの名無しさん
07/05/12 12:44:58
(1..100).each{|i|if i%3==0&&i%5==0 then s="FizzBuzz" elsif i%3==0 then s="Fizz" elsif i%5==0 then s="Buzz" else s = i end; puts s}
130bytes orz
599:デフォルトの名無しさん
07/05/12 13:55:39
ラーメンタイマー作ってー
ramen.rb 180
ってやると残り時間を秒単位でカウントしていって
時間過ぎたら今度は経過時間を表示していくようなやつ
600:デフォルトの名無しさん
07/05/12 15:22:30
# Windowsではベルは鳴らない(なんで?)。マイナス引数秒までカウントする
# バックスペース文字の連打で描画領域を確保するのは横着なので真似しないこと
time = Integer(ARGV[0])
$stdout.sync = true
time.downto(time*-1) do |t|
print "\a\a" if t < 1
print t.to_s.rjust(4)
sleep 1
print "\b\b\b\b \b\b\b\b"
end
601:デフォルトの名無しさん
07/05/12 16:08:51
# 遠くから見て残り時間がわからなくて寂しかったので修正
# 5秒につき * が1個減ります
time = Integer(ARGV[0])
$stdout.sync=true
0.upto(time) do |i|
(print i / 60; next) if i % 60 == 0
(print '*') if i % 5 == 0
end
time.downto(time*-1) do |t|
print "\a" if t < 0
print "\b \b" if t % 5 == 0 && t >= 0
sleep 1
end
602:デフォルトの名無しさん
07/05/12 16:25:52
>>598
更新履歴兼雑記 - FizzBuzz アゲイン 15:51
URLリンク(d.hatena.ne.jp)
1.upto(?d){|n|puts ["Fizz#{s=[:Buzz][n%5]}"][n%3]||s||n}
1.upto(?d){|n|s=[:Buzz][n%5];puts n%3<1?"Fizz#{s}":s||n}
1.upto(?d){|n|n%3<1&&s=:Fizz;puts n%5<1?"#{s}Buzz":s||n}
1.upto(?d){|n|puts ["Fizz%s"%s=[:Buzz][n%5]][n%3]||s||n}
603:デフォルトの名無しさん
07/05/17 20:58:14
FizzBuzzの問題で不思議に思うこと。
いろんな言語で書いてあるのをみてみると
ふりわけするのにこういうパターン(ケース型?)がすごく多い。
if n % 15 == 0 then
puts "FizzBuzz"
elsif n % 3 == 0 then
puts "Fizz"
elsif n % 5 == 0 then
puts "Buzz"
else
puts n
end
15を先に調べるとなにかいいことある?
式の評価回数がふえるだけのような気がするんだけど。
ふつうにifの入れ子では駄目なのかなあ。
あ、短くする競争のものは、なんでもやってください。
そうじゃないものの話ね。
604:デフォルトの名無しさん
07/05/17 21:01:06
改行の出力
605:デフォルトの名無しさん
07/05/17 21:26:13
>>603
「3の倍数の場合」「5の倍数の場合」「3の倍数でもあり、5の倍数でもある場合」
のみっつのケースを特別視しないといけないから、素直にコードに落とすと
そうなるんじゃないか?
606:sage
07/05/17 21:43:12
私はこっちの方が素直だと思う。
if n % 3 == 0 then
if n % 5 == 0 then
puts "FizzBuzz"
else
puts "Fizz"
end
else
if n % 5 == 0 then
puts "Buzz"
else
puts n
end
end
607:デフォルトの名無しさん
07/05/17 22:13:42
めんどいな
>>603
コードによってthen以下の処理内容は違うから一概には言えない
ただ、たとえば3や5を先にすると、15で割り切れるはずの30が先に3や5の処理に入ることがある
短くしたいとか奇を衒おうとかいうコードの場合、そういうのに対する余分な迂回処理は避けたいんだろう
だから分岐の時点で15を先に持ってくると
608:デフォルトの名無しさん
07/05/17 23:17:02
>>606
n % 5 == 0 という条件式が繰り返されているので、仕様変更に弱い。
TABLE = [nil, "Fizz", "Buzz", "FizzBuzz"]
index = 0
index += 1 if n % 3 == 0
index += 2 if n % 5 == 0
word = TABLE[index]
puts word ? word : n
609:デフォルトの名無しさん
07/05/18 00:44:30
仕様変更なんて起こらないだろ
そんなこと言ったら再利用に便利なようにメソッド化しモジュール化すべきだと言うぞ俺は
610:デフォルトの名無しさん
07/05/18 01:19:00
では、関数型っぽく(lisperっぽく?)
p (1..100).to_a.map {|i|
if i % 15 == 0 then "FizzBuzz"
elsif i % 3 == 0 then "Fizz"
elsif i % 5 == 0 then "Buzz"
else i
end
}
611:デフォルトの名無しさん
07/05/18 02:21:25
うーん。仕様変更に弱いですか。
実際、どれぐらい式の評価回数が違うか数えてみると
1から100の数字の場合、3でも5でも割り切れる場合が7個
3で割り切れる場合が27個、5で割り切れる場合が13個
それ以外が53個、ケース型の式の評価回数は、
7*1+27*2+(13+53)*3=259回
入れ子型の場合、2*100=200回
ケース型はデータによって変動するわけですが、
最良の場合は100回、最悪で300回。
612:デフォルトの名無しさん
07/05/18 10:10:49
スレリンク(prog板:90番)
613:デフォルトの名無しさん
07/05/19 17:39:56
これはどうでしょう・・・
1.upto(100) {|i|
s = ""
s << 'Fizz' if i % 3 == 0
s << 'Buzz' if i % 5 == 0
s << i.to_s if s == ""
puts s
}
614:デフォルトの名無しさん
07/05/20 00:25:39
拡張すると、1-100の各数に対して素因数を全て書き出せ、という問題に
615:デフォルトの名無しさん
07/05/20 08:31:31
Fizz-Buzz問題
スレリンク(prog板)
616:デフォルトの名無しさん
07/05/21 11:40:06
無職さんの答え
(1..100).each{ |n|
s = n.to_s
s='Fizz' if n % 3 == 0
s='Buzz' if n % 5 == 0
s='FizzBuzz' if n % 15 == 0
puts s
}
617:デフォルトの名無しさん
07/05/21 12:33:07
そういうときはせめて elsif 使おうぜ
別に何かトリッキーな短くしようという書き方してるわけでもないだろ
今のままだと n が 15のとき
s #=> "15"
s #=> "Fizz"
s #=> "Buzz"
s #=> "FizzBuzz"
と 4回切り替わってるぞ
(1..100).each do |n|
if n % 15 == 0 then
s = 'FizzBuzz'
elsif n % 3 == 0 then
s = 'Fizz'
elsif n % 5 == 0 then
s = 'Buzz'
else
s = n.to_s
end
puts s
end
んで「 nが何回も評価されててうぜえ」と感じるなら case 文とか
そして、もしも「こんなん1から100まで入った配列をFizzやBuzz入りの配列に変換すりゃいいんだろ」と思えるのなら
618:デフォルトの名無しさん
07/05/21 12:58:33
こんなん考えた
class Fixnum
def fizzbuzz
(ret = "#{["Fizz"][self % 3]}#{["Buzz"][self % 5]}").empty? and ret = to_s
ret
end
end
1.upto(100){|n|
puts n.fizzbuzz
}
619:デフォルトの名無しさん
07/05/21 13:05:48
>>617
>>618を使うなら
puts (1..100).to_a.map{|i| i.fizzbuzz}
ってとこか?
どこぞで不評だったputsの特別機能(配列は改行つきで表示)がこんなとこでなにやら便利に
620:デフォルトの名無しさん
07/05/21 13:07:42
>>617
切り替わるとやばいかな。のちのち値を追いかけるときやばくなるとかですか。
理由をもうちっと教えてください。
621:デフォルトの名無しさん
07/05/21 13:41:35
単にムダでイヤとかそういうスタイル上の理由じゃね
str = String.new
str = "hoge"
と同じような無駄(1行目で作られたStringオブジェクトは2行目で破棄される)
何か「まずい」ことがおきることはないはずだよ
622:デフォルトの名無しさん
07/05/21 16:10:10
>>619
map使うならto_aは不要。
623:デフォルトの名無しさん
07/05/21 16:39:59
なにげにEnumerableインクルードしてるからな
624:デフォルトの名無しさん
07/05/21 16:52:02
まだやってんの蚊
お前ら人生の効率をもう少し重視したほうがいい
625:デフォルトの名無しさん
07/05/22 04:48:05
3の倍数でFizz、5の倍数でBuzz、7の倍数でFuzz、11の倍数で……
626:デフォルトの名無しさん
07/05/24 16:35:08
puts "1"
puts "2"
puts "Fizz"
・
・
・
じゃダメなのか?
と基本的なボケをしてみる。
627:デフォルトの名無しさん
07/05/24 19:04:31
赤点ぎりぎりで合格!
628:デフォルトの名無しさん
07/05/28 01:00:12
こんなのはやっぱり反則?
FizzBuzz.rb
1.upto(?d){|i|puts""==(a=$0[i*i%3*4-11..-4--i**4%5])?i:a}
629:デフォルトの名無しさん
07/05/28 18:03:52
ruby初心者の俺が15の倍数をチェックしないバージョンを書いてみた
def FizzBuzz(x)
r = "Fizz" if x % 3 == 0
r = (r||"") + "Buzz" if x % 5 ==0
return r || x
end
1.upto(100) {|x| puts FizzBuzz(x)}
630:デフォルトの名無しさん
07/05/28 18:41:31
>>628
うちだと、nil nil nil nil ...にしかならなかった
631:デフォルトの名無しさん
07/05/28 21:42:07
ファイル名をFizzBuzz.rbにしてください。
632:デフォルトの名無しさん
07/05/28 21:50:44
ファイル作るの面倒だったのでirbで無理矢理動かした。
>> $0 = 'FizzBuzz.rb'
>> 1.upto(?d){|i|puts""==(a=$0[i*i%3*4-11..-4--i**4%5])?i:a}
動作確認には十分。
633:デフォルトの名無しさん
07/05/28 22:09:33
普通に、"FizzBuzz"[i*i%3*4-8..-1--i**4%5] でよさそうなもんだが。
634:デフォルトの名無しさん
07/05/29 20:36:53
書き換えるのが面倒だったの
635:デフォルトの名無しさん
07/05/30 17:02:25
>>629-634
そういうことかww
やっときづいた
636:デフォルトの名無しさん
07/06/06 15:42:44
a = [1, 2, 0, 3, 4, 5]
配列の一番後ろを得たいときは、
a.last
だよな?
後ろから2番目、3番目を得たいときは、どうするんだ?
a[a.size - 2]
しかない?
a.last(2)
は違うし・・・
637:デフォルトの名無しさん
07/06/06 15:49:18
irb> a = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb> a[-2]
=> 4
638:デフォルトの名無しさん
07/06/06 15:59:27
-1がlast
last一つ前は-2
639:デフォルトの名無しさん
07/06/06 16:03:16
>>637-638
インデックス、マイナスにできたのか。しらなかた
reverseしてから、アクセスとかやってた。
サンクスでう。
640:デフォルトの名無しさん
07/06/11 02:35:33
stringをarrayにする簡単な方法はないですか?
やりたいことは、arrayにして、sortしたいのですが・・・
s.to_aは行ごとだし・・・
641:デフォルトの名無しさん
07/06/11 02:38:56
srand
s = "hogemoge"
a = []; s.each_byte {|l| a << l.chr}
pp a.sort_by{ rand }.to_s
実際書いてみると、以外に短かかったw
642:デフォルトの名無しさん
07/06/11 03:43:29
s.split(//).each
643:デフォルトの名無しさん
07/06/11 07:53:28
確かに str.split(//e) が妥当だ(e は str の文字コード)
1文字ずつぶった切って配列にしてるんだなと読み下してもくれるし
644:デフォルトの名無しさん
07/06/11 16:10:21
s.scan(/./)
s.split(//)
同じ長さだったか。
645:デフォルトの名無しさん
07/07/08 19:59:06
パスカルの3角形を印字するプログラムを
作りたいのだが以下のプログラムで作るにはどうしたらいいのでしょうか?
教えてください。
print("Enter n: "); n = gets.chomp.to_i
if( n>30 || n<0 ) then
n = 10
end
a = Array.new( n )
a[0] = [1] # 要素が1 の長さ1の配列
# ここでパスカルの3角形を作る
# このとき、a[i]ごとに配列を作る
# そして、印字
for i in (0..a.length-1) do
for j in (0..a[i].length-1) do
print( " ", a[i][j] )
end
print( "\n" )
end
646:デフォルトの名無しさん
07/07/09 06:58:16
マルチ乙
647:デフォルトの名無しさん
07/07/09 08:18:09
そんな事よりカレーの話しようぜ
648:デフォルトの名無しさん
07/07/09 14:54:25
宿題スレ行け→マルチ乙
これはひどい
649:デフォルトの名無しさん
07/07/09 16:07:04
回答してはいけないという空気?
650:デフォルトの名無しさん
07/07/09 16:25:33
いや、いいんじゃない?
マルチと誤解されないためには、前スレに移動する由を書いとけばいい
651:デフォルトの名無しさん
07/07/09 16:39:33
それこそ「宿題スレのほうがいい」というアドバイスを受けたからこっち来たんだろ
移動した旨は移動時に既にあっちに書いてあるし、イジられる以上の非難を受ける謂れは無いと思われ
652:デフォルトの名無しさん
07/07/09 18:09:50
じゃ、とりあえず。いろいろ宿題の中身無視してるけ、どこんな感じで。
class Array
def next_pascal
next_pascal = Array.new
next_pascal << self[0]
self[0..-2].each_index do |i|
next_pascal << self[i] + self[i + 1]
end
next_pascal << self[-1]
end
end
p = [1]
10.times do
puts p.join(' ')
p = p.next_pascal
end
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4668日前に更新/173 KB
担当:undef