[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 04/20 05:16 / Filesize : 173 KB / Number-of Response : 653
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

RUBYの宿題教えてください。



1 名前:RUBY [05/01/24 22:17:37 ]
私は、ある大学の1年生です。今、情報処理の講義でRUBYを習っています。
その講義で、期末テストとして課題が出たのですが、プログラミング初心者の私には
全然歯が立ちません。締め切りは1/31です。プロも皆さんには簡単な
問題かもしれませんがどうか教えてください。
課題は以下の通りです。


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
その台詞、仕事で使わせてもらう ( ・`ω・´)ノ



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







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<173KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef