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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/01/05(土) 03:33:39
>>944
もともと、Golfするスレだからなw

>>945
ってそうそうそれかいwww
953デフォルトの名無しさん:2008/01/05(土) 11:03:18
> もともと、Golfするスレだからな
違う
954デフォルトの名無しさん:2008/01/06(日) 12:51:14
んあー整形出力は鬼門だ
同じスクリプトが2つとしてできない

>>943
まだ作ってなくて提出期限がまだならどこまで考えたのか言ってみ
それにあわせて作る(人が出るかもしれない)から

英文から単語単位でどうにかするためにはまずどう考えた?
60文字を超すってどういうことだろう?
単語が切れてはならない場合どうするのが妥当だと思う?
単語の間隔を調整するためにはどういう風に処理すればうまくいきそう?
955デフォルトの名無しさん:2008/01/07(月) 12:34:55
ある意味、整形出力が似たような書き方になるコボルって凄いのかも知れんな
あくまで、ある意味で、だが
956デフォルトの名無しさん:2008/01/13(日) 01:42:00
お願いします。
氏名で検索して血液型と年齢と体重と身長を表示し、追加訂正でき、
身長と体重からBMI値も表示されるようにしなさい。
という課題です。
テキストは自分で作ってかまわないです。

よろしくお願いします。
957デフォルトの名無しさん:2008/01/13(日) 01:53:42
なにこの潔い丸投げっぷり

>>956
この手の課題はうんこするほど見てきたので疑問がある
> 検索して
どうやって検索することを課題では期待してる?(それ以前の課題では何をやった?)
コマンドライン引数から?
「氏名を入力してください」っていうプロンプトを自前で出して入力?
> 追加訂正でき
追加ってどうやるんだ?
データベース追加用のスクリプトを別途作って起動? コマンドライン引数で指定?
それともメニューを作って「1:検索 2:追加 3:削除」とか表示して最初に1文字選ぶ?
訂正って簡単に言うが訂正って何よ?
項目を選んで訂正? それとも全欄再入力させて上書きしてもいい?
あと、データは外部ファイルに保存することを期待されてると思ってよい?
その外部ファイルはテキストファイルでなければならないという制約はある?
958デフォルトの名無しさん:2008/01/13(日) 01:58:58
railsで20分くらいで作れそうだな
959957:2008/01/13(日) 02:02:17
あ、「おまかせします」という回答は無しね
それはありえないから

語弊はあるけど、プログラムは小難しく書こうと思えばどこまでも小難しくできる
君が明らかに書けそうにないシロモノを提出しても不審がられるだけだろ?

これまでの授業聞いてもやもやーっとでも思いついたものがあって欲しい
それを伝えてくれればだいたいそんな感じで作る人が現れるかもしれない
本当はこれまで習ったメソッドやモジュールを教えてくれれば一発なんだけど

>>958
どうせ一人しかアクセスしないだろうしPStoreでも30分くらいでなんとかなりそう
960デフォルトの名無しさん:2008/01/13(日) 02:52:19
お〜ぃだれかいつもの(ワンライナー)で頼むw
961デフォルトの名無しさん:2008/01/13(日) 03:43:42
aviファイルのfourccを取り出すにはどうすればいい?
同じ事やってそうなexifの見たけど、さっぱり。
962デフォルトの名無しさん:2008/01/13(日) 04:24:51
# >>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
# 続く
963デフォルトの名無しさん:2008/01/13(日) 04:25:55
# 続き
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
# 続く
964デフォルトの名無しさん:2008/01/13(日) 04:28:19
# 続き
@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
965デフォルトの名無しさん:2008/01/13(日) 04:33:26
どうやっていいかわからんので素直っぽい方法をいろいろ使ってみた

ら作るのえらい長くなって俺涙目
あまり妙なことはしてないので授業次第では提出に堪えるものではあると思う

