1 名前:RUBY [05/01/24 22:17:37 ] 私は、ある大学の1年生です。今、情報処理の講義でRUBYを習っています。 その講義で、期末テストとして課題が出たのですが、プログラミング初心者の私には 全然歯が立ちません。締め切りは1/31です。プロも皆さんには簡単な 問題かもしれませんがどうか教えてください。 課題は以下の通りです。
449 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 20:59:26 ] >>448 a, b = b, a Cでもいまどきそんなの使うやついねーよ
450 名前:デフォルトの名無しさん [2007/01/11(木) 22:47:27 ] >>449 多値使うのかー。 > Cでもいまどきそんなの使うやついねーよ そうなのかw
451 名前:デフォルトの名無しさん [2007/01/12(金) 14:47:00 ] 自分もできない課題があって困ってるんだが・・・。 りんご本からいくつか課題出されて、その中の テキスト65ページ 「耳の遠いおばあちゃん」に取り組みなさい。 耳の遠いおばあちゃんのプログラムを書いてみましょう。 おばあちゃんに何を言っても(何をタイプしても)、叫ばない限り(つまり、すべて大文字でタイプしない限り)、 は?! もっと大きな声で話しておくれ、坊や! と返事をします。もし叫んだときは、彼女はあなたの言葉を聞いて(少なくとも聞いた気がして)、 いやー、1938年以来ないねー! と大声で返事します。 プログラムに真実味を持たせるため、1930から1950のランダムな数字で毎回違う年を叫ぶようにしましょう。 あなたは、BYEと叫ぶまでおばあちゃんとの会話から逃れられません。 う年を叫ぶようにしましょう。 あなたは、BYEと叫ぶまでおばあちゃんとの会話から逃れられません。 とかいうの。
452 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 20:30:26 ] >>451 ぐぐれば解答例あるよ。
453 名前:デフォルトの名無しさん [2007/01/12(金) 22:54:56 ] 初心者の過去スレ人多すぎで見れない… どこをググれば??
454 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 11:11:22 ] Google以外どこをぐぐるんですか? loop do str = STDIN.gets if str.upcase == str if 'BYE' == str break else # そうかい。1953年以来ないね〜。 end else # はぁあああああ!!!?なんだってぇえぇぇぇぇぇぇーーーーー!!!! end end 動かしてないけど大体こんな感じでしょう。 ちゃんと手を動かしながら本読んでれば出来るハズなんだけどなぁ
455 名前:デフォルトの名無しさん [2007/01/14(日) 00:45:45 ] ぐぐっても解答例が探せなかったorz そのプログラムも動いてくれなかったです。 乱数のとこで引っかかったりwhileで引っかかったりで前に進みません。
456 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:35:46 ] 454は答えそのものじゃなくて基本的なアプローチ部分のコード例だよ。残りを埋めなきゃ答えにはならん。 それすら見てもわからんのか……。 ところでmixiで質問してるのと同じ人?
457 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 02:23:57 ] >>455 何がどうダメなのか説明しないと誰もアドバイスできませんよ。 プログラムを動かそうとしたらエラーが出るなら、 そのエラーメッセージとソースコードをコピペする。 「エスパー募集中ですか?」って言われちゃいますよ?
458 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 03:11:56 ] つーか自分で作って詰まれ どうせ他人の見ても何がどうなってるのかわからんのだろ 確かにこのスレは宿題丸投げも可だが、あまり身勝手におイタしてると 「完全に動作するがコードが面妖で提出不可」なプログラムだけ回答に出されて放置されたりするぞ
459 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 03:27:05 ] 「ここまでは書けたけどあとはさっぱりです」とか素直に見せられたほうが答返ってくるよな。
460 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 09:55:57 ] そして誰かが3行程度で作ってしまう。
461 名前:デフォルトの名無しさん [2007/01/14(日) 11:25:50 ] CodeGolf形式で聞けば答えてくれるぞ
462 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 22:24:50 ] 俺なら70byteで解く
463 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 14:23:44 ] 人工無能を作るスレがあるからそっちで聞け
464 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 22:27:13 ] 関係ない他のスレに迷惑かけちゃいかんよ
465 名前:939 [2007/01/19(金) 23:12:14 ] ヒープを配列で実装しろという問題とヒープソートの作り方を教えてください
466 名前:デフォルトの名無しさん mailto:sage [2007/01/20(土) 04:09:57 ] www.geocities.jp/ky_webid/algorithm/022.html
467 名前:デフォルトの名無しさん [2007/01/24(水) 16:36:01 ] 0点の紙が1枚、1点の紙が2枚、4点の紙が1枚入っている箱がある。 この箱から1枚引いて箱に戻すのを6回繰り返したとき、合計点数のとりうる値を求めるプログラムを書け。 この問題の解法を教えてください。よろしくお願いします。
468 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 19:05:18 ] >>467 算数の問題が解けないのか、解けるけどRubyに書き直せないのかどっちだ? # 前者のような気はするけど。
469 名前:デフォルトの名無しさん [2007/01/24(水) 20:53:01 ] >>468 後者です。 場合わけなどを効率よくプログラミングにおとすにはどうしたよいかわかりません。
470 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:42:44 ] なるほど。アルゴリズムは考え付いたわけね。 じゃ、日本語で良いのでそのアルゴリズムを書いてみて。 それをコード化してあげる。
471 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:00:26 ] >>467 少年よ、再帰を抱け! def sum(n,s,k) ls = [0,1,4] if n == 0 then print k,"\t","sum=",s,"\n" else for i in 0..2 sum(n-1,s+ls[i],k+[i]) end end end sum(6,0,[])
472 名前:デフォルトの名無しさん [2007/01/24(水) 22:00:33 ] >>470 計算問題として解くなら手計算でゴリ押しできるのですがうまいアルゴリズムが思いつかなくて。 とりあえず0,1,4からなる6個の数字をすべての場合を網羅するように作成して現れる合計値をすべて記録すれば答えはでるんですが、それだと面倒なので質問しました。
473 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:07:57 ] トリッキーなコード ↓
474 名前:デフォルトの名無しさん [2007/01/24(水) 22:12:02 ] >>471 ありがとうございます。 こんなに短くできるんですね。
475 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:19:38 ] >>473 動的計画法を使う典型問題だね。 b = [0] 6.times{b=[0,1,4].inject(b){|c,y|c + b.map{|x|x+y}}.sort.uniq} puts b
476 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:24:06 ] inject([])の間違いだた。まぁ今回はたまたまうまく動くけど。
477 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:33:39 ] おりゃ puts (0...6).inject([0]){|b,_|[0,1,4].map{|y|b.map{|x|x+y}}.flatten.sort.uniq}
478 名前:デフォルトの名無しさん [2007/01/24(水) 23:08:30 ] ありがとうございます。この問題の回答としては>>475->>477 さんのほうが良いですね。
479 名前:デフォルトの名無しさん [2007/01/28(日) 11:47:43 ] codegolf的に、配列を圧縮する方法ってないでしょうか。 a = [123, 567, 23, 456, 34, 12] を 文字列か何かであらわせないかと。 base64でも使うのかな?
480 名前:デフォルトの名無しさん [2007/01/28(日) 12:16:22 ] d=[777,666,555,444,333,222,111,0,123,456,789,12,45,67,89,10] require 'base64' require 'zlib' p d p pk = d.pack("S*") p z = Zlib::Deflate.deflate(pk) p b64 = Base64.encode64(z) p unb64 = Base64.decode64(b64) p Zlib::Inflate.inflate(unb64) p ud = unb64.unpack("S*") puts "d==ud = "+ (d==ud).to_s puts "b64.length=" + b64.length.to_s やってみたのですが、 元に戻らない・・・
481 名前:デフォルトの名無しさん [2007/01/28(日) 12:29:24 ] ミスってた、 d=[777,666,555,444,333,222,111,0,123,456,789,12,45,67,89,10] require 'base64' require 'zlib' p d p pk = d.pack("S*") p z = Zlib::Deflate.deflate(pk) p b64 = Base64.encode64(z) p unb64 = Base64.decode64(b64) p unz = Zlib::Inflate.inflate(unb64) p ud = unz.unpack("S*") puts "d==ud = "+ (d==ud).to_s puts b64.length.to_s + " -> " + ud.length.to_s
482 名前:デフォルトの名無しさん [2007/01/28(日) 12:30:00 ] >>481 でいけますね。解決です。
483 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 21:35:53 ] 本スレのほうから誘導されましたので、こちらで質問させていただきます。 pc10.2ch.net/test/read.cgi/tech/1164885714/548-557 (したいこと) Arrayの要素の組合せを全て作った Arrayを返す。 (サンプル) 仮に combinations というメソッド名として [].combinations => [] [1].combinations => [[[1]]] [1,2].combinations => [ [[1],[2]], # 1個ずつの組み合わせ [[1,2]], # 2個ずつの組み合わせ ] [1,2,3].combinations => [ [[1],[2],[3]], # 1個ずつの組み合わせ [[1,2],[3]], # 2個ずつの組み合わせ [[1],[2,3]], # 2個ずつの組み合わせ [[1,2,3]], # 3個ずつの組み合わせ ] [1,2,3,4].combinations => [ [[1],[2],[3],[4]], # 1個ずつの組み合わせ [[1,2],[3],[4]], # 2個ずつの組み合わせ [[1],[2,3],[4]], # 2個ずつの組み合わせ [[1],[2],[3,4]], # 2個ずつの組み合わせ [[1,2],[3,4]], # 2個ずつの組み合わせ [[1,2,3],[4]], # 3個ずつの組み合わせ [[1],[2,3,4]], # 3個ずつの組み合わせ [[1,2,3,4]], # 4個ずつの組み合わせ ] 実装は、メソッドの再帰を行うんだろうとはなんとなく分かるんですが、それ以上は進まず。
484 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 22:31:59 ] ttp://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/42665?42609-42821
485 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:30:44 ] >>181 class Array def srt case size when 0,1 self else f,*t = self t.select{|v| v <= f}.srt + [f] + t.select{|v| v > f}.srt end end end nums = (0..9).map{rand(100)} p nums p nums.srt
486 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:30:46 ] 10個の任意の数字を昇順(小さい数から大きい数)に並び替えるプログラムを作成しなさい 注意事項及びヒント: sortメソッドは使用しないこと 配列を使用した方が並び替え易いと思います
487 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:38:08 ] >>486 OK、sortメソッドは使わないぜ。 a=[1,4,3,5,3,10,3,5,3,5] $><<a.sort_by{|x|x}.join(" ")
488 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:21:52 ] >>487 >>486 が初心者スレで返された答えとかぶってるw
489 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:52:49 ] >>486 適当にクイックソートを書いてみた def qsort(array) return array unless array.size > 1 left = [] right = [] mid_idx = array.size / 2 mid = array[mid_idx] array.delete_at(mid_idx) until array.empty? n = array.shift if n < mid left.push(n) else right.push(n) end end qsort(left).push(mid).concat(qsort(right)) end で、書いておいてなんだが いくら初心者だろーが力任せ、単純なソート法なら自力で思いつくだろ
490 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:15:48 ] 俺も適当にクイックソート書いてみた。 def qsort(array) return array unless array.size > 1 mid = array.delete_at array.size/2 array = array.partition{|x|x<mid} qsort(array[0]).push(mid).concat(qsort(array[1])) end 飽きたから超適当。もういいや、こんなんで
491 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:36:50 ] >489-490 おまえらさあ、こういうのをそのままコピペして提出するアホがいたらどうすんだよ。 これを受け取ってどう評価するか悩む教師の身にもなってみてくれ、まじで。
492 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 00:03:32 ] 教授、乙
493 名前:486 [2007/02/06(火) 01:32:00 ] レスどうも、コピペしてませんからご安心を。確認しただけです。 全く違うソートになりましたが。
494 名前:デフォルトの名無しさん [2007/02/14(水) 16:21:00 ] 端末に現在時刻を 1 秒おきに表示しスクロールするプログラム. 実行中にキーボードの 1 が押されるとそれ以降は文字色を赤で, また,2 が押されるとそれ以降は文字色を青で表示する. 0 が押されると数字を入力するようプロンプトを表示し, 時刻の表示間隔を入力された数字の秒数に変更する. Ctrl+C で終了する. お願いします.
495 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 19:12:53 ] じゃあ半分だけ。 loop do puts Time.now sleep 1 end
496 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:28:32 ] それで半分は言いすぎw
497 名前:デフォルトの名無しさん [2007/02/15(木) 03:17:40 ] どうでもいいけど、宿題で聞くヤツって何でこう、突っ放しなんだろうな。 お前本当に、答えてほしのかとww もっとこう、答えたくて答えたくてたまらないように、仕向けないといけないと思うんだけど。 ・・・まあ、だから、2ch聞いてるんだろうけど。 ちなみん、おれが、2ch聞いたのはほとんど答えてもらってる。
498 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 04:41:13 ] このスレももう500になるのか とりあえずフォーマットくらいは用意すべきだろうね
499 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 10:09:25 ] >>494 >>495 ありがとうございます. 核の部分はそうなると思いますが, そこは問題を説明するために設定した部分で, 本当に聞きたいのはユーザとの対話部分なんです. 引き続きお願いします. 自分なりには curses を使って書いてみたんですが, getstr がどうもうまく動かないので, こちらで質問してみました.
500 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 16:39:31 ] >>499 試行中なんだが、getstrだとエンターまでを入力として期待するのでよくないはず。 getchを使おう。 今のリファレンスには書いてないがncursesの現行のAPIはほとんどwrapされてるようす。 あとは拡張ライブラリのソース見れって感じだ。 正直言って宿題としてはあんまりよくないな。 ncursesそのまま使うのはめんどう。 まあ、むしろCursesに皮を被せる設計の勉強なのかもしれんが。
501 名前:デフォルトの名無しさん [2007/02/20(火) 17:54:13 ] >>500 とのことなので,getstr 相当のものを getch で書いてみたのですが, どっちにしても getch で入力待ち状態のときに Ctrl-C が効きませんでした. ruby のソースを開いてみると ext/curses にサンプルがあったので, ruby mouse.rb をしてみたのですが, これでもクリック待ちのときに Ctrl-C で終了できませんでした. これが,ruby の curses の仕様なんでしょうか? Ctrl-C を押したらいつでも終了するのがマナー だと思っていたのですが…
502 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:01:01 ] >501 ちなみに、環境何?
503 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:11:33 ] >>502 ruby 1.8.5/screen 4.00/zsh 4.3.2/ck 2.0.26 で coLinux 0.7.1 上の Gentoo と Cygwin とを使っています.
504 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:05:15 ] >>501 > これでもクリック待ちのときに Ctrl-C で終了できませんでした. > これが,ruby の curses の仕様なんでしょうか? rubyのつーか、cursesってそういうもんじゃなかったっけ?
505 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 11:11:41 ] >>501 手元のopenSUSE 10.2では止まるけど、Ctrl-Cで停止しなければならない仕様なの? C-Cされてもどこぞでシグナルがトラップされてたら止まらない。 コンソールからインタラクティブに操作するアプリは操作が中断されるだけで止まらないのも多い。 ところでgetchで入力待ちになったら1秒おきに表示が更新されない気がするんだけど?
506 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 11:53:25 ] >>504 pythonでは入力待ち状態でCtrl-Cしたら 終了するのですがどうなんでしょう? >>505 環境依存するのは何の違いがきいてるのでしょう? 設定で解消できるものなのか,OS依存でどうしようもないのか? 可能ならばCtrl-Cで終了するようにしたいです. cursesがtrapを仕込んでいるとして,それを解除, あるいは,更にtrapしてCtrl-Cを検出することは 無理でしょうか? >>ところで… はい.ですから timeout などを使って getch をくるまないといけないと思います. 更新間隔を入力するときは表示の更新が止まってもよいものとします.
507 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 14:12:48 ] >>506 Cursesのマニュアルをじっくり読みなよ。 ttp://www.kis-lab.com/serikashiki/man/ncurses.html ttp://www.faqs.org/docs/Linux-HOWTO/NCURSES-Programming-HOWTO.html
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 その台詞、仕事で使わせてもらう ( ・`ω・´)ノ