1 名前:RUBY [05/01/24 22:17:37 ] 私は、ある大学の1年生です。今、情報処理の講義でRUBYを習っています。 その講義で、期末テストとして課題が出たのですが、プログラミング初心者の私には 全然歯が立ちません。締め切りは1/31です。プロも皆さんには簡単な 問題かもしれませんがどうか教えてください。 課題は以下の通りです。
606 名前:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:13:42 ] めんどいな >>603 コードによってthen以下の処理内容は違うから一概には言えない ただ、たとえば3や5を先にすると、15で割り切れるはずの30が先に3や5の処理に入ることがある 短くしたいとか奇を衒おうとかいうコードの場合、そういうのに対する余分な迂回処理は避けたいんだろう だから分岐の時点で15を先に持ってくると
608 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 00:44:30 ] 仕様変更なんて起こらないだろ そんなこと言ったら再利用に便利なようにメソッド化しモジュール化すべきだと言うぞ俺は
610 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 10:10:49 ] pc11.2ch.net/test/read.cgi/prog/1178626960/90
613 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 00:25:39 ] 拡張すると、1-100の各数に対して素因数を全て書き出せ、という問題に
615 名前:デフォルトの名無しさん [2007/05/20(日) 08:31:31 ] Fizz-Buzz問題 pc11.2ch.net/test/read.cgi/prog/1178626960/
616 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 13:05:48 ] >>617 >>618 を使うなら puts (1..100).to_a.map{|i| i.fizzbuzz} ってとこか? どこぞで不評だったputsの特別機能(配列は改行つきで表示)がこんなとこでなにやら便利に
620 名前:デフォルトの名無しさん [2007/05/21(月) 13:07:42 ] >>617 切り替わるとやばいかな。のちのち値を追いかけるときやばくなるとかですか。 理由をもうちっと教えてください。
621 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 13:41:35 ] 単にムダでイヤとかそういうスタイル上の理由じゃね str = String.new str = "hoge" と同じような無駄(1行目で作られたStringオブジェクトは2行目で破棄される) 何か「まずい」ことがおきることはないはずだよ
622 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:10:10 ] >>619 map使うならto_aは不要。
623 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:39:59 ] なにげにEnumerableインクルードしてるからな
624 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:52:02 ] まだやってんの蚊 お前ら人生の効率をもう少し重視したほうがいい
625 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 04:48:05 ] 3の倍数でFizz、5の倍数でBuzz、7の倍数でFuzz、11の倍数で……
626 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 16:35:08 ] puts "1" puts "2" puts "Fizz" ・ ・ ・ じゃダメなのか? と基本的なボケをしてみる。
627 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 19:04:31 ] 赤点ぎりぎりで合格!
628 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/05/28(月) 18:41:31 ] >>628 うちだと、nil nil nil nil ...にしかならなかった
631 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 21:42:07 ] ファイル名をFizzBuzz.rbにしてください。
632 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 22:09:33 ] 普通に、"FizzBuzz"[i*i%3*4-8..-1--i**4%5] でよさそうなもんだが。
634 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:36:53 ] 書き換えるのが面倒だったの
635 名前:デフォルトの名無しさん [2007/05/30(水) 17:02:25 ] >>629-634 そういうことかww やっときづいた
636 名前:デフォルトの名無しさん [2007/06/06(水) 15:42:44 ] a = [1, 2, 0, 3, 4, 5] 配列の一番後ろを得たいときは、 a.last だよな? 後ろから2番目、3番目を得たいときは、どうするんだ? a[a.size - 2] しかない? a.last(2) は違うし・・・
637 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 15:49:18 ] irb> a = [1, 2, 3, 4, 5] => [1, 2, 3, 4, 5] irb> a[-2] => 4
638 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 15:59:27 ] -1がlast last一つ前は-2
639 名前:デフォルトの名無しさん [2007/06/06(水) 16:03:16 ] >>637-638 インデックス、マイナスにできたのか。しらなかた reverseしてから、アクセスとかやってた。 サンクスでう。
640 名前:デフォルトの名無しさん [2007/06/11(月) 02:35:33 ] stringをarrayにする簡単な方法はないですか? やりたいことは、arrayにして、sortしたいのですが・・・ s.to_aは行ごとだし・・・
641 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 03:43:29 ] s.split(//).each
643 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 07:53:28 ] 確かに str.split(//e) が妥当だ(e は str の文字コード) 1文字ずつぶった切って配列にしてるんだなと読み下してもくれるし
644 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:10:21 ] s.scan(/./) s.split(//) 同じ長さだったか。
645 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/07/09(月) 06:58:16 ] マルチ乙
647 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 08:18:09 ] そんな事よりカレーの話しようぜ
648 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 14:54:25 ] 宿題スレ行け→マルチ乙 これはひどい
649 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:07:04 ] 回答してはいけないという空気?
650 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:25:33 ] いや、いいんじゃない? マルチと誤解されないためには、前スレに移動する由を書いとけばいい
651 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:39:33 ] それこそ「宿題スレのほうがいい」というアドバイスを受けたからこっち来たんだろ 移動した旨は移動時に既にあっちに書いてあるし、イジられる以上の非難を受ける謂れは無いと思われ
652 名前:デフォルトの名無しさん mailto:sage [2007/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