あ、入力する文字コードとスクリプトの文字コードとcsvの文字コードは統一しておかないと化けるよ
966デフォルトの名無しさん:2008/01/13(日) 05:27:47
>>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
967デフォルトの名無しさん:2008/01/13(日) 06:46:42
ruby-sqlite3使ったら先生涙目になるかな?
968デフォルトの名無しさん:2008/01/13(日) 06:49:48
pstoreよりマシだろ
969デフォルトの名無しさん:2008/01/13(日) 07:03:28
970デフォルトの名無しさん:2008/01/13(日) 11:07:15
オラクルにぶち込んだら涙目かもな。
971デフォルトの名無しさん:2008/01/13(日) 11:13:34
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
テキストはこんな感じでおねがいします。
よろしくお願い致します。
973デフォルトの名無しさん:2008/01/13(日) 20:39:35
SEつくづく大変だと思う
974デフォルトの名無しさん:2008/01/13(日) 21:01:26
>橘 祐一郎 O 40 181 72
>テキストはこんな感じでおねがいします。
区切り文字(セパレータ)は全角スペースでいいのか?
「橘 祐一郎」なんかこれも姓名で区切られちゃうぞ?
ほんとにいいのか?
975デフォルトの名無しさん:2008/01/13(日) 21:06:15
>>974
しっぽから処理して残りを名前にすればOK
976デフォルトの名無しさん:2008/01/13(日) 21:13:05
他の要素が全角英字と全角数字だからそれ以外が名前ってことでよろしこ
全角英字の前までマッチさせれば桶

ってかタブ区切りのつもりでいいのかね
ってかそれこそ既存のコンマ区切りでじゅうぶん用が足りるんじゃ
977デフォルトの名無しさん:2008/01/13(日) 21:47:39
身長体重が整数は変だよ
978デフォルトの名無しさん:2008/01/13(日) 21:48:44
エラーチェックは?
979デフォルトの名無しさん:2008/01/13(日) 21:52:53
>>977
まあねえ
小数がありえるくらいは自然に対応していいよね

>>978
無限のバリエーションに対応しないといけなくなって破綻するぞ
課題でそうと指定されてない限りはこういうのは決め打ちでいい
980デフォルトの名無しさん:2008/01/13(日) 21:55:39
ゆーしぱぱsqlite使ってでかいちゃうぞ〜
981デフォルトの名無しさん:2008/01/13(日) 21:58:39
作ってて一番最初に思ったのは「これって同姓同名どうするんだ?」だったからなあ
その次は「空エントリーの扱いどうしよう」
982デフォルトの名無しさん:2008/01/14(月) 00:30:08
XMLでおながいします
983デフォルトの名無しさん:2008/01/14(月) 03:01:17
fourccはこんな感じでどうよ?

f.seek(188)
buf = f.read(4)
p buf

ちゃんとファイルぐらい自力で開いてくれ(w
984デフォルトの名無しさん:2008/01/14(月) 05:12:50
>>972
> テキストはこんな感じでおねがいします。
ってのを最大限好意的に解釈して、以下独自仕様
・氏名以外の値に全角文字使用不可。
・データは氏名、血液型、年齢、身長、体重を空白区切り、一行で入力。
・氏名は氏、名に分割されない。間に空白等あれば、それも氏名に含む。
・血液型は A B O AB のみ入力値として認める。
・年齢、身長、体重は数値のみ入力値として認める。
・入力したデータは自動的には保存されない事に注意。
以上

続いてソース(三分割)
985デフォルトの名無しさん:2008/01/14(月) 05:14:02
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
986デフォルトの名無しさん:2008/01/14(月) 05:14:44
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
987デフォルトの名無しさん:2008/01/14(月) 05:15:58
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
988デフォルトの名無しさん:2008/01/14(月) 05:23:52
使用例
% 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 # 終了
989デフォルトの名無しさん:2008/01/14(月) 11:36:00
出来れば ActiveRecord でおねがいします
990デフォルトの名無しさん:2008/01/15(火) 13:20:19
>>984〜988
ありがとうございます。
991デフォルトの名無しさん:2008/01/15(火) 13:58:24
>>938
さらにinjectを使うとHashを変数に持つ必要が無くなるな
ARGF.read.scan(/[a-z]+/i).inject(Hash.new(0)){|h, e| h[e]+=1; h }.sort_by{|k, v| -v } (以下略
992デフォルトの名無しさん:2008/01/16(水) 19:57:33
ume
993デフォルトの名無しさん:2008/01/16(水) 20:05:16
ぇこのミカン
994デフォルトの名無しさん:2008/01/19(土) 14:03:15

995デフォルトの名無しさん:2008/01/19(土) 14:04:04

996デフォルトの名無しさん:2008/01/19(土) 14:04:32

997デフォルトの名無しさん:2008/01/19(土) 14:06:28
998デフォルトの名無しさん:2008/01/19(土) 17:26:33
999デフォルトの名無しさん:2008/01/19(土) 17:30:41
1000デフォルトの名無しさん:2008/01/19(土) 17:31:06
         _w_
       ∧('ω')∧ <1
       (* ‘ω‘ * ) <0
       つ_('ω')_⊂ <0
      ノ./ ・ω・ヽ <0
      Ol      l
        `'ー---‐´
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。