1 :
RUBY :
05/01/24 22:17:37 私は、ある大学の1年生です。今、情報処理の講義でRUBYを習っています。 その講義で、期末テストとして課題が出たのですが、プログラミング初心者の私には 全然歯が立ちません。締め切りは1/31です。プロも皆さんには簡単な 問題かもしれませんがどうか教えてください。 課題は以下の通りです。
2 :
RUBY :05/01/24 22:18:29
年月を与えたとき、下のようなカレンダーを出力するプログラムを作る。 西暦1年1月1日は月曜日である。4年に一度閏年がある。しかし、100の倍数の年は閏年ではない。しかし、400の倍数の年は閏年である。 平年の1月1日が火曜日であったとすると次年の1月1日は水曜日である。 従って、日、月、・・・、土を、0、1、・・・、6と数字で表すと、西暦n年の1月1日の曜日kは、 n+(n-1)/4-(n-1)/100+(n-1)/400 を7で割った余りである。k=n % 7又2月の日数mは、 m=28+n/4*4/n-n/100*100/n+n/400*400/n と表せる。ここで割り算は全て整数同士の割り算(切り捨て)である。 1.2月以外の日数を与える。 2.作成したいカレンダーの年(n)と月(m)を与える。 3.2月の日数を計算する。 28+n/4*4/n-n/100*100/n+n/400*400/n 4.1月1日の曜日を表す数字(0、1、・・・、6)を計算する。 (n+(n-1)/4-(n-1)/100+(n-1)/400) % 7 5.今対象としている月の第1日目の曜日を、上で求めた1月1日の曜日を表す数値に、 今対象とする月の前の月までの日数を加算し、7で割った余りとして求める。 6.下のようなカレンダーをHTMLの表で出力する。 1989年 4月 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
3 :
RUBY :05/01/24 22:19:48
<私のやってみたこと> まず、それぞれの月を番号とし、日数を要素として配列を考えてみましたが 全然解けません。講師は、「配列なんかわざわざ使わなくてもいい」 と言っていたので、解く糸口も失ってしまいました。 どうか、解答のプログラムを教えてください。
4 :
デフォルトの名無しさん :05/01/24 22:44:38
>>1 > その講義で、期末テストとして課題が出たのですが、プログラミング初心者の私には
> 全然歯が立ちません。締め切りは1/31です。プロも皆さんには簡単な
うそつけ。歯が立たないのは、おまえの頭が弱いからだろうが。
5 :
デフォルトの名無しさん :05/01/24 22:45:33
Rubyのマニュアルはあるか? ないなら探せ。 講師は>2の文章が理解できるか君を試しているんだ。10時間考えても分からないなら「グレゴリオ歴」を調べよ。
6 :
デフォルトの名無しさん :05/01/24 22:49:19
>5 わかりました。自分でやってみます。ありがとうございました
7 :
RUBY :05/01/25 00:16:51
インターネットの掲示板に初めて書き込んだのですが、掲示板って、やっぱりこわいところですね。 罵声や無視がたくさんあるところだと思っていました。さっそく>>4のデフォルトの名無しさんに怒られてしまいました。 でも、名無しさんが言うように自分の力でやった方がためになりますよね。 図書やマニュアルを使って自分で考えてみたいと思います。>>5の助言もありがとうございました。 プログラミング分野の人たちは優しいですね。
Rubyが宿題になる学校も出てきたのか
9 :
デフォルトの名無しさん :05/01/25 00:21:43
>>8 > Rubyが宿題になる学校も出てきたのか
宿題には、アカデミズムの世界以外ではまったく見ない言語を使ったりしますが。
>>1 と言うか、期末テストなら自分で考えた方が後々にも役立って良いよ、1/31までは十分長いからね。
Rubyはアカデミズムの世界以外ではまったく見ない言語な訳でつね。
13 :
デフォルトの名無しさん :05/01/25 00:35:12
>>11 > Rubyはアカデミズムの世界以外ではまったく見ない言語な訳でつね。
違うだろ。
15 :
デフォルトの名無しさん :05/01/25 00:39:54
>>12 > HSPを教える学校があるこんな世の中じゃ
教えるだけまし。
わたしが学生の時には、
「次回からC言語を使うので、来週までにマスターしておいてください」
だった。
>>8 うちの大学では1〜2年前期はCで2年後期にRubyだな
日数配列を用意しないで書く方法がわかんないあ・・・
ifやcase使えって事かもw
配列なんてなにに使うんだ?
>18 だから>2を読めって。分からないなら質問しろ。丸投げはダメだ。こんなアホな宿題を他人にやらせてたら、ダメ人間になっちゃうゾ!
>>21 と言うか、
>>2 を与えられてもまだダメだというのは、よほど無能だと
言うことだから、こいつにはプログラミングはさっさとあきらめて、
コンピュータ関係の業界に来ないで欲しいと言いたいな。
p 18.id != 1.id#=>true です; とりあえず配列使って書けたけど >19さんの言う通りifとかcaseを使うのかな・・・(;´Д`)ウーン
Σ(´Д`;)ガーン・・・叩かれてる;
25 :
デフォルトの名無しさん :05/01/25 20:29:39
class Ichi attr_reader(:nisuuu) def initialize @nisuuu = Hash.new @nisuuu[1] = 31 @nisuuu[3] = 31 @nisuuu[5] = 31 @nisuuu[7] = 31 @nisuuu[8] = 31 @nisuuu[10] = 31 @nisuuu[12] = 31 @nisuuu[4]= 30 @nisuuu[6]= 30 @nisuuu[9]= 30 @nisuuu[11]= 30 end end class Ni attr_reader(:n, :m) def initialize print "年と月を入力しろ\n" print "年>>>" @n = gets.chomp.to_i print "月>>>" @m = gets.chomp.to_i end end
26 :
デフォルトの名無しさん :05/01/25 20:31:35
class San attr_reader(:ni) def initialize(n) @ni = 28 + (n / 4 * 4 / n) - (n / 100 * 100 / n) + (n / 400 * 400 / n) end end class Yon attr_reader(:ichiyoubi) def initialize(n) @ichiyoubi = (n + (n - 1) / 4 - (n - 1) / 100 + (n - 1) / 400) % 7 end end class Go attr_reader(:myoubi) def initialize(ichi, ichiyoubi, nigatsu, m) @myoubi = ichiyoubi for i in 1..(m-1) nisu = 0 if i == 2 nisu = nigatsu else nisu = ichi.nisuuu[i] end @myoubi += nisu end @myoubi %= 7 end end
配列使うな。 Rubyマニュアルで文法読め! >19の助言を読め! 大馬鹿者!
>27 Rubyマニュアルって何ですか?
29 :
デフォルトの名無しさん :05/01/25 21:56:55
def qsort(s, first, last) if first < last then pivot = s[last] i = first j = last - 1 while true do while i < last && s[i] < pivot do i += 1 end while j >= first && s[i] >pivot do j -= 1 end if i >= j then break end つづきます。
30 :
デフォルトの名無しさん :05/01/25 21:57:26
temp = s[i] s[i] = s[j] s[j] = temp i += 1 j -= 1 end temp = s[i] s[i] = s[last] s[last] = temp qsort(s, first, i-1) qsort(s, i+1, last) end end def quick_sort(s) qsort(s, 0, s.size-1) return s end s = [4,5,8,7,10,8,9,3,12,0] p quick_sort(s) クイックソートのソースなんですけど、何故か上手くならんでくれません…。
31 :
デフォルトの名無しさん :05/01/25 22:12:44
めちゃくちゃ!!
days = case month when 1,3,5,7,8,10,12 31 when 4,6,9,11 30 when 2 28 end
34 :
デフォルトの名無しさん :05/01/26 06:42:54
ついにRubyにも宿題スレかw
35 :
デフォルトの名無しさん :05/01/26 13:30:25
みんな、暖かく見守ってあげようよ
36 :
デフォルトの名無しさん :05/01/26 13:36:04
やりたくもない宿題を出されて困っている人がいるのだから、 詳しい人が変わりにやってあげるのが当然だと思います。 人間らしい思いやりの心を見せましょう。
>>29-30 誤 while j >= first && s[i] >pivot do
正 while j >= first && s[j] >pivot do
よく見んと判らんなw
38 :
sage :05/01/27 00:58:54
29です。 あああ、ありがとうございます!!! 動きましたーー!!たすかりました〜〜ホロリ
39 :
デフォルトの名無しさん :05/01/27 01:00:12
あ!あがってしまったw
ダメ人間決定
sage放置
42 :
デフォルトの名無しさん :05/01/28 19:11:54
あ!あがってしまったw
43 :
デフォルトの名無しさん :05/01/29 02:40:38
Rubyの授業の課題として出されたのですが、学生中にRubyを使うことはおそ らくないので勉強していなかったのでまったくわかりません。誰か助けてい ただけませんか? ・web上の適当な英文をもちいて、大文字、小文字を無視して、各アル ファベッドについて、次に来る文字の頻度をカウントする。単語の終 わりでは次に来る文字は、空白、カンマピリオドなどである。数字も 含め、これらはアルファベッド以外の記号は、まとめてカウントする。 結果をHTMLの表として出力する。縦に最初の文字、横に次の文字とし て分布を見る。 という問題ですが誰かお願いします!
44 :
デフォルトの名無しさん :05/01/29 02:43:59
わたしはもう寝ますが、明日までなので、朝までにやっておいてください。 コピペしてすぐ提出できるように、ちゃんと書いておいてください。
45 :
デフォルトの名無しさん :05/01/29 02:51:57
>わたしはもう寝ますが、明日までなので、朝までにやっておいてください。 コピペしてすぐ提出できるように、ちゃんと書いておいてください。 上の文は誰か他の人が書いたものなので。 ぜひお願いします!
「アルファベッド」
47 :
デフォルトの名無しさん :05/01/29 03:07:57
>>43 「アルファベット」でした。すいません。
>>43 タグはどうすんの? web上の英文て対象はHTMLを含むんだよね。
<p>baka</p>
なんてHTMLが送られてきたら、pは2回、bakaは1回てカウントするの?
それともpは無視?
あ、ごめん、文字ね。
>>43 作ってみたよー
require 'open-uri'
TARGET_URI = '
http://www.gnu.org/ '
class CharCounter
NON_WORD_CHAR = 'OTHER'
def initialize
@buf = Hash.new{|h, k| h[k] = Hash.new(0)}
@before_char = NON_WORD_CHAR
end # def
def push(s)
s.gsub(/[\r\n]+/, '').split(//).each do |c|
c.downcase!
c = NON_WORD_CHAR if c !~ /[a-zA-Z]/
@buf[@before_char][c] += 1
@before_char = c
end
end # def
def sorted_each
@buf.keys.sort.each do |k|
yield k, @buf[k]
end
end # def
end # class
# 続く
# 続き ALPHABETS = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z) ALPHABETS.push(CharCounter::NON_WORD_CHAR) def print_html(counter, uri) puts "<html><head><title>#{uri}</title></head><body><table border=1><tr><td> </td>" ALPHABETS.each do |c| puts "<th>#{c}</th>" end puts '</tr>' counter.sorted_each do |prechar, freq| puts "<tr><th>#{prechar}</th>" ALPHABETS.each do |c| puts "<td>#{freq[c]}</td>" end puts "</tr>" end puts "</table></body></html>" end # def def main(uri) counter = CharCounter.new open(uri) do |f| f.each_line {|line| counter.push(line) } end print_html(counter, uri) end # def main(TARGET_URI)
52 :
デフォルトの名無しさん :05/01/29 04:41:19
こんなに長いプログラムを本当にありがとうございました。あと一つ質問が あるんですけれども、このプログラムで作ったHTMLの表はどこで見られるの ですか?
>>52 標準出力に出してる。だからなんかファイルにリダイレクトしてwebブラウザで開け。
例えば、vaka.rbとかいうファイルにスクリプトを書いてコマンドラインから、
ruby vaka.rb > baka.html
とかやればbaka.htmlができるからそれをブラウザで開くといい。
あ、あとRubyは1.8系が前提っすから、その辺よろしく。
54 :
デフォルトの名無しさん :05/01/29 05:13:42
確認できました!夜遅くまでいろいろとすいませんでした。これで何とか単 位ももらえそうです。本当にありがとうございました!!
お前北大だろ
これで済むと思うよな。
57 :
デフォルトの名無しさん :05/01/29 12:55:09
58 :
RUBY :05/01/31 23:19:34
こんばんは、RUBYです。 今日、期末課題を提出しました。あれから、図書などを調べてプログラミングしてみました。 プログラムを完成させることはできなかったので、あまり良い成績はとれそうもありませんが、 一応、形にはなっていると思うので、それなりの評価はあるでしょう。 今日まで、掲示板を見ることができませんでしたが、課題の解答を沢山の人が作ってくれて 本当にありがとうございました。 今回の課題を作成しているうちにプログラミングに興味を持ったので、 休み中に何かに挑戦してみたいと思っているのですが、どんな言語から始めたらよいか、 どんな言語が将来役に立つか、プログラミング初心者が初めに読んだ方がよい図書は何か などアドバイスがあったら教えてください。
最低
>>58 Rubyでいいじゃん
そんなにRuby使うの嫌か?
ま、Schemeでもやっとけ。
お前のやったことはカンニングだぞ 白血病で氏ね
>>58 > 一応、形にはなっていると思うので、それなりの評価はあるでしょう。
なんで? カンニングは評価くれんでしょ。
>>64 向こうで解こうとしてた者なんだが、これCじゃなかったの?
いや質問者が同一人物とは限らんのだが…
>>66 ふむ。あと1ヶ月ほどあるのね。しかも乱入も可か。
乱入してみるかなw
68 :
RUBY :05/02/04 03:22:20
>>62 は?見てねーつってんだろ?あ?
パソコンばっかり見てるヒッキー&ブサイク男ちゃん
ドライアイで氏ね
>>71 ユーザビリティ的にはC#(+IDE)かJava(+Eclipse)かPythonかRubyでFAだろう。
入門用と考えると以下は満たして欲しい。
1.参考書
2.ライブラリが豊富
3.IDE(特にコンパイラなら必須)
4.GC
Cは悪くないけど、もはやGCが無い言語は入門用としては遺物ではなかろうか。
ゴージャスなIDE付きでタダで使える実装は無いし。
Basicは発展性がなさ過ぎるというかVBA弄ってて泣きそうになったのでやめとけ。
参考書さえあるならAirみたいなオブジェクト指向でない手続き型のスクリプト言語が
習得がもっとも容易であると思われる。しかしそのような言語はあまり聞かない。
>2.ライブラリが豊富 Rubyは失格だな。なにやるにしてもネットのどこかから拾ってくればできなくもないって奴ばっかだし。
入門用ならIDE無い方が良いと思うよ
>>76 HSPもいいのかも知れないなあ、と一瞬思ったけどgotoを使うのが基本の言語はダメだろ。
関数定義はないし構造体も無いのは無理。
関数定義はあるんじゃなかったっけ
目的しかないやっつけHSPと目的のないオナニー言語Ruby
Rubyに目的が無いんだったらJavaにもCにも無いと思われ
もなさんRubyをどのような目的で使ってますかー?
CGIスクリプトとテキスト処理 あとはApolloを使ってGUIアプリケーションとか
84 :
デフォルトの名無しさん :05/02/09 21:37:05
無知蒙昧な2ちゃんねらにRubyのよさを知らしめるために日夜勉強しています。
>>84 Rubyを使うことが目的なのか?あふぉか?
86 :
デフォルトの名無しさん :05/02/22 21:23:13
[1]授業単元:Ruby [2]問題文:オセロを作れ [3]環境 [3.1]OS: [3.2]コンパイラ: [3.3]言語:Ruby [4]期限:23日昼 [5]その他の制限:CPU対戦は不要
87 :
デフォルトの名無しさん :05/03/02 12:45:21
age
[1] byte code化 [2] M17N [3] native thread対応
89 :
デフォルトの名無しさん :2005/07/17(日) 16:31:23
問題文自動生成システムを作りたいんだけど。。 熟語辞書の中から熟語をランダムに選択して、その語彙を含む問題文をコーパスから拾ってきて生成するシステム。 ちょっと手がつかないです(*_*)
大学の講座にRubyがあるのですか。
幸せな大学だなぁ。うちはPrologだったぞ。
Rubyももう十年ですから、大学講座に取り上げられて不思議は ありませんね。
(1) test/ruby/test_lambda.rbのsyntax errorを直せ。 (20点)
まだなんかヘンな気がするな…
95 :
デフォルトの名無しさん :2005/09/18(日) 19:13:13
age
96 :
デフォルトの名無しさん :2005/10/12(水) 00:31:12
学籍番号 名前 点数 の順に書かれているファイルを読み込んで、平均点と学籍番号順に並べ替えて表示するプログラムを作れといわれました。
data = File.read(ファイル名).split(/\n/) puts data.inject(0){|a,b| a+b.split[2].to_i} puts data.sort_by{|a|a.split[0].to_i}
98 :
デフォルトの名無しさん :2005/10/19(水) 09:08:52
これだと平均じゃなくて合計じゃないですか?
そうか。なら2行目は、 puts data.inject(0){|a,b| a+b.split[2].to_i} / data.length.to_f といったところか。
E・∇・ヨノシ <100ゲット♫
101 :
デフォルトの名無しさん :2005/10/22(土) 21:44:51
クラスNumericに引数なしのメソッドinteger?を再定義して 例えばp 5.0.integer?ならtrue、p 5.01.integer? はfalse と整数を判別して出力するのを作れといわれました。 ほんの数行で出来るらしいのですがよろしくお願いします。
Integer と Float で定義すりゃいいんじゃない?
こんな感じ?"ほんの数行"かどうかは分かりませんが。 "判別する"というのを条件文で実装する必要はないんですよね? > class Integer > def integer? > return true > end > end > > class Float > def integer? > return false > end > end
>102-103 それって 5.0.integer? が false になるし。 class Numeric; def my_int?; self.ceil == self; end; end てところだろう。本質的には一行。 ちなみに Ruby にもとからある integer? は、 Numeric が常に偽を返し、 Integer でオーバーロードして常に真を返すようにしている。つまり103と同 じようなものになっている。
誰か簡単な宿題を出してくれよ
106 :
デフォルトの名無しさん :2005/11/21(月) 21:15:42
こんばんは、今日Rubyを学んでいる授業で課題を出されたのですが 完成しなくて困っています。 自分はプログラムではRubyが始めて学ぶ言語であり、 プログラミングに関しては全くの初心者です。 ↓の詰まっているところに答えて頂けるとありがたいです。 魔方陣をHTMLの表形式で出力 各行、各列の和もその表の中に納める←ここが出来ません… 原文が長いので先に結果 21 39 8 33 2 27 45 175 30 6 24 49 18 36 12 175 46 15 40 9 34 3 28 175 13 31 7 25 43 19 37 175 22 47 16 41 10 35 4 175 38 14 32 1 26 44 20 175 5 23 48 17 42 11 29 175 175 175 175 175 175 175 175 Completed(0) そして… f.print "<table border=1>\n"とf.print "</table>"の間で四苦八苦です。 175の和の列を表に納めたいのですが、やり方が分かりません・・・。 教えていただければ幸いですm(_ _)m
107 :
原文 :2005/11/21(月) 21:16:55
n=7 a=Array.new for i in 1..n a[i]=Array.new end for m in 0..n-1 for k in 0..n-1 i=(k+m)*2+(n+1)/2+2 j=k-m+(3*n+1)/2 a[(i-1)%n+1][(j-1)%n+1]=n*m+k+1 end end f=open('g:\kadai.html',"w")
108 :
原文続き :2005/11/21(月) 21:17:48
f.print "<table border=1>\n" for i in 1..n f.print "<tr>\n" x=0 for j in 1..n printf "%4d",a[i][j] f.print "<td>",a[i][j],"</td>\n" x+=a[i][j] end printf "%4d\n",x end for j in 1..n x=0 for i in 1..n x+=a[i][j] end printf "%4d",x f.print "</tr>\n" end print "\n" f.print "</table>" f.close
# 足し算の結果もresultに入ってるなら以下のようにやるのが楽かなー puts '<table>' result.each{|row| puts '<tr>' row.each{|cell| puts "<td>#{cell}</td>" } puts '</tr>' } puts '</table>'
#
>>107-108 のを活かすならこんな感じ。
# 動作確認はしてないので悪しからず御了承を。
File.open("result.html"){|f|
f.puts '<table border="1">'
a.each{|row|
f.puts '<tr>'
sum = 0
row.each{|cell|
sum += cell
f.puts "<td>#{cell}</td>"
}
f.puts "<td>#{sum}</td>"
f.puts "</tr>"
}
f.puts "</table>"
}
# 変数名はとりあえず意味のわかるように単語で付けた方がいいよ。
# アルファベット一文字の変数名はかなり読みにくいので。
111 :
106 :2005/11/22(火) 00:42:43
>>109-110 ご親切にありがとうございましたm(_ _)m
とっても参考になりました。
最初、手続きオブジェクトというものを知らなかったために
書いてあることが分かりませんでしたが、授業の教科書の先読んで
理解出来たように思います。
変数名を単語でというのは、
お二方のrowやcellと書いてある部分の事ですよね?
伝える時はそう書くのですね。
勉強になりました(^^;A
112 :
デフォルトの名無しさん :2005/11/28(月) 22:02:26
>>106 と同じ…(略)
自分もrubyが良く分かっていなくて参考書を買って1からやり直している途中です。
ですが課題の締め切りに間に合わなそうなのでどなたかお願いしますm(__)m
下のプログラムでa-zすべてのアルファベットの頻度を調べなければならないのですが、
for c in "a" .. "z" do
end
を最初、最後に入れ、bをcに変えても正しくされないのですがどこがおかしいのでしょうか。
t = File.read( "test.txt" )
u = t.split(//) # tを文字に分解
w = t.split # tを単語に分解
# 文全体にに文字B又はbが含まれる頻度
countc = 0
for x in u do
countc += 1 if x =~ /b/i
end
# 単語の先頭に文字B又はbが含まれる頻度
countw = 0
for x in w do
countw += 1 if x[0,1] =~ /b/i
end
何はともあれおまえの言っていることがそもそもわけわからん。なにをどう試したんだ。
アフォには聞いてませんから
115 :
デフォルトの名無しさん :2005/11/28(月) 23:14:55
>>112 です。
t = File.read( "test.txt" )
u = t.split(//) # tを文字に分解
w = t.split # tを単語に分解
for c in "a" .."z" do
# 文全体にに文字B又はbが含まれる頻度
countc = 0
for x in u do
countc += 1 if x =~ /b/i
end
# 単語の先頭に文字B又はbが含まれる頻度
countw = 0
for x in w do
countw += 1 if x[0,1] =~ /b/i
end
# 出力する
printf "B又はbが本文に含まれる頻度は%4d回、単語の先頭に含まれる頻度は、%4d回でした。\n" ,c.upcase, countc , countw
end
…としたんですがエラーが出てしまいます。。
116 :
113 :2005/11/28(月) 23:25:24
んじゃ説明すると、 全てのアルファベットの頻度を調べなければならないのだから、結果を保持す るのに52個の配列を用意する必要がある。ふつうは26要素の配列かハッシュを 2つ使うだろう(112の例で、文字用と単語用の2つの変数を用いたように)。 マッチするのに必要な正規表現は、112ではベタ書きしているが、これもa-zの それぞれで書換えなければならないだろう。 当然、a-zで「カウントアップする変数」と「マッチさせるための正規表現」 をそれぞれ切り替えるように適切に繰り返しをしなければならないだろう。 このどれもやっていないようだから「何をやってるかわからん」と思ったんだが、まあいいや。
117 :
113 :2005/11/28(月) 23:31:51
おっと入れ違った。 115はそもそも、 for c in "a" .. "z" do に対応する end がないので実行で きない。 115の方針を貫く場合、結果を保持する変数は2つで良いままの可能性が高い。 しかし相変わらず b の数しか数えてないのだから、このままでは結果が正し く表示されない。正規表現をそれぞれで(cに依存するかたちで)書き換える必 要がある。 それから結果の出力では「Bまたはb」がべた書きだから printf がヘン。%表 記の箇所と引数の数が一致してないよ。 ……というところかな。
答えてやりたいが今から大学だ
119 :
504 :2005/11/29(火) 21:37:25
printfが良く分かっていないのですが、 t = File.read( "test.txt" ) u = t.split(//) # tを文字に分解 w = t.split # tを単語に分解 for c in "a" .."z" do # 文全体 countc = 0 for x in u do countc += 1 if x =~ /c/i end # 単語の先頭 countw = 0 for x in w do countw += 1 if x[0,1] =~ /c/i end # 出力する printf "%4d又は%4dが本文に含まれる頻度は%4d回、単語の先頭に含まれる頻度は、%4d回でした。\n" , c , c.upcase, countc , countw end でもおかしいですよね(^_^;)
cとかc.upcaseは文字列なんだから%sを使え まぁしかし Ruby では埋め込み式を使う方が一般的な気はするけど
121 :
504 :2005/11/29(火) 22:59:05
エラー出ませんでした! しかし全部0回でした(笑) 勉強しなおしてきますm(__)m
あーだからさ、/c/i が「cという一文字に(大文字小文字は気にせず)一致する」 正規表現なわけだよな? /b/i なら「bという〜」。そこのところはいいか。 今の君のコードは26回、毎回「c」だけカウントしているわけだ。それじゃ意味がない。 1回目は「a」、2回目は「b」、3回目は「c」……26回目は「z」になるように、しないといけない。 どうやってそれを実現するかはさすがに自分で考えてくれい。やり方はいろい ろあるけど、何が授業内容に則した方法なのかまではオレは知らん。
プログラミングの入り口でループで躓いて諦めるひとを何人も見てきた
124 :
504 :2005/11/30(水) 22:10:36
cは変数で、その変数cに"a"から"z"までを代入してることにはならないんですか?orz
だってたとえば112の元々のコードだったら /b/i は「bという変数の中身」じゃ なくて「bという文字にマッチする正規表現」じゃん。その判断をどうやって するわけ? たとえばだ、「bという変数が存在したらその中身、存在しなかったらbという その文字」と動くとしようか。すると、ちょっと変更するだけでプログラムの 挙動がえらい変わって大変なことになるし、たとえばbという変数が存在する ときに「bという文字にマッチする正規表現」をどう書いたらいいかわからな いじゃん。 そういう不都合があるから、ただそのまま変数名を書いてもそれを変数名とは 認識しないわけ。 で、正規表現に変数の値を埋め込むにはそれなりの書き方をしないといけない。 もしくは正規表現をやめるかだな。 教科書か何かを読み直してよく考えろ。 たとえば for x in u の x はどういうデータで何を調べればいい?とかな。
同時に並列動作を望むなら ベクトルコンピュータ使ひ給へ
127 :
504 :2005/12/01(木) 01:28:05
正規表現を使わない方法で出来ましたm(__)m ホントすみませんでした(^^;)
北大の課題ばかりのスレだなぁ
129 :
デフォルトの名無しさん :2005/12/19(月) 16:44:49
誰かこのプログラムに注釈付けていただけませんか。何が起きてるか全くわかんないです。 def boyer_moore_search(text, pattern) printf("text.length = %d, pattern.length = %d\n", \ text.length, pattern.length) skip = Array.new for k in 0 ... 256 do skip[k] = pattern.length end for k in 0 ... pattern.length do skip[pattern[k]] = pattern.length - k - 1 end #続く
130 :
129 :2005/12/19(月) 16:45:19
i = pattern.length - 1 while i < text.length do j = pattern.length - 1 while text[i] == pattern[j] do printf("a: i = %d, j = %d\n", i, j) if j == 0 then return i else i = i - 1 j = j - 1 end end if skip[text[i]] > pattern.length - j then i = i + skip[text[i]] printf("b: i = %d, j = %d\n", i, j) else i = i + pattern.length - j printf("c: i = %d, j = %d\n", i, j) end end return -1 end printf("Match position = %d\n", \ boyer_moore_search("irohanihoheto","ohe"))
>boyer_moore_search この名前から何か連想できないならアルゴリズムの教科書でも一から読み直した方が・・・
132 :
デフォルトの名無しさん :2005/12/20(火) 11:37:17
つーヵこのスレって存在自体おかしくね? RUBYで宿題?ナニソレ。 >私は、ある大学の1年生です。今、情報処理の講義でRUBYを習っています。 こんな学校ほんとに存在するのか? いきなりRUBY教えるって、その講師は真性のアホじゃないのか?
はいはいわろすわろす
Rubyだと何でアホなの? 自分はFORTRANだったけど。
>>128 に本当っぽいことが書いてある…と言ってみるw
北大ってどんなところなの?
北のほうにある
139 :
デフォルトの名無しさん :2006/01/10(火) 21:50:54
お願いします 問題 次の足し算を満足する0〜9の相異なる数 A,E,G,L,M,N,O,P,R (但し、A,L,Oはゼロではない) の組を求めよ(答えは三通り) APPLE +) LEMON ---------- ORANGE 1.O=1 2.N=0 3.L=2から8 また、G=L+1で桁上がりはない 4.P=2,3,4,6,7,8 でM=10-P PもMもL,Gに等しくない 5.Eは2から9でL,G,P,Mに等しくない 6.P+E+1が10以上のとき A=P+E+1-10 A+L+1 が10未満ではダメ R=A+1-10 P+E+1が10未満のとき A=P+E+1 A+Lが10未満ではダメ R=A+L-10 7.AはO,N,L,G,P,M,Eに等しくない 8.RはO,N,L,G,P,M,E,Aに等しくない
アミノ酸配列と円周率が楽だからそんなのやめなさい
>>139 できた。結局、なにがわからんの?
楽して書きたいとかなら、地道にひとつずつ条件を書いていくしかないと思われ。
o = 1
n = 0
a_t = 1..9
e_t = 0..9
g_t = 0..9
l_t = 1..9
m_t = 0..9
p_t = 0..9
r_t = 0..9
def different_all?(key, array)
return array.all?{|v| v != key}
end
count = 0 a_t.each{|a| e_t.each{|e| next unless different_all?(e, [a, o, n]) g_t.each{|g| next unless different_all?(g, [e, a, o, n]) l_t.each{|l| next unless different_all?(l, [g, e, a, o, n]) next if l + 1 > 10 next unless g == l + 1 p_t.each{|p| next unless different_all?(p, [l, g, e, a, o, n]) m_t.each{|m| next unless different_all?(m, [p, l, g, e, a, o, n]) next unless m == 10 - p r_t.each{|r| next unless different_all?(r, [m, p, l, g, e, a, o, n]) apple = 10000 * a + 1000 * p + 100 * p + 10 * l + e lemon = 10000 * l + 1000 * e + 100 * m + 10 * o + n orange = 100000 * o + 10000 * r + 1000 * a + 100 * n + 10 * g + e
if orange == ( apple + lemon ) count += 1 puts 'A = ' + a.to_s puts 'E = ' + e.to_s puts 'G = ' + g.to_s puts 'L = ' + l.to_s puts 'M = ' + m.to_s puts 'N = ' + n.to_s puts 'O = ' + o.to_s puts 'P = ' + p.to_s puts 'R = ' + r.to_s puts '-----' end } } } } } } } puts count
いんでんとなんかはてきとうに直してくれ。
ありがとうございます 何がわからないというか、何もかもわからなくて
146 :
デフォルトの名無しさん :2006/01/12(木) 12:22:33
階乗を求めるプログラムを教えてください
>>146 死ねマルチ
result = 1;(1..5).each{|i| result *= i}; p result
自然数 N が与えられたとき、 1 から N までの数字を N 個並べる組み合わせをすべて 列挙するプログラムは Ruby で書くとどうなりますか? 例えば N = 3 のとき 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 となるようにです。 よろしくおながいします。
>>148 何がわからないのかちゃんと説明できたら教えてやる。
一応、プログラムは出来た。
N=4の出力 4! = 24 なので合ってるはず。
[1, 4, 3, 2][3, 4, 1, 2][2, 1, 3, 4][1, 4, 2, 3]
[1, 3, 4, 2][3, 2, 4, 1][4, 2, 3, 1][2, 4, 3, 1]
[2, 3, 1, 4][4, 1, 2, 3][3, 2, 1, 4][1, 3, 2, 4]
[1, 2, 3, 4][4, 2, 1, 3][1, 2, 4, 3][3, 1, 4, 2]
[4, 3, 2, 1][2, 4, 1, 3][2, 3, 4, 1][3, 4, 2, 1]
[4, 1, 3, 2][4, 3, 1, 2][2, 1, 4, 3][3, 1, 2, 4]
例えば、 1: methodA() 2: methodB() 3: methodC() の3行からなるprogram.rbがあって、methodB()の処理が5秒たっても終わらなかったら、 methodB()の処理をタイムアウトして(飛ばして)、次行methodC()への処理へと いくという風にするにはどうしたらよいでしょうか? timeout()を使っても、program.rb全体が終了してしまいうまくいきません。 あくまでmethodB()だけをタイムアウトして、program.rbの処理自体は続行させたいのです。
timeout が TimeoutError を送出するんだから rescue で受ければいいんじゃないの?
宿題です。危機です。 ruby/tkで迷路を作成して脱出するプログラムを どなたか作ってくださいorz
ここは「教えてください」というスレッドであって「代行してください」というスレッドではないと思うのだが。
勘違いしてましたorz 多分このスレを立てた人と同じ大学です、自分も締め切りが迫っててピンチです。 迷路を作成して、脱出するプログラムを作りたいのですが、 @座標(1,1)(左上隅)に最初の通路空け、 A上下左右で、2マス進んだところがまだ通路になっていない場所 (複数ある場合はランダムに選択) B穴掘り可能な方向がなかったら、そこまでの道を2マスだけ逆戻り。 逆戻りできない場合完成。 という感じにするのは分るのですが、ruby/tkでどうやってそれを表現したら良いのかが わからないのですが。。
テキストベースで組んでみてから、Ruby/Tkでやれば?
テキストベース?のは出来たんですが…orz
アルゴリズムを聞いてるのかな
ruby/tkでのやり方が知りたいです!
知りたいなら自分で勉強しような。 テキストべースのままでいいじゃん。
課題的に Ruby/tk が必須なら教科書に必要事項は絶対書いてあるからちゃんと読め。 必須じゃないなら自分である程度の勉強をしろ。 そういうことをしてもわからなかったら、必要な事項だけ質問するべし。漠然 と知りたいと言われても誰も答えられないよ。
スレタイに宿題って入ってたら丸投げだとオレも思ってた
問題についてもっと詳しい情報がなけりゃだれもやらんぞ。 連立方程式がわからないんですけどおしえてもらえませんか? っていってるのと同じ。
自分ではココまで頑張ったってとこを教えれ
XMAX = 80 YMAX = 24 MAXSITE = (XMAX * YMAX / 4) row = Array.new(YMAX+1).fill(0) map = Array.new (XMAX+1).times { map.push(row.dup) } ∬ for j in 2..(YMAX-2) for i in 2..(XMAX-2) if (map[i][j] == 1) putc(?@) else putc(?\s) end end putc(?\n) end exit 0 全部入らなかったので最初と最後うpしましたが…
165 :
デフォルトの名無しさん :2006/01/22(日) 22:58:42
age
で、tkについてはどこまで頑張ったのか?
きっと月曜提出だったんだよ、ということで時間切れ。 つかアルゴリズム?の宿題で画面表示必須って意味あるの?
>>166 def draw(cw,cs,xs,ys)
for i in 1.. xs
for j in 1..ys
if @a[i][j]&0b0001!=0
TkcLine.new(cw,cs*i-1,cs*j,cs*i+cs,cs*j, "tags"=>"tag")
end
if @a[i][j]&0b0010!=0 && i !=xs
TkcLine.new(cw,cs*(i+1)-1,cs*j,cs*(i+1)-1,cs*(j+1), "tags"=>"tag")
end
end
end
TkcLine.new(cw,cs,cs,cs*(xs+1),cs,cs*(xs+1),cs*ys,"width"=>2, "tags"=>"tag")
TkcLine.new(cw,cs,2*cs+1,cs,cs,cs*(ys+1),cs*(xs+1),cs*(ys+1),"width"=>2, "tags"=>"tag")
こんな感じです(^_^;)
きたねーコードだな。 で、何がわからないんだっけ?
>>154 です、、
とゆーかもう完全に意味がわかりませんorz
少なくとも意味がわかってから質問するように。
迷路の線は描けたのですが、道順(脱出経路)の線をひくことができません。。
足を踏みいれた格子の色を変えていく。 ただし、それぞれの格子で、どの辺から格子に入ったかを記録しておき、 その辺から再び出る(=戻る)なら格子の色を元にもどす。
174 :
デフォルトの名無しさん :2006/02/02(木) 20:25:18
a,bが互いな素であるときaxをbで割ったあまりが1になるようなxを1つ出力するプログラムを書きなさい。 という課題が出ました。 互いに素というのは作れるのですが、後半部分ができません。 だれか教えてください。お願いします。
そのできた部分まで見せてくれるとやりやすいかもしれない
互いに素がわかるならこれでどう? def axb(a,b) if tagainiso?(a,b) p = 1 x = 0 until a*x%b == 1 x = (p + 1)*b/a p += 1 end return x end return 0 end # テストコード def test_axb assert_equal(1, axb(3,2)) assert_equal(7, axb(13,10)) assert_equal(0, axb(2,4)) end
てかホントに初心者スレから移動したんだな
178 :
174 :2006/02/02(木) 21:41:41
a = gets.to_i
b = gets.to_i
def gcd(a,b)
if b == 0
return a
else
return gcd(b,a%b)
end
end
これでgcd(a,b) =1のときでif文作るところまでいきました。
ここから先がわかりません。
>>176 どこが何をしているのかがちょっとよくわかりません。
ホント素人ですいません。
>>178 算数は苦手ですか?
tagainiso?(a,b)はa,bが互いに素かどうか調べる。
自分でわかるって言ってたので、その説明は略。
until a*x%b == 1
x = (p + 1)*b/a
p += 1
end
は単なるループ。a*x%b == 1はわかるよね?
以下算数の話。
a*x%b = 1をpを整数として変形すると、
a*x/b = p + 1となるのでこれをxについて解く。
x = (p+1)*b/a となる。
pが整数なので、上記のループではpを1ずつ変化させて、条件に合うxを探してるだけ。
で、結局axb(a,b)で求めるxが返る。
これでどう?
if tagainiso?(a,b) # IF互いに素なら until a*x%b == 1 # a*x%bが1になるまで続ける p += 1 # p=p+1 これだけわかればトレースはできるだろうから、計算の意味は自分で考えてみよう
181 :
147 :2006/02/02(木) 22:13:03
できました!みなさんありがとうございました!!!!
(1...b).each do |x| break if a*x%b == 1 end return x の方が計算量少ないのでは。
b != 1 のチェックも必要だね。
で、それどこの宿題? 大学? 高校? 中学校? 小学校?
>>183 b=1の時点で互いに素の可能性が消えるので不要。
互いに素の定義って最大公約数が1じゃなかたっけ?
187 :
デフォルトの名無しさん :2006/02/06(月) 23:59:56
puts (Math.atan(1.0/5)*4 - Math.atan(1.0/239))*4 俺ならこんなの書いてきたら落第させるがな
>188 それだとputsの戻り値*4にならないか?
puts は 必ず nil を返すように作られてるんだがそれでもよろしいか
hoge (1+2) * 3 は hoge(1+2) * 3 と同じ動作をするべき? まあ、そうかもね。
どっちにしても、そういう仕様だからなぁ。
「カッコが省略されてる引数は最初の空白で区切れるようにしろ」というのは 主張としてはある程度真理だな 引数に空白を含めたい人が自力でカッコで括ってれと 「文末が出るまで全部引数にしまっちゃうよ」というのもそれはそれで便利だが
で、宿題としては要は自前でテーラー展開しろってことなんだろうな。 そろそろ気づいて自力でできた頃か?
おいおい、自力でテーラー展開してどうするんだ? ニュートン法でも発明しろってことか?w
ここ北大の人が質問してそう
ちょっとドキッとしたが卒業生だからもう関係ねーや 1年の情報処理ででもやってるのかな 俺のやったときはFortran77/90とCとDelphiの選択だったような気がする
また来年も質問が来るのかな
E・∇・ヨノシ <200ゲット♫
net/http使っていて、 HTTP/1.1 501 Method Not Implemented Date: Tue, 28 Mar 2006 08:09:41 GMT Server: Apache/2.0.54 (Debian GNU/Linux) mod_fastcgi/2.4.2 mod_ruby/1.2.4 Ruby/1.8.2(2005-04-11) mod_ssl/2.0.54 OpenSSL/0.9.7e Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Length: 206 Connection: close Content-Type: text/html; charset=iso-8859-1 なのが欲しいのはどうすればいい?
どうしたいの?
.headerじゃ、HTMLの<HEAD>と</HEAD>の間しか採れないと思う。 漏れが欲しいのはHTTPの中で鯖から送られて来る情報。
(⊃д`)
Response から each を使えばいいような気がするのだが。
こんなんでどう? % cat http_header_test1.rb #!/usr/bin/ruby require 'net/http' Net::HTTP.version_1_2 Net::HTTP.start('www.ruby-lang.org', 80) {|http| response = http.get('/ja/') printf("HTTP/%s %s %s\n", response.http_version, response.code, response.message) response.each{|x, y| printf("%s: %s\n", x.capitalize, y)} } % ./http_header_test1.rb HTTP/1.1 200 OK Cache-control: no-cache Last-modified: Sat, 24 Dec 2005 13:44:39 GMT Vary: User-Agent Content-type: text/html; charset=euc-jp Date: Tue, 28 Mar 2006 11:59:22 GMT Server: Apache/2.0.54 (Debian GNU/Linux) mod_fastcgi/2.4.2 mod_ruby/1.2.4 Ruby/1.8.2(2005-04-11) mod_ssl/2.0.54 OpenSSL/0.9.7e Content-length: 15762 Pragma: no-cache
ありがとうございました。
209 :
デフォルトの名無しさん :2006/04/07(金) 10:36:49
保守
質問者を堕落させ、回答者のレベルをアップさせるスレってここのことですか? 質問者はruby-man-ja-html-20051029ぐらい読んでいるんだよな? と、てきとうなことを言ってみた。
スレの性質上、学期末じゃないとあんまり釣れないと思うよ
学期末とかじゃなくても良いから 問題出してくれねーかなー。 面白そうなら、コード書くからさー。
213 :
デフォルトの名無しさん :2006/05/04(木) 22:38:17
じゃあ、問題出し合うスレにしちゃうか!
じゃ、お題。っ【ソリティア】
>>214 ソリティアを"作る"のか"解く"のかどっちだ?
216 :
214 :2006/05/06(土) 04:17:59
じゃとりあえず ソリティア「クロンダイク」を作る で。俺も作ってみるかなー。 【仕様案(あくまで俺用。参考にでも】 ・配置はランダム Winのフリーセルのような問題番号はなし。 ・CUIで入出力 CUIの方が環境依存少なめかなぁと。 ・サブコマンド 列名をアルファベットで現し 基本は3文字で[列名][枚数][列名]。 例: A3C (A列の3枚をC列へ移す) 山札をめくる時は半角スペース1個入れてエンター。 列名はプレイ時に一目で判るようにしておく。 って言うか文字順に置くかキー配置なぞって置くか2案で悩み中。
UNOがいいよ。 仕様例: CUIベース。 手札の表示は、赤の1ならR1、青の2ならB2、黄の3ならY3、緑の4ならG4って感じ。 赤のReverseならRR、青のSkipならBS、黄のDrowTwoならYD、 WildはW、WildDrowFourはWD ってところでいいかと。 ["R1", "B2", "Y3", "G4", "R", "BS", "YD"] って感じででも手札を表示。 use card?[1,2,3,4,5,6,7,G,U] とでも表示して、1文字読んで選択させる。 Gは1枚カードを山から取る、Uはunoのつもり。 ウノ自体のルールはぐぐってくれ。
>218 作りたい人は作る。基本スルー。
つまりrubyでカードゲームは無理ということですよ。
Rubyで無理じゃなくて、ここの住人じゃ無理なだけでそ
Win32API使ってもいい?
良いんじゃね?
じゃあUNO作るわ まっとれ
ひとりでUNOやってて楽しいか? 昔MacでUNOのゲームがあったが、かなりつまらんかったな。
227 :
デフォルトの名無しさん :2006/05/21(日) 13:38:41
UNOはつまらん 囲碁にしようぜ、てか囲碁のプログラムってむずくね?
そんな面倒なのじゃなくまず3人じゃんけんのプログラムから始めろよ
囲碁は終了判定があいまいでプレイヤーの感覚に任せる部分が大きい ぶっちゃけどちらかが投了しない限り続行は可能だよ つーかUNOも囲碁も相手が必須だろ そこをどうするかがポイントになるハズ
>>228 グー・グー・チョキの場合は決勝? あいこ?
>>230 あいこしたら、あいこした方が負け。
つまり、チョキの勝ちというルールで。
>>230 あいこにしたほうが簡単ぽいのでひとまずあいこでよし
>>230 あいこのグーふたりを勝ちにして、チョキを落として再試合。
つまり、次回から勝負が決まるまでチョキの結果をムシすれ。
おまいら馬鹿なのか? CPU1だけと7並べやってもつまらんって当たり前じゃん。 CPU1, CPU2, CPU3とプレーヤの4人で7ねらべとか出来る様にすればいいじゃん。 マクのUNOって糞だっただけじゃね? PCのUNOはそこそこおもしろかったよ。
>>232 一人勝ちバージョンできたよー
どこまで凝っていいのかわからなかったから
判定メソッド1個と$stdin.getsの入力ループで簡単ぽく作ったよー
def hantei(hands)
sum=0
hands.values.each do |hand|
sum = hand + sum
end
case sum
when 0,1,3,4,6
kekka='あいこ。もう一度'
when 2
if hands.has_value?(2) then
kekka="パーで#{hands.index(2)}の勝ち"
else
kekka="グーで#{hands.index(0)}の勝ち"
end
when 5
kekka="チョキで#{hands.index(1)}の勝ち"
end
yobina=['グー','チョキ','パー']
hands.each do |name,hand|
puts "#{name}:#{yobina[hand]}"
end
puts kekka
end
# 遊び方:実行してこれ↓ setumeibun='1:グー 2:チョキ 3:パー 0:やめる (数字とEnter押してね)' puts '3人じゃんけん開始(決勝戦なし)' puts setumeibun while line=$stdin.gets.chomp do case line when '0' puts 'さようなら' exit when '1' myhand=0 when '2' myhand=1 when '3' myhand=2 else puts setumeibun next end hantei({'YOU'=>myhand, 'COM1'=>rand(3).to_i, 'COM2'=>rand(3).to_i}) end
遊び方:
>>236-237 のスクリプト本文っぽい部分をコピペしてまとめて1ファイルにして実行。
1を入力してEnterを押すとグーを出したことに、2を入力だとチョキに、3だとパーになる。
0を入力すると終了する。テンキーで遊ぶと便利。
説明:
プレーヤーはコンピュータCOM1、COM2とユーザーYOUを含む3人。
各々の名前と出した手は、名前 => 手 の対応でハッシュhandsに入る。
出した手は整数の数値で格納され、グーは0で表す。チョキは1。パーは2。
利便性のためにユーザー入力とはズレてることに注意。
COMの出す手はグーチョキパー等しくランダムであり、
0.00…1から2.99…9までの乱数を発生させ小数点切り捨てで対応。
で、「誰か1人が勝利した」か「全員あいこ」かどうかは、3人分の手の数字の和ですべて判別できる。
勝った人の名前を知るには、「その場合に勝利である手」を値に持つキーをhandsからindexで探せばいい。
誰かがグーで勝つパターン [和は2] [勝者は0]
0・1・1
誰かがチョキで勝つパターン [和は5] [勝者は1]
1・2・2
誰かがパーで勝つパターン [和は2] [勝者は2]
2・0・0
本来決勝に進むパターン(今回あいこ)[和は1か4]
0・0・1、 1・1・2、 2・2・0
全員あいこのパターン[和は0か3か6]
0・0・0、 1・1・1、 2・2・2、 0・1・2
言い訳:
きれいとわかりやすいって両立しないよね
----
おしまい
ある程度短ければ自分の全力で作っていいんじゃね? 初心者勉強スレみたいな雰囲気もあるから迷うが
三人じゃんけんかー。 昔、JAVAで作ったのがあるから移植してみようかな。
何かプロトコル決めて、戦わせたいね(w Simple Janken Transfer Protcol(SJTP)とか。
Transfer ワロタ
でも作って公開してもメリットなくね
ひとつのゲームだけじゃなくて 汎用的なカードゲーム用exchangeサイトみたいなの Rubyで作れんかね
あんまRuby向きの概念ではないな 個々のシステムを個々に作るほうが得意だと思う
>>243 作るだけでも非常に勉強になるぞ
というのはどうだろう
素人のプログラムなんて読みたくねえよな実際
>>246 ここに書いとくとMinero Aokiがリファクタリングしてくれるという特典付き。
そうか
じゃんけんする人をn人にした場合はどうなるの?
[グー、チョキ、パー、・・・、手_n] になる
作ってるうちにめんどーになった。
多人数対応してるつもりのあいこ勝ち抜きバージョン。
@players=['YOU','COM1','COM2','COM3']
に'YOU'という文字を含まない要素を追加するとその名前で人数が増える。
YOU無しでやると自動で対戦する。
@players=['COM1','COM2','COM3''COM4''COM5''COM6''COM7''COM8''COM9''COM10']
だと10人対戦。いつ終わるかは知らね。
@goal=100の場合は100回勝った人が出た時点で終了。
ただしあいこ感知の都合であいこ勝ち抜きも積み立て1勝とカウントするので注意。
あいこを勝ち残った人にあいこ勝ち抜き回数ぶんの勝利数を追加。
定数のグーチョキパーはなんか使い方違う気がするがお腹すいたので判断できん。
結局クラス作る必要もなかった気もするけど面倒なので放置。
ちなみに俺
>>236 。反応なくてもがんばるよ!っていうか
>>246 の読む気しないってのには同意
handsの中身は
>>238 の@handsと同じ。
要は勝利者が1人になるまで前回の勝者たちを集めて同じ処理させてるだけ。
252 :
251 :2006/05/23(火) 15:31:27
class Game GOO=0;TYOKI=1;PAA=2 def initialize @label=['グー','チョキ','パー'] @players=['YOU','COM1','COM2','COM3'] @carryover=0;@hands=Hash.new;@win=Hash.new; @players.each{|player| @win[player]=0} @goal=100 end def msg(str) print "#{str}\n" end def win_pattern return [ {'pat'=>[GOO,TYOKI], 'win'=> GOO}, {'pat'=>[TYOKI,PAA], 'win'=> TYOKI}, {'pat'=>[PAA,GOO].sort, 'win'=> GOO} ] end
253 :
251 :2006/05/23(火) 15:32:31
def game winner=@players until winner.size == 1 do jyanken_call(winner) hands=ask(winner) show(hands) winner=judge(hands) end end_phase(winner.first) end def jyanken_call(winner) if @carryover == 0 then msg " じゃーんけん (参加者:#{winner.sort.join(',')})" else msg " あーいこで (参加者:#{winner.sort.join(',')})" end end def ask(winner) hands=Hash.new winner.each{|player| hands[player]=hand(player) } return hands end
254 :
251 :2006/05/23(火) 15:33:17
def hand(player) if player =~ /YOU/ then return get_yourinput else return rand(3).to_i end end def get_yourinput while input=STDIN.gets.chomp do case input.to_i when 0 then gameover when 1 then return GOO when 2 then return TYOKI when 3 then return PAA else msg ' 1:グー 2:チョキ 3:パー 0:やめる (数字とEnter押してね)' end end end def show(hands) hands.each{|name,hand| msg "#{name}:#{@label[hand]}" } end
255 :
251 :2006/05/23(火) 15:34:01
def judge(hands) now=hands.values.sort win_pattern.each do |hash| if (now & hash['pat'])==hash['pat'] && (now | hash['pat']) == hash['pat'] then return pick_winners(hands,hash['win']) # someone wins end end @carryover+=1 return hands.keys #noone wins end def pick_winners(hands,win) winner=Array.new hands.each{|name,hand| winner << name if hand == win } @carryover+=1 unless winner.size == 1 return winner end def end_phase(winner) @win[winner] = @win[winner] + 1 + @carryover @carryover=0 msg "#{winner} が勝ちました! (現在:#{@win[winner]}勝)" msg " "
if
[email protected] {|key,val| val >= @goal} then
msg "優勝者は#{@goal}勝を最初に達成した#{champ[0]}さんです!"
gameover
end
end
def gameover
@win.each{|name,win|
msg "#{name}:#{win}勝"
}
msg "さようなら";exit
end
end
game=Game.new
loop do
game.game
end
はい終わり。
>>252 たぶん書き間違ってる。PAAで勝つパターンが入ってない。
def win_pattern
return [
{'pat'=>[GOO,TYOKI], 'win'=> GOO},
{'pat'=>[TYOKI,PAA], 'win'=> TYOKI},
{'pat'=>[PAA,GOO].sort, 'win'=> GOO}
]
end
↓
def win_pattern
return [
{'pat'=>[GOO,TYOKI], 'win'=> GOO},
{'pat'=>[TYOKI,PAA], 'win'=> TYOKI},
{'pat'=>[PAA,GOO].sort, 'win'=> PAA}
]
end
あと、コピペするものには 使わないほうがいいぞ
2chブラウザによっては空白が というのに置き換わるっていうかOpenjaneDoeがそうだ
ちょっと昔作ったJAVAの三人じゃんけんをRubyに移植してみたら 約200行になった。ここには貼れない。 ちなみに、JAVAの時は約300行だった。 ロジックはJAVAで書いた時のをそのまま移植したので もっとエレガントに出来そうな気はしてる。
>259 是非別所にうpしる Rubyに書き換えようぜ
N人じゃんけんが既に出てるから、判定部分は何か面白いことしてないと目立たないぞ(w どこかのあぷろだ借りるのが手っ取り早いだろうな
じゃんけんだと、手の種類が2個だと勝敗が決まってるんだよな。 3のときと1のときはあいこだよな。 いちいち判定しないで #仮想コード players.find(winner_hand(*hands.uniq)) if hands.uniq.size == 2 とかでいけるんじゃないの? Handクラスを作ってTyoki<-Paa<-Goo<-Tyokiとリンクリストみたいにして負けた方をincompatibleとして持つなら def stronger(other) @incompatible == other ? self : other end これだとwinner_handはいらなくて、 hands.uniq.inject{|a,b| a.stronger b}/*hands.uniq.size == 2*/で勝つ方の手が決まる。 まあ真偽値返すようにしてsortして[0]使うんでもいいけど。 Tyokiとかはインスタンスが違っちゃいかんのでHansの定数にするかシングルトンにするかクラスのまま使うかすること。 あとloopでgame呼ばないでgame側でloopしたほうがよさそうなのと win_patternは普通にクラス定数の方がいいんじゃねえかと思うのと gameでwinnerに@playersを代入してるけどインスタンス変数のまま使えばいいじゃんってのと コンストラクタでやってる色々は引数にした方がいいんじゃねえかとか。 あとオブジェクト指向っぽくするならCOMPlayerとHumanPlayerを作ってVisitorパターン使ってplayさせてみるとか。 といってもVisitorパターンが最適とは本見なきゃわからん人なので今ひとつ断言できない。
じゃんけんが完成したら、いよいよ野球拳の実装だな。wktk
オセロまでいくとむずすぎる?
頭の悪いオセロなら簡単だよ
それオセーロ
268 :
259 :2006/05/31(水) 07:17:44
270 :
268 :2006/05/31(水) 19:56:37
>>269 うーん、Rubyだ。
ポイントの入れ方は、3人でじゃんけんして
あいこなら変化なし
一人勝ちなら勝った人は+2point,負けた二人は-1pointずつ
二人勝ちなら勝った二人は+1pointずつ,負けた人は-1point
# ダメな変数の使い方の見本になってしまったorz
# flagに複数の意味を持たせてしまっていたようだ
# いくら一年以上前のプログラムだからって気付けよ>一昨日の自分
確かに、配点を弄るメソッドがPlayerにあるのは変ですね。
Jankenクラスにjudgeメソッドを実装するなら、ポイントを弄るメソッドも
Jankenクラスにあるべきですね。
>268の時点では、Jankenクラスは特に役目は無くて(ってまたダメな設計の見本orz)
単にゲームを開始するだけの係りでした。
>>269 >>263 の人?
初心者だけど、Rubyの勉強になった。サンクス。
2時間ぐらいマニュアルと格闘しながら解読した。
>>272 本当に些細なことだが、
scissorsは単複同形だよ。
N人であいこなし。複数人が勝てるパターンにしてみた。
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=27843 使い方は>269と同じ(パクりました)
* 変数名、メソッド名を自分の好みに変更
* 判定にビット演算を使いたかったので、手の定義を変更した。
* 対話的に動かせるようにしてみた。
* 回数が多いときは誰かが101勝したら終了
* 人数を増やしすぎると延々あいこが続くので決着が着かない
例えば、
$ ruby Janken.rb 3 10
なら、3人で10回勝負が着くまでじゃんけんしつづける。
# あいこでredoさせるのに手間取った
# Fixnum#stepでredoすると最初からになってしまうorz
# 人数が多い時は別の終了条件にした方が良さそう。
# おいらが書くと長くなってしまうorz
275 :
デフォルトの名無しさん :2006/06/03(土) 15:28:38
age
276 :
デフォルトの名無しさん :2006/07/16(日) 14:47:02
すいません。 ある文字列があったときに、特定の範囲の文字色を変えるというプログラムをつくりたいのですが、 どなたかアドバイスお願いします。 いまはHTMLで出力しているのですが、それ以外にも、ruby/tkでつくったプログラム上に表示したいと思っています。
file=File.read('test.txt') rules=[ {'re' => /cat/ ,'from' => 'ねこだいすき', 'to' => '<font color=red>ねこだいすき</font>'}, {'re' => /dog/, 'from' => 'いぬだいすき', 'to' => '<font color=blue>いぬだいすき</font>'} ] rules.each do |rule| if file =~ rule['re'] then file.gsub(rule['from'],rule['to']) end end #アドバイスって何が欲しいんだろう…
宿題スレ向きだよな。 アドバイスじゃなくて正解が知りたいと思う悪寒。 こう試してみたけど出来ませんじゃないし。
ここ宿題スレだよね
宿題隔離スレだから自力でできた(できてない)とこから以下全部丸投げとかでも構わない こんなとこで一言一句完全丸写ししてバレないと思ってるならそれでもいいし ただし問題が何したいのかさっぱりわからん場合はそれこそ問題外
問題文さえここに正確に書き写せない香具師なんだからどうなっても知らん
282 :
デフォルトの名無しさん :2006/07/24(月) 21:22:49
ar.push ar.shift
284 :
デフォルトの名無しさん :2006/07/24(月) 21:48:13
>>283 その日の授業内容にもよるが先生が頭抱えそうな回答だな(w
>282,284 っていうか教科書読めよ。 特に 284 なんて問題文に答えが書いてあるのにこれ以上優しく説明できるか。
x = ARGV[0].to_i if /[05]$/ =~ x.to_s print "#{x}は5の倍数です。\n" end if /^(([0369]|[258][0369]*[147])|([147]|[258][0369]*[258])([0369]|[147][0369]*[258])*([258]|[147][0369]*[147]))*$/ !~ x.to_s print "#{x}は3の倍数ではありません。\n" end
>>287 ありがとうございました!!!!!
本当に助かりました!
290 :
デフォルトの名無しさん :2006/07/25(火) 20:27:32
283はいいと思うけど、287はちょっとなぁ。
>>282 も配列の添え字の勉強をした上での宿題なんじゃないかと思うぞ…
>>287 の3の倍数でない方がよくわからん。
3で割り切れないじゃダメなの?
5の倍数のとこをよく読んで意図を掴め
ARGV[0].to_s.split(//)#!/usr/bin/ruby def sm(s) sm = 0 s.to_s.split(//).each {|e| sm += e.to_i } sm = sm(sm) if(sm >= 10) return sm end f = [true, false, false, true, false, false, true, false, false, true] p f[sm(ARGV[0])]
ゴミがついたので貼りなおし #!/usr/bin/ruby def sm(s) sm = 0 s.to_s.split(//).each {|e| sm += e.to_i } sm = sm(sm) if(sm >= 10) return sm end f = [true, false, false, true, false, false, true, false, false, true] p f[sm(ARGV[0])]
文字が入力されてたらアウトだからこうかな #!/usr/bin/ruby def sm(s) sm = 0 s.to_s.split(//).each {|e| sm += e.to_i } sm = sm(sm) if(sm >= 10) return sm end p [false, false, false, true, false, false, true, false, false, true][sm(ARGV[0] )]
x = ARGV[0].to_i if ("x" * x).gsub(/xxx/,'') !~ /x/ print "#{x}は3の倍数ではありません。\n" end
298 :
デフォルトの名無しさん :2006/07/28(金) 00:58:09
またお前あるいは同類か どうでもいいがこれまで言われたアドバイス全然生かしてねえな
授業で習ってない書き方をしたら丸写しバレるだろって話ね(w
こんなに答えの書いてある問題はさすがにないと思うんだが、本当に宿題なのかなあ。
>>301 すまん、こういうパズル未満の難易度の言葉合わせな宿題は出る。
授業聞いてればそれなりに何使うかは思いつくだろ、みたいな。
情報でのプログラムの演習なんてその程度でいいんだよ。
>>298 てゆーかさ、これだとpflagはずっとtrueのままじゃね?
304 :
デフォルトの名無しさん :2006/07/28(金) 01:53:24
>>298 include Math
n = ARGV[0].to_i
ne = sqrt(n).to_i
pflag = true
for i in 2..ne
break if pflag = n % i == 0
end
puts pflag ? 'xx は合成数です' : 'xx は素数です'
俺にはこれが限界
後は誰か頼む
プログラムが書けるより、問題を論理的に解析して解の生成アルゴリズムをひらめくのが重要。 アルゴリズムがひらめけばあとは言語仕様に従って記述すればプログラムに成るし。
306 :
ど素人 :2006/07/28(金) 02:01:09
参考書にてわからない問題がありました。次のプログラムって日本語でどう説明できますか? ぜひお願いします。 A=new Array(3, 8, 19, 20, 22, 24, 45); i=0; j=A.length-1; a=19; k=Math.floor((i+j)/2); while(i<=j){ if(A[k] == a){ break; } else if(A[k] > a){ j = k - 1; } else{ i = k + 1; } k = Math.floor((i+j)/2); } if(i>j) k=-1; document.write(a," ",k);
javascriptか 言語ですらないな 板違いだ
JavaScriptの言語性を馬鹿にしていると痛い目見るぞ
どこをどう読めば人を馬鹿にしてると読めるんだろう
馬鹿な人がいるようには読める。
馬鹿な人には読めないマキコ。
どっちにしろ荒らしに反応すな
js=ajax=web2.0
もしかしたらスレ違いかも知れませんが… コマンドラインから テキストファイルを、各行の頭に行番号を付け表示したいのです。 今は Ruby で ruby -e 'a=readlines;for i in 0...a.size;printf"%6d: %s",i+1,a[i];end' textfile としています。 でももう少し短くなる気がするのですが、良いワンライナー無いでしょうか?
ruby -ple 'printf "%6d: ", $.'
ruby -e 'exec("/bin/cat", "-n", *ARGV)'
ruby -e 'ARGF.each{|s|printf "%6d: %s", ARGF.file.lineno, s}'
320 :
316 :2006/08/26(土) 17:00:01
>>317 短ッ!rubyのオプションと特殊変数の事
すっかり忘れてました、感謝です
>>318 環境書き忘れてた…今度リナやユニ触る機会があったら
catのオプションの事思い出します
>>319 ARGF.eachはさっき気付いて
i=0;ARGF.each{|s|printf "%6d: %s",i+=1,s}
って書いたところでした
そういやARGFは独自のメソッド持ってるんでしたね…
>>320 > i=0;ARGF.each{|s|printf "%6d: %s",i+=1,s}
そういうときはwith_index使えって教わんなかったか?
ARGF.each_with_index{|s, i|printf "%6d: %s", i, s}
322 :
デフォルトの名無しさん :2006/08/31(木) 22:22:15
二進表示をprintf,sprintfを使わず、正の整数を入力して その二進表示を出力するプログラムを作成しよ。 ただし整数から二進表示文字列を作るメソッドi2bを 作成してそれを呼び出すように書くこと。 できるだけ簡単なプログラムでお願いします。 Ruby初心者なのでわからなくて困ってます。
>>322 alias myprintf printf
myprintf("%b\n", 10) #=> 1010
324 :
デフォルトの名無しさん :2006/08/31(木) 22:38:35
>>323 ありがとうございます。
でも、せっかく作成していただいたのに申し訳ないのですが
printfは使って作成してはいけないんです。
ちっ、バレたかwww
>>322 こんなんじゃダメ?
def i2b i
return i.to_s(2)
end
Fixnum < Integer#to_s --- to_s --- to_s(base) ruby 1.7 feature 整数を 10 進文字列表現に変換します。 ruby 1.7 feature: 引数を指定すれば、それを基数とした文字列表 現に変換します。基数として 2 〜 36 以外を指定した場合は例外 ArgumentError が発生します。 p 10.to_s(2) # => "1010" p 10.to_s(8) # => "12" p 10.to_s(16) # => "a" p 35.to_s(36) # => "z" これか。 これ提出されたら、宿題だした奴もがっくり来るだろうなw
328 :
デフォルトの名無しさん :2006/08/31(木) 23:28:58
>>326 >>327 ありがとうございます。
家のパソコンだとプログラムが実行できないので
明日実行できるパソコンで試してみます。
超ナイーブに書いてみたが数字がでかいとスタックオーバーフローで死ぬ。 def to_bin(i); q, m = i.divmod(2); q == 0 ? m : to_bin(q).to_s + m.to_s;end
>>328 家のパソコンにもRubyインストールすればいいだろ?
よっぽど特殊なOSで無い限り入れられる。
331 :
デフォルトの名無しさん :2006/08/31(木) 23:42:20
329>> 何回もインストールしてみたのですが 何回挑戦しても失敗してしまいます。
最近は宿題もWeb2.0とか意識するべきだと思うんだ
def i2b(i)
require "open-uri"
open('
http://google.co.jp/search?q= '+i+'+in+binary').read.scan(/0b([01]+?)</)
end
puts "正の整数を入れてください"
i=STDIN.gets.chomp
puts i2b(i)
334 :
デフォルトの名無しさん :2006/09/01(金) 00:03:39
332
>>333 >>
ありがとうございます。
助かりました。
web 2.0ってperl廚の妄言のような。 phpとの戦いで死にかけてるから生き残りに必死な様にしか見えない。
>>335 そうか?PHPってgoto導入して死ぬんだろ?
Web2.0は言語を規定しない(そもそも何も規定しないがw) 「なんかWeb通して新感覚にみんなで超便利」というサービスを提供する限り、 サーバー上の言語は本当に何でもよい
初心者の自分が作った方が参考になるんじゃないのかな? def i2b i b = "" # 2進法文字列の初期化 while i>0 if i%2 == 1 then # 2で割って余りをもとめる b = "1" + b # 1なら文字列の先頭に1を追加 else b = "0" + b # 0なら文字列の先頭に0を追加 end i = i/2 end return b end
def i2b(i) cc = nil b = "" if i = callcc {|cc| i} b = "01"[i % 2] + b cc.call((i / 2).nonzero?) end b end
340 :
デフォルトの名無しさん :2006/09/01(金) 09:53:17
>>338 わかりやすく教えていただいて
ありがとうございます。
>>339 ありがとうございました。
>>338 参考にはなるかもしれんが、ためにはならんぞ。
342 :
デフォルトの名無しさん :2006/09/09(土) 05:00:57
Rubyで書かれたうpろだのソースってありますか?
ハイレベルな宿題だな
>>342 cgi限定?
http以外のプロトコル使ってもいいのかな?
AppleTalkでお願いします。
347 :
デフォルトの名無しさん :2006/09/11(月) 16:25:43
>>346 ありがとうございます。
CGI.rbの仕様で10kB以下だとStringIOで処理されて
それ以上のサイズだとTempfileオブジェクトになるようだと
書いてあるのですが
「Tempfileの場合、数MBのファイルをread,writeするのはあれなので」
という部分の意味が良く分かりません
何があれなんでしょうか
やっぱり、なにがあれなんだろう。
「数MBのファイルを、わざわざ Ruby の read/write を使ってアップローダ側 のディレクトリの特定のファイルにコピーするのは処理にオーバヘッドがかか るので」 てとこじゃね。
ああでもあれか、 FileUtils.cp ってけっきょく ruby レベルで read/write を繰り返しているわけだよな。まあ、当り前だが。 それに、ソースを見てみると file.size の大小で TempFile かどうか判定し てるね。 is_a? とかを使った方がいいんじゃないかなあ。
multipart/form-dataってファイル毎のデータ長送ってこない上に、次にどのファイル(or フォームのクエリ)が来るか分からないんだっけ。 だから便利性を求めたライブラリは、テンポラリファイル作るとか回りくどい仕様になってるんだよね。 こういうインターフェイスにすれば、少し面倒になるけど テンポラリも要らないし融通が利くのに。 cgi = CGI.new cgi.find_file {|info, fp| # フォームから送られた名前で振り分け if info.name == "upload_file" # fpを使ってファイルに保存する処理 else # 普通のクエリとして扱う cgi[info.name] = fp.read end }
352 :
デフォルトの名無しさん :2006/09/15(金) 02:07:28
def seach(dir, key) ↑ dir(ディレクトリ), key(検索キーワード) で指定したディレクトリ下にある合致するファイルを検索して 合致するファイル名の配列を返す関数のコードお願いします。
自分で出来ました。お騒がせしました。 def seach(dir, key) a = Array.new Dir.foreach(dir){|f| if f[key] a.push(f) end } a end seach(Dir.getwd, ".txt").each{|v| print v + "\n" }
Dir.glob(dir + "/**/" + key) じゃ駄目?
合致するファイルって名前だけか。
353.gsub(/serch/, 'search')
353.gsub(/seach/, 'search')
353.gsub /(?=。)/, "お" (^ω^ )
数字に変換できなくなるまで、入力を何回でも受け付けるプログラムを 作りました。入力された文字列が数字に正しいものかどうかをチェック するようなフィルタを作ったんですが、あまりスマートに書けませんで した。もう少し、きれいなコードを書く方法をご存知の方、ご意見を下 さい。 #!/usr/bin/ruby def i2b (i) ;return i.to_s(2) ;end #文字列が数値に変換可能かチェックする 0xffはOK 124ffはNG def analyzer (str) #if str can be converted to number => true else => false str.delete!("\n");str.downcase! case str[0..1] when '0x' num = str.to_i(16) if num.to_s(16) != str[2..-1] ;return false ;end when '0b' num = str.to_i(2) if num.to_s(2) != str[2..-1] ;return false ;end
when '0d' num = str[2..-1] if num.to_s(10) != str[2..-1] ;return false ;end when '0o' num = str.to_i(8) if num.to_s(8) != str[2..-1] ;return false ;end else if str[0] == '0'[0] and str.length > 1 num = str.to_i(8) if num.to_s(8) != str[1..-1] ;return false ;end elsif str[0] != '0'[0] num = str.to_i(10) if num.to_s(10) != str ;return false ;end end end return true end puts "please input number." loop{ print ">" ;str = gets() if analyzer(str) == false ;puts "#{str} is not number" ;exit ;end num = str.to_i(0) ;puts i2b(num) }
age
def analyzer(str) Integer(str) true rescue ArgumentError false end
363 :
359 :2006/09/20(水) 01:36:19
ありがとうございます。組込み関数のInteger(str)は見落としていました。 str.to_i()が例外を投げない仕様になっていたので困っていた所です。 あとリファレンスを読むのが不十分でした。すいません、今後は気を付けます。
364 :
359 :2006/09/20(水) 01:37:01
ありがとうございます。組込み関数のInteger(str)は見落としていました。 str.to_i()が例外を投げない仕様になっていたので困っていた所です。 あとリファレンスを読むのが不十分でした。すいません、今後は気を付けます。
お礼は一回でおk。
ありがdddddddddddddddddddddddddddddddddddddddddddddddd
勉強になるので、以前のじゃけんプログラムみたいな数百行程度のプログラムを また作って欲しいのですが。
自分で作った方が勉強になるぞ。
「ババ抜き」とかどうでしょうか? 表示は、例えばこんな感じで A:H1 D3 SQ C9 HJ DK S0 B:D4 S0 CQ JK C:C5 H0 S2 DQ SK D:D4 H1 CK SJ H7 H9 Aさんが、Bさんから S0 を取りました。 A:H1 D3 SQ C9 HJ DK B:D4 CQ JK C:C5 H0 S2 DQ SK D:D4 H1 CK SJ H7 H9 Bさんが、Cさんから H0 を取りました。 A:H1 D3 SQ C9 HJ DK B:D4 CQ JK H0 C:C5 S2 DQ SK D:D4 H1 CK SJ H7 H9
たびたびわからなくなるんだが、 引かれた奴が次に他の奴から引くんだっけ? 引いた奴が次に他の奴から引かれるんだっけ?
ローカルルールがあるかもしれないが、うちでは引いた奴が他の奴から引かれるというルール。 そうじゃないと、「おい、お前今混ぜてるのはババ引いたからだろ!」ということが起こらず面白くない。
最強のジャンケンAI。綿密な先読みで人間などには負けることが無い。 ↓ print "ジャンケンしーましょ、最初はグー!" print "ジャンケン・・・[g=グー/c=チョキ/p=パー]:" puts "AIの手:"+ ({?g => "パー", ?c => "グー", ?p => "チョキ"}[gets[0]] or raise "死ね。") puts "お前の負けだ。"
いや、出す瞬間に、相手の手を見て反応しているのでOK。 ハンターハンターでやってた
>>375 ハンターハンターのは「出す直前」だが、>373のは完全に後出し。
ババ抜きってさあ、記憶力と観察力があれば、自分のとこから取られたカードがどこにあるかわかるから有利になれるんだけど そういう戦略を実装できるようにすべき?
したけりゃしろよ。 スレ違いだし。
スレ違いな理由は何?
>>377 戦略とかあるの?
ランダムに引く人と戦略を持っている人とで、勝利確率どのぐらい違うが見てみたいね。
戦略:こっそりはなくそをつけとく
質問です。 次のようなテキストファイルがあったとします。 "ほげほげ","なんとか","むだむだ" "ほげほ","なんとかか","むだむだだ" (以下、何十行か続く) それを ほげほげ なんとか むだむだ ほげほ なんとかか むだむだだ (以下続く) という感じの書式(空白はタブです)に変えてテキストファイルとして書き出すスクリプトを書きたいのですが、 正規表現とか難しいことを使わないと行けないのでしょうか。 どなたかやり方ご存じありませんでしょうか。
データに","が含まれないなら while s = gets puts s.gsub(/"/, "").gsub(/,/, "\t") end ちゃんとCSVを処理したいなら、RAAでcsv関連のライブラリを探すとか。
>>383 字句解析はrubyに丸投げ
puts eval("[#$_]").join("\t") while gets
黒魔術だ・・・
>>385 おおー、こんなに簡単にできてしまうんですね。
Rubyって凄い! ありがとうございました!
CGIとかで、外部のユーザが自由に入力出来るようなデータに使う場合は、注意しろよー。
390 :
デフォルトの名無しさん :2006/10/17(火) 01:01:11
東大の宿題予想しようぜ
>>391 東大の講師ごくろうさまです。軽くRubyのコンパイラでも作らせてあげてください。
そもそも東大生でこんなところに質問しにくるアホはいねーだろ # と思いたいなあ
東大生といえども所詮、学生だし。
むしろ東大生がやるレベルの宿題ってのをみてみたいので、 ここに投げてほしいと思う俺がいる。
俺も俺も
俺もw
ほれ 1 2 3 4 5 6 7 8 9 ----------------------------- 1| 1 2 3 4 5 6 7 8 9 2| 2 4 6 8 10 12 14 16 18 3| 3 6 9 12 15 18 21 24 27 4| 4 8 12 16 20 24 28 32 36 5| 5 10 15 20 25 30 35 40 45 6| 6 12 18 24 30 36 42 48 54 7| 7 14 21 28 35 42 49 56 63 8| 8 16 24 32 40 48 56 64 72 9| 9 18 27 36 45 54 63 72 81
等幅でおk
宿題じゃないけど、聞いていい? 問、重複行を削除せよ
ruby -e 'File.open("file.txt"){|f| f.readlines.sort!.uniq! }'
>>402 ソートしないでという条件をつけさしてください。
temp = "" ARGF.each_line do |line| puts line if not line == temp temp = line end
>>403 print readlines.uniq!
uniqって、重複なかったら、nilが帰ってくるんだけど orz
print readlines.uniq で、いけますね。
puts ARGF.map.uniq 意味もなく最短を狙ってみる。
CodeGolfかよw
>>408 ARGFは$<で代用可能。ついでにそのおかげで空白も除去できる。
puts$<.map.uniq
>>410 > ついでにそのおかげで空白も除去できる。
将来もずっとそうかわからんぞ。
namespaceの話もあるからな。
>411 それを言ったら Ruby なんて教祖の暴走がある限り ほぼ全ての仕様が将来もずっとそうか分からんぞ。
俺はいつもこんな感じ。適宜digest使ったり。 h = [] ARGF.each_line do |line| puts line if h[$_.sum] =|| 0 end
そりゃsyntax errorだと思うが。 if h[line.sum] ||= 0 だとしても常に真だし。
質問です。 行列A Matrix[[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]]と 行列B Matrix[[0, 0, 0, 1], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]] について、同一座標の数値ごとに論理和をとって行列Cを返すプログラムを教えてください。 この場合行列Cは、Matrix[[0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]] になります。 よろしくお願いします。
論理和とったら [[1, 1, 0, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]] にならないか? a = [[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]] b = [[0, 0, 0, 1], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]] i = -1 puts a.map{|x| x.map{|y| i+=1; y | b.flatten[i]; }}.inspect
>>416 ありがとうございます。
論理和というか、両方1のときは1、それ以外は0になる形です。
それは、論理積じゃねーの。
うむ
すいません。その通りです。 論理積でお願いします。
421 :
416 :2006/10/25(水) 18:54:17
あとは自分で考えろよ
いっぱいある縦棒のどれかをアンパサンドに変えればいいんでないの?
puts a.map{|x| x.map{|y| i+=1; y | b.fアンパサンドatten[i]; }}.inspect こうですか? わかりません!
424 :
415 :2006/10/25(水) 21:20:16
おかげさまでできました。
>>416 さんをはじめ、このスレのみなさん本当にありがとうございました。
425 :
デフォルトの名無しさん :2006/12/16(土) 19:10:09
Code Golf はここでよいですよね? 数字を与えられて、それを1から配列数までを網羅した配列を短く書く方法はないですか? 例: 9 -> [1, 2, 3, 4, 5, 6, 7, 8, 9] a = []; 9.times{|i| a += [(i + 1)]}; p a かな?
426 :
デフォルトの名無しさん :2006/12/16(土) 19:10:59
a = []; 9.times{|i| a << i + 1}; p a
427 :
デフォルトの名無しさん :2006/12/16(土) 19:12:56
あ、これでいいのか・・・ p Array.new(9){|i| i + 1}
(1..9).to_a
(1..9).map このほうが短いな
Range#to_aが真っ先に思いつくのが普通だよな。
[*1..9]
432 :
デフォルトの名無しさん :2006/12/17(日) 07:24:23
434 :
デフォルトの名無しさん :2006/12/17(日) 11:43:34
>>429 1.9ではEnumerable::Enumeratorが返る。
>>436 いままでで切り捨てられたものの例を挙げてみてくれないか?
なんでなんで
警告出るのはあったな
440 :
デフォルトの名無しさん :2006/12/25(月) 18:15:30
<panda>kuma</panda>という文字列を<panda>kum<a></panda>としたいのですが、 gsub('a','<a>')とすると当然ながら<p<a>nd<a>>kum<a></p<a>nd<a>>となってしまいます。 <>の中のaを回避して置換するよい方法ありませんか?
<kuma>panda</kuma> ↓ <kuma>p<a>nd<a></kuma> こう?
"<panda>kuma</panda>".scan(/(<.*?>|[^<]+)/).map{|s,*| if /^</ !~ s then s.gsub(/a/, "<a>") else s end }.join => "<panda>kum<a></panda>" "<kuma>panda</kuma>".scan(/(<.*?>|[^<]+)/).map{|s,*| if /^</ !~ s then s.gsub(/a/, "<a>") else s end }.join => "<kuma>p<a>nd<a></kuma>"
|s,*| これ↑をすると、配列がはずれて文字列だけになるんだ。 何故?
Ruby では、ブロック引数に値を渡すときの操作は実質的には(多重)代入と同じ。 |s, a| と書くのは、 |s, a| = each_elementのように値が入るのと等価になっている。 また、 a, *b = [1, 2, 3] とすればaに1、bに[2,3]が入るという規則を思い出すと、今回のケースでは、 「多重代入で最初のものだけを得たい」というケースであるから、 |s, *dummy| と書けば s に最初の要素が、 dummy に残りの配列が手に入る ことになる。 でも今回は dummy は使わないから省きたい。で、こういう要求にこたえて最 近のRubyでは*パートの変数名を省略できるようになっている。つまり、 a, * = [1, 2, 3] と書くと a に1が入るという操作になる。 というわけで、ブロック引数に |s, *| と書くと、 s に最初の要素が入ることになる。 ちなみに ,* が省かれるとふつうの代入と区別できないため、sには配列が入る。 ……なんだけど実際には * はなくても良いのを思い出した。 カンマがあれば良いので |s,| で良かったです。すまん。
>>444 丁寧な説明、サンクス。
なるほど、配列の第1要素のみ利用するってこってですね。
car?
>446 lispのcar関数とはまた別モノだろ
448 :
デフォルトの名無しさん :2007/01/11(木) 20:52:38
C言語で、値の入れ替えは、以下のように書くことができるようですが、 rubyでもっと短くかけないですか? a=(a^=b,b^=a,a^b);
>>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と叫ぶまでおばあちゃんとの会話から逃れられません。 とかいうの。
453 :
デフォルトの名無しさん :2007/01/12(金) 22:54:56
初心者の過去スレ人多すぎで見れない… どこをググれば??
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で引っかかったりで前に進みません。
454は答えそのものじゃなくて基本的なアプローチ部分のコード例だよ。残りを埋めなきゃ答えにはならん。 それすら見てもわからんのか……。 ところでmixiで質問してるのと同じ人?
>>455 何がどうダメなのか説明しないと誰もアドバイスできませんよ。
プログラムを動かそうとしたらエラーが出るなら、
そのエラーメッセージとソースコードをコピペする。
「エスパー募集中ですか?」って言われちゃいますよ?
つーか自分で作って詰まれ どうせ他人の見ても何がどうなってるのかわからんのだろ 確かにこのスレは宿題丸投げも可だが、あまり身勝手におイタしてると 「完全に動作するがコードが面妖で提出不可」なプログラムだけ回答に出されて放置されたりするぞ
「ここまでは書けたけどあとはさっぱりです」とか素直に見せられたほうが答返ってくるよな。
そして誰かが3行程度で作ってしまう。
461 :
デフォルトの名無しさん :2007/01/14(日) 11:25:50
CodeGolf形式で聞けば答えてくれるぞ
俺なら70byteで解く
人工無能を作るスレがあるからそっちで聞け
関係ない他のスレに迷惑かけちゃいかんよ
465 :
939 :2007/01/19(金) 23:12:14
ヒープを配列で実装しろという問題とヒープソートの作り方を教えてください
467 :
デフォルトの名無しさん :2007/01/24(水) 16:36:01
0点の紙が1枚、1点の紙が2枚、4点の紙が1枚入っている箱がある。 この箱から1枚引いて箱に戻すのを6回繰り返したとき、合計点数のとりうる値を求めるプログラムを書け。 この問題の解法を教えてください。よろしくお願いします。
>>467 算数の問題が解けないのか、解けるけどRubyに書き直せないのかどっちだ?
# 前者のような気はするけど。
469 :
デフォルトの名無しさん :2007/01/24(水) 20:53:01
>>468 後者です。
場合わけなどを効率よくプログラミングにおとすにはどうしたよいかわかりません。
なるほど。アルゴリズムは考え付いたわけね。 じゃ、日本語で良いのでそのアルゴリズムを書いてみて。 それをコード化してあげる。
>>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個の数字をすべての場合を網羅するように作成して現れる合計値をすべて記録すれば答えはでるんですが、それだと面倒なので質問しました。
トリッキーなコード ↓
474 :
デフォルトの名無しさん :2007/01/24(水) 22:12:02
>>471 ありがとうございます。
こんなに短くできるんですね。
>>473 動的計画法を使う典型問題だね。
b = [0]
6.times{b=[0,1,4].inject(b){|c,y|c + b.map{|x|x+y}}.sort.uniq}
puts b
inject([])の間違いだた。まぁ今回はたまたまうまく動くけど。
おりゃ 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
本スレのほうから誘導されましたので、こちらで質問させていただきます。
http://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個ずつの組み合わせ
]
実装は、メソッドの再帰を行うんだろうとはなんとなく分かるんですが、それ以上は進まず。
>>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
10個の任意の数字を昇順(小さい数から大きい数)に並び替えるプログラムを作成しなさい 注意事項及びヒント: sortメソッドは使用しないこと 配列を使用した方が並び替え易いと思います
>>486 OK、sortメソッドは使わないぜ。
a=[1,4,3,5,3,10,3,5,3,5]
$><<a.sort_by{|x|x}.join(" ")
>>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
で、書いておいてなんだが
いくら初心者だろーが力任せ、単純なソート法なら自力で思いつくだろ
俺も適当にクイックソート書いてみた。 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 飽きたから超適当。もういいや、こんなんで
>489-490 おまえらさあ、こういうのをそのままコピペして提出するアホがいたらどうすんだよ。 これを受け取ってどう評価するか悩む教師の身にもなってみてくれ、まじで。
教授、乙
493 :
486 :2007/02/06(火) 01:32:00
レスどうも、コピペしてませんからご安心を。確認しただけです。 全く違うソートになりましたが。
494 :
デフォルトの名無しさん :2007/02/14(水) 16:21:00
端末に現在時刻を 1 秒おきに表示しスクロールするプログラム. 実行中にキーボードの 1 が押されるとそれ以降は文字色を赤で, また,2 が押されるとそれ以降は文字色を青で表示する. 0 が押されると数字を入力するようプロンプトを表示し, 時刻の表示間隔を入力された数字の秒数に変更する. Ctrl+C で終了する. お願いします.
じゃあ半分だけ。 loop do puts Time.now sleep 1 end
それで半分は言いすぎw
497 :
デフォルトの名無しさん :2007/02/15(木) 03:17:40
どうでもいいけど、宿題で聞くヤツって何でこう、突っ放しなんだろうな。 お前本当に、答えてほしのかとww もっとこう、答えたくて答えたくてたまらないように、仕向けないといけないと思うんだけど。 ・・・まあ、だから、2ch聞いてるんだろうけど。 ちなみん、おれが、2ch聞いたのはほとんど答えてもらってる。
このスレももう500になるのか とりあえずフォーマットくらいは用意すべきだろうね
>>494 >>495 ありがとうございます.
核の部分はそうなると思いますが,
そこは問題を説明するために設定した部分で,
本当に聞きたいのはユーザとの対話部分なんです.
引き続きお願いします.
自分なりには curses を使って書いてみたんですが,
getstr がどうもうまく動かないので,
こちらで質問してみました.
>>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 を押したらいつでも終了するのがマナー
だと思っていたのですが…
>501 ちなみに、環境何?
>>502 ruby 1.8.5/screen 4.00/zsh 4.3.2/ck 2.0.26
で coLinux 0.7.1 上の Gentoo と Cygwin とを使っています.
>>501 > これでもクリック待ちのときに Ctrl-C で終了できませんでした.
> これが,ruby の curses の仕様なんでしょうか?
rubyのつーか、cursesってそういうもんじゃなかったっけ?
>>501 手元のopenSUSE 10.2では止まるけど、Ctrl-Cで停止しなければならない仕様なの?
C-Cされてもどこぞでシグナルがトラップされてたら止まらない。
コンソールからインタラクティブに操作するアプリは操作が中断されるだけで止まらないのも多い。
ところでgetchで入力待ちになったら1秒おきに表示が更新されない気がするんだけど?
>>504 pythonでは入力待ち状態でCtrl-Cしたら
終了するのですがどうなんでしょう?
>>505 環境依存するのは何の違いがきいてるのでしょう?
設定で解消できるものなのか,OS依存でどうしようもないのか?
可能ならばCtrl-Cで終了するようにしたいです.
cursesがtrapを仕込んでいるとして,それを解除,
あるいは,更にtrapしてCtrl-Cを検出することは
無理でしょうか?
>>ところで…
はい.ですから timeout などを使って getch をくるまないといけないと思います.
更新間隔を入力するときは表示の更新が止まってもよいものとします.
>>507 pythonではできるって言ってんだから
pythonとrubyのcursesの実装の違いでしょ。
そこでcursesのマニュアル出すのはどうかと。
つーか宿題としては性質が悪すぎだな 端末文字の色変えろって気楽に言った時点でイヤな予感はしたんだが
>>507 んぅ・・・
raw/norawあたりがあやしいかなと思って挿入してみても変化なし.
何かヒントいただけませんか?
>>510 すいません.色は問題の本質ではないです.
色を変える代わりに,1ならA,2ならBを表示するだけかまいません.
>>511 そこ変えてもダメなの?
Ctrl-Cの扱いを変えられるのはraw、cbreakぐらい。
pythonでもrubyでもcursesモジュールは単にCのAPIをラップしてるだけで変わりはない。
強制的にrawになってる(?)ならgetchした先でCtrl-Cのコードのときexitすりゃいいけど
なんでそんなことになってるのかなあ。
>>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
>>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
cbreak使えば余計なことしなくていいみたいだ。 cbreakモードは割り込み、フロー制御するが、rawモードはスルーして文字を返すそうな。
>>515 それだとCtrl-Cもとられて本末転倒だろ
端末制御ってめんどくさいな
あきらめてpython使えってことだな
宿題なのに?
最近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 :2007/03/09(金) 01:06:17
今実行して確かめたら基礎もできてなかった。うーん・・・ これだとBYE実行でもifに行っちゃいますね。
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 :2007/03/09(金) 21:07:16
>522 ありがとうございます!countメソッドははじめて見ました。 これまでのチュートリアルにでてないので使わないやり方もあるんですかね? 年号のやつもごちゃごちゃしてましたね。コメントどうもです。 さらに自分でBYE実行時の台詞変えたりしてみようと思います。
いや、ここでのcountはただのローカル変数だよ
525 :
520 :2007/03/09(金) 22:50:52
ああ、そうですね。お恥ずかしいです。 それにしてもチュートリアルの問題やたら難しくないですか? こんなもんなんでしょうか。 もう少し簡単な問題やヒントがのってるかと思ってチュートリアル書いた人の 本も買ってみたんですがネットにのってるのとほとんど同じ内容でした。
こんなもんです。
やたら難しいかどうかはともかく、小難しいのには同意する 初めてのPerl並に平易な問題から段階踏んで攻めるのがいいと思うんだが
>>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 ああ!そうだった・・・
|| 忘れてたよ・・・
今月のカレンダを表示する関数を教えてくれ。 calコマンドは呼んじゃ駄目。 つーかprint_this_month関数ぐらい欲しい。
> 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
だから宿題なんだろ?
どのくらいの出来のカレンダーを求められてるかによって難易度は大幅に変わるな
そもそも出力形式はなんなのよ。 cal と同じでいいの?
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 -------------- ここまでならできた 変数変えただけで月曜始まりにも対応するようにしようと思ったが面倒なのでパス
…これもあんま宿題として提出はできそうにないな
#!/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)
#!/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
あ、しまった、to_a の構想を作ってる途中で変えたの忘れてた この配列を配列として取り出すメリット何もないな Calender.new(4,2007).to_a で2007年4月の1日から末日までの Dateオブジェクトの配列が返ってきたら便利だなと思ったんだけど っていうか、どんな授業で出たカレンダーの宿題なのか早く言ってくれないと 提出に絶対適さないプログラム構造のカレンダーをめいめい趣味で作っちゃうよこのスレ
cal 4 2007 だけじゃなく cal 2007 にも対応汁
#!/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コマンド互換性を廃して独自に
お題に沿ってめいめい趣味で作って楽しむスレじゃないの? 他人のソース見るのって勉強に成るし、いろんな解釈から面白いものが出てくれば良いと思う。
###
>>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
### 続く
### 続き 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
>>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を作ったんだと思います
なんかもうちょっと繰り返しとかのとこを全体的にどうにかすると
思いっきり綺麗に書けそうですが思いつかないので放置します次の方どうぞ
>(コンセプト段階では意味があったんだが今考えると意図不明 このセリフどっかで聞いたことあるなぁ Matzが良く使うよなぁ
>>548 その台詞、仕事で使わせてもらう ( ・`ω・´)ノ
#!/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
>>550 きゃー短い
…やっぱこれ行列か
やっぱこれ行列だよな…
行列操作でMatrixしか思いつかなくてA4の紙にでっかい図書いて茹で上がって諦めたよ
Rangeオブジェクトは昇順の数字限定のいけ好かない奴だと思ってたのでこれからはなにやら便利に使うよ
enumeratorはなんて読むかもわかんないくらいなのでこれからがんばってべんきょうするよ
case文は書き慣れた感じがしてやらしいよ
あらら2009年のを表示させると死ぬな。 a[6] ||= ''; a[7] ||= ''; a にすりゃいいけど、ここ汚くて嫌い。
どうやったらこういうの書けるようになるの?
555
日本語書けるからといって小説が書けるようになるわけでもなく
でも小説を書くために日本語の勉強って大事。 つ 国語
お題カモン
きょうは八十八夜ですが任意の年月日を入力してそれが年初から何日目かを求めるプログラムを作りなさい ただしDateは使わないこと
def dates(y,m,d) ((Time.local(y,m,d) - Time.local(y)) / (3600*24) + 1).to_i end どうでもいいけど八十八夜ってのは年初からの日数じゃないぞ。 dates(2007,5,2) # => 122
旧暦の年初だろ そんなことも知らないのか
つーか「5」月な時点で30*4=120日くらいは最低過ぎてるんじゃないかと思えて欲しい
ここで旧暦ライブラリの出番
122 - 88 = 34 = 2/3 = 節分 うまく出来てるな
>561 旧正月でもないぞ。 立春から数えて八十八日目。節分もまぁ似たようなものだが。
ついでに 二百十日 = 9/1 も確認してみました dates(2007,9,1) # => 244
立春の予測の厳密な計算ってスタンドアロンではできないんじゃなかったっけ できたとしても、なんていうかRubyの練習にはならないと思う
>>567 >できたとしても、なんていうかRubyの練習にはならないと思う
適当なサイトにアクセスして日付を取ってくるとかはどうだ?
まあお代考えた香具師が馬鹿だったということで、次のお代ドーゾ。
マウスの位置はどうしたら分かりますか?
基本的にはそんなもんわからん 何かウィンドウシステムのようなもん使ってるならそれ併記しろ あとなにかRuby/Tkとかのアプリケーション上での話ならそれもきちんと書け
FreeBSDでコンソールしか使ってないのですが なんか文字と同じサイズで四角いマウスカーソル らしきものが出て来て動くんです
それ宿題じゃないだろ
>>570 机の横に落ちてるだろ。ちゃんと探せよ。
マウスパッドの上にありました
1から100までの数をプリントするプログラムを書け。 ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
※ただし55byte以内でなければならない と付け加えないとつまらんな
Rubyで書いたら怒られると思う
やべえ、 おれ再帰つかったことねぇや
使えるということと使わなければならないということは全く別物 必要なければ使わなくていい 使えないのは問題
再帰は使わない人は一生自前で使わないからなあ きちんと概念学んで理解すると時々使うようになると思う
「累乗のプログラムを作るときに出てきた累乗専用の何か」以上の理解がない俺に 誰か再帰の便利なとこ教えてくれ
Haskellとか使うと嫌でも分かるよ。 というか再帰こそ自然で直観的なものだと思えるようになる。
今から再帰で目覚めるためだけにlisp始めれ、というよりは若干やさしいか? そうでもないか
教科書の再帰関数は見かけ無駄な動作しかしないからな フツーの言語で説明されても「こんなんループで書いたほうが早いってはい終了」と思って 即忘れてしまうのは無理もないと思う
ヒルベルトとか
クイックソートとかマージソートは再帰で書くと思うが。
>>588 Rubyスクリプトだとfact(n)を書くのに
(1..n).each do |i| 以下略
とか
1.upto(n) do |i| 以下略
とか
そういう便利な繰り返しが真っ先に出てきちゃうからな
いや、Rubyに限ったことじゃないけど
>>578 のそもそもは「面接官の前で紙に該当のコード書け」という問題だからなあ
2分もあれば書けるだろうとか言われてるし
モニタの前でコーヒーとか飲みながらキーボードをパチパチやって答える問題ではない
実務でクイックソートとかマージソート使う場面あるか? まずほとんどの場面で、 単純なソートで大丈夫だぜ
というか、普通はライブラリを使うだろ。
「クイックソート自力で実装しました」とか言ったら普通はグーで殴られるよな ソートの実装はそれこそ勉強用だ 絶対に自力で経験しないといけないが、絶対に実地で使ってはイカン(趣味でもな)
Rubyみたいな言語での再帰の日常利用はある日天啓のごとくひらめくもんだと思う ただし、たいがいはコードが美しくなるだけであって動作速度は普通に書くよりも遅い ただでさえワンテンポ遅いRubyが再帰でさらに遅くなるのでトレードオフの見極めに注意 込み入ったプログラムでは使うと便利なこともあるけれど、初心者には無理かも
再帰的処理は練習しないと肝心の「再帰処理で考えれば万事うまくいく」とこで再帰の使用をひらめかないから、 自作の速度クリティカルじゃないスクリプトでどんどん使って慣れておいたほうがいいぞ。
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
ラーメンタイマー作ってー ramen.rb 180 ってやると残り時間を秒単位でカウントしていって 時間過ぎたら今度は経過時間を表示していくようなやつ
# 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
# 遠くから見て残り時間がわからなくて寂しかったので修正 # 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
http://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の入れ子では駄目なのかなあ。 あ、短くする競争のものは、なんでもやってください。 そうじゃないものの話ね。
改行の出力
>>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
めんどいな
>>603 コードによってthen以下の処理内容は違うから一概には言えない
ただ、たとえば3や5を先にすると、15で割り切れるはずの30が先に3や5の処理に入ることがある
短くしたいとか奇を衒おうとかいうコードの場合、そういうのに対する余分な迂回処理は避けたいんだろう
だから分岐の時点で15を先に持ってくると
>>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
仕様変更なんて起こらないだろ そんなこと言ったら再利用に便利なようにメソッド化しモジュール化すべきだと言うぞ俺は
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 }
うーん。仕様変更に弱いですか。 実際、どれぐらい式の評価回数が違うか数えてみると 1から100の数字の場合、3でも5でも割り切れる場合が7個 3で割り切れる場合が27個、5で割り切れる場合が13個 それ以外が53個、ケース型の式の評価回数は、 7*1+27*2+(13+53)*3=259回 入れ子型の場合、2*100=200回 ケース型はデータによって変動するわけですが、 最良の場合は100回、最悪で300回。
これはどうでしょう・・・ 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 }
拡張すると、1-100の各数に対して素因数を全て書き出せ、という問題に
615 :
デフォルトの名無しさん :2007/05/20(日) 08:31:31
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 }
そういうときはせめて 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入りの配列に変換すりゃいいんだろ」と思えるのなら
こんなん考えた 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 }
>>617 >>618 を使うなら
puts (1..100).to_a.map{|i| i.fizzbuzz}
ってとこか?
どこぞで不評だったputsの特別機能(配列は改行つきで表示)がこんなとこでなにやら便利に
620 :
デフォルトの名無しさん :2007/05/21(月) 13:07:42
>>617 切り替わるとやばいかな。のちのち値を追いかけるときやばくなるとかですか。
理由をもうちっと教えてください。
単にムダでイヤとかそういうスタイル上の理由じゃね str = String.new str = "hoge" と同じような無駄(1行目で作られたStringオブジェクトは2行目で破棄される) 何か「まずい」ことがおきることはないはずだよ
なにげにEnumerableインクルードしてるからな
まだやってんの蚊 お前ら人生の効率をもう少し重視したほうがいい
3の倍数でFizz、5の倍数でBuzz、7の倍数でFuzz、11の倍数で……
puts "1" puts "2" puts "Fizz" ・ ・ ・ じゃダメなのか? と基本的なボケをしてみる。
赤点ぎりぎりで合格!
こんなのはやっぱり反則? FizzBuzz.rb 1.upto(?d){|i|puts""==(a=$0[i*i%3*4-11..-4--i**4%5])?i:a}
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 ...にしかならなかった
ファイル名をFizzBuzz.rbにしてください。
ファイル作るの面倒だったのでirbで無理矢理動かした。 >> $0 = 'FizzBuzz.rb' >> 1.upto(?d){|i|puts""==(a=$0[i*i%3*4-11..-4--i**4%5])?i:a} 動作確認には十分。
普通に、"FizzBuzz"[i*i%3*4-8..-1--i**4%5] でよさそうなもんだが。
書き換えるのが面倒だったの
635 :
デフォルトの名無しさん :2007/05/30(水) 17:02:25
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) は違うし・・・
irb> a = [1, 2, 3, 4, 5] => [1, 2, 3, 4, 5] irb> a[-2] => 4
-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
s.split(//).each
確かに str.split(//e) が妥当だ(e は str の文字コード) 1文字ずつぶった切って配列にしてるんだなと読み下してもくれるし
s.scan(/./) s.split(//) 同じ長さだったか。
パスカルの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
マルチ乙
そんな事よりカレーの話しようぜ
宿題スレ行け→マルチ乙 これはひどい
回答してはいけないという空気?
いや、いいんじゃない? マルチと誤解されないためには、前スレに移動する由を書いとけばいい
それこそ「宿題スレのほうがいい」というアドバイスを受けたからこっち来たんだろ 移動した旨は移動時に既にあっちに書いてあるし、イジられる以上の非難を受ける謂れは無いと思われ
じゃ、とりあえず。いろいろ宿題の中身無視してるけ、どこんな感じで。 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
require 'enumerator' class Array def next_pascal enum_for(:each_cons,2).inject([self[0]]){|a,(i,j)|a<<(i+j)}<<self[-1] end end
添付ライブラリに、そういうのあったのか 勉強になった
655 :
デフォルトの名無しさん :2007/07/12(木) 08:00:41
アクセスログを読み取り、リモートホスト別に参照サイトを、 それぞれ時間順に表示するものを作りたいんです。 ホスト別に分け、さらにそれを時間順に並べ直すって所が分かりません ・・・要するに全く出来て無いんですが これはどう考えればいいんでしょうか?
リファレンスマニュアルを、暗記する勢いで熟読しろ String(文字列)とArray(配列)とHash(ハッシュ)とEnumerable(配列とハッシュに共通)の4つのとこだけでいい 「そういえば何かあったな」とか「何か使えそうなのないかな」と思いながら眺めるだけでいいから Enumerableのgで始まるとことかsで始まるとことか超お勧め
Apacheのアクセスログはsplit一発ではうまくいかないから面倒なんだよな 書いてみたけどメガなファイルを読み込ませるとしばらく固まるので注意 #!/usr/bin/ruby -Ke require 'time' path_to_log = './access_log_20070712' # ログファイルのパス re_apache_log = /^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/ def convert_time(str) # Apacheのログ時刻表記をTimeオブジェクトにして返す # (っていうかParseDateで対応して欲しい) if /(\d\d)\/(...)\/(\d\d\d\d):(\d\d):(\d\d):(\d\d)/ =~ str then return Time.mktime($3,$2,$1,$4,$5,$6) end end # ログファイルを行単位で配列にしたものの要素をさらにログ内容で区切る # => [ ["%h1,%l1,%u1,%t1,...], ["%h2,%l2,%u2,%t2,...], ... ] data = File.readlines(path_to_log).map{ |l| l.scan(re_apache_log).flatten } # 0番目のリモホでソートした後、3番目の時刻をTimeオブジェクトにした値でもソートする # sort_by{|a| [a1,a2,a3]} と書くと実質上a1でソート後a2でソートされa3でソートされる data.sort_by{|a| [a[0], convert_time(a[3])]}.each do |line| puts line.join(',') end
659 :
デフォルトの名無しさん :2007/07/12(木) 13:49:29
説明付きで書いてくださるなんて、有難うございます リファレンスも、もっとしっかり読んで勉強しておくことにします
660 :
デフォルトの名無しさん :2007/07/18(水) 01:38:04
joinなしで、配列をコンマ区切り出力 puts %w(a b c).inject(""){|r,i|r+i+","}.chop もっと短くならんかね
joinを使わない理由はなんだ? puts ['a','b','c'] * ','
>>661 のコードを実際にプログラム中で見たらピキッってなるな
それお前の完全な自己満足じゃねーか素直にjoin使えバカみたいな
FizzBuzzスレからの引用でしょ?
>661 >663 の言う通り、FizzBuzzスレで出た話題。要は言語問わず お前ら join のアルゴリズムぐらいは自前で書ける能力持ってるよな? って話。だから別に短くする必要はどこにも無いと思うのだが… >660ですら既にワンライナーし過ぎで気になるくらいだ
665 :
デフォルトの名無しさん :2007/07/18(水) 20:45:50
何、ファビッてるのー ゆかり(笑) 紫蘇人
平和だな 夏休みにRubyの宿題…なんて無いか
Rubyを授業に使うところも少ないだろうしね。 MLではどっかの学校で使ってるという人がいたけど
夏休み期間にかかるくらい大きな宿題(あるいは課題)をRubyで出す学校や大学はまだ無いだろうな あっても「来週までに作るように」とか「これまでの授業を踏まえて最後に課題をやるように」程度か
671 :
デフォルトの名無しさん :2007/09/20(木) 21:24:31
暇だから勉強がてらRubyで何か小物作ろうぜ
>>43-44 もの凄い亀レスだけど、この流れワロタw
こんな堂々とした丸投げはある意味、すっきりするかもしれん。
α寝台
最小の内角が120度の多角形があります。 それに続く内角がその前の角より5度ずつ大きい多角形を作る時、 その図形は何角形になるかを求め、図示せよ。 丸投げで申し訳ないですがよろしくお願いします。
1つずつ頂点をたどって、その点から次へ伸びる辺が 起点(基底辺)から何度なのかを考える pre_angle : 前の内角 pre_absolute_angle : 前の辺の起点からの角度 cur_angle : 今の辺の内角 cur_absolute_angle : 今の辺の起点からの角度 n : 辺の番号 cur_absolute_angle が360となった時、辺は閉じる 問題の定義から cur_angle=pre_angle +5 cur_absolute_angle=pre_absolute_angle + ( 180-cur_angle) となる n=1 のとき、 pre_angle=120 pre_absolute_angle=60 あるので後はこれをnを増やしていけばわかるはず
676 :
674 :2007/10/06(土) 23:38:27
はず、とか言われても困るんですが。 答えそのものを書いて下さい。
>>676 ふざけるな。
つーか、これRubyと何の関係があるの?
Rubyで解けってことじゃないの? と思ったけど、図示しろと書いてあるし、違うのかな?
n多角形の内角の和って、180(n - 2)だから、 180(n-2) = Σ 120 + 5(k-1) [k=1...n] を解けば何角形かわかるんじゃね?
681 :
デフォルトの名無しさん :2007/10/08(月) 00:41:32
> 答えそのものを書いて下さい。 いくらなんでも、ヒデエ態度w
>>674 >>図示せよ。
2chで図示ってAA職人の出番ですか?
683 :
デフォルトの名無しさん :2007/10/08(月) 01:29:33
ワロタ
中心点をきめてそこから頂点に結ぶと全体の角度の和は 180nになるな。で、中心の360を除けばいいだろ。 あとは好きにしろ。
n角形の内角の総和は180(n-2)だからn角形から(n+1)角形になると内角の総和は180度増える。 例)三角形(180度)→四角形(360度)→五角形(540度) 内角度が120,125,130,135,…と5度ずつ増える総和が180の倍数(180で割り切れる)になるのが答えの多角形では? Ruby勉強始めたばかりなので下手ですまない -------------------------------- angle_sum,angle_no = 0,0 now_angle = 120 flag = true while flag do angle_no += 1 angle_sum += now_angle puts "#{angle_no}: #{now_angle} sum=#{angle_sum}" flag = false if angle_sum % 180 == 0 now_angle += 5 end puts "result=#{angle_no}" --------------------------------- 1: 120 sum=120 2: 125 sum=245 3: 130 sum=375 4: 135 sum=510 5: 140 sum=650 6: 145 sum=795 7: 150 sum=945 8: 155 sum=1100 9: 160 sum=1260 result=9 --------------------------------- 検証:180 * (9 - 2) = 1260 答え: 9角形
作図するとしてさ、角度はともかく辺の長さはどうやって決めればいいんだ?
勘
>>686 辺の長さは決まらないだろう? 基準の長さが決められてないんだから。
形は決まるかもしれないが。
120n+5*((n-1)^2+(n-1))/2 = 180(n-2)
>>690 675の答えってまんまJavaスレの18のコピペやん
だから意外と根は深い
2次方程式の解なんて手計算で出せば良いだろう。
プログラミングができると、簡単にプログラミングに逃げてしまうのが欠点だな。 そういう俺も円周率求める課題にモンテカルロ法使ったりした訳だがw
9と16
>>690 つーかプログラミングの宿題なのか?
>>689 で出てる通り、中学生レベルの数学だろ。
手計算で終わりじゃん。
9と15
甘いな。問題文をよく読もう
>>674 >> (中略)
>>その図形は何角形になるかを求め、図示せよ。
この問題のキモは、プログラムで「図示」させる所にあるのだ
>>699 最初の辺の長さを維持して図形を作れば、最後の辺でどうにでも調整が利くんじゃね?
開いていく図形になるんだから。
全ての辺の長さを同じにしろっていう制限をつけたほうが良さげ。
L*cos(120)+L*cos(125)+L*cos(130)+.... = 0 L(cos(120)+cos(125)+....) = 0 だからLの長さ固定じゃどうにもならんな。
もとい、5度ずつじゃないか。 意味はかわらんけど。
>>700 ,701
一つの平面内という暗黙の制限をなくせばなんとかなる?
ちょっと難しすぎて考える気にならんのだけど。
一つの平面内で描けなきゃ意味ないな 逗子は難しいな
705 :
デフォルトの名無しさん :2007/10/14(日) 19:38:26
706 :
705 :2007/10/14(日) 19:39:03
ちなみに、golfしてもらっても構いません
丁度良さそうな難易度だったので挑戦してみたぜ。 関数型やった事ないんで、激しく勘違いしているかも しれないが、一応雰囲気はそれらしくしてみたつもり。 算術演算子3つ(加減算、大なり)と即値2つ(1,4243) だけで解いてみた。 ループのやり方さえ分からないところから始めたので、 自分にとってはかなりの力作。 greater = lambda { |a,b| a > b } add = lambda { |a,b| a + b } sub = lambda { |a,b| a - b } ONE = 1 ZERO = sub[ONE,ONE] N = 4243 shift_l = lambda { |n| add[n,n] } shift_r = lambda { |n| ret = lambda { |m,i| k = add[m,i] greater[shift_l[k], n] \ ? m \ : k } (rec = lambda { |i| greater[n, i] \ ? ret[ rec[ shift_l[i] ], i] \ : ZERO })[ONE] }
J3 = lambda { |n| d = (rec = lambda { |d| greater[d, shift_l[n]] \ ? d \ : rec[ add[d, shift_r[ add[d,ONE] ] ] ] })[ONE] sub[ add[ add [ shift_l[n], n], ONE], d] } print J3[N] ここでやるような事じゃないかも知れないけど、 誰か気が向いたら添削してくれると嬉しいな。
なんでそんなとこに \ 突っ込んでるんだ。素直にif使え。
cleanの初心者向け解説サイトを斜め読みしながら書いたんだけどさ、 条件分岐にはガード "|" というのを使うそうなんだ。 | [condition] = [expression] // 真 | otherwise = [exprassion] // 偽 これに似たような感じにしたかったんで、一文字の記号 : と ? で 縦に揃えてみたけど、あんまり似てはいないな。 上の式を素直に真似するなら本来こうなるはずなんだが、 [condition] ? [expression] : [expression] インデントが深すぎるような気がして3行にしてしまった。 今は反省している。
関数型言語のやり方を勉強してみようかと思い立ったけど、 処理系を準備するのが面倒だったので、手持ちのRubyで 擬似コードでも書いてみることにしたんだよ。 LispでもOcamlでも何でも良かったんだが、最初に見つけた 簡単そうな日本語の解説がcleanだったというだけのことで、 青木さんのHaskel本を入手できてればそっちだったかもね。
形だけ同じようにしてどうする RubyをCOBOLやFORTRANのように記述されてピキッと来たことはないのか? 関数型言語でないものに関数型言語の論理を持ち込むな
>>714 すまん、
>>705 みたいなやる気の欠片もないマルチ野郎には
相応の解答をしてやろうと思って、勉強ついでにやっただけなんだ。
ネタがスベったにせよ、スルーできずに文句が飛んでくる程とは
思ってなかった。
それについては申し訳ない。
それから、形だけというか、文法とか見た目だけ他言語チックに
されても不愉快という点には、まぁ同意なんだが……
(一応それも含めてネタの一環なんで、敢えてやってる)
関数型囓り始めたばかりの自分が言うのもなんだけどさ、
>関数型言語でないものに関数型言語の論理を持ち込むな
というのはどうかとおもうよ。
Rubyは一言で言えばオブジェクト指向言語なのだろうけど、
別に手続き型の書き方を否定してるわけじゃない。
手続き型の方がいい場合にはそれを支援する仕組みさえある。
Kernelに定義された”関数”とか、Math を includeするとかね。
毎度毎度 stdout.print "string" なんてやりたくないだろ?
Rubyは関数型言語譲りのλ式があって高階関数とかも
簡単に扱えるようにできてるんだから、関数型の方が適した
問題領域にはそれを使ったらいいじゃない。
関数型の書き方が合っていると思う一例。
びっくりするほど簡潔でわかりやすい。
def qsort(xs)
if xs.size <= 1
xs
else
x = xs.shift
qsort(xs.select { |v| x >= v }) + [x] + qsort(xs.select { |v| x < v })
end
end
WikipediaのHaskellの項からほぼ丸写ししたquicksortだけど
shiftで破壊的操作してるのは…まぁ、ご愛敬ということで。
引数に比較関数を受けて Enumerable#partisonで分割すると
もうちょっと気の利いた形になるかな。
あと、いまさらだけど、ついでなので
>>708 追記。
加算演算子要らなかった。
minus = lambda { |a| sub[ZERO, a] }
add = lambda { |a,b| sub[a, minus[b]] }
> shiftで破壊的操作してる 多重代入すれば(・∀・)イイ!! x, *xs = args
718 :
デフォルトの名無しさん :2007/10/22(月) 17:45:34
すみません 学校で宿題が出たのでソースは書いたのですが このままだと同じクラスのみんなにコピペされて みんな同じソースを提出という事態になりそうです そのなかで自分のソースだけは本物(オリジナル) であることを証明出来るような何かを同じソースに 埋め込むような方法はどんなのがあるでしょうか?
>>719 crypt関数かなんかで暗号化した文字列を、こっそりとコメントに埋め込む
で行けるかも。試したことないから分からんけど
>>719 気にするな
今は笑っちゃうほど簡単だが次の次くらいで自力で書ける人間と書けない人間の差が出る
次の次とか無いんです、というのなら諦めとけ
授業で習ってない使い方をしておくというのもあるが
ソースばらまいたのは自分じゃないのか
とりあえず親しい友人2、3人に見せたら、あっという間に広まった。
そりゃそうだろ 普通は誰もプログラミングなんてしたくない コピーするだけで校内マラソンがクリアできるならたいていの奴はそうする
いやプログラミングは楽しいよ。 俺が始めた頃は下手なゲームよりBASICでプログラム作る方が楽しかったなぁ。
自分は特殊だという自覚は持てよ
cryptした文字列埋め込んだとして 先生が理解してくれるかどうか
コメント書き換えると動かなくなるようにって出来ないのかな Rubyで
コメントを含んだソース全体をMD5化したものを ソースに入れておいて実行時は比較してから動作を変えるとか
どちらにしても「不自然」にはなるよ 授業で説明してない書き方を組み入れるのが一番 まあ、これは書いた人がRubyを気に入ってくれたという前提だけど
ソースをコピーされるのがいやで、 それを阻止するソースを他人に聞きに来る。 たかだか宿題でコピーなんて気にするな。
>ソース全体をMD5化したものをソースに入れておいて これどうやってやるんだろう MD5計算したあとにソース書き換えたら またMD5計算しなおさないと合わないよね
計算し直したものをまたソースに入れればいいよ
ファイル名をMD5にすればいいんでね?
MD5.rb
ソース配った後でMD5して意味あるのか?
SHA で hexdigest したソースを提出すればおk。
どっか縦書きで自分の名前入れとけよ
みなさん色々アイディアありがとうございます
>>736 ファイル名は課題番号なのでだめなんです
電子署名。
みんなコピペして自分の署名貼り付けたら意味ないような・・・ コピーではないことを証明するにはどうすりゃいいんだろう・・・
宿題マダァ?(・∀・ )っ/凵⌒☆チンチン
おれも
>>740 がいいと思う。
結構気づかれないんじゃない?
からころも きつつなれにし つましあれば はるばるきぬる たびをしぞおもふ 在原業平
>>719 俺のときは、アルゴリズムの演習の課題を、言語指定がなかったので、Delphiで出した。
当時、大学のメインマシンは、UNIXだったので、誰も真似できなかったな。
間違ってなかったので、無論、通った。
C言語の講義のときは、課題をC++(OOP)で書いて出した。
C++じゃねーか!って言われたが、結局通った。
はっきりいって、圧倒的にわかっていると思わせる書き方をして出すと、OK。
コピペされても、コピペした奴は、教師の質問やツッコミに答えられないので。
まあ、うちは、3流大学だったので、通用したんだろうけどなw
機械語を出力して、実行するスクリプトを書いてみるとかw 昔ベーマガで何度か見かけた手法。
みんなソースが既に流出してることは認識しているか?
>>749 なつかしいw
ベーマガなのに、なんで、機械語みたいなBASIC打ち込まされるのか、当時腹たってた
>>747 句読点の場所が変だってつっこまれたことない?
どうせ課題を見るのは院生だから、情報系以外の学科の場合、変なことすると理解されねーぞ
よくわからんけどすげー、って思ってくれないかな。
学部生の成果物を理解できない院生ってのもどうかと思うな。
逆に院生になっちゃうと、専門以外のことは案外知らないんじゃない?
課題は課題 Cの課題を採点するチューターが業務のCプログラムを読み解けるとは限らないし非難される謂れもねー 技巧つきでRubyの課題を提出する奴はDelphiやPerlの課題をJavaで書いてくるアホと一緒だ 「動くんだからいいでしょ」ってそれは「課題の」要件満たしてねえぞ 小学校の平行四辺形の面積求める理解力テストで積分使って面積求めてたらやっぱバツだろ
何が言いたいかわかんあい
>>758 ・学生は、学生らしくコード書いてろ
・ハッカーは必要ない
おまいはほんとうに見せたほうなのか という突っ込みはないの
>>747 院生がよく言うグチ
「フォーマットに従えよチェックめんどクセェんだよカス」
「課題にオリジナリティなんて要らねぇんだよ」
「まーたオナレポか!」
「講義の趣旨に沿えよだりぃ・・・」
763 :
デフォルトの名無しさん :2007/11/26(月) 21:09:32
宿題だしていいかい?
中はダメ・・・
765 :
デフォルトの名無しさん :2007/11/26(月) 21:30:25
むしろここだけでやったほうがいい
宿題をしてもらうまえに準備を。
http://www.uploda.net/cgi/uploader4/index.php?file_id=0000022859.zip まずこのファイルを 解凍してもらうと
comb.rb,ディレクトリdataA,dataBとdataCがでてきます。
dataAとdataBには3つずつファイルがはいってます。
dataCは出力用のディレクトリです。
今このプログラムは標準入力から3つ引数あたえて処理します。
1つめ、2つめが入力のファイルをあたえると3つめの引数ででてきます。
わからないのがファイル操作で、dataAにはいっているファイルを
1つめの入力、dataBにはいってるファイルを2つめの入力とします。
1つめの入力(1ファイル)に対して2つめの入力(3ファイル)をあたえ
3つめの入力でファイル名をあたえてそのファイルをdataCにいれてほしいんで
す。
つまり1つのファイル(dataA)にたいして3つのファイル(dataB)で処理を行い
dataCディレクトリにファイルを出力してほしいんです。それを3回ということ
でdataCには9個できるわけです。Cにできるファイル名は適当でいいです。
お願いします。最近ruby全然やってなくて素人なみに忘れてしまったんで。
わかりにくければ質問してください
767 :
デフォルトの名無しさん :2007/11/26(月) 22:08:30
>>766 ruby の前に日本語を勉強し直してくれ
ruby comb.rb dataA/s1.16k dataB/p1.16k 1.16k で1.16kというファイルができるとおもうんですよ。 でdataAの3つのファイルとdataBの3つのファイルかけあわせて9このファイル をつくってほしいんです。
769 :
デフォルトの名無しさん :2007/11/26(月) 22:16:31
Dir.glob("dataA/*").each do |data_a| Dir.glob("dataB/*").each do |data_b| system "ruby comb.rb #
770 :
デフォルトの名無しさん :2007/11/26(月) 22:17:38
途中で送信した Dir.glob("dataA/*").each do |data_a| Dir.glob("dataB/*").each do |data_b| system "ruby comb.rb #{data_a} #{data_b} #{data_a}___xxx___#{data_b}" end end
できれば出力するファイルをoutputCへいくようにしてほしいんですけど
772 :
デフォルトの名無しさん :2007/11/26(月) 22:24:11
>>771 >>770 を hetare.rb という名前で保存して
以下の内容を
--ここから--
@echo off
ruby hetare.rb
copy * outputC
--ここまで--
hetare.bat という名前で保存して、hetare.batを実行する
linux なんすけど
775 :
デフォルトの名無しさん :2007/11/26(月) 22:44:03
linuxってそんなにハードル下がっているのか? #!/bin/sh ruby hetare.rb cp * outputC これでいいだろ。
776 :
やばす :2007/11/26(月) 22:44:57
今宿題でrubyで最大値を出すプログラムを作れって。。。 かなりぐぐったがむりぽ。。 だれか教えてくだされ。Array#maxを使うと良いらしいですが、 スーパーツンデレFラン大なので、以下が限界っす。 a = Array.new 10.times do a.push(rand(10)) end a.each_with_index {|x, idx| print "[#{idx}]:#{x}\n" } print "最大値は#{a.max}です♪\n" 誰か丸投げ用のテンプレ作れや。
hetare.batの実行の仕方がわかりません
>>770 の、最初に
i = 0
で三つ目の引数を
outputC/#{(i+=1).to_s}
とでもすればいいよ
ありがとうございます
>>766 ほらよ
http://www.uploda.org/uporg1131424.txt >f1 = File.new(file1,"rb")
>a1 = f1.read.unpack("s*")
>f1.close
a1 = File.open(file1,"rb"){|io| io.read.unpack("s*")}.map{|i| i.to_f}
ブロックで囲めばファイルクローズまでしてくれる
ややこしいので読み込んだらすぐに配列に対してmapを使って全部Floatに変えてしまえ
あとでもめる
>for i in
[email protected] do @big[i] += @small[i] end
@small.length-1だろ。nil参照して落ちるぞ
>gou = Gousei.new
>gou.set(arga[0],arga[1])
>gou.gousei(arga[2])
Gousei.set(file1,file2).gousei(file2)
めんどくせぇのでメソッドチェーンで一気にやっちまえるようにクラス書き直し
配列を x 個にほぼ均等に分ける関数ってどう書けば良いでしょうか。 例えば、([8,5,2,3,1,4,6,7,9,0],4)という引数を与えると [[8,5,2],[3,1,4],[6,7],[9,0]] が返るようなものです。
とりあえず、それぞれの個数を数えてやってみた 無駄多いかな? def hoge(ary, x) ary = ary.dup kosuu = Array.new(x,0) i = 0 ary.each{ kosuu[i] += 1 i == (x-1) ? i=0 : i+=1 } result = Array.new(x){Array.new} x.times{|i| kosuu[i].times{|j| result[i] << ary.shift } } result end
#これでどや def balance_split(src, n) dst = Array.new(n) i = src.size%n s = src.size/n n.times do |m| s.times do dst[m] = Array.new unless dst[m] dst[m].push src.shift end if i > 0 dst[m].push src.shift i -= 1 end end return dst end p balance_split([8,5,2,3,1,4,6,7,9,0], 4) #=> [[8, 5, 2], [3, 1, 4], [6, 7, 9], [0, 33]]
require "benchmark" array = Array.new 10000.times{|i| array.push i} Benchmark.bm do |x| x.report do balance_split(array, 4) # hoge(array, 4) end end --------------------------------------- balance_split user system total real 0.016000 0.000000 0.016000 ( 0.016000) hoge user system total real 0.031000 0.000000 0.031000 ( 0.031000) hogeはループ2回まわしてるからな・・・
src.size に コストがかかるようなケースは?
挿入するときに詰めていく方法 (8 5 2 3 1 4 6 7 9 0) . 4 (8) () () () (8) (5) () () (8) (5) (2) () (8) (5) (2) (3) (8 5) (2) (3) (1) (8 5) (2 3) (1) (4) (8 5) (2 3) (1 4) (6) (8 5) (2 3) (1 4) (6 7) (8 5 2) (3 1) (4 6) (7 9) (8 5 2) (3 1 4) (6 7) (9 0)
挿入するときに閾をずらしていく方法 (8 5 2 3 1 4 6 7 9 0) . 4 8 | | | <- (1,3,5) 8 | 5 | | <- (1,3,5) 8 | 5 | 2 | <- (1,3,5) 8 | 5 | 2 | 3 <- (1,3,5) 8 5 | 2 | 3 | 1 <- (2,4,6) 8 5 | 2 3 | 1 | 4 <- (2,5,7) 8 5 | 2 3 | 1 4 | 6 <- (2,5,8) 8 5 | 2 3 | 1 4 | 6 7 <- (2,5,8) 8 5 2 | 3 1 | 4 6 | 7 9 <- (3,6,9) 8 5 2 | 3 1 4 | 6 7 | 9 0 <- (3,7,10)
>>786 それはデータ構造に無理があるか、あるいはそもそもRubyでやるべきではない事象
それを考慮する処理を考えるくらいなら内職でダイレクトメールにシール貼ってたほうが有意義
8 | | | <- (1,1,1) 8 | 5 | | <- (1,2,2) 8 | 5 | 2 | <- (1,2,3) 8 | 5 | 2 | 3 <- (1,2,3) 8 5 | 2 | 3 | 1 <- (2,3,4) 8 5 | 2 3 | 1 | 4 <- (2,4,5) 8 5 | 2 3 | 1 4 | 6 <- (2,4,6) 8 5 | 2 3 | 1 4 | 6 7 <- (2,4,6) 8 5 2 | 3 1 | 4 6 | 7 9 <- (3,5,7) 8 5 2 | 3 1 4 | 6 7 | 9 0 <- (3,6,8)
def balance_split(a,x) a = a.dup r = [] until a.empty? do r << a.slice!(0, a.size.quo(x).ceil) x -= 1 end r end
すごい やればどうにでも出来るもんだな
793 :
782 :2007/11/30(金) 03:44:01
ありがとうございます。 よく考えたらこれ、要は10と4が与えられた時 (3 3 2 2)を求めるアルゴリズム? ただ分ける対象が配列になってるだけで… 既に名のあるアルゴリズムだったりして…?
アルゴリズム以前の問題
795 :
デフォルトの名無しさん :2007/11/30(金) 06:34:14
子供笑うな来た道だ 年より笑うな行く道だということわざがあってな
796 :
デフォルトの名無しさん :2007/12/01(土) 03:24:16
すいません。私は大学2回生なんですが、どうしても出来ないRubyの問題があります。。 どなたか助けてください! 【以下が課題】 ・単語の出現頻度(TF値)を求めるプログラムを書け。 なお、抽出元はテキストファイルとする。(a.txt) ・上記の"a.txt"の中身は何でも良い。 ・データベースへの登録は特に必要としない。 単純にテキストファイルから単語の出現頻度を求めるという問題です(×_×) テキストファイルを読み込んで頻度を求めれば良いと思うんですがよくわからず困っています。。 この際、形態素解析を行う方がbetterなんですが、時間もないので無理かと。。 とりあえず、テキストファイルの中のTF値を求めるプログラム、教えてください!お願いします!
単語の切れ目を定義し切り出す 単語ごとに累計を求める
単語とは何か、という定義から始めなければならない気もする 面倒だし数え上げデータベースは単語をキーとするハッシュで代用しよう data = {'単語1' => 回数1, '単語2' => 回数2, ...} みたいな感じで ハッシュなら適当に新規作成も上書きもできるから、単語が出現したときにdata['単語1'] = data['単語1'] + 1 とすればいい あーでもこれだとdataに'単語1'が登録されてないときは「nilは足せません例外」で止まるから何かフォローしとかないと駄目だなー たいていテキストファイルの中身は英文でよいということになってるはずなんだが、もし日本語文が前提ということなら鬼だ 英文なら単語区切りはスペースとタブ文字とコンマとピリオドと!と?と改行とクォーテーションマーク類(の連続)でよかんべ ハイフンの直後が改行だった場合はハイフンと改行を取り去って連結してひとつの単語とみなさなければならないが面倒だしパスするか とかいうことを思った
799 :
デフォルトの名無しさん :2007/12/01(土) 07:01:42
問題文にはテキストが英語だとはどこにも書いてないな なんでもいいということだから 都合よく英語のみと解釈してプログラム書いてさっさと提出するのもよし 日本語突っ込んで一生を棒に振るのもよし
おなじ「と」でも 単語「と」みなさなければならない と タブ文字「と」コンマ「と」ピリオド「と」 は違う単語だよな 別々に数えるべきだよな?
>>800 形態素解析や構文解析でぐぐれ
スレの範疇を超えている
日本語文章なら厄介というか学部2年の課題ではきつ過ぎるだろうから英語文章と考えると 単にString#splitを使ってやれば良いだけでは. tf = Hash.new File.open("a.txt"){|io| io.read}.split(/\s/).each do |word| if tf[word] tf[word] += 1 else tf[word] = 1 end end p tf
>>801 いや、単語に分ける話というより
ハッシュで数えちゃだめだろっていう話
英語の who でも指示代名詞の場合と関係代名詞の場合と・・・(ry
tf = Hash.new File.open("a.txt"){|io| io.read}.split(/\s/).each {|w| tf[w] = tf[w] ? tf[w] + 1 : 1} p tf
tic-tac-toe は一語なんかな三語なんかな ハイフンとって tictactoe とすると別の単語になるから困るな
808 :
デフォルトの名無しさん :2007/12/01(土) 10:11:37
796です! 前述した課題なんですが、おれは私個人的に解きたい問題であって、決して大学の課題とかではありません。。 Rubyのプログラムを勉強しているところなので。。 議題にあがっているんですが、出来れば日本語の出現頻度をとりたいっす。 やっぱり日本語だと形態素解析は必要ですかね?? 「ファイルを読み込み、日本語文書の出現頻度を調べる」、これがやりたいんです!!
> 日本語文書の出現頻度 まず日本語をやりなおせ
>>808 単語分割する一つの方法としては,漢字とひらがなとカタカナの境界を利用するのが有効だ.
実際,前述の文章を分割してみれば,
/単語分割/する/一/つの/方法/としては/,/漢字/とひらがなと/カタカナ/の/境界/を/利用/するのが/有効/だろうね/./
となってそれらしくなる.ただしこれは,仮名漢字混じり文の場合だけだ.
ちゃっともんちーのえっちゃんとちゅっちゅしたいよう
なんて文章は無理.これを分割するには,膨大な読みがなの辞書が必要だ.
ちゃっともんちー 固有名詞
えっちゃん 人名
ちゅっちゅ 擬音語
って感じのやつな.
だから1人では出来ない.
しかも時間とお金がかかる.読みの辞書は手作業で作らざるをえないからだ.
だから君のしたい事はアルゴリズムだけでは無理.
そしてここはアルゴリズムを考える場所でも辞書を作る場所でもない.
知りたかったら以下の本の1章だけでも立ち読みするのだ.
『自然言語処理−基礎と応用−』'電子情報通信学会
『自然言語処理』 岩波書店
そーいや JUMAN は Ruby バインディング無いんだっけ?
がんばっておまえのライフワークにしてくれ そしてMSの糞IMEを置き換えてくれ
IMEが嫌ならSKKでも使ってろ
丸投げも大丈夫ですか? Webで以下の通り動作する住所録プログラムを組め。 ・氏名、住所、郵便番号、電話番号、Eメールアドレスのデータを管理する。 ・データの追加、削除、変更、表示ができる機能を持っている。 ・表示には出力ボタンをセットし、クリックするとcvs形式で出力される。 Rubyのバージョンは1.8です。期限は12月7日です。よろしくお願いします。
require 'himajin'
>>817 LoadError: no such file to load -- himajin
from (irb):1:in `require'
from (irb):1
from :0
と出ました。どうすればよろしいでしょうか?
>>817 require "himajin.rb"
でできました!
ありがとうございます!
himajin Ruby Brigadeでも立ち上げてくれ。
>>815 は課題としてはわりと極悪の領域だと思う
でも、どうせ総合まとめ問題としての課題なんだろ?
こういうのは「積み上げたベースになると期待されてる既存のプログラム」も出してもらわないと、
課題の流れを完全無視したヘンなのしか作ってやれんぞ
極端な話だがRoRでゼロから作って提出しても0点だと思うし
とか期限1週間後にアドバイスしてみる
極悪というほどでもないと思うけど・・・ 普通これくらいは課題で出されるぞ
課題で出される場合はそれまで習ってきたバックグラウンドがあるからなあ 今までFile#openとFile#readしか習ってないならPStoreもSQLiteも使ったら駄目だろうし CGI.rbを習ってないならnet/httpしか使えないかもしれないし、下手したらコマンドラインでruby ./hoge.rbと実行する方法しか習ってなくて 登録と削除とファイル出力はひとつのCGIに引数で区別させるのではなく別cgiを単体のコマンドとみなして叩かないと駄目かもしれない 自作クラスの概念を習ってないなら関数的にダラダラ書かないとやっぱマズいとも思うし
824 :
デフォルトの名無しさん :2007/12/14(金) 16:30:00
まあどうあれ期限後に想像で話すこっちゃないな(w そういうのは期限内に当人に問いただせよ 相変わらずRubyの宿題募集中だが 「どんなことを習った上での課題なのか」は こっちから聞き返す可能性があるのでそこんとこはよろしく 中学生の数学の宿題に高校の微分積分使った解答書いたら変だろ?
ここの住人はさらっと1行で書くから困る
データの追加や変更はエラーとか無視すればすぐできたが フォームつきのHTMLを行き当たりばったりで書くのがめんどくさいな 設計とかきちんと考えてから作ったほうが面倒がないかもしれない
827 :
デフォルトの名無しさん :2007/12/15(土) 18:35:50
>>824 JavaやC/C++みたいにテンプレ作るか?
[1] 課題文(含コード&リンク):()
[2] Rubyバージョン
[3] 期限: ([yyyy年mm月dd日hh:mmまで] )
[4] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
人もお題も少ないし、書き込みがあったときに不足があれば聞き返すくらいでちょうどいいかと思われ 件のは期限に対して明らかにめんどくさそうだからスルーされただけかと
829 :
デフォルトの名無しさん :2007/12/20(木) 01:08:19
どうしてもやってほしい問題があります! ・プロンプト画面にて(プログラム実行中)複数あるテキストファイルを指定し, ファイルの中身を出力しなさい. この問題,教えてください!! プロンプト画面でテキストファイルのファイル名を入力したいです. テキストファイルは複数ある過程でお願いします.
ARGVで取って出力してshiftして繰り返して、とかそんな感じでどうぞ
我ながらなんという適当… 質問の日本語がふわふわしすぎてて萎えた。 require 'readline' require 'shellwords' while buf = Readline.readline('>', true) inputs = Shellwords.shellwords(buf) begin break if /quit/i =~ inputs.first while path = inputs.shift puts File.read(path) end rescue => ex puts ex.message retry end end
rescue retry、後置if、shellwords、これそのままだして、大丈夫かねw
コードについて質問されたらあぼ〜んしそう
嫌がらせかオナニーだろ かわいそうに
前者です
すいません、 ・1文字の変数、2項演算子+、−、*、/、()を含む式を読み込み、これを逆ポーランド記法に変換し、出力するスクリプトを作成せよ。 ただし、入力される式の構文は正しいものと仮定する(すなわち、構文チェックはしなくてよい) この問題お願いします。
step1. 式から二分木による構文木を作成する step2. 構文木を後順走査でなぞると逆ポーランド記法になる
…… …アドバイスとしては正しいな それのひとつ前の問題でどんなことを習ったのかが気になる
構文チェックしなくてよいってのが気になるな 「構文解析せず」に逆ポ記に「変換」するのか・・・? うーむ・・・
doukakuかgolfに持ち込むと面白い解がつきそうな問題
(a + b 括弧閉じてない a * / b 演算子だけが続けて現れてる のような変な入力のことは想定しなくていい、ということだろうね。
>>839 構文解析に失敗した場合に、綺麗にエラーを出さないで変な挙動をしても良い、ってことじゃないだろうか。
じゃあ鼻から悪魔を出そうぜ。
ぐぐってみたらるびまでたった2行で実現してて悔しいので見なかったことにします
え〜となんか例としてこんな風になればいいそうです (例) >(a+b*c)+d/(e-f) abc*+def-/+
演算子順位構文解析を実装しちゃうな おもしろそうだから
yaccで書いてexecしろ
._0なら可だが、.0は無理っぽいですね。
str = "abcdabca" 何かのライブラリ::(str) ってゆーソースがあるんですけど、(ちゃんとstrに対して処理してくれました。) このstrに対する処理をファイル(abc.txtとかのテキストファイル) にさせたいのですが、どう書けばいいでしょうか? ちなみに ruby ファイル名 で実行したら、読みこませたいファイル名を入力したら読み込んでライブラリの処理を行わせるようにしたいです。
ファイルを開いてファイル内容を変数に読み込む、という作業に対しての勉強が要る Fileオブジェクトのopenメソッドとreadメソッドかな あと、実行時の引数に指定された文字列をどうにかしたい場合はARGVという組み込み定数に関する知識が必要 宿題スレなのでそれっぽくアドバイスしてみた
def n(s) puts s end n(ARGF.gets)
855 :
852 :2007/12/25(火) 14:09:06
解決しました。いや〜、理解するのに時間はかかりましたが↓↓ みなさんありがとうございました。
悪い子の宿題はねがー
857 :
デフォルトの名無しさん :2007/12/26(水) 18:22:41
教えて下さい。お願いします。 「Rubyで簡単なデータベースを作れ」という宿題です。ハッシュを利用して作れとのことでした。.txtを読み込んで表示までは簡単だったのですが、.txtに書き込むことが出来なくて悩んでます。クラスを使うのかなと思って色々試してますが、出来ません。 何かいい方法ないでしょうか。よろしくお願いします。
読み込むテキストファイルにデータがどのように書かれていたかによると思われ きっと、テキストファイルに書き込むときにも同じように書き込まないといけないはずだから
859 :
デフォルトの名無しさん :2007/12/26(水) 21:31:06
返答ありがとうございます。 イメージでは… 人間 22 A 文章 犬 10 A 文章 虫 1 B 文章 と書いたテキストから、検索してマッチした行をとりだす。または、テキストに新しく加える。 検索して取り出すか、テキストに書き込むか、プログラムを使う人が決められるように作ろうとしてます。 実行すると 検索するときは"a"、データに加えるときは"b"を入力してください。… という感じです。 検索だけ、加えるだけで上手く行ったのですが、二つを合わせると上手くいきません…アドバイス、またはプログラムの例をお願いします。よろしくお願いします。
どうせまたdupとかcloneとかの話じゃねーの?
あなたの勝手なイメージはいまはまだどうでもよくて、宿題として既存のデータ例があるんじゃないの? 「氏名で検索して血液型と年齢と住所を表示あるいは追加訂正できること」とかそういう どんなデータを格納するかも宿題として指定されてないの? 今までRubyでどこまで勉強したのかも気にはなるが
課題の文章はなるべく全文書いてほしいよね 課題に沿わないのを目見当で作って提出したらバレると思う
イメージでは、エスパーしないといけんからな
864 :
デフォルトの名無しさん :2007/12/27(木) 12:08:23
返答ありがとうございます。 …自由です。例とかはありません。ハッシュを勉強して、クラスも勉強して…自由課題。使用言語はRuby。なんでもいいからデータベース。検索、追加できるように。とだけ言われました。 なのでどうすればいいのか…。イメージするので精一杯で…本当にすみません。 よろしくお願いします。
……もしかして、学校の授業じゃなくて会社の課題か何かか? 「Rubyは学びやすいから独学でデータベースもどき作って見せてみて」みたいな いや、Hashを勉強しろと言われるレベル(つまり基本的なHashをロクに学んでない)と 「データベースっぽいもの作れ」との間にはかなり習熟レベル上の溝があるようにも思うんだが とりあえず、ファイル読み込みや保存のことはひとまず忘れろ。面倒だから。 スクリプトの最初で3つくらい自前で詳細データをデータベース変数に入れとくようにして作り始めるのが吉。 で、もしそれはできている(データベース用変数への追加や削除や変更はできている)のなら、ファイルへの保存はPStoreを使うといい。 変数を「そのまんま」保存して「そのまんま」読み込めるから。 以下のスクリプトを連続で実行すると前回実行時の結果の配列の末尾に現在時刻がどんどん追加されていく require 'pstore' NOW = Time.now.to_s # 今の時刻 DB_PATH = 'timelog.pstore' # 保存用ファイルのパス timelog = Array.new # データベース用変数 if FileTest.exist?(DB_PATH) then PStore.new(DB_PATH).transaction{|db| timelog.replace(db['timelog']) # 保存用ファイルが存在した場合ファイルのデータベース内容で置き換える } end timelog.push(NOW) # データベース用変数に末尾に今の時刻を追加 puts timelog # データベース内容を表示してみる PStore.new(DB_PATH).transaction{|db| db['timelog'] = timelog # 「timelog」という名前でtimelogを保存 }
横からすいません ある学生の全履修科目の成績から評定平均を求める関数的メソッドを定義せよ。また、この関数的メソッドを利用して 全学年の成績ファイル(出席番号順)を読み込み、各学生の評定平均を求め、成績順位リスト(評定平均順)を出力するスクリプトを作成せよ。 ただし、成績ファイルの各行は次のような形式とする。 出席番号 氏名 科目名1:評価1 , 科目名2:評価2 ...... 申し訳ありませんがこれもお願いできないでしょうか
867 :
デフォルトの名無しさん :2007/12/27(木) 20:38:21
評定平均ってなんだ?
成績を1〜5で評価したときに全部足した後科目数で割ったやつのことです 例えば 英語3 数学 4国語 5理科 5社会3 のときは(3+4+2+5+3)/5で4.0となります。小数点第1位まで求めます こんな説明でいいでしょうか
Rubyでどんなこと習ったかも言わないと、教科書に載ってないクラスを駆使した 質問者には何書いてるかわからないスクリプトが返ってくるぞ 評定平均は学校用語だけど、一人の学生の全科目の5段階評価の算術平均(足して科目数で割る)でいいよね あと、具体的な成績ファイルってないの? 出席番号は数字なのかどうかとか全角なのかどうかとか 氏名は空白で姓名を区切ってはいないことが確定なのかとか 科目と評価の繋ぎは全角の:で間違いないのかとか 出席番号や氏名を区切ってるものは全角空白1個でいいのかとか 科目を羅列するのに使われてるのは半角コンマだけどこれでいいのかとか 評価は全角整数なのか半角整数なのかとか そういうことが気になって仕方がない(というかわからないとファイル内容から読み取れない)んだけど そのへんはどうよ
紙に印刷されてて空白かどうかはよくわからない、という答が返ってくると予測 成績ファイルは見栄えが似てさえいれば自前で勝手に作っていいのかな?
完成すればいいので使いやすいクラスで書いてくださって結構です。 評定平均はそれでいいです。 すいません、具体的な成績ファイルはありません 成績ファイルも自分で作成です。 よろしかったら全部半角でお願いします。
873 :
デフォルトの名無しさん :2007/12/27(木) 21:00:46
このスレって教えてくれというよりも作ってくれだな。
>>872 以下から授業で見たことのある書き方を全て選べ
File.open
File.read
open
each_line
if /何か/ =~ 変数
配列変数[数字]
scan
split
push
sort
sort_by
puts
print
>>873 暇潰しに丸投げしてくれってスレでもあるわけだしお互い様かと
>>874 File.open
File.read
open
each_line
if /何か/ =~ 変数
配列変数[数字]
scan
split
push
sort
sort_by
puts
print
全部見たことあります。
# seiseki.txt 0001 相田健介 国語:3 , 数学:3 , 理科:5 , 社会:2 , 英語:3 0002 飯山健吾 国語:2 , 数学:5 , 理科:4 , 社会:2 , 英語:2 0003 宇井修 国語:5 , 数学:3 , 理科:3 , 社会:4 , 英語:4 0004 江川太助 国語:4 , 数学:4 , 理科:3 , 社会:2 , 英語:3 0005 大井川泰幸 国語:5 , 数学:5 , 理科:5 , 社会:5 , 英語:5 # kadai.rb def heikin(seiseki) sum = 0.0 seiseki.each{|i| sum = sum + i.to_f } return (sum / 5) end data = Hash.new File.open('seiseki.txt').each_line{|line| line.scan(/(.+?)\s+(.+?)\s+(.+)/){ no = $1 seiseki = $3.scan(/:(\d)/).flatten data[no] = [line,seiseki] } } list = data.sort_by{|a| heikin(a[1][1]) }.reverse list.each{|e| puts e[1][0] }
すいません 実行すると 0005 大井川泰幸 国語:5 , 数学:5 , 理科:5 , 社会:5 , 英語:5 0003 宇井修 国語:5 , 数学:3 , 理科:3 , 社会:4 , 英語:4 0004 江川太助 国語:4 , 数学:4 , 理科:3 , 社会:2 , 英語:3 0001 相田健介 国語:3 , 数学:3 , 理科:5 , 社会:2 , 英語:3 0002 飯山健吾 国語:2 , 数学:5 , 理科:4 , 社会:2 , 英語:2 ってなって出席番号 氏名 の後に評定平均がでません
>>877 そりゃ問題に評定平均も出力しろなんてことは一言も書いてなかったからな
最初のリストを並べ変えるだけだと思ってプログラム作ったもの
あーじゃあひとまずパス
他の人か気紛れに期待しとけ
期限はいつまで?
言葉が足りずすいません。 期限は1月10日までです
>>877 書いてみたよ。
名前のあとに、()付きで平均をいれた。
そのままでもよさそうだが、一応小数点第一位までに。
def heikin (l)
l.inject(0.0) {|r, v| r + v } / l.size
end
num_name = /\A(\w+\s+\w+)/
ARGF.readlines.map do
|line|
next unless hyouka = line.match(/#{num_name}\s+(.+)\Z/).to_a[2]
[heikin(hyouka.scan(/\w+:(\d+)/).map {|it,| it.to_i }), line]
end.
sort_by {|v,| v } .
map {|h, l| l.sub(num_name, "\\1 (#{(h * 10).floor / 10.0 })") } . # <<
reverse .
display
なにやら悪意を感じるスクリプトだな
882 :
デフォルトの名無しさん :2007/12/28(金) 21:13:47
>>865 さんありがとうございます。
実は大学の課題です。
あまりRubyについて勉強してないんですが、単位が欲しいならやってこいと。
Hashについては、格納の仕方と正規表現での取り出し方しか学んでません。
1000以上のデータを格納し、追加出来て、取り出せるものに。
データは3つ以上の要素を含むものに。
んで、できたらCGIにしてね^^とのことでした。
期限は1月10日までです。
大学のPCを使用しているので、29〜1月3日まで使用できないです。
自宅PCはwindowsXPなので、rubyとRDEを入れて自宅でやろうとしましたが、
大学の環境(unix,emacs,kterm)と違いすぎるので断念しました。
教えていただいた内容を元に、やってみますありがとうございます。
そこは断念するところじゃないだろ・・・
むしろKconv
Emacs上でRuby-modeとEmacsの編集機能を駆使してバリバリプログラミングしてるんだよ きっと
886 :
デフォルトの名無しさん :2007/12/28(金) 21:57:08
>>883 さん
やってみたんですが、XPでruby使う環境を勉強して時間をかけるより、
大学に行ってハッシュとかクラスを使ったプログラムを書いたほうが、
いいのかなと思いました。
888 :
デフォルトの名無しさん :2007/12/28(金) 22:58:07
>>887 ありがとうございます。
上記をダウンロードして、はろーわーど表示させたのですが、
ファイル保存やろうとして上手くいかなかったのでやめました。
emacsとktermに近い感じでプログラミングすることはできるのでしょうか。
すみませんが、教えてください。
ぐぐッて出た、RDEとメモ帳でどちらもやってみました。
一番使いやすいと感じたものを教えてください。
お手数ですが、よろしくお願いします。
つーか、windowsアプリでファイルの保存ができないのか? コマンドプロンプトを開いて ruby -v は打てるのか?
>>880 すいません、実行しても何も反応が返ってこないんですけど
どうすればいいでしょうか?
>>890 あちこちにあるピリオドは画面の汚れじゃないぞ。
ARGF使ってるから入力待ちになってるんだろう 実行時に成績データの入ったファイル指定すればいいんじゃね ruby kadai.rb seiseki.txt
>>891 コピー&ペーストで実行したんで写し間違いとかはないとおもうんですけど
894 :
デフォルトの名無しさん :2007/12/29(土) 00:29:53
はい、打てます・・・。
>>892 たびたびすいません。今度は
kadai.rb:7:in `sort_by': undefined method `<=>' for nil:NilClass (NoMethodError)
from kadai3rb:7
となってしまいます
>>895 すまん。
文字コード指定するっていうのを書くの忘れてた。
ruby -Ku kadai.rb seiseki.txt
として動かしてくれ。
-Ku のところは成績ファイルの文字コードで、
UTF-8 なら -Ku
SJIS なら -Ks
EUC なら -Ke
ね。
少し変なとこあったので1行追加しといた。
def heikin (l)
l.inject(0.0) {|r, v| r + v } / l.size
end
num_name = /\A(\w+\s+\w+)/
ARGF.readlines.map do
|line|
next unless hyouka = line.match(/#{num_name}\s+(.+)\Z/).to_a[2]
[heikin(hyouka.scan(/\w+:(\d+)/).map {|it,| it.to_i }), line]
end.
compact .
sort_by {|v,| v } .
map {|h, l| l.sub(num_name, "\\1 (#{(h * 10).floor / 10.0 })") } . # <<
reverse .
display
unixで、ktermなら、 cygwinと、Poderosa(もしくは、putty)いれれば解決 emacsは、どうせ、使いこなしてないだろうから、 xyzzyと、ruby-modeで代用(ならんかw
コピペして保存するだけなんだからメモ帳で十分だろ...
悪意に満ちたコードだなぁ・・・ というかオナニーだw
できました 本当にありがとうございました
902 :
デフォルトの名無しさん :2007/12/29(土) 13:47:08
>>897 さん
cygwinとputtyをどりあえずダウンロードして使ってみます。
助言ありがとうございます。
これ説明してみろといわれたら撃沈するぞw
map {|h, l| l.sub(num_name, "\\1 (#{(h * 10).floor / 10.0 })") } . # << ここ難しいと思う というかじっくり本腰入れて読み解かないと何やってんだかさっぱりわからん(w
一個一個 pで出力セナ俺にはわからんw
宿題に説明しろって文は入ってなかったので 多分大丈夫です
説明機会が無いなら俺はこれを即0点にするか直接呼び出して説明聞くなあ その先生がRubyを多少なりとも理解していれば理解しているほど、このスクリプトは奇妙だと感じるはず 君がこれに何も感じないのは単に君がRubyを知らないからに過ぎない
先生「これはなにかね」
>>1 「チェーンコンボです」
先生「チェーンコンボとは何ですか」
>>906 「コンボです。」
先生「え、コンボ?」
>>906 「はい。コンボです。読みにくさでプログラマに大ダメージを与えます。」
先生「・・・で、そのコンボは習熟度を測る課題提出で何のメリットがあると考えたのですか」
>>906 「はい。エディタが破壊されてもコマンドラインから1行で書けます。」
先生「いや、エディタを使わない授業はありません。それに課題はファイルで提出するのですよね」
>>906 「でも、Perlにも勝てますよ。」
先生「いや、勝つとかそういう問題じゃなくてですね・・・」
>>896 質問者関係ないのだが、
seiseki,txt入れると、妙な出力になるんだが、仕様?
0005 大井川泰幸 (5.0) 国語:5 , 数学:5 , 理科:5 , 社会:5 , 英語:50003 宇井修 (3.8) 国語:5 , 数学:3 , 理科:3 , 社会:4 , 英語:4
0004 江川太助 (3.2) 国語:4 , 数学:4 , 理科:3 , 社会:2 , 英語:3
0001 相田健介 (3.2) 国語:3 , 数学:3 , 理科:5 , 社会:2 , 英語:3
0002 飯山健吾 (3.0) 国語:2 , 数学:5 , 理科:4 , 社会:2 , 英語:2
reverse時に、おかしくなってるっぽいんだが・・・
> ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
うはwwww seiseki.txtに最後改行いれてなかたwwww
>>896 の出力がおかしなところがあったので、2行追加
def heikin (l)
l.inject(0.0) {|r, v| r + v } / l.size
end
num_name = /\A(\w+\s+\w+)/
ARGF.readlines.map do
|line|
next unless hyouka = line.match(/#{num_name}\s+(.+)\Z/).to_a[2]
a = [heikin(hyouka.scan(/\w+:(\d+)/).map {|it,| it.to_i }), line]
end.
compact .
sort_by {|v,| v } .
map {|h, l| l.sub(num_name, "\\1 (#{(h * 10).floor / 10.0 })") } . # <<
reverse .
each { require 'enumerator' } .
enum_for(:each_with_index).map {|v, i| v } .
display
「評定平均を求める関数的メソッド」の立場が非常にどうでもいいものに見えるな
データのパースと表示のほうがはるかに小難しいから仕方ないな てか問題出した人は自分で実際に作ってないんじゃねーかと思えるアンバランスさだ
>>912 の追加した部分がおかしかったので、修正
添削希望
def heikin (l)
l.inject(0.0) {|r, v| r + v } / l.size
end
num_name = /\A(\w+\s+\w+)/
ARGF.readlines.map do
|line|
next unless hyouka = line.match(/#{num_name}\s+(.+)\Z/).to_a[2]
a = [heikin(hyouka.scan(/\w+:(\d+)/).map {|it,| it.to_i }), line]
end.
compact .
sort_by {|v,| v } .
map {|h, l| l.sub(num_name, "\\1 (#{(h * 10).floor / 10.0 })") } . # <<
reverse .
each { require 'enumerator' } .
enum_for(:each_with_index).map {|v, i| [i, v] } .
flatten .
select {|s| s.class.to_s.hex <= 0 } .
display
これに固執する意味が全くわからない 本人か? 本人なら目を覚ませ
917 :
デフォルトの名無しさん :2007/12/30(日) 03:11:58
def heikin(seiseki) sum = 0.0 seiseki.each{|s| sum = sum + s.to_f } return (sum / seiseki.size) end list = Hash.new File.open('seiseki.txt').each_line{|line| line.scan(/\A(\d+?)\s+(.+?)\s+国語:(\d).+?数学:(\d).+?理科:(\d).+?社会:(\d).+?英語:(\d)\s.?\Z/e){ seiseki = [$3, $4, $5, $6, $7] list[no] = {'出席番号' => $1, '氏名' => $2, '成績' => seiseki, '評定平均' => heikin(seiseki)} } } ranking = list.keys.sort_by{|no| list[no]['評定平均']}.reverse ranking.each{|no| data = list[no] a = data['成績'] puts "#{data['出席番号']}\t#{data['氏名']}\t評定平均:#{data['評定平均']}\t国語:#{a[0]} , 数学:#{a[1]} , 理科:#{a[2]} , 社会:#{a[3]} , 英語:#{a[4]}" }
919 :
918 :2007/12/30(日) 04:09:32
日本語のハッシュキーがいまいちだがそのへんはわかりやすさ優先にしたんで好みで改変してくれ おそらく現行で一番素直な解法だと思う…というかまともなのの1つ目ってだけか もしコメント求められたら 「大きくなりうるデータリスト自体は最後の表示に使うだけで一切並べないのがポイントです」 とか発表しとけ スクリプトと同じディレクトリに seiseki.txt というファイルが必要なので用意すること
920 :
デフォルトの名無しさん :2007/12/30(日) 04:11:57
まぁ。なんと親切な御肩♥
AVならカメラ回ってるのに監督に「ちゃんと声出す!」ってダメ出しされるレベル
盛り上がってるとこすいません どなたかこれお願いできないでしょうか 問題 配列とハッシュを利用して、英文ファイルを読み込み、単語の頻度表を出力するスクリプトを作成せよ ただし、必要ならば、1行のテキストを単語の配列に分解するのに、split()メソッドを使ってもよい。 また、単語を出現回数順に並べ替えるのに、sort()メソッドを使ってもよい お願いします
>>923 おたくの学校は「宿題は2ちゃんねるで聞きなさい」って教育してんのか・・・w?
count = Hash.new(0) ARGF.readlines.each do |line| words = line.split words.each do |word| count[word] = count[word] + 1 end end sortlist = count.sort{|a, b| a[1] <=> b[1]} sortlist.each do |key, value| puts "#{key}: #{value}" end
素早いレスありがとうございます
>>923 tf = Hash.new
words = ARGF.read.scan(/[a-z]+/i)
words.each{ |word| tf[word] = tf[word] ? tf[word] + 1 : 1 }
p tf.to_a.sort{|a, b| b[1] <=> a[1]}
メソッドチェーンにしがみついたがために追加せざるを得なくなった醜いコードであることは間違いないな
英文から単語の出現頻度を数える課題って、 なんかの本に例題として載ってるのかな?
> tf[word] = tf[word] ? tf[word] + 1 : 1 この発想はなかったわw
>>932 このスレ内では
>>806 が発出なんだけど面白いので参考にさせてもらった
ハッシュつかって数えるってのは結構ありがちなんで使いどころは多そう
>>934 ハッシュ使うなら、初期値を設定してやるとシンプルになると思う。
tf = Hash.new(0)
words.each {|word| tf[word] += 1 }
tf = Hash.new(0) words = ARGF.read.scan(/[a-z]+/i) words.each {|word| tf[word] += 1 } p tf.to_a.sort{|a, b| b[1] <=> a[1]} どんどんコンパクトになるな RubyかわいいよRuby よい御年を
Hash.new(0)に慣れて、その後Hash.new([])と書いてはまった俺。 デフォルト値が [] みたいな場合はHash.new {|h,k| h[k] = [] } と しないといかんのよね。
>>936 sortの所は
tf.sort_by{|k, v| -v }
で行けるな
出力を整形してみた tf, w = Hash(0), 0 ARGF.read.scan(/[a-z]/i){|m| tf[m] += 1 } puts tf.sort_by{|h, k| w = k.length if k.length > w -v }.map{|h, k| "#{k.ljust(w)}\t#{v}" }
そのvはどこから出てきたのかとかそれじゃ一文字単位じゃないのかとか #! /usr/bin/goruby t=H.ne(w=0) A.re.sc(/[a-z]+/i){|m|t[m]+=1} puts t.s_b{|k,v|w=[k.le,w].max;[-v,k]}.m{|k,v|"#{k.lj(w)}\t#{v}"}
putsをsにしてくれ。
gorubyのコード見ると、背中がムズムズするww
新年早々申し訳ありません。どなたかこれをお願いできないでしょうか 問題 英文ファイルを読み込み、60文字の行(ただし、単語が2行にまたがってはならない)に分割して出力するスクリプトを作成せよ。 このとき、もし余裕があれば(最後の行を除く)各行の単語の感覚を調整して右端を整えるようにせよ。 お願いします
今このスレ年始冬休みでセンスないのいてるから、 授業で使ったことのあるメソッドとか事前に明示しないと提出に耐えないようなの出てくるぞ 奴らはこのスレを理解せずに自分のオナニーにしか使ってない
ruby -e 'puts $<.read.gsub(/\n/, " ").gsub(/.{1,60}(?:\s|\Z)/){$&+"\n"}'
さすが兄貴カックイイっす
944,945の流れでワロタw
オナニーと言うよりいじめだよな。
丁寧にほぐしていけば解るはず
951 :
943 :2008/01/03(木) 23:30:30
今回の課題で習ったのは Stringクラスやsprintfメソッドといったあたりです
> もともと、Golfするスレだからな 違う
んあー整形出力は鬼門だ
同じスクリプトが2つとしてできない
>>943 まだ作ってなくて提出期限がまだならどこまで考えたのか言ってみ
それにあわせて作る(人が出るかもしれない)から
英文から単語単位でどうにかするためにはまずどう考えた?
60文字を超すってどういうことだろう?
単語が切れてはならない場合どうするのが妥当だと思う?
単語の間隔を調整するためにはどういう風に処理すればうまくいきそう?
ある意味、整形出力が似たような書き方になるコボルって凄いのかも知れんな あくまで、ある意味で、だが
956 :
デフォルトの名無しさん :2008/01/13(日) 01:42:00
お願いします。 氏名で検索して血液型と年齢と体重と身長を表示し、追加訂正でき、 身長と体重からBMI値も表示されるようにしなさい。 という課題です。 テキストは自分で作ってかまわないです。 よろしくお願いします。
なにこの潔い丸投げっぷり
>>956 この手の課題はうんこするほど見てきたので疑問がある
> 検索して
どうやって検索することを課題では期待してる?(それ以前の課題では何をやった?)
コマンドライン引数から?
「氏名を入力してください」っていうプロンプトを自前で出して入力?
> 追加訂正でき
追加ってどうやるんだ?
データベース追加用のスクリプトを別途作って起動? コマンドライン引数で指定?
それともメニューを作って「1:検索 2:追加 3:削除」とか表示して最初に1文字選ぶ?
訂正って簡単に言うが訂正って何よ?
項目を選んで訂正? それとも全欄再入力させて上書きしてもいい?
あと、データは外部ファイルに保存することを期待されてると思ってよい?
その外部ファイルはテキストファイルでなければならないという制約はある?
railsで20分くらいで作れそうだな
959 :
957 :2008/01/13(日) 02:02:17
あ、「おまかせします」という回答は無しね
それはありえないから
語弊はあるけど、プログラムは小難しく書こうと思えばどこまでも小難しくできる
君が明らかに書けそうにないシロモノを提出しても不審がられるだけだろ?
これまでの授業聞いてもやもやーっとでも思いついたものがあって欲しい
それを伝えてくれればだいたいそんな感じで作る人が現れるかもしれない
本当はこれまで習ったメソッドやモジュールを教えてくれれば一発なんだけど
>>958 どうせ一人しかアクセスしないだろうしPStoreでも30分くらいでなんとかなりそう
お〜ぃだれかいつもの(ワンライナー)で頼むw
aviファイルのfourccを取り出すにはどうすればいい? 同じ事やってそうなexifの見たけど、さっぱり。
#
>>956 MENU = '1:search 2:add 3:edit 0:save&exit 9:quit'
TABLE = ['name','age','height','weight','blood']
DBFILE = './data.csv'
def bmi(datum)
return datum[3].to_f / (datum[2].to_f/100) / (datum[2].to_f/100)
end
def search
puts 'name? (just enter: view all)'
name = Regexp.new(gets.chomp)
name = /.+/ if name == //
@data.each do |id,datum|
if datum[0] =~ name then
datum.each_with_index{|e,i| puts "#{TABLE[i]}:#{e}"}
puts "BMI:#{"%0.1f" % bmi(datum)}"
end
end
end
def add
new = []
TABLE.each_with_index do |label,i|
puts "#{label}?"
new[i] = gets.chomp
end
@data[@data.size + 1] = new
end
# 続く
# 続き def edit id = get_id_prompt old = @data[id] new = [] TABLE.each_with_index do |label,i| puts "new #{label}? (default: #{old[i]})" input = gets.chomp if input.empty? then new[i] = old[i] else new[i] = input end end @data[id] = new end def save File.open(DBFILE,'w'){|f| @data.each do |id,datum| f.puts datum.join(',') end } end # 続く
# 続き @data = {} File.open(DBFILE).readlines.each_with_index do |line,i| a = line.chomp.split(',') @data[i] = [a[0],a[1],a[2],a[3],a[4]] end puts MENU while choise = gets.chomp do case choise.to_i when 0; save; exit when 1; search when 2; add when 3; edit when 9; exit else # do nothing end puts MENU end # ===== 終了 ===== # 以下 同ディレクトリに置く data.csv 山田太郎,23,171,81,A 山田次郎,22,164,68,O 佐藤大助,31,160,77,A 山下花子,25,162,51,AB 西表ウメ,77,135,43,O
どうやっていいかわからんので素直っぽい方法をいろいろ使ってみた ら作るのえらい長くなって俺涙目 あまり妙なことはしてないので授業次第では提出に堪えるものではあると思う あ、入力する文字コードとスクリプトの文字コードとcsvの文字コードは統一しておかないと化けるよ
>>956 # 追加訂正 : update.rb 山田太郎 A 25 65 175
require 'pstore'
PStore.new('person.db').transaction {|db| db[ARGV[0]] = ARGV }
# 検索表示 : display.rb 山田太郎
require 'pstore'
Columns = ['氏名','血液型','年齢','体重','身長']
PStore.new('person.db').transaction do |db|
param = db[ARGV[0]]
Columns.each_with_index {|c,i| puts c + ' : ' + param[i] }
w,h = (param[3].to_f),(param[4].to_f/100)
puts 'BMI : %0.1f'%[w/(h*h)]
end
ruby-sqlite3使ったら先生涙目になるかな?
pstoreよりマシだろ
オラクルにぶち込んだら涙目かもな。
pstoreはローカル個人データベースではわりとポピュラーだからRuby使ってるぶんには問題ないぞ
複数人が同時にアクセスするようになると早晩破綻するが
>>966 はこれはこれでマルもらえそうないろいろ問題ありそうな微妙な立ち位置だけどな
972 :
デフォルトの名無しさん :2008/01/13(日) 20:17:43
>>957 言葉が足りなくてすみません。
検索はコマンドライン引数から「氏名を入力してください」っていうプロンプトを自前で出して入力。
追加訂正はメニューを作って「1:検索 2:追加 3:削除」とか表示して最初に1文字選ぶ。
訂正内容は全欄再入力させて上書きでお願いします。
データは外部ファイルに保存。で、テキストファイルという制約ありです。
>>959 見たことあるメソッドとモジュールは
File.open
File.read
open
if /何か/ =~ 変数
配列変数[数字]
scan
size
sort
sort_by
puts
print
hash です。
kojin.txt
山田太郎 A 35 177 75
鈴木花子 B 29 152 48
佐藤次郎 O 13 149 42
斉藤裕子 AB 21 167 65
橘 祐一郎 O 40 181 72
テキストはこんな感じでおねがいします。
よろしくお願い致します。
SEつくづく大変だと思う
>橘 祐一郎 O 40 181 72 >テキストはこんな感じでおねがいします。 区切り文字(セパレータ)は全角スペースでいいのか? 「橘 祐一郎」なんかこれも姓名で区切られちゃうぞ? ほんとにいいのか?
>>974 しっぽから処理して残りを名前にすればOK
他の要素が全角英字と全角数字だからそれ以外が名前ってことでよろしこ 全角英字の前までマッチさせれば桶 ってかタブ区切りのつもりでいいのかね ってかそれこそ既存のコンマ区切りでじゅうぶん用が足りるんじゃ
身長体重が整数は変だよ
エラーチェックは?
>>977 まあねえ
小数がありえるくらいは自然に対応していいよね
>>978 無限のバリエーションに対応しないといけなくなって破綻するぞ
課題でそうと指定されてない限りはこういうのは決め打ちでいい
ゆーしぱぱsqlite使ってでかいちゃうぞ〜
作ってて一番最初に思ったのは「これって同姓同名どうするんだ?」だったからなあ その次は「空エントリーの扱いどうしよう」
XMLでおながいします
fourccはこんな感じでどうよ? f.seek(188) buf = f.read(4) p buf ちゃんとファイルぐらい自力で開いてくれ(w
>>972 > テキストはこんな感じでおねがいします。
ってのを最大限好意的に解釈して、以下独自仕様
・氏名以外の値に全角文字使用不可。
・データは氏名、血液型、年齢、身長、体重を空白区切り、一行で入力。
・氏名は氏、名に分割されない。間に空白等あれば、それも氏名に含む。
・血液型は A B O AB のみ入力値として認める。
・年齢、身長、体重は数値のみ入力値として認める。
・入力したデータは自動的には保存されない事に注意。
以上
続いてソース(三分割)
class Database < Hash DATAFILE = 'kojin.txt' def initialize ; load ; end def insert(datastr) data = parse(datastr) self[data[0]] = data end def save open(DATAFILE,'w') do |f| self.each {|k,v| f.puts(v.join(' ')) } end end def load return unless File.exist?(DATAFILE) open(DATAFILE) do |f| f.each {|l| self.insert(l.chomp) } end end def parse(datastr) if datastr =~ /^(.*)\s+(A|B|O|AB)\s+(\d+)\s+(\d+)\s+(\d+)\s*$/ return [$1,$2,$3,$4,$5] else raise 'データエラー' end end end
Columns = ['氏名','血液型','年齢','身長','体重'] def display(param) if param.nil? puts '未登録' else Columns.each_with_index {|c,i| puts c + ' : ' + param[i] } h,w = (param[3].to_f/100),(param[4].to_f) puts 'BMI : %0.1f'%[w/(h*h)] end end def input(msg=nil) puts msg unless msg.nil? print '> ' $stdout.flush return $stdin.gets.chomp end
db = Database.new mode = nil while true begin case mode when nil mode = input('1:検索 2:追加(訂正) 3:削除 S:保存 Q:終了') next when '1' then display(db[input('氏名を入力してください')]) when '2' then db.insert(input('追加(訂正)するデータを入力してください')) when '3' then db.delete(input('削除する氏名を入力してください')) when 'S','s' then db.save when 'Q','q' then exit when 'l' then puts db.keys end rescue puts $! end mode = nil end
使用例 % ruby kojin.rb 1:検索 2:追加(訂正) 3:削除 S:保存 Q:終了 > 2 追加(訂正)するデータを入力してください > 山田太郎 A 35 177 75 1:検索 2:追加(訂正) 3:削除 S:保存 Q:終了 > 1 氏名を入力してください > 山田太郎 氏名 : 山田太郎 血液型 : A 年齢 : 35 身長 : 177 体重 : 75 BMI : 23.9 1:検索 2:追加(訂正) 3:削除 S:保存 Q:終了 > q # 終了
出来れば ActiveRecord でおねがいします
990 :
デフォルトの名無しさん :2008/01/15(火) 13:20:19
>>938 さらにinjectを使うとHashを変数に持つ必要が無くなるな
ARGF.read.scan(/[a-z]+/i).inject(Hash.new(0)){|h, e| h[e]+=1; h }.sort_by{|k, v| -v } (以下略
ume
ぇこのミカン
松
竹
梅
毒
苺
桜
1000 :
デフォルトの名無しさん :2008/01/19(土) 17:31:06
_w_ ∧('ω')∧ <1 (* ‘ω‘ * ) <0 つ_('ω')_⊂ <0 ノ./ ・ω・ヽ <0 Ol l `'ー---‐´
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。