1 名前:RUBY [05/01/24 22:17:37 ] 私は、ある大学の1年生です。今、情報処理の講義でRUBYを習っています。 その講義で、期末テストとして課題が出たのですが、プログラミング初心者の私には 全然歯が立ちません。締め切りは1/31です。プロも皆さんには簡単な 問題かもしれませんがどうか教えてください。 課題は以下の通りです。
508 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 17:54:46 ] >>507 pythonではできるって言ってんだから pythonとrubyのcursesの実装の違いでしょ。 そこでcursesのマニュアル出すのはどうかと。
509 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 18:06:09 ] >>508 証拠は質問者の証言だけか?
510 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 23:02:45 ] つーか宿題としては性質が悪すぎだな 端末文字の色変えろって気楽に言った時点でイヤな予感はしたんだが
511 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 21:31:43 ] >>507 んぅ・・・ raw/norawあたりがあやしいかなと思って挿入してみても変化なし. 何かヒントいただけませんか? >>510 すいません.色は問題の本質ではないです. 色を変える代わりに,1ならA,2ならBを表示するだけかまいません.
512 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 23:44:29 ] >>511 そこ変えてもダメなの? Ctrl-Cの扱いを変えられるのはraw、cbreakぐらい。 pythonでもrubyでもcursesモジュールは単にCのAPIをラップしてるだけで変わりはない。 強制的にrawになってる(?)ならgetchした先でCtrl-Cのコードのときexitすりゃいいけど なんでそんなことになってるのかなあ。
513 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 17:36:05 ] >>512 ちょっと言葉足らずだったので補足させて下さい. 例えば,以下のようなソースだと noraw モードになってるので getch で Ctrl-C しても何も起きませんが, getch より前に raw を挿入すると Ctrl-C で終了できました. しかし,getch を getstr に置き換えると raw/noraw/cbreak/nocbreak のどれを挿入しても変化なしでした. require "curses" begin Curses::init_screen Curses::stdscr.addstr("% ") Curses::stdscr.refresh() s = Curses::stdscr.getch() Curses::stdscr.addstr("\n>>> %s \n" % s) Curses::stdscr.refresh() rescue Curses::close_screen end
514 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 17:37:08 ] >>512 >>513 なので,getstr の代わりに,以下のように, raw モードで getch のループを回す mygetstr を使うと Ctrl-C で終了するようにできました. しかし,Ctrl-H とかその他もろもろの処理を 全部書くのはなんか無駄なことしてるようで… def mygetstr() Curses::raw() Curses::noecho() s = "" while true do c = Curses::stdscr.getch() if c == 3 then exit 3 elsif c == 10 then break else Curses::stdscr.addch(c) s += [c].pack("c") end end Curses::noraw() Curses::echo() return s end
515 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 19:24:03 ] cbreak使えば余計なことしなくていいみたいだ。 cbreakモードは割り込み、フロー制御するが、rawモードはスルーして文字を返すそうな。
516 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 19:57:02 ] >>515 それだとCtrl-Cもとられて本末転倒だろ
517 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 10:27:09 ] 端末制御ってめんどくさいな
518 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:20:46 ] あきらめてpython使えってことだな
519 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:16:53 ] 宿題なのに?
520 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 00:53:49 ] 最近rubyでプログラミング始めたんですが公式のチュートリアルに>451と 同じ問題があって躓いてます。454見る前にできたプログラム書いてみます。 見て参考になる部分もありましたが3回「連続」で'BYE'を繰り返さないと 抜けられないようにする応用がわかりません。 talk = '' puts 'おばばに何か用かえ?' while talk != 'BYE' talk = gets.chomp if talk == talk.upcase puts 'いやー、' + 19.to_s + (30+(rand(30))).to_s + '年以来ないねー!' else puts 'もっと大きな声で話しておくれ、坊や!' end end
521 名前:520 mailto:sage [2007/03/09(金) 01:06:17 ] 今実行して確かめたら基礎もできてなかった。うーん・・・ これだとBYE実行でもifに行っちゃいますね。
522 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 10:31:33 ] puts 'おばばに何か用かえ?' count = 0 while count < 3 talk = gets.chomp if talk == talk.upcase puts "いやー、#{1930+rand(20)}年以来ないねー!" # puts 'いやー、' + (1930+rand(20)).to_s + '年以来ないねー!' と同じ else puts 'もっと大きな声で話しておくれ、坊や!' end if talk == 'BYE' count += 1 else count = 0 end end
523 名前:520 mailto:sage [2007/03/09(金) 21:07:16 ] >522 ありがとうございます!countメソッドははじめて見ました。 これまでのチュートリアルにでてないので使わないやり方もあるんですかね? 年号のやつもごちゃごちゃしてましたね。コメントどうもです。 さらに自分でBYE実行時の台詞変えたりしてみようと思います。
524 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:23:38 ] いや、ここでのcountはただのローカル変数だよ
525 名前:520 mailto:sage [2007/03/09(金) 22:50:52 ] ああ、そうですね。お恥ずかしいです。 それにしてもチュートリアルの問題やたら難しくないですか? こんなもんなんでしょうか。 もう少し簡単な問題やヒントがのってるかと思ってチュートリアル書いた人の 本も買ってみたんですがネットにのってるのとほとんど同じ内容でした。
526 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:47:18 ] こんなもんです。
527 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:26:10 ] やたら難しいかどうかはともかく、小難しいのには同意する 初めてのPerl並に平易な問題から段階踏んで攻めるのがいいと思うんだが
528 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:35:43 ] >>514-519 間が空いてしましましたが, この件 ruby を 1.8.5_p2 から 1.8.6_pre3 にアップデートすると getstr の入力待ちで Ctrl-C したら終了するようになりました. Gentoo だとまだ stable じゃなかったこともあって バージョンのことをまったく気にしてなかったんですが 何が変わったんでしょ? ともかくご助言して頂いた方々ありがとうございました.
529 名前:デフォルトの名無しさん [2007/04/16(月) 10:53:59 ] value = ARGV[0] ? ARGV[0] : 100 ARGV[0]が定義されていない場合、デフォルト値100を代入。 ARGV[0]が2個が単調だ。 もっといい書き方はないだろうか?
530 名前:デフォルトの名無しさん [2007/04/16(月) 11:23:17 ] >>529 value = ARGV[0] || 100
531 名前:デフォルトの名無しさん [2007/04/16(月) 22:51:44 ] >>530 ああ!そうだった・・・ || 忘れてたよ・・・
532 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 03:46:47 ] 今月のカレンダを表示する関数を教えてくれ。 calコマンドは呼んじゃ駄目。 つーかprint_this_month関数ぐらい欲しい。
533 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 12:02:25 ] > print_this_month関数 irb> print Time.now.month # => 4 irb> require 'date' irb> puts Date.parse('2006-11-13').month # => 11 irb> require 'parsedate' irb> p ParseDate.parsedate('Sat Aug 28 21:45:09 1999') # => [1999, 8, 28, 21, 45, 9, nil, 6] こんなんじゃ不足? ちなみにcalコマンドのようにカレンダーのデータを作り整形して表示するクラスは今のところない …というかそれ要るか? そのカレンダーは既にアプリケーションだと思うんだが…
534 名前:デフォルトの名無しさん [2007/04/24(火) 13:15:03 ] だから宿題なんだろ?
535 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 14:09:01 ] どのくらいの出来のカレンダーを求められてるかによって難易度は大幅に変わるな
536 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 17:24:25 ] そもそも出力形式はなんなのよ。 cal と同じでいいの?
537 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 22:16:37 ] require 'date.rb' days=['日','月','火','水','木','金','土'] # カレンダーの上の曜日 width=3 # 数字を含めた幅 endday=6 # 週の終わりの曜日(日曜:0、月曜:1、…、土曜:6) t=Date.today day_1st=Date.new(t.year,t.month,1) # 今月の第1日 day_last=Date.new(t.year,t.month,-1) # 今月の最終日 puts "#{t.month}月 #{t.year}".center(width*7) # cal風に中心に月と年 days.each{|w| print w.ljust(width)} # 曜日を表示 puts print ' '*day_1st.wday*width # 1日までを空白で埋める day_1st.upto(day_last) do |d| print d.day.to_s.ljust(width) print "\n" if d.wday == endday # 週の終わりなら改行 end puts -------------- ここまでならできた 変数変えただけで月曜始まりにも対応するようにしようと思ったが面倒なのでパス
538 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 08:01:15 ] …これもあんま宿題として提出はできそうにないな
539 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 09:41:37 ] #!/usr/bin/ruby require 'date' class RubyCalendar def calendar(y, m) ostr = sprintf("%04d / %s\n", y, Date::MONTHNAMES[m]); dt = Date.new(y, m, 1) wd = dt.wday (0..6).each {|dc| ostr += sprintf("%4s", Date::ABBR_DAYNAMES[dc]); } (0..34).each {|dc| d = dc - wd + 1 y2, m2, d2 = y, m, d if(dc < wd || !Date::valid_date?(y, m, d)) dt2 = dt + d - 1 y2, m2, d2 = dt2.year, dt2.month, dt2.day ds = d2.to_s else ds = d2; end ostr += (dc % 7 == 0 ? "\n" : '') + sprintf("%4s", ds); } return ostr end end rc = RubyCalendar.new print rc.calendar(2007, 5)
540 名前:腹減った mailto:sage [2007/04/25(水) 13:02:37 ] #!/usr/bin/ruby require 'date' ### 改行制限で書ききれなかったのできちんと cal.rb MM YYYY の形式で指定すること(無指定は今月) class Calender def initialize(args) (args.empty?) ? (t = Date.today) : (t = Date.new(args[1].to_i, args[0].to_i, 1)) case ENV['LANG'] #+ENV['LANGUAGE'] when /ja/i (@monthnames,@abbr_daynames)=[nil,'1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'], ['日','\ 月','火','水','木','金','土'] else (@monthnames,@abbr_daynames)=Date::MONTHNAMES, Date::ABBR_DAYNAMES.map{|day| day.chop!} end (@d_one,@d_last) = Date.new(t.year,t.month,1), Date.new(t.year,t.month,-1) @width=1 end attr_writer :width, :monthnames, :abbr_daynames def to_a a=Array.new; (@d_one-@d_one.wday).upto(@d_last+6-@d_last.wday){|d| a.push(d)}; return a end def to_s spacer=' '*@width cal = "#{@monthnames[@d_one.month]} #{@d_one.year}".center(3*7) << "\n" cal << @abbr_daynames.inject(''){|days,name| days << name.rjust(2) << spacer} << "\n" to_a.each do |d| (cal << ' ' << spacer; next) unless d.month == @d_one.month cal << d.day.to_s.rjust(2) << spacer << "\n"*(d.wday / 6) end return cal << "\n" end end Calender.new(ARGV).display
541 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 13:31:13 ] あ、しまった、to_a の構想を作ってる途中で変えたの忘れてた この配列を配列として取り出すメリット何もないな Calender.new(4,2007).to_a で2007年4月の1日から末日までの Dateオブジェクトの配列が返ってきたら便利だなと思ったんだけど っていうか、どんな授業で出たカレンダーの宿題なのか早く言ってくれないと 提出に絶対適さないプログラム構造のカレンダーをめいめい趣味で作っちゃうよこのスレ
542 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 13:39:24 ] cal 4 2007 だけじゃなく cal 2007 にも対応汁
543 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 15:24:31 ] #!/usr/bin/ruby require 'date' class Date def to_a a=Array.new; Date.new(self.year,self.month,1).upto(Date.new(self.year,self.month,-1)){|d| a.push(d)}; return a end def calender arr = self.to_a cal = "#{MONTHNAMES[self.month]} #{self.year}".center(4*7) << "\n" cal << ABBR_DAYNAMES.inject(''){|days,name| days << name.rjust(3) << ' '} << "\n" cal << ' '*arr[0].wday arr.each do |d| cal << d.day.to_s.rjust(3) << ' ' cal << "\n" if d.wday == 6 end return cal end end if ARGV.size == 0 then d=Date.today else d=Date.new(ARGV[1].to_i,ARGV[0].to_i,1) end puts d.calender ------------- Dateのメソッドにすると楽しそうなのでくっつけてみた(書き方はこんなんでいいの?) to_aがきちんとselfの月の配列になるよ calenderはDateのプリティな表示ということでcalコマンド互換性を廃して独自に
544 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 16:48:03 ] お題に沿ってめいめい趣味で作って楽しむスレじゃないの? 他人のソース見るのって勉強に成るし、いろんな解釈から面白いものが出てくれば良いと思う。
545 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 16:57:24 ] ### >>542 動くこた動くがもうわけわからんので煮詰めるのギブアップ ### Date#calenderのwideはtrueだと>>543 のように表示、falseだとcalコマンドのように表示 #!/usr/bin/ruby require 'date' class Date def to_a a=Array.new; Date.new(self.year,self.month,1).upto(Date.new(self.year,self.month,-1)){|d| a.push(d)}; return a end def calender(wide=true) wide ? width=3 : width=2 arr = self.to_a cal = "#{MONTHNAMES[self.month]} #{self.year if wide}".center((width+1)*7) << "\n" cal << ABBR_DAYNAMES.inject(''){|days,name| days << (wide ? name.rjust(width) : name.chop.rjust(width)) << ' '} << "\n" cal << ' '*(width+1)*arr[0].wday arr.each do |d| cal << d.day.to_s.rjust(width) << ' ' cal << "\n" if d.wday == 6 end return cal end ### 続く
546 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 16:58:51 ] ### 続き def calender_yearly cals=Array.new (1..12).each do |month| d=Date.new(self.year,month,1) cals.push(d.calender(false).to_a) end calender = "#{self.year.to_s.center(63)}\n\n" (0..3).each do |i| calender << seasonal(cals[i*3],cals[i*3+1],cals[i*3+2]) end return calender end def seasonal(m1,m2,m3) str = " #{m1[0].chomp}#{m2[0].chomp}#{m3[0]}" (1..7).each do |i| str << "#{putline(m1[i])}#{putline(m2[i])}#{putline(m3[i])}\n" end return str end def putline(week) return "#{week.nil? ? ' '*22 : week.chomp.ljust(22)}" end end if ARGV.size == 0 then d=Date.today else d=Date.new(ARGV[1].to_i,ARGV[0].to_i,1) end puts d.calender_yearly
547 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 17:14:29 ] >>544 ソースが勉強になるかどうかって話になると書く人減りそうだ スレは改行制限があるからヘンな書き方になるし 三項演算子なんて今年初めて使ったぞ えー解説、calender_yearlyでは12か月分のカレンダー作って配列calsに入れてます (コンセプト段階では意味があったんだが今考えると意図不明) seasonal では 1月1行目+2月1行目+3月1行目\n 1月2行目+2月2行目+3月2行目\n 1月3行目+2月3行目+3月3行目\n 要はこんなことしてます 22文字で固定するためにputlineを作ったんだと思います なんかもうちょっと繰り返しとかのとこを全体的にどうにかすると 思いっきり綺麗に書けそうですが思いつかないので放置します次の方どうぞ
548 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 18:39:50 ] >(コンセプト段階では意味があったんだが今考えると意図不明 このセリフどっかで聞いたことあるなぁ Matzが良く使うよなぁ
549 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 18:54:46 ] >>548 その台詞、仕事で使わせてもらう ( ・`ω・´)ノ
550 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 19:09:23 ] #!/usr/bin/ruby require 'date' # >>545-546 のを改悪 require 'enumerator' class Date def to_a (Date.new(self.year,self.month,1)..Date.new(self.year,self.month,-1)).to_a end def calender(wide = true) width = wide ? 3 : 2 cal = "#{MONTHNAMES[self.month]} #{self.year if wide}".center((width+1)*7) << "\n" cal << ABBR_DAYNAMES.map{|n| n[0..width-1]}.join(' ') << "\n" cal << ' ' * (width+1) * Date.new(self.year, self.month, 1).wday self.to_a.each do |d| cal << d.day.to_s.rjust(width) << ' ' << (d.wday == 6 ? "\n" : "") end; cal end def calender_yearly cals = (1..12).map do |month| a = Date.new(self.year, month, 1).calender(false).split(/\n/) a[7] ||= ''; a end ret = "#{self.year.to_s.center(63)}\n\n" cals.each_slice(3) do |a| ret << a.transpose.map{|b|b.map{|c|c.ljust(22)}.to_s}.join("\n") << "\n" end; ret end end case ARGV.size when 0; puts Date.today.calender when 1; puts Date.new(ARGV[0].to_i, 1, 1).calender_yearly when 2; puts Date.new(ARGV[1].to_i, ARGV[0].to_i, 1).calender end
551 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 19:37:37 ] >>550 きゃー短い …やっぱこれ行列か やっぱこれ行列だよな… 行列操作でMatrixしか思いつかなくてA4の紙にでっかい図書いて茹で上がって諦めたよ Rangeオブジェクトは昇順の数字限定のいけ好かない奴だと思ってたのでこれからはなにやら便利に使うよ enumeratorはなんて読むかもわかんないくらいなのでこれからがんばってべんきょうするよ case文は書き慣れた感じがしてやらしいよ
552 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 20:07:10 ] あらら2009年のを表示させると死ぬな。 a[6] ||= ''; a[7] ||= ''; a にすりゃいいけど、ここ汚くて嫌い。
553 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 21:00:02 ] どうやったらこういうの書けるようになるの?
554 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 19:17:28 ] >>553 どうやって日本語覚えた?
555 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 03:33:05 ] 555
556 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 11:27:17 ] 日本語書けるからといって小説が書けるようになるわけでもなく
557 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 12:09:35 ] でも小説を書くために日本語の勉強って大事。 つ 国語
558 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 16:56:17 ] お題カモン
559 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 06:52:06 ] きょうは八十八夜ですが任意の年月日を入力してそれが年初から何日目かを求めるプログラムを作りなさい ただしDateは使わないこと
560 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 09:31:02 ] def dates(y,m,d) ((Time.local(y,m,d) - Time.local(y)) / (3600*24) + 1).to_i end どうでもいいけど八十八夜ってのは年初からの日数じゃないぞ。 dates(2007,5,2) # => 122
561 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 09:39:58 ] 旧暦の年初だろ そんなことも知らないのか
562 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 11:24:20 ] つーか「5」月な時点で30*4=120日くらいは最低過ぎてるんじゃないかと思えて欲しい
563 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 11:32:54 ] ここで旧暦ライブラリの出番
564 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 12:00:56 ] 122 - 88 = 34 = 2/3 = 節分 うまく出来てるな
565 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 20:44:10 ] >561 旧正月でもないぞ。 立春から数えて八十八日目。節分もまぁ似たようなものだが。
566 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 21:28:28 ] ついでに 二百十日 = 9/1 も確認してみました dates(2007,9,1) # => 244
567 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 21:43:41 ] 立春の予測の厳密な計算ってスタンドアロンではできないんじゃなかったっけ できたとしても、なんていうかRubyの練習にはならないと思う
568 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 23:07:14 ] >>567 >できたとしても、なんていうかRubyの練習にはならないと思う 適当なサイトにアクセスして日付を取ってくるとかはどうだ?
569 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 02:07:21 ] まあお代考えた香具師が馬鹿だったということで、次のお代ドーゾ。
570 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:34:35 ] マウスの位置はどうしたら分かりますか?
571 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:45:20 ] 基本的にはそんなもんわからん 何かウィンドウシステムのようなもん使ってるならそれ併記しろ あとなにかRuby/Tkとかのアプリケーション上での話ならそれもきちんと書け
572 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:06:16 ] FreeBSDでコンソールしか使ってないのですが なんか文字と同じサイズで四角いマウスカーソル らしきものが出て来て動くんです
573 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:09:27 ] それ宿題じゃないだろ
574 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:11:53 ] っていうか>>570 の続きが>>572 なんじゃないよな…
575 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:24:01 ] ttp://freebsd4-jman.kandk.co.jp/8/moused.8.html ttp://freebsd4-jman.kandk.co.jp/1/vidcontrol.1.html
576 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 22:20:22 ] >>570 机の横に落ちてるだろ。ちゃんと探せよ。
577 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 11:55:34 ] マウスパッドの上にありました
578 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 16:32:25 ] 1から100までの数をプリントするプログラムを書け。 ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
579 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 16:39:04 ] ※ただし55byte以内でなければならない と付け加えないとつまらんな
580 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 17:17:03 ] Rubyで書いたら怒られると思う
581 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 20:58:45 ] これか? www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
582 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 22:10:41 ] やべえ、 おれ再帰つかったことねぇや
583 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 00:35:12 ] 使えるということと使わなければならないということは全く別物 必要なければ使わなくていい 使えないのは問題
584 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 01:06:50 ] 再帰は使わない人は一生自前で使わないからなあ きちんと概念学んで理解すると時々使うようになると思う
585 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:14:09 ] 「累乗のプログラムを作るときに出てきた累乗専用の何か」以上の理解がない俺に 誰か再帰の便利なとこ教えてくれ
586 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:18:41 ] Haskellとか使うと嫌でも分かるよ。 というか再帰こそ自然で直観的なものだと思えるようになる。
587 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:28:01 ] 今から再帰で目覚めるためだけにlisp始めれ、というよりは若干やさしいか? そうでもないか
588 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:59:41 ] 教科書の再帰関数は見かけ無駄な動作しかしないからな フツーの言語で説明されても「こんなんループで書いたほうが早いってはい終了」と思って 即忘れてしまうのは無理もないと思う
589 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 05:48:31 ] ヒルベルトとか
590 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 08:59:39 ] クイックソートとかマージソートは再帰で書くと思うが。
591 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:03:17 ] >>588 Rubyスクリプトだとfact(n)を書くのに (1..n).each do |i| 以下略 とか 1.upto(n) do |i| 以下略 とか そういう便利な繰り返しが真っ先に出てきちゃうからな いや、Rubyに限ったことじゃないけど
592 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 12:42:17 ] >>578 のそもそもは「面接官の前で紙に該当のコード書け」という問題だからなあ 2分もあれば書けるだろうとか言われてるし モニタの前でコーヒーとか飲みながらキーボードをパチパチやって答える問題ではない
593 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:11:19 ] 実務でクイックソートとかマージソート使う場面あるか? まずほとんどの場面で、 単純なソートで大丈夫だぜ
594 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:43:51 ] というか、普通はライブラリを使うだろ。
595 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:54:24 ] 「クイックソート自力で実装しました」とか言ったら普通はグーで殴られるよな ソートの実装はそれこそ勉強用だ 絶対に自力で経験しないといけないが、絶対に実地で使ってはイカン(趣味でもな)
596 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:31:45 ] Rubyみたいな言語での再帰の日常利用はある日天啓のごとくひらめくもんだと思う ただし、たいがいはコードが美しくなるだけであって動作速度は普通に書くよりも遅い ただでさえワンテンポ遅いRubyが再帰でさらに遅くなるのでトレードオフの見極めに注意 込み入ったプログラムでは使うと便利なこともあるけれど、初心者には無理かも
597 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:26:26 ] 再帰的処理は練習しないと肝心の「再帰処理で考えれば万事うまくいく」とこで再帰の使用をひらめかないから、 自作の速度クリティカルじゃないスクリプトでどんどん使って慣れておいたほうがいいぞ。
598 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:55:39 ] ラーメンタイマー作ってー ramen.rb 180 ってやると残り時間を秒単位でカウントしていって 時間過ぎたら今度は経過時間を表示していくようなやつ
600 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/05/12(土) 16:25:52 ] >>598 更新履歴兼雑記 - FizzBuzz アゲイン 15:51 d.hatena.ne.jp/shinichiro_h/20070509#1178693484 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 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:01:06 ] 改行の出力
605 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:26:13 ] >>603 「3の倍数の場合」「5の倍数の場合」「3の倍数でもあり、5の倍数でもある場合」 のみっつのケースを特別視しないといけないから、素直にコードに落とすと そうなるんじゃないか?
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