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


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

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



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


152 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 00:44:27 ]
宿題です。危機です。
ruby/tkで迷路を作成して脱出するプログラムを
どなたか作ってくださいorz

153 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 01:17:49 ]
ここは「教えてください」というスレッドであって「代行してください」というスレッドではないと思うのだが。


154 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 02:09:17 ]
勘違いしてましたorz
多分このスレを立てた人と同じ大学です、自分も締め切りが迫っててピンチです。
迷路を作成して、脱出するプログラムを作りたいのですが、
@座標(1,1)(左上隅)に最初の通路空け、
A上下左右で、2マス進んだところがまだ通路になっていない場所
(複数ある場合はランダムに選択)
B穴掘り可能な方向がなかったら、そこまでの道を2マスだけ逆戻り。
逆戻りできない場合完成。
という感じにするのは分るのですが、ruby/tkでどうやってそれを表現したら良いのかが
わからないのですが。。

155 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 07:26:48 ]
テキストベースで組んでみてから、Ruby/Tkでやれば?

156 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 11:18:09 ]
テキストベース?のは出来たんですが…orz

157 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 17:07:54 ]
アルゴリズムを聞いてるのかな

158 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 21:55:50 ]
ruby/tkでのやり方が知りたいです!

159 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 22:04:17 ]
知りたいなら自分で勉強しような。
テキストべースのままでいいじゃん。

160 名前:デフォルトの名無しさん mailto:sage [2006/01/20(金) 23:23:47 ]
課題的に Ruby/tk が必須なら教科書に必要事項は絶対書いてあるからちゃんと読め。
必須じゃないなら自分である程度の勉強をしろ。
そういうことをしてもわからなかったら、必要な事項だけ質問するべし。漠然
と知りたいと言われても誰も答えられないよ。




161 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 00:40:36 ]
スレタイに宿題って入ってたら丸投げだとオレも思ってた

162 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 00:42:27 ]
問題についてもっと詳しい情報がなけりゃだれもやらんぞ。

連立方程式がわからないんですけどおしえてもらえませんか?

っていってるのと同じ。

163 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 00:48:45 ]
自分ではココまで頑張ったってとこを教えれ

164 名前:デフォルトの名無しさん mailto:sage [2006/01/22(日) 00:46:34 ]
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

166 名前:デフォルトの名無しさん mailto:sage [2006/01/23(月) 12:14:25 ]
で、tkについてはどこまで頑張ったのか?

167 名前:デフォルトの名無しさん mailto:sage [2006/01/24(火) 21:27:35 ]
きっと月曜提出だったんだよ、ということで時間切れ。
つかアルゴリズム?の宿題で画面表示必須って意味あるの?

168 名前:デフォルトの名無しさん mailto:sage [2006/01/25(水) 00:08:12 ]
>>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")

こんな感じです(^_^;)

169 名前:デフォルトの名無しさん mailto:sage [2006/01/25(水) 01:11:32 ]
きたねーコードだな。
で、何がわからないんだっけ?

170 名前:デフォルトの名無しさん mailto:sage [2006/01/25(水) 01:48:02 ]
>>154
です、、
とゆーかもう完全に意味がわかりませんorz



171 名前:デフォルトの名無しさん mailto:sage [2006/01/25(水) 11:13:10 ]
少なくとも意味がわかってから質問するように。

172 名前:デフォルトの名無しさん mailto:sage [2006/01/31(火) 00:57:40 ]
迷路の線は描けたのですが、道順(脱出経路)の線をひくことができません。。

173 名前:デフォルトの名無しさん mailto:sage [2006/01/31(火) 19:57:14 ]
足を踏みいれた格子の色を変えていく。
ただし、それぞれの格子で、どの辺から格子に入ったかを記録しておき、
その辺から再び出る(=戻る)なら格子の色を元にもどす。

174 名前:デフォルトの名無しさん [2006/02/02(木) 20:25:18 ]
a,bが互いな素であるときaxをbで割ったあまりが1になるようなxを1つ出力するプログラムを書きなさい。
という課題が出ました。
互いに素というのは作れるのですが、後半部分ができません。
だれか教えてください。お願いします。


175 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 21:00:23 ]
そのできた部分まで見せてくれるとやりやすいかもしれない

176 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 21:02:36 ]
互いに素がわかるならこれでどう?
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



177 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 21:15:42 ]
てかホントに初心者スレから移動したんだな

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
どこが何をしているのかがちょっとよくわかりません。
ホント素人ですいません。

179 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 22:03:14 ]
>>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が返る。

これでどう?


180 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 22:03:34 ]
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 ]
できました!みなさんありがとうございました!!!!

182 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 22:19:57 ]
(1...b).each do |x|
 break if a*x%b == 1
end
return x

の方が計算量少ないのでは。

183 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 22:26:52 ]
b != 1 のチェックも必要だね。

184 名前:デフォルトの名無しさん mailto:sage [2006/02/03(金) 16:48:13 ]
で、それどこの宿題? 大学? 高校? 中学校? 小学校?

185 名前:デフォルトの名無しさん mailto:sage [2006/02/03(金) 22:41:09 ]
>>183
b=1の時点で互いに素の可能性が消えるので不要。

186 名前:デフォルトの名無しさん mailto:sage [2006/02/04(土) 02:49:49 ]
互いに素の定義って最大公約数が1じゃなかたっけ?

187 名前:デフォルトの名無しさん [2006/02/06(月) 23:59:56 ]
www.pluto.ai.kyutech.ac.jp/plt/matumoto/pi_small/node8.html

rubyで上記のURLのいずれかの公式を用いて円周率もとめたいんですけど、、、どなたかソースコード例示してもらえないでしょうか

188 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 00:18:42 ]
puts (Math.atan(1.0/5)*4 - Math.atan(1.0/239))*4

俺ならこんなの書いてきたら落第させるがな

189 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 03:29:45 ]
>188
それだとputsの戻り値*4にならないか?

190 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 08:34:49 ]
puts は 必ず nil を返すように作られてるんだがそれでもよろしいか



191 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 09:31:26 ]
 hoge (1+2) * 3

 hoge(1+2) * 3
と同じ動作をするべき?

まあ、そうかもね。

192 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 13:37:36 ]
どっちにしても、そういう仕様だからなぁ。

193 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 14:00:18 ]
「カッコが省略されてる引数は最初の空白で区切れるようにしろ」というのは
主張としてはある程度真理だな

引数に空白を含めたい人が自力でカッコで括ってれと

「文末が出るまで全部引数にしまっちゃうよ」というのもそれはそれで便利だが

194 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 11:40:32 ]
で、宿題としては要は自前でテーラー展開しろってことなんだろうな。
そろそろ気づいて自力でできた頃か?

195 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 18:40:30 ]
おいおい、自力でテーラー展開してどうするんだ?
ニュートン法でも発明しろってことか?w

196 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 01:33:21 ]
ここ北大の人が質問してそう

197 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 02:29:37 ]
ちょっとドキッとしたが卒業生だからもう関係ねーや

1年の情報処理ででもやってるのかな
俺のやったときはFortran77/90とCとDelphiの選択だったような気がする

198 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 04:38:20 ]
また来年も質問が来るのかな

199 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 14:51:52 ]
ttp://crab.hucc.hokudai.ac.jp:8080/keng/sfinddata.cgi?USERID=476465055e62784e1&SEQ=7
これか? いや、これはD言語みたいだな。。。(汗


200 名前:ハーピィ mailto:sage [2006/02/24(金) 11:53:49 ]
E・∇・ヨノシ <200ゲット♫



201 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 17:22:35 ]
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
なのが欲しいのはどうすればいい?


202 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 17:36:43 ]
どうしたいの?

203 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 18:03:52 ]
pc8.2ch.net/test/read.cgi/tech/1143403165/10
なお話?

204 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 18:10:18 ]
.headerじゃ、HTMLの<HEAD>と</HEAD>の間しか採れないと思う。
漏れが欲しいのはHTTPの中で鯖から送られて来る情報。

205 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 18:35:27 ]
(⊃д`)

206 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 18:44:02 ]
Response から each を使えばいいような気がするのだが。


207 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 21:01:45 ]
こんなんでどう?

% 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

208 名前:デフォルトの名無しさん mailto:sage [2006/03/28(火) 21:31:34 ]
ありがとうございました。

209 名前:デフォルトの名無しさん [2006/04/07(金) 10:36:49 ]
保守

210 名前:デフォルトの名無しさん mailto:sage [2006/04/07(金) 20:37:40 ]
質問者を堕落させ、回答者のレベルをアップさせるスレってここのことですか?
質問者はruby-man-ja-html-20051029ぐらい読んでいるんだよな?
と、てきとうなことを言ってみた。




211 名前:デフォルトの名無しさん mailto:sage [2006/04/07(金) 20:52:34 ]
スレの性質上、学期末じゃないとあんまり釣れないと思うよ


212 名前:デフォルトの名無しさん mailto:sage [2006/05/03(水) 23:44:59 ]
学期末とかじゃなくても良いから
問題出してくれねーかなー。
面白そうなら、コード書くからさー。

213 名前:デフォルトの名無しさん [2006/05/04(木) 22:38:17 ]
じゃあ、問題出し合うスレにしちゃうか!

214 名前:デフォルトの名無しさん mailto:sage [2006/05/05(金) 14:20:15 ]
じゃ、お題。っ【ソリティア】

215 名前:デフォルトの名無しさん mailto:sage [2006/05/05(金) 19:22:45 ]
>>214
ソリティアを"作る"のか"解く"のかどっちだ?

216 名前:214 mailto:sage [2006/05/06(土) 04:17:59 ]
じゃとりあえず

ソリティア「クロンダイク」を作る

で。俺も作ってみるかなー。


【仕様案(あくまで俺用。参考にでも】

・配置はランダム
Winのフリーセルのような問題番号はなし。

・CUIで入出力
CUIの方が環境依存少なめかなぁと。

・サブコマンド
列名をアルファベットで現し
基本は3文字で[列名][枚数][列名]。
例: A3C (A列の3枚をC列へ移す)
山札をめくる時は半角スペース1個入れてエンター。

列名はプレイ時に一目で判るようにしておく。
って言うか文字順に置くかキー配置なぞって置くか2案で悩み中。

217 名前:デフォルトの名無しさん mailto:sage [2006/05/11(木) 02:05:01 ]
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 名前:デフォルトの名無しさん mailto:sage [2006/05/17(水) 19:53:34 ]
>>217
で、どうしろと?

219 名前:デフォルトの名無しさん mailto:sage [2006/05/17(水) 20:12:02 ]
>218
作りたい人は作る。基本スルー。

220 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 01:57:28 ]
つまりrubyでカードゲームは無理ということですよ。



221 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 03:29:39 ]
Rubyで無理じゃなくて、ここの住人じゃ無理なだけでそ

222 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 06:46:32 ]
Win32API使ってもいい?

223 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 08:27:37 ]
良いんじゃね?

224 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 08:56:46 ]
じゃあUNO作るわ
まっとれ

225 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 13:21:12 ]
ひとりでUNOやってて楽しいか?

昔MacでUNOのゲームがあったが、かなりつまらんかったな。

226 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 13:30:04 ]
>>225

>>1

227 名前:デフォルトの名無しさん [2006/05/21(日) 13:38:41 ]
UNOはつまらん
囲碁にしようぜ、てか囲碁のプログラムってむずくね?

228 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 16:29:22 ]
そんな面倒なのじゃなくまず3人じゃんけんのプログラムから始めろよ

229 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 16:37:47 ]
囲碁は終了判定があいまいでプレイヤーの感覚に任せる部分が大きい
ぶっちゃけどちらかが投了しない限り続行は可能だよ

つーかUNOも囲碁も相手が必須だろ
そこをどうするかがポイントになるハズ

230 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 17:15:27 ]
>>228
グー・グー・チョキの場合は決勝? あいこ?



231 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 19:21:32 ]
>>230
あいこしたら、あいこした方が負け。
つまり、チョキの勝ちというルールで。

232 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 20:04:07 ]
>>230
あいこにしたほうが簡単ぽいのでひとまずあいこでよし

233 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 02:34:21 ]
>>230
あいこのグーふたりを勝ちにして、チョキを落として再試合。
つまり、次回から勝負が決まるまでチョキの結果をムシすれ。

234 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 08:49:28 ]
おまいら馬鹿なのか?
CPU1だけと7並べやってもつまらんって当たり前じゃん。
CPU1, CPU2, CPU3とプレーヤの4人で7ねらべとか出来る様にすればいいじゃん。

マクのUNOって糞だっただけじゃね?
PCのUNOはそこそこおもしろかったよ。

235 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 08:51:55 ]
www.amazon.co.jp/gp/product/4789724964/

236 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 15:44:15 ]
>>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

237 名前:236続き mailto:sage [2006/05/22(月) 15:46:02 ]
# 遊び方:実行してこれ↓
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

238 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 15:51:13 ]
遊び方:
>>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

言い訳:
きれいとわかりやすいって両立しないよね


----
おしまい

239 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 16:18:18 ]
ある程度短ければ自分の全力で作っていいんじゃね?
初心者勉強スレみたいな雰囲気もあるから迷うが

240 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 19:43:42 ]
三人じゃんけんかー。
昔、JAVAで作ったのがあるから移植してみようかな。




241 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 21:15:31 ]
何かプロトコル決めて、戦わせたいね(w
Simple Janken Transfer Protcol(SJTP)とか。

242 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 22:50:53 ]
Transfer ワロタ

243 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 23:16:19 ]
でも作って公開してもメリットなくね

244 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 23:54:46 ]
ひとつのゲームだけじゃなくて
汎用的なカードゲーム用exchangeサイトみたいなの
Rubyで作れんかね

245 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 23:58:30 ]
あんまRuby向きの概念ではないな
個々のシステムを個々に作るほうが得意だと思う

246 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 00:33:22 ]
>>243
作るだけでも非常に勉強になるぞ
というのはどうだろう

素人のプログラムなんて読みたくねえよな実際

247 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 01:20:01 ]
>>246
ここに書いとくとMinero Aokiがリファクタリングしてくれるという特典付き。

248 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 07:08:10 ]
そうか

249 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 08:54:39 ]
じゃんけんする人をn人にした場合はどうなるの?

250 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 14:50:55 ]
[グー、チョキ、パー、・・・、手_n] になる



251 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 15:30:18 ]
作ってるうちにめんどーになった。

多人数対応してるつもりのあいこ勝ち抜きバージョン。
@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 mailto:sage [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 mailto:sage [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 mailto:sage [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 mailto:sage [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 " "


256 名前:251 しまったメソッド途中で切っちゃった mailto:sage [2006/05/23(火) 15:36:15 ]
    if champ=@win.find{|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


257 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 15:37:33 ]
はい終わり。

258 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 17:09:52 ]
>>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

あと、コピペするものには&nbsp;使わないほうがいいぞ
2chブラウザによっては空白が&#160;というのに置き換わるっていうかOpenjaneDoeがそうだ

259 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 01:49:26 ]
ちょっと昔作ったJAVAの三人じゃんけんをRubyに移植してみたら
約200行になった。ここには貼れない。
ちなみに、JAVAの時は約300行だった。

ロジックはJAVAで書いた時のをそのまま移植したので
もっとエレガントに出来そうな気はしてる。

260 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 12:43:55 ]
>259
是非別所にうpしる
Rubyに書き換えようぜ



261 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 12:46:31 ]
N人じゃんけんが既に出てるから、判定部分は何か面白いことしてないと目立たないぞ(w

どこかのあぷろだ借りるのが手っ取り早いだろうな

262 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 13:34:30 ]
ここ?

ソースポスト
sourcepost.sytes.net/

263 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 14:32:48 ]
じゃんけんだと、手の種類が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パターンが最適とは本見なきゃわからん人なので今ひとつ断言できない。

264 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 16:24:06 ]
じゃんけんが完成したら、いよいよ野球拳の実装だな。wktk

265 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 18:39:19 ]
オセロまでいくとむずすぎる?

266 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 18:55:58 ]
頭の悪いオセロなら簡単だよ

267 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 04:16:01 ]
それオセーロ

268 名前:259 mailto:sage [2006/05/31(水) 07:17:44 ]
遅くなってすみません。
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=27835

Rubyに移植済みのもの。
判定部分に剰余を使っているので三人でしかじゃんけんできません。

あと、ルール
一人勝ちなら+2ポイント残り二人は-1ポイントずつ
二人勝ちなら+1ポイントずつ残り一人は-2ポイント
終了条件は特に無し

# EUC-JPなファイルをupしたら文字化けorz

269 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 14:02:51 ]
>>268
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=27837
Rubyっぽくしてみた。
ルール(配点)の入れどころがよくわからんかったので消してしまったがJanken側にあるべきではないか。

$ ruby source.rb プレーヤ数 回数
で実行できるけど30人越えた辺りで反応がすげー鈍くなるよ。


270 名前:268 mailto:sage [2006/05/31(水) 19:56:37 ]
>>269
うーん、Rubyだ。

ポイントの入れ方は、3人でじゃんけんして
あいこなら変化なし
一人勝ちなら勝った人は+2point,負けた二人は-1pointずつ
二人勝ちなら勝った二人は+1pointずつ,負けた人は-1point
# ダメな変数の使い方の見本になってしまったorz
# flagに複数の意味を持たせてしまっていたようだ
# いくら一年以上前のプログラムだからって気付けよ>一昨日の自分

確かに、配点を弄るメソッドがPlayerにあるのは変ですね。
Jankenクラスにjudgeメソッドを実装するなら、ポイントを弄るメソッドも
Jankenクラスにあるべきですね。

>268の時点では、Jankenクラスは特に役目は無くて(ってまたダメな設計の見本orz)
単にゲームを開始するだけの係りでした。




271 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 20:38:13 ]
>>269
>>263の人?
初心者だけど、Rubyの勉強になった。サンクス。
2時間ぐらいマニュアルと格闘しながら解読した。

272 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 13:08:46 ]
Jankenにポイント計算つけた。
sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=27841
(敗者数/勝者数).ceilのポイント(敗者数>勝者数、そうでなければポイント=1)を分ける。
敗者は常に-1にしてある。
3人でやったときは同じ結果で、それ以上でも同じルールをスケールした結果になるはず。


273 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 19:51:06 ]
>>272
本当に些細なことだが、
scissorsは単複同形だよ。

274 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:38:55 ]
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でつくったプログラム上に表示したいと思っています。


277 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 15:07:20 ]
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


#アドバイスって何が欲しいんだろう…

278 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 04:44:43 ]
宿題スレ向きだよな。
アドバイスじゃなくて正解が知りたいと思う悪寒。

こう試してみたけど出来ませんじゃないし。

279 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 10:32:52 ]
ここ宿題スレだよね

280 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 11:33:00 ]
宿題隔離スレだから自力でできた(できてない)とこから以下全部丸投げとかでも構わない
こんなとこで一言一句完全丸写ししてバレないと思ってるならそれでもいいし

ただし問題が何したいのかさっぱりわからん場合はそれこそ問題外



281 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 11:45:35 ]
問題文さえここに正確に書き写せない香具師なんだからどうなっても知らん

282 名前:デフォルトの名無しさん [2006/07/24(月) 21:22:49 ]
さっぱりわかりません。どうかよろしくお願いします。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2457.txt

283 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:32:58 ]
ar.push ar.shift


284 名前:デフォルトの名無しさん [2006/07/24(月) 21:48:13 ]
これもわかりません。どうか優しい人よろしくお願いします。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2458.txt

285 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:51:24 ]
>>283
その日の授業内容にもよるが先生が頭抱えそうな回答だな(w

286 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:59:40 ]
>282,284
っていうか教科書読めよ。

特に 284 なんて問題文に答えが書いてあるのにこれ以上優しく説明できるか。


287 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 23:23:54 ]
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

288 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 01:02:30 ]
>>287
ありがとうございました!!!!!
本当に助かりました!

289 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 14:27:15 ]
>>283>>287を提出したのだろうか

290 名前:デフォルトの名無しさん [2006/07/25(火) 20:27:32 ]
283はいいと思うけど、287はちょっとなぁ。



291 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 20:32:00 ]
>>282も配列の添え字の勉強をした上での宿題なんじゃないかと思うぞ…

292 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 21:19:06 ]
>>287の3の倍数でない方がよくわからん。
3で割り切れないじゃダメなの?

293 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 21:23:40 ]
5の倍数のとこをよく読んで意図を掴め

294 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 02:42:09 ]
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])]



295 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 02:42:50 ]
ゴミがついたので貼りなおし

#!/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])]

296 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 02:45:06 ]
文字が入力されてたらアウトだからこうかな


#!/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]
)]


297 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 18:19:26 ]
x = ARGV[0].to_i
if ("x" * x).gsub(/xxx/,'') !~ /x/
print "#{x}は3の倍数ではありません。\n"
end

298 名前:デフォルトの名無しさん [2006/07/28(金) 00:58:09 ]
どうか助けてください。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2473.txt

299 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 01:13:51 ]
またお前あるいは同類か

どうでもいいがこれまで言われたアドバイス全然生かしてねえな

300 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 01:17:03 ]
授業で習ってない書き方をしたら丸写しバレるだろって話ね(w



301 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 01:39:33 ]
こんなに答えの書いてある問題はさすがにないと思うんだが、本当に宿題なのかなあ。


302 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 01:43:07 ]
>>301
すまん、こういうパズル未満の難易度の言葉合わせな宿題は出る。
授業聞いてればそれなりに何使うかは思いつくだろ、みたいな。
情報でのプログラムの演習なんてその程度でいいんだよ。

303 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 01:47:16 ]
>>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 は素数です'

俺にはこれが限界
後は誰か頼む

305 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 01:57:00 ]
プログラムが書けるより、問題を論理的に解析して解の生成アルゴリズムをひらめくのが重要。
アルゴリズムがひらめけばあとは言語仕様に従って記述すればプログラムに成るし。

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);



307 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 02:06:14 ]
>>306
Rubyじゃないじゃん。

308 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 02:15:10 ]
javascriptか
言語ですらないな
板違いだ

309 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 02:20:29 ]
JavaScriptの言語性を馬鹿にしていると痛い目見るぞ

310 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 02:32:19 ]
>>309
馬鹿にされたと思ったあなたは >>306 ですか?



311 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 09:16:50 ]
どこをどう読めば人を馬鹿にしてると読めるんだろう

312 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 09:26:32 ]
馬鹿な人がいるようには読める。

313 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 10:32:03 ]
馬鹿な人には読めないマキコ。

314 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 13:19:12 ]
どっちにしろ荒らしに反応すな

315 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 16:16:36 ]
js=ajax=web2.0

316 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 13:24:41 ]
もしかしたらスレ違いかも知れませんが…

コマンドラインから
テキストファイルを、各行の頭に行番号を付け表示したいのです。
今は Ruby で

ruby -e 'a=readlines;for i in 0...a.size;printf"%6d: %s",i+1,a[i];end' textfile

としています。
でももう少し短くなる気がするのですが、良いワンライナー無いでしょうか?

317 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 14:03:40 ]
ruby -ple 'printf "%6d: ", $.'

318 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 14:07:40 ]
ruby -e 'exec("/bin/cat", "-n", *ARGV)'

319 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 14:16:06 ]
ruby -e 'ARGF.each{|s|printf "%6d: %s", ARGF.file.lineno, s}'

320 名前:316 mailto:sage [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は独自のメソッド持ってるんでしたね…



321 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 11:56:52 ]
>>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初心者なのでわからなくて困ってます。



323 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 22:35:13 ]
>>322
alias myprintf printf
myprintf("%b\n", 10) #=> 1010


324 名前:デフォルトの名無しさん [2006/08/31(木) 22:38:35 ]
>>323
ありがとうございます。
でも、せっかく作成していただいたのに申し訳ないのですが
printfは使って作成してはいけないんです。


325 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 23:05:24 ]
ちっ、バレたかwww

326 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 23:05:42 ]
>>322
こんなんじゃダメ?

def i2b i
return i.to_s(2)
end

327 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 23:16:24 ]
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
ありがとうございます。
家のパソコンだとプログラムが実行できないので
明日実行できるパソコンで試してみます。

329 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 23:29:00 ]
超ナイーブに書いてみたが数字がでかいとスタックオーバーフローで死ぬ。
def to_bin(i); q, m = i.divmod(2); q == 0 ? m : to_bin(q).to_s + m.to_s;end

330 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 23:34:27 ]
>>328
家のパソコンにもRubyインストールすればいいだろ?
よっぽど特殊なOSで無い限り入れられる。



331 名前:デフォルトの名無しさん [2006/08/31(木) 23:42:20 ]
329>>
何回もインストールしてみたのですが
何回挑戦しても失敗してしまいます。



332 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 23:55:11 ]
>>331
ttp://rubyforge.org/frs/?group_id=167
ttp://instantrails.rubyforge.org/wiki/wiki.pl

どっちでも好きな方を試せ。
使い方は聞くな。


333 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 00:00:08 ]
最近は宿題もWeb2.0とか意識するべきだと思うんだ


def i2b(i)
require "open-uri"
open('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>>
ありがとうございます。
助かりました。

335 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 00:13:12 ]
web 2.0ってperl廚の妄言のような。
phpとの戦いで死にかけてるから生き残りに必死な様にしか見えない。

336 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 00:17:55 ]
>>335
そうか?PHPってgoto導入して死ぬんだろ?

337 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 00:20:51 ]
Web2.0は言語を規定しない(そもそも何も規定しないがw)

「なんかWeb通して新感覚にみんなで超便利」というサービスを提供する限り、
サーバー上の言語は本当に何でもよい

338 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 00:43:49 ]
初心者の自分が作った方が参考になるんじゃないのかな?

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

339 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 01:06:58 ]
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
ありがとうございました。



341 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 11:03:29 ]
>>338
参考にはなるかもしれんが、ためにはならんぞ。

342 名前:デフォルトの名無しさん [2006/09/09(土) 05:00:57 ]
Rubyで書かれたうpろだのソースってありますか?

343 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 11:31:05 ]
ハイレベルな宿題だな

344 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 19:34:15 ]
>>342
cgi限定?
http以外のプロトコル使ってもいいのかな?


345 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 21:53:01 ]
AppleTalkでお願いします。

346 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 18:06:15 ]
>>342
ここにあるよ
ttp://wirepuller.org/text/ruby/

347 名前:デフォルトの名無しさん [2006/09/11(月) 16:25:43 ]
>>346
ありがとうございます。
CGI.rbの仕様で10kB以下だとStringIOで処理されて
それ以上のサイズだとTempfileオブジェクトになるようだと
書いてあるのですが
「Tempfileの場合、数MBのファイルをread,writeするのはあれなので」
という部分の意味が良く分かりません
何があれなんでしょうか

348 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 16:43:40 ]
やっぱり、なにがあれなんだろう。

349 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 16:47:04 ]
「数MBのファイルを、わざわざ Ruby の read/write を使ってアップローダ側
のディレクトリの特定のファイルにコピーするのは処理にオーバヘッドがかか
るので」

てとこじゃね。

350 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 16:51:16 ]
ああでもあれか、 FileUtils.cp ってけっきょく ruby レベルで read/write
を繰り返しているわけだよな。まあ、当り前だが。

それに、ソースを見てみると file.size の大小で TempFile かどうか判定し
てるね。 is_a? とかを使った方がいいんじゃないかなあ。




351 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 22:39:34 ]
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(検索キーワード)
で指定したディレクトリ下にある合致するファイルを検索して
合致するファイル名の配列を返す関数のコードお願いします。

353 名前:デフォルトの名無しさん mailto:sage [2006/09/15(金) 02:52:35 ]
自分で出来ました。お騒がせしました。

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"
}

354 名前:デフォルトの名無しさん mailto:sage [2006/09/15(金) 04:44:56 ]
Dir.glob(dir + "/**/" + key)
じゃ駄目?

355 名前:デフォルトの名無しさん mailto:sage [2006/09/15(金) 09:46:53 ]
合致するファイルって名前だけか。


356 名前:デフォルトの名無しさん mailto:sage [2006/09/15(金) 12:35:15 ]
353.gsub(/serch/, 'search')

357 名前:デフォルトの名無しさん mailto:sage [2006/09/15(金) 12:36:53 ]
353.gsub(/seach/, 'search')

358 名前:デフォルトの名無しさん mailto:sage [2006/09/15(金) 13:35:36 ]
353.gsub /(?=。)/, "お"

(^ω^ )

359 名前:デフォルトの名無しさん mailto:sage [2006/09/19(火) 05:01:46 ]
数字に変換できなくなるまで、入力を何回でも受け付けるプログラムを
作りました。入力された文字列が数字に正しいものかどうかをチェック
するようなフィルタを作ったんですが、あまりスマートに書けませんで
した。もう少し、きれいなコードを書く方法をご存知の方、ご意見を下
さい。
#!/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

360 名前:デフォルトの名無しさん mailto:sage [2006/09/19(火) 05:03:41 ]
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)
}




361 名前:デフォルトの名無しさん mailto:age [2006/09/19(火) 13:54:30 ]
age

362 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 00:09:54 ]
def analyzer(str)
  Integer(str)
  true
rescue ArgumentError
  false
end


363 名前:359 mailto:sage [2006/09/20(水) 01:36:19 ]
ありがとうございます。組込み関数のInteger(str)は見落としていました。
str.to_i()が例外を投げない仕様になっていたので困っていた所です。
あとリファレンスを読むのが不十分でした。すいません、今後は気を付けます。

364 名前:359 mailto:sage [2006/09/20(水) 01:37:01 ]
ありがとうございます。組込み関数のInteger(str)は見落としていました。
str.to_i()が例外を投げない仕様になっていたので困っていた所です。
あとリファレンスを読むのが不十分でした。すいません、今後は気を付けます。

365 名前:デフォルトの名無しさん mailto:sage [2006/09/25(月) 00:44:03 ]
お礼は一回でおk。

366 名前:デフォルトの名無しさん mailto:sage [2006/09/25(月) 05:45:12 ]
ありがdddddddddddddddddddddddddddddddddddddddddddddddd

367 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 13:58:21 ]
勉強になるので、以前のじゃけんプログラムみたいな数百行程度のプログラムを
また作って欲しいのですが。

368 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 16:22:36 ]
自分で作った方が勉強になるぞ。


369 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 19:45:42 ]
>>367
ネタ寄越せ。

370 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 20:41:08 ]
「ババ抜き」とかどうでしょうか?
表示は、例えばこんな感じで

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



371 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 23:45:38 ]
たびたびわからなくなるんだが、
引かれた奴が次に他の奴から引くんだっけ?
引いた奴が次に他の奴から引かれるんだっけ?


372 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 23:52:43 ]
ローカルルールがあるかもしれないが、うちでは引いた奴が他の奴から引かれるというルール。
そうじゃないと、「おい、お前今混ぜてるのはババ引いたからだろ!」ということが起こらず面白くない。

373 名前:デフォルトの名無しさん mailto:sage [2006/10/05(木) 23:53:37 ]
最強のジャンケンAI。綿密な先読みで人間などには負けることが無い。


print "ジャンケンしーましょ、最初はグー!"
print "ジャンケン・・・[g=グー/c=チョキ/p=パー]:"
puts "AIの手:"+ ({?g => "パー", ?c => "グー", ?p => "チョキ"}[gets[0]] or raise "死ね。")
puts "お前の負けだ。"

374 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 00:18:51 ]
>>373
それは後出しと言って反則なんだよ。

375 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 03:40:29 ]
いや、出す瞬間に、相手の手を見て反応しているのでOK。
ハンターハンターでやってた

376 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 07:35:01 ]
>>375
ハンターハンターのは「出す直前」だが、>373のは完全に後出し。

377 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 13:48:43 ]
ババ抜きってさあ、記憶力と観察力があれば、自分のとこから取られたカードがどこにあるかわかるから有利になれるんだけど
そういう戦略を実装できるようにすべき?

378 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 14:12:53 ]
したけりゃしろよ。
スレ違いだし。

379 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 15:33:39 ]
スレ違いな理由は何?

380 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 16:11:05 ]
>>377
した方が面白いと思う。



381 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 21:14:51 ]
>>377
戦略とかあるの?
ランダムに引く人と戦略を持っている人とで、勝利確率どのぐらい違うが見てみたいね。

382 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 21:31:05 ]
戦略:こっそりはなくそをつけとく

383 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 23:40:54 ]
質問です。
次のようなテキストファイルがあったとします。

"ほげほげ","なんとか","むだむだ"
"ほげほ","なんとかか","むだむだだ"
(以下、何十行か続く)

それを

ほげほげ   なんとか   むだむだ
ほげほ   なんとかか   むだむだだ
(以下続く)

という感じの書式(空白はタブです)に変えてテキストファイルとして書き出すスクリプトを書きたいのですが、
正規表現とか難しいことを使わないと行けないのでしょうか。
どなたかやり方ご存じありませんでしょうか。

384 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 23:49:02 ]
データに","が含まれないなら
while s = gets
puts s.gsub(/"/, "").gsub(/,/, "\t")
end

ちゃんとCSVを処理したいなら、RAAでcsv関連のライブラリを探すとか。

385 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 23:58:28 ]
>>383 字句解析はrubyに丸投げ
puts eval("[#$_]").join("\t") while gets


386 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 00:02:31 ]
黒魔術だ・・・

387 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 00:21:37 ]
>>385
おおー、こんなに簡単にできてしまうんですね。
Rubyって凄い! ありがとうございました!

388 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 13:58:07 ]
CGIとかで、外部のユーザが自由に入力出来るようなデータに使う場合は、注意しろよー。

389 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 17:39:10 ]
>>385
ワロタ。
$KCODE忘れんなよー。


390 名前:デフォルトの名無しさん [2006/10/17(火) 01:01:11 ]
東京大学教養課程の第一プログラミング言語がRubyに
d.hatena.ne.jp/sumii/20060928/1159394568
b.hatena.ne.jp/entry/http://d.hatena.ne.jp/sumii/20060928/1159394568



391 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 06:27:31 ]
東大の宿題予想しようぜ


392 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 18:29:19 ]
>>391
東大の講師ごくろうさまです。軽くRubyのコンパイラでも作らせてあげてください。


393 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 20:46:33 ]
そもそも東大生でこんなところに質問しにくるアホはいねーだろ
# と思いたいなあ


394 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 20:58:36 ]
東大生といえども所詮、学生だし。

395 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 21:13:49 ]
むしろ東大生がやるレベルの宿題ってのをみてみたいので、
ここに投げてほしいと思う俺がいる。

396 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 21:40:50 ]
俺も俺も

397 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 15:12:50 ]
俺もw

398 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 16:13:56 ]
ほれ
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


399 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 16:27:23 ]
>>398
ずれててよくわかんない。><

400 名前:デフォルトの名無しさん mailto:sage [2006/10/20(金) 19:06:04 ]
等幅でおk



401 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 04:13:34 ]
宿題じゃないけど、聞いていい?

問、重複行を削除せよ

402 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 04:27:37 ]
ruby -e 'File.open("file.txt"){|f| f.readlines.sort!.uniq! }'

403 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 06:46:39 ]
>>402
ソートしないでという条件をつけさしてください。


404 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 07:06:05 ]
temp = ""
ARGF.each_line do |line|
puts line if not line == temp
temp = line
end

405 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 10:51:00 ]
>>403
print readlines.uniq!

406 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 11:37:44 ]
uniqって、重複なかったら、nilが帰ってくるんだけど orz

407 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 11:40:35 ]
print readlines.uniq

で、いけますね。

408 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 12:12:44 ]
puts ARGF.map.uniq
意味もなく最短を狙ってみる。

409 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 12:40:15 ]
CodeGolfかよw

410 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 16:53:55 ]
>>408
ARGFは$<で代用可能。ついでにそのおかげで空白も除去できる。
puts$<.map.uniq



411 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 22:46:08 ]
>>410
> ついでにそのおかげで空白も除去できる。
将来もずっとそうかわからんぞ。
namespaceの話もあるからな。


412 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 20:20:24 ]
>411
それを言ったら Ruby なんて教祖の暴走がある限り
ほぼ全ての仕様が将来もずっとそうか分からんぞ。

413 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 14:38:13 ]
俺はいつもこんな感じ。適宜digest使ったり。

h = []
ARGF.each_line do |line|
puts line if h[$_.sum] =|| 0
end

414 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 02:02:20 ]
そりゃsyntax errorだと思うが。

if h[line.sum] ||= 0
だとしても常に真だし。

415 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 14:52:15 ]
質問です。

行列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]]
になります。

よろしくお願いします。


416 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 15:53:48 ]
論理和とったら
[[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


417 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 16:03:33 ]
>>416
ありがとうございます。
論理和というか、両方1のときは1、それ以外は0になる形です。

418 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 16:25:42 ]
それは、論理積じゃねーの。

419 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 16:37:23 ]
うむ

420 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 18:22:22 ]
すいません。その通りです。
論理積でお願いします。



421 名前:416 mailto:sage [2006/10/25(水) 18:54:17 ]
あとは自分で考えろよ

422 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 19:59:41 ]
いっぱいある縦棒のどれかをアンパサンドに変えればいいんでないの?

423 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 20:14:23 ]
puts a.map{|x| x.map{|y| i+=1; y | b.fアンパサンドatten[i]; }}.inspect

こうですか? わかりません!

424 名前:415 mailto:sage [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}

428 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 20:08:27 ]
(1..9).to_a

429 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 20:10:02 ]
(1..9).map
このほうが短いな

430 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 00:55:11 ]
Range#to_aが真っ先に思いつくのが普通だよな。



431 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 01:19:25 ]
[*1..9]

432 名前:デフォルトの名無しさん [2006/12/17(日) 07:24:23 ]
>>428-429
マジスカ((((*´ー`)

>>431
これ、知らんかった!
!説明plz
マニュアルに書いてある?

433 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 10:04:55 ]
>>432
「2.8 *がついた引数は何ですか」

434 名前:デフォルトの名無しさん [2006/12/17(日) 11:43:34 ]
>>433
www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=FAQ::%CA%D1%BF%F4%A1%A2%C4%EA%BF%F4%A1%A2%B0%FA%BF%F4#a2.2e8.20.2a.a4.ac.a4.c4.a4.a4.a4.bf.b0.fa.bf.f4.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab
これか・・・。

引数以外にもつけられるんだ

435 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 23:18:17 ]
>>429
1.9ではEnumerable::Enumeratorが返る。


436 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 18:32:40 ]
>>435
将来もずっとそうかわからんぞ。

437 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 22:37:07 ]
>>436
いままでで切り捨てられたものの例を挙げてみてくれないか?


438 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 22:51:18 ]
なんでなんで

439 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 09:51:30 ]
警告出るのはあったな

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を回避して置換するよい方法ありませんか?



441 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 19:59:15 ]
<kuma>panda</kuma>

<kuma>p<a>nd<a></kuma>

こう?


442 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 21:23:23 ]
"<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>"


443 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 08:38:57 ]
  |s,*|
これ↑をすると、配列がはずれて文字列だけになるんだ。
何故?

444 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 09:50:48 ]
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,| で良かったです。すまん。


445 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 12:27:10 ]
>>444
丁寧な説明、サンクス。
なるほど、配列の第1要素のみ利用するってこってですね。

446 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 21:05:25 ]
car?

447 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 13:35:21 ]
>446
lispのcar関数とはまた別モノだろ

448 名前:デフォルトの名無しさん [2007/01/11(木) 20:52:38 ]
C言語で、値の入れ替えは、以下のように書くことができるようですが、
rubyでもっと短くかけないですか?
a=(a^=b,b^=a,a^b);

449 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 20:59:26 ]
>>448
a, b = b, a

Cでもいまどきそんなの使うやついねーよ

450 名前:デフォルトの名無しさん [2007/01/11(木) 22:47:27 ]
>>449
多値使うのかー。

> Cでもいまどきそんなの使うやついねーよ
そうなのかw



451 名前:デフォルトの名無しさん [2007/01/12(金) 14:47:00 ]
自分もできない課題があって困ってるんだが・・・。
りんご本からいくつか課題出されて、その中の

テキスト65ページ 「耳の遠いおばあちゃん」に取り組みなさい。
耳の遠いおばあちゃんのプログラムを書いてみましょう。
おばあちゃんに何を言っても(何をタイプしても)、叫ばない限り(つまり、すべて大文字でタイプしない限り)、
 は?! もっと大きな声で話しておくれ、坊や!
と返事をします。もし叫んだときは、彼女はあなたの言葉を聞いて(少なくとも聞いた気がして)、
 いやー、1938年以来ないねー!
と大声で返事します。
プログラムに真実味を持たせるため、1930から1950のランダムな数字で毎回違う年を叫ぶようにしましょう。
あなたは、BYEと叫ぶまでおばあちゃんとの会話から逃れられません。
う年を叫ぶようにしましょう。
あなたは、BYEと叫ぶまでおばあちゃんとの会話から逃れられません。

とかいうの。

452 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 20:30:26 ]
>>451
ぐぐれば解答例あるよ。

453 名前:デフォルトの名無しさん [2007/01/12(金) 22:54:56 ]
初心者の過去スレ人多すぎで見れない…
どこをググれば??

454 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 11:11:22 ]
Google以外どこをぐぐるんですか?

loop do
  str = STDIN.gets
  if str.upcase == str
    if 'BYE' == str
      break
    else
      # そうかい。1953年以来ないね〜。
    end
  else
      # はぁあああああ!!!?なんだってぇえぇぇぇぇぇぇーーーーー!!!!
  end
end

動かしてないけど大体こんな感じでしょう。
ちゃんと手を動かしながら本読んでれば出来るハズなんだけどなぁ

455 名前:デフォルトの名無しさん [2007/01/14(日) 00:45:45 ]
ぐぐっても解答例が探せなかったorz
そのプログラムも動いてくれなかったです。

乱数のとこで引っかかったりwhileで引っかかったりで前に進みません。

456 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:35:46 ]
454は答えそのものじゃなくて基本的なアプローチ部分のコード例だよ。残りを埋めなきゃ答えにはならん。
それすら見てもわからんのか……。

ところでmixiで質問してるのと同じ人?


457 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 02:23:57 ]
>>455
何がどうダメなのか説明しないと誰もアドバイスできませんよ。
プログラムを動かそうとしたらエラーが出るなら、
そのエラーメッセージとソースコードをコピペする。

「エスパー募集中ですか?」って言われちゃいますよ?


458 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 03:11:56 ]
つーか自分で作って詰まれ
どうせ他人の見ても何がどうなってるのかわからんのだろ

確かにこのスレは宿題丸投げも可だが、あまり身勝手におイタしてると
「完全に動作するがコードが面妖で提出不可」なプログラムだけ回答に出されて放置されたりするぞ

459 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 03:27:05 ]
「ここまでは書けたけどあとはさっぱりです」とか素直に見せられたほうが答返ってくるよな。

460 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 09:55:57 ]
そして誰かが3行程度で作ってしまう。



461 名前:デフォルトの名無しさん [2007/01/14(日) 11:25:50 ]
CodeGolf形式で聞けば答えてくれるぞ

462 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 22:24:50 ]
俺なら70byteで解く

463 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 14:23:44 ]
人工無能を作るスレがあるからそっちで聞け


464 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 22:27:13 ]
関係ない他のスレに迷惑かけちゃいかんよ

465 名前:939 [2007/01/19(金) 23:12:14 ]
ヒープを配列で実装しろという問題とヒープソートの作り方を教えてください

466 名前:デフォルトの名無しさん mailto:sage [2007/01/20(土) 04:09:57 ]
www.geocities.jp/ky_webid/algorithm/022.html

467 名前:デフォルトの名無しさん [2007/01/24(水) 16:36:01 ]
0点の紙が1枚、1点の紙が2枚、4点の紙が1枚入っている箱がある。
この箱から1枚引いて箱に戻すのを6回繰り返したとき、合計点数のとりうる値を求めるプログラムを書け。

この問題の解法を教えてください。よろしくお願いします。



468 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 19:05:18 ]
>>467
算数の問題が解けないのか、解けるけどRubyに書き直せないのかどっちだ?
# 前者のような気はするけど。


469 名前:デフォルトの名無しさん [2007/01/24(水) 20:53:01 ]
>>468
後者です。
場合わけなどを効率よくプログラミングにおとすにはどうしたよいかわかりません。

470 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:42:44 ]
なるほど。アルゴリズムは考え付いたわけね。
じゃ、日本語で良いのでそのアルゴリズムを書いてみて。
それをコード化してあげる。





471 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:00:26 ]
>>467
少年よ、再帰を抱け!

def sum(n,s,k)
ls = [0,1,4]
if n == 0 then
print k,"\t","sum=",s,"\n"
else
for i in 0..2
sum(n-1,s+ls[i],k+[i])
end
end
end

sum(6,0,[])


472 名前:デフォルトの名無しさん [2007/01/24(水) 22:00:33 ]
>>470
計算問題として解くなら手計算でゴリ押しできるのですがうまいアルゴリズムが思いつかなくて。
とりあえず0,1,4からなる6個の数字をすべての場合を網羅するように作成して現れる合計値をすべて記録すれば答えはでるんですが、それだと面倒なので質問しました。


473 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:07:57 ]
トリッキーなコード
   ↓

474 名前:デフォルトの名無しさん [2007/01/24(水) 22:12:02 ]
>>471
ありがとうございます。
こんなに短くできるんですね。

475 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:19:38 ]
>>473
動的計画法を使う典型問題だね。
b = [0]
6.times{b=[0,1,4].inject(b){|c,y|c + b.map{|x|x+y}}.sort.uniq}
puts b

476 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:24:06 ]
inject([])の間違いだた。まぁ今回はたまたまうまく動くけど。

477 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:33:39 ]
おりゃ
puts (0...6).inject([0]){|b,_|[0,1,4].map{|y|b.map{|x|x+y}}.flatten.sort.uniq}


478 名前:デフォルトの名無しさん [2007/01/24(水) 23:08:30 ]
ありがとうございます。この問題の回答としては>>475->>477さんのほうが良いですね。


479 名前:デフォルトの名無しさん [2007/01/28(日) 11:47:43 ]
codegolf的に、配列を圧縮する方法ってないでしょうか。

a = [123, 567, 23, 456, 34, 12]


文字列か何かであらわせないかと。
base64でも使うのかな?

480 名前:デフォルトの名無しさん [2007/01/28(日) 12:16:22 ]
d=[777,666,555,444,333,222,111,0,123,456,789,12,45,67,89,10]
require 'base64'
require 'zlib'
p d
p pk = d.pack("S*")
p z = Zlib::Deflate.deflate(pk)
p b64 = Base64.encode64(z)

p unb64 = Base64.decode64(b64)
p Zlib::Inflate.inflate(unb64)
p ud = unb64.unpack("S*")

puts "d==ud = "+ (d==ud).to_s
puts "b64.length=" + b64.length.to_s

やってみたのですが、
元に戻らない・・・



481 名前:デフォルトの名無しさん [2007/01/28(日) 12:29:24 ]
ミスってた、

d=[777,666,555,444,333,222,111,0,123,456,789,12,45,67,89,10]
require 'base64'
require 'zlib'
p d
p pk = d.pack("S*")
p z = Zlib::Deflate.deflate(pk)
p b64 = Base64.encode64(z)

p unb64 = Base64.decode64(b64)
p unz = Zlib::Inflate.inflate(unb64)
p ud = unz.unpack("S*")

puts "d==ud = "+ (d==ud).to_s
puts b64.length.to_s + " -> " + ud.length.to_s



482 名前:デフォルトの名無しさん [2007/01/28(日) 12:30:00 ]
>>481
でいけますね。解決です。

483 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 21:35:53 ]
本スレのほうから誘導されましたので、こちらで質問させていただきます。
pc10.2ch.net/test/read.cgi/tech/1164885714/548-557

(したいこと)
Arrayの要素の組合せを全て作った Arrayを返す。

(サンプル)
仮に combinations というメソッド名として
[].combinations => []
[1].combinations => [[[1]]]
[1,2].combinations => [
 [[1],[2]], # 1個ずつの組み合わせ
 [[1,2]],  # 2個ずつの組み合わせ
]
[1,2,3].combinations => [
 [[1],[2],[3]], # 1個ずつの組み合わせ
 [[1,2],[3]],  # 2個ずつの組み合わせ
 [[1],[2,3]],  # 2個ずつの組み合わせ
 [[1,2,3]],   # 3個ずつの組み合わせ
]
[1,2,3,4].combinations => [
 [[1],[2],[3],[4]], # 1個ずつの組み合わせ
 [[1,2],[3],[4]],  # 2個ずつの組み合わせ
 [[1],[2,3],[4]],  # 2個ずつの組み合わせ
 [[1],[2],[3,4]],  # 2個ずつの組み合わせ
 [[1,2],[3,4]],   # 2個ずつの組み合わせ
 [[1,2,3],[4]],   # 3個ずつの組み合わせ
 [[1],[2,3,4]],   # 3個ずつの組み合わせ
 [[1,2,3,4]],    # 4個ずつの組み合わせ
]
実装は、メソッドの再帰を行うんだろうとはなんとなく分かるんですが、それ以上は進まず。

484 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 22:31:59 ]
ttp://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/42665?42609-42821

485 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:30:44 ]
>>181
class Array
def srt
case size
when 0,1
self
else
f,*t = self
t.select{|v| v <= f}.srt + [f] + t.select{|v| v > f}.srt
end
end
end

nums = (0..9).map{rand(100)}
p nums
p nums.srt

486 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:30:46 ]
10個の任意の数字を昇順(小さい数から大きい数)に並び替えるプログラムを作成しなさい

注意事項及びヒント:

sortメソッドは使用しないこと
配列を使用した方が並び替え易いと思います

487 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 22:38:08 ]
>>486
OK、sortメソッドは使わないぜ。
a=[1,4,3,5,3,10,3,5,3,5]
$><<a.sort_by{|x|x}.join(" ")

488 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:21:52 ]
>>487
>>486が初心者スレで返された答えとかぶってるw


489 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:52:49 ]
>>486
適当にクイックソートを書いてみた

def qsort(array)
return array unless array.size > 1
left = []
right = []
mid_idx = array.size / 2
mid = array[mid_idx]
array.delete_at(mid_idx)

until array.empty?
n = array.shift
if n < mid
left.push(n)
else
right.push(n)
end
end

qsort(left).push(mid).concat(qsort(right))
end


で、書いておいてなんだが
いくら初心者だろーが力任せ、単純なソート法なら自力で思いつくだろ



490 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:15:48 ]
俺も適当にクイックソート書いてみた。
def qsort(array)
  return array unless array.size > 1
  mid = array.delete_at array.size/2
  array = array.partition{|x|x<mid}
  qsort(array[0]).push(mid).concat(qsort(array[1]))
end
飽きたから超適当。もういいや、こんなんで



491 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:36:50 ]
>489-490
おまえらさあ、こういうのをそのままコピペして提出するアホがいたらどうすんだよ。
これを受け取ってどう評価するか悩む教師の身にもなってみてくれ、まじで。


492 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 00:03:32 ]
教授、乙

493 名前:486 [2007/02/06(火) 01:32:00 ]
レスどうも、コピペしてませんからご安心を。確認しただけです。
全く違うソートになりましたが。

494 名前:デフォルトの名無しさん [2007/02/14(水) 16:21:00 ]
端末に現在時刻を 1 秒おきに表示しスクロールするプログラム.
実行中にキーボードの 1 が押されるとそれ以降は文字色を赤で,
また,2 が押されるとそれ以降は文字色を青で表示する.
0 が押されると数字を入力するようプロンプトを表示し,
時刻の表示間隔を入力された数字の秒数に変更する.
Ctrl+C で終了する.

お願いします.

495 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 19:12:53 ]
じゃあ半分だけ。

loop do
puts Time.now
sleep 1
end

496 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:28:32 ]
それで半分は言いすぎw

497 名前:デフォルトの名無しさん [2007/02/15(木) 03:17:40 ]
どうでもいいけど、宿題で聞くヤツって何でこう、突っ放しなんだろうな。
お前本当に、答えてほしのかとww

もっとこう、答えたくて答えたくてたまらないように、仕向けないといけないと思うんだけど。
・・・まあ、だから、2ch聞いてるんだろうけど。

ちなみん、おれが、2ch聞いたのはほとんど答えてもらってる。

498 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 04:41:13 ]
このスレももう500になるのか
とりあえずフォーマットくらいは用意すべきだろうね

499 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 10:09:25 ]
>>494>>495
ありがとうございます.
核の部分はそうなると思いますが,
そこは問題を説明するために設定した部分で,
本当に聞きたいのはユーザとの対話部分なんです.
引き続きお願いします.

自分なりには curses を使って書いてみたんですが,
getstr がどうもうまく動かないので,
こちらで質問してみました.

500 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 16:39:31 ]
>>499
試行中なんだが、getstrだとエンターまでを入力として期待するのでよくないはず。
getchを使おう。
今のリファレンスには書いてないがncursesの現行のAPIはほとんどwrapされてるようす。
あとは拡張ライブラリのソース見れって感じだ。

正直言って宿題としてはあんまりよくないな。
ncursesそのまま使うのはめんどう。
まあ、むしろCursesに皮を被せる設計の勉強なのかもしれんが。



501 名前:デフォルトの名無しさん [2007/02/20(火) 17:54:13 ]
>>500
とのことなので,getstr 相当のものを getch で書いてみたのですが,
どっちにしても getch で入力待ち状態のときに Ctrl-C が効きませんでした.
ruby のソースを開いてみると ext/curses にサンプルがあったので,
ruby mouse.rb をしてみたのですが,
これでもクリック待ちのときに Ctrl-C で終了できませんでした.
これが,ruby の curses の仕様なんでしょうか?
Ctrl-C を押したらいつでも終了するのがマナー
だと思っていたのですが…

502 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:01:01 ]
>501
ちなみに、環境何?

503 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:11:33 ]
>>502
ruby 1.8.5/screen 4.00/zsh 4.3.2/ck 2.0.26
で coLinux 0.7.1 上の Gentoo と Cygwin とを使っています.

504 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:05:15 ]
>>501
> これでもクリック待ちのときに Ctrl-C で終了できませんでした.
> これが,ruby の curses の仕様なんでしょうか?
rubyのつーか、cursesってそういうもんじゃなかったっけ?

505 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 11:11:41 ]
>>501
手元のopenSUSE 10.2では止まるけど、Ctrl-Cで停止しなければならない仕様なの?
C-Cされてもどこぞでシグナルがトラップされてたら止まらない。
コンソールからインタラクティブに操作するアプリは操作が中断されるだけで止まらないのも多い。

ところでgetchで入力待ちになったら1秒おきに表示が更新されない気がするんだけど?

506 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 11:53:25 ]
>>504
pythonでは入力待ち状態でCtrl-Cしたら
終了するのですがどうなんでしょう?

>>505
環境依存するのは何の違いがきいてるのでしょう?
設定で解消できるものなのか,OS依存でどうしようもないのか?

可能ならばCtrl-Cで終了するようにしたいです.
cursesがtrapを仕込んでいるとして,それを解除,
あるいは,更にtrapしてCtrl-Cを検出することは
無理でしょうか?

>>ところで…
はい.ですから timeout などを使って getch をくるまないといけないと思います.
更新間隔を入力するときは表示の更新が止まってもよいものとします.


507 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 14:12:48 ]
>>506
Cursesのマニュアルをじっくり読みなよ。
ttp://www.kis-lab.com/serikashiki/man/ncurses.html
ttp://www.faqs.org/docs/Linux-HOWTO/NCURSES-Programming-HOWTO.html

508 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 17:54:46 ]
>>507
pythonではできるって言ってんだから
pythonとrubyのcursesの実装の違いでしょ。
そこでcursesのマニュアル出すのはどうかと。


509 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 18:06:09 ]
>>508
証拠は質問者の証言だけか?

510 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 23:02:45 ]
つーか宿題としては性質が悪すぎだな

端末文字の色変えろって気楽に言った時点でイヤな予感はしたんだが



511 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 21:31:43 ]
>>507
んぅ・・・
raw/norawあたりがあやしいかなと思って挿入してみても変化なし.
何かヒントいただけませんか?

>>510
すいません.色は問題の本質ではないです.
色を変える代わりに,1ならA,2ならBを表示するだけかまいません.

512 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 23:44:29 ]
>>511
そこ変えてもダメなの?
Ctrl-Cの扱いを変えられるのはraw、cbreakぐらい。
pythonでもrubyでもcursesモジュールは単にCのAPIをラップしてるだけで変わりはない。
強制的にrawになってる(?)ならgetchした先でCtrl-Cのコードのときexitすりゃいいけど
なんでそんなことになってるのかなあ。

513 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 17:36:05 ]
>>512
ちょっと言葉足らずだったので補足させて下さい.
例えば,以下のようなソースだと noraw モードになってるので
getch で Ctrl-C しても何も起きませんが,
getch より前に raw を挿入すると Ctrl-C で終了できました.
しかし,getch を getstr に置き換えると
raw/noraw/cbreak/nocbreak のどれを挿入しても変化なしでした.

require "curses"
begin
Curses::init_screen
Curses::stdscr.addstr("% ")
Curses::stdscr.refresh()
s = Curses::stdscr.getch()
Curses::stdscr.addstr("\n>>> %s \n" % s)
Curses::stdscr.refresh()
rescue
Curses::close_screen
end

514 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 17:37:08 ]
>>512>>513
なので,getstr の代わりに,以下のように,
raw モードで getch のループを回す mygetstr
を使うと Ctrl-C で終了するようにできました.
しかし,Ctrl-H とかその他もろもろの処理を
全部書くのはなんか無駄なことしてるようで…

def mygetstr()
Curses::raw()
Curses::noecho()
s = ""
while true do
c = Curses::stdscr.getch()
if c == 3 then
exit 3
elsif c == 10 then
break
else
Curses::stdscr.addch(c)
s += [c].pack("c")
end
end
Curses::noraw()
Curses::echo()
return s
end

515 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 19:24:03 ]
cbreak使えば余計なことしなくていいみたいだ。
cbreakモードは割り込み、フロー制御するが、rawモードはスルーして文字を返すそうな。

516 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 19:57:02 ]
>>515
それだとCtrl-Cもとられて本末転倒だろ

517 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 10:27:09 ]
端末制御ってめんどくさいな

518 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:20:46 ]
あきらめてpython使えってことだな

519 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:16:53 ]
宿題なのに?

520 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 00:53:49 ]
最近rubyでプログラミング始めたんですが公式のチュートリアルに>451と
同じ問題があって躓いてます。454見る前にできたプログラム書いてみます。
見て参考になる部分もありましたが3回「連続」で'BYE'を繰り返さないと
抜けられないようにする応用がわかりません。

talk = ''
puts 'おばばに何か用かえ?'
while talk != 'BYE'
talk = gets.chomp
if talk == talk.upcase
puts 'いやー、' + 19.to_s + (30+(rand(30))).to_s + '年以来ないねー!'
else
puts 'もっと大きな声で話しておくれ、坊や!'
end
end



521 名前:520 mailto:sage [2007/03/09(金) 01:06:17 ]
今実行して確かめたら基礎もできてなかった。うーん・・・
これだとBYE実行でもifに行っちゃいますね。

522 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 10:31:33 ]
puts 'おばばに何か用かえ?'
count = 0
while count < 3
talk = gets.chomp
if talk == talk.upcase
puts "いやー、#{1930+rand(20)}年以来ないねー!"
# puts 'いやー、' + (1930+rand(20)).to_s + '年以来ないねー!' と同じ
else
puts 'もっと大きな声で話しておくれ、坊や!'
end

if talk == 'BYE'
count += 1
else
count = 0
end
end

523 名前:520 mailto:sage [2007/03/09(金) 21:07:16 ]
>522
ありがとうございます!countメソッドははじめて見ました。
これまでのチュートリアルにでてないので使わないやり方もあるんですかね?

年号のやつもごちゃごちゃしてましたね。コメントどうもです。
さらに自分でBYE実行時の台詞変えたりしてみようと思います。

524 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:23:38 ]
いや、ここでのcountはただのローカル変数だよ

525 名前:520 mailto:sage [2007/03/09(金) 22:50:52 ]
ああ、そうですね。お恥ずかしいです。
それにしてもチュートリアルの問題やたら難しくないですか?
こんなもんなんでしょうか。
もう少し簡単な問題やヒントがのってるかと思ってチュートリアル書いた人の
本も買ってみたんですがネットにのってるのとほとんど同じ内容でした。

526 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:47:18 ]
こんなもんです。

527 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:26:10 ]
やたら難しいかどうかはともかく、小難しいのには同意する

初めてのPerl並に平易な問題から段階踏んで攻めるのがいいと思うんだが

528 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:35:43 ]
>>514-519
間が空いてしましましたが,
この件 ruby を 1.8.5_p2 から 1.8.6_pre3 にアップデートすると
getstr の入力待ちで Ctrl-C したら終了するようになりました.
Gentoo だとまだ stable じゃなかったこともあって
バージョンのことをまったく気にしてなかったんですが
何が変わったんでしょ?
ともかくご助言して頂いた方々ありがとうございました.


529 名前:デフォルトの名無しさん [2007/04/16(月) 10:53:59 ]
value = ARGV[0] ? ARGV[0] : 100

ARGV[0]が定義されていない場合、デフォルト値100を代入。

ARGV[0]が2個が単調だ。
もっといい書き方はないだろうか?



530 名前:デフォルトの名無しさん [2007/04/16(月) 11:23:17 ]
>>529
value = ARGV[0] || 100



531 名前:デフォルトの名無しさん [2007/04/16(月) 22:51:44 ]
>>530
ああ!そうだった・・・
|| 忘れてたよ・・・

532 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 03:46:47 ]
今月のカレンダを表示する関数を教えてくれ。
calコマンドは呼んじゃ駄目。
つーかprint_this_month関数ぐらい欲しい。

533 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 12:02:25 ]
> print_this_month関数

irb> print Time.now.month
# => 4

irb> require 'date'
irb> puts Date.parse('2006-11-13').month
# => 11

irb> require 'parsedate'
irb> p ParseDate.parsedate('Sat Aug 28 21:45:09 1999')
# => [1999, 8, 28, 21, 45, 9, nil, 6]


こんなんじゃ不足?

ちなみにcalコマンドのようにカレンダーのデータを作り整形して表示するクラスは今のところない
…というかそれ要るか?
そのカレンダーは既にアプリケーションだと思うんだが…

534 名前:デフォルトの名無しさん [2007/04/24(火) 13:15:03 ]
だから宿題なんだろ?

535 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 14:09:01 ]
どのくらいの出来のカレンダーを求められてるかによって難易度は大幅に変わるな

536 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 17:24:25 ]
そもそも出力形式はなんなのよ。 cal と同じでいいの?


537 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 22:16:37 ]
require 'date.rb'

days=['日','月','火','水','木','金','土'] # カレンダーの上の曜日
width=3 # 数字を含めた幅
endday=6 # 週の終わりの曜日(日曜:0、月曜:1、…、土曜:6)

t=Date.today
day_1st=Date.new(t.year,t.month,1) # 今月の第1日
day_last=Date.new(t.year,t.month,-1) # 今月の最終日
puts "#{t.month}月 #{t.year}".center(width*7) # cal風に中心に月と年
days.each{|w| print w.ljust(width)} # 曜日を表示
puts
print ' '*day_1st.wday*width # 1日までを空白で埋める
day_1st.upto(day_last) do |d|
print d.day.to_s.ljust(width)
print "\n" if d.wday == endday # 週の終わりなら改行
end
puts

--------------
ここまでならできた
変数変えただけで月曜始まりにも対応するようにしようと思ったが面倒なのでパス

538 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 08:01:15 ]
…これもあんま宿題として提出はできそうにないな

539 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 09:41:37 ]
#!/usr/bin/ruby

require 'date'

class RubyCalendar
  def calendar(y, m)
    ostr = sprintf("%04d / %s\n", y, Date::MONTHNAMES[m]);
    dt = Date.new(y, m, 1)
    wd = dt.wday
    (0..6).each {|dc|
      ostr += sprintf("%4s", Date::ABBR_DAYNAMES[dc]);
    }
    (0..34).each {|dc|
      d = dc - wd + 1
      y2, m2, d2 = y, m, d
      if(dc < wd || !Date::valid_date?(y, m, d))
        dt2 = dt + d - 1
        y2, m2, d2 = dt2.year, dt2.month, dt2.day
        ds = d2.to_s
      else
        ds = d2;
      end
      ostr += (dc % 7 == 0 ? "\n" : '') + sprintf("%4s", ds);
    }
    return ostr
  end
end

rc = RubyCalendar.new
print rc.calendar(2007, 5)



540 名前:腹減った mailto:sage [2007/04/25(水) 13:02:37 ]
#!/usr/bin/ruby
require 'date'
### 改行制限で書ききれなかったのできちんと cal.rb MM YYYY の形式で指定すること(無指定は今月)
class Calender
def initialize(args)
(args.empty?) ? (t = Date.today) : (t = Date.new(args[1].to_i, args[0].to_i, 1))
case ENV['LANG'] #+ENV['LANGUAGE']
when /ja/i
(@monthnames,@abbr_daynames)=[nil,'1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'], ['日','\
月','火','水','木','金','土']
else
(@monthnames,@abbr_daynames)=Date::MONTHNAMES, Date::ABBR_DAYNAMES.map{|day| day.chop!}
end
(@d_one,@d_last) = Date.new(t.year,t.month,1), Date.new(t.year,t.month,-1)
@width=1
end
attr_writer :width, :monthnames, :abbr_daynames
def to_a
a=Array.new; (@d_one-@d_one.wday).upto(@d_last+6-@d_last.wday){|d| a.push(d)}; return a
end
def to_s
spacer=' '*@width
cal = "#{@monthnames[@d_one.month]} #{@d_one.year}".center(3*7) << "\n"
cal << @abbr_daynames.inject(''){|days,name| days << name.rjust(2) << spacer} << "\n"
to_a.each do |d|
(cal << ' ' << spacer; next) unless d.month == @d_one.month
cal << d.day.to_s.rjust(2) << spacer << "\n"*(d.wday / 6)
end
return cal << "\n"
end
end
Calender.new(ARGV).display



541 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 13:31:13 ]
あ、しまった、to_a の構想を作ってる途中で変えたの忘れてた
この配列を配列として取り出すメリット何もないな

Calender.new(4,2007).to_a で2007年4月の1日から末日までの
Dateオブジェクトの配列が返ってきたら便利だなと思ったんだけど


っていうか、どんな授業で出たカレンダーの宿題なのか早く言ってくれないと
提出に絶対適さないプログラム構造のカレンダーをめいめい趣味で作っちゃうよこのスレ

542 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 13:39:24 ]
cal 4 2007
だけじゃなく
cal 2007
にも対応汁


543 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 15:24:31 ]
#!/usr/bin/ruby
require 'date'
class Date
def to_a
a=Array.new; Date.new(self.year,self.month,1).upto(Date.new(self.year,self.month,-1)){|d| a.push(d)}; return a
end

def calender
arr = self.to_a
cal = "#{MONTHNAMES[self.month]} #{self.year}".center(4*7) << "\n"
cal << ABBR_DAYNAMES.inject(''){|days,name| days << name.rjust(3) << ' '} << "\n"
cal << ' '*arr[0].wday
arr.each do |d|
cal << d.day.to_s.rjust(3) << ' '
cal << "\n" if d.wday == 6
end
return cal
end
end

if ARGV.size == 0 then
d=Date.today
else
d=Date.new(ARGV[1].to_i,ARGV[0].to_i,1)
end
puts d.calender

-------------
Dateのメソッドにすると楽しそうなのでくっつけてみた(書き方はこんなんでいいの?)
to_aがきちんとselfの月の配列になるよ
calenderはDateのプリティな表示ということでcalコマンド互換性を廃して独自に

544 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 16:48:03 ]
お題に沿ってめいめい趣味で作って楽しむスレじゃないの?
他人のソース見るのって勉強に成るし、いろんな解釈から面白いものが出てくれば良いと思う。

545 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 16:57:24 ]
### >>542 動くこた動くがもうわけわからんので煮詰めるのギブアップ
### Date#calenderのwideはtrueだと>>543のように表示、falseだとcalコマンドのように表示

#!/usr/bin/ruby
require 'date'
class Date
def to_a
a=Array.new; Date.new(self.year,self.month,1).upto(Date.new(self.year,self.month,-1)){|d| a.push(d)}; return a
end

def calender(wide=true)
wide ? width=3 : width=2
arr = self.to_a
cal = "#{MONTHNAMES[self.month]} #{self.year if wide}".center((width+1)*7) << "\n"
cal << ABBR_DAYNAMES.inject(''){|days,name| days << (wide ? name.rjust(width) : name.chop.rjust(width)) << ' '} << "\n"
cal << ' '*(width+1)*arr[0].wday
arr.each do |d|
cal << d.day.to_s.rjust(width) << ' '
cal << "\n" if d.wday == 6
end
return cal
end

### 続く


546 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 16:58:51 ]
### 続き
def calender_yearly
cals=Array.new
(1..12).each do |month|
d=Date.new(self.year,month,1)
cals.push(d.calender(false).to_a)
end
calender = "#{self.year.to_s.center(63)}\n\n"
(0..3).each do |i|
calender << seasonal(cals[i*3],cals[i*3+1],cals[i*3+2])
end
return calender
end
def seasonal(m1,m2,m3)
str = " #{m1[0].chomp}#{m2[0].chomp}#{m3[0]}"
(1..7).each do |i|
str << "#{putline(m1[i])}#{putline(m2[i])}#{putline(m3[i])}\n"
end
return str
end
def putline(week)
return "#{week.nil? ? ' '*22 : week.chomp.ljust(22)}"
end
end
if ARGV.size == 0 then
d=Date.today
else
d=Date.new(ARGV[1].to_i,ARGV[0].to_i,1)
end
puts d.calender_yearly

547 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 17:14:29 ]
>>544
ソースが勉強になるかどうかって話になると書く人減りそうだ
スレは改行制限があるからヘンな書き方になるし

三項演算子なんて今年初めて使ったぞ


えー解説、calender_yearlyでは12か月分のカレンダー作って配列calsに入れてます
(コンセプト段階では意味があったんだが今考えると意図不明)

seasonal では

1月1行目+2月1行目+3月1行目\n
1月2行目+2月2行目+3月2行目\n
1月3行目+2月3行目+3月3行目\n

要はこんなことしてます
22文字で固定するためにputlineを作ったんだと思います
なんかもうちょっと繰り返しとかのとこを全体的にどうにかすると
思いっきり綺麗に書けそうですが思いつかないので放置します次の方どうぞ

548 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 18:39:50 ]
>(コンセプト段階では意味があったんだが今考えると意図不明

このセリフどっかで聞いたことあるなぁ
Matzが良く使うよなぁ


549 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 18:54:46 ]
>>548
その台詞、仕事で使わせてもらう ( ・`ω・´)ノ

550 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 19:09:23 ]
#!/usr/bin/ruby
require 'date' # >>545-546 のを改悪
require 'enumerator'
class Date
  def to_a
    (Date.new(self.year,self.month,1)..Date.new(self.year,self.month,-1)).to_a
  end
  def calender(wide = true)
    width = wide ? 3 : 2
    cal = "#{MONTHNAMES[self.month]} #{self.year if wide}".center((width+1)*7) << "\n"
    cal << ABBR_DAYNAMES.map{|n| n[0..width-1]}.join(' ') << "\n"
    cal << ' ' * (width+1) * Date.new(self.year, self.month, 1).wday
    self.to_a.each do |d|
      cal << d.day.to_s.rjust(width) << ' ' << (d.wday == 6 ? "\n" : "")
    end; cal
  end
  def calender_yearly
    cals = (1..12).map do |month|
      a = Date.new(self.year, month, 1).calender(false).split(/\n/)
      a[7] ||= ''; a
    end
    ret = "#{self.year.to_s.center(63)}\n\n"
    cals.each_slice(3) do |a|
      ret << a.transpose.map{|b|b.map{|c|c.ljust(22)}.to_s}.join("\n") << "\n"
    end; ret
  end
end
case ARGV.size
  when 0; puts Date.today.calender
  when 1; puts Date.new(ARGV[0].to_i, 1, 1).calender_yearly
  when 2; puts Date.new(ARGV[1].to_i, ARGV[0].to_i, 1).calender
end



551 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 19:37:37 ]
>>550
きゃー短い

…やっぱこれ行列か
やっぱこれ行列だよな…
行列操作でMatrixしか思いつかなくてA4の紙にでっかい図書いて茹で上がって諦めたよ

Rangeオブジェクトは昇順の数字限定のいけ好かない奴だと思ってたのでこれからはなにやら便利に使うよ
enumeratorはなんて読むかもわかんないくらいなのでこれからがんばってべんきょうするよ



case文は書き慣れた感じがしてやらしいよ

552 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 20:07:10 ]
あらら2009年のを表示させると死ぬな。
a[6] ||= ''; a[7] ||= ''; a にすりゃいいけど、ここ汚くて嫌い。

553 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 21:00:02 ]
どうやったらこういうの書けるようになるの?

554 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 19:17:28 ]
>>553
どうやって日本語覚えた?


555 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 03:33:05 ]
555

556 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 11:27:17 ]
日本語書けるからといって小説が書けるようになるわけでもなく

557 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 12:09:35 ]
でも小説を書くために日本語の勉強って大事。
つ 国語

558 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 16:56:17 ]
お題カモン

559 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 06:52:06 ]
きょうは八十八夜ですが任意の年月日を入力してそれが年初から何日目かを求めるプログラムを作りなさい
ただしDateは使わないこと


560 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 09:31:02 ]
def dates(y,m,d)
((Time.local(y,m,d) - Time.local(y)) / (3600*24) + 1).to_i
end

どうでもいいけど八十八夜ってのは年初からの日数じゃないぞ。

dates(2007,5,2) # => 122




561 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 09:39:58 ]
旧暦の年初だろ
そんなことも知らないのか

562 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 11:24:20 ]
つーか「5」月な時点で30*4=120日くらいは最低過ぎてるんじゃないかと思えて欲しい

563 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 11:32:54 ]
ここで旧暦ライブラリの出番

564 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 12:00:56 ]
122 - 88 = 34 = 2/3 = 節分
うまく出来てるな


565 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 20:44:10 ]
>561
旧正月でもないぞ。

立春から数えて八十八日目。節分もまぁ似たようなものだが。


566 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 21:28:28 ]
ついでに 二百十日 = 9/1 も確認してみました
dates(2007,9,1) # => 244


567 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 21:43:41 ]
立春の予測の厳密な計算ってスタンドアロンではできないんじゃなかったっけ
できたとしても、なんていうかRubyの練習にはならないと思う

568 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 23:07:14 ]
>>567
>できたとしても、なんていうかRubyの練習にはならないと思う
適当なサイトにアクセスして日付を取ってくるとかはどうだ?

569 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 02:07:21 ]
まあお代考えた香具師が馬鹿だったということで、次のお代ドーゾ。

570 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:34:35 ]
マウスの位置はどうしたら分かりますか?



571 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:45:20 ]
基本的にはそんなもんわからん

何かウィンドウシステムのようなもん使ってるならそれ併記しろ
あとなにかRuby/Tkとかのアプリケーション上での話ならそれもきちんと書け

572 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:06:16 ]
FreeBSDでコンソールしか使ってないのですが
なんか文字と同じサイズで四角いマウスカーソル
らしきものが出て来て動くんです


573 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:09:27 ]
それ宿題じゃないだろ

574 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:11:53 ]
っていうか>>570の続きが>>572なんじゃないよな…

575 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:24:01 ]
ttp://freebsd4-jman.kandk.co.jp/8/moused.8.html
ttp://freebsd4-jman.kandk.co.jp/1/vidcontrol.1.html


576 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 22:20:22 ]
>>570
机の横に落ちてるだろ。ちゃんと探せよ。

577 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 11:55:34 ]
マウスパッドの上にありました

578 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 16:32:25 ]
1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

579 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 16:39:04 ]
※ただし55byte以内でなければならない
と付け加えないとつまらんな

580 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 17:17:03 ]
Rubyで書いたら怒られると思う



581 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 20:58:45 ]
これか?
www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm


582 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 22:10:41 ]
やべえ、
おれ再帰つかったことねぇや

583 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 00:35:12 ]
使えるということと使わなければならないということは全く別物
必要なければ使わなくていい
使えないのは問題


584 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 01:06:50 ]
再帰は使わない人は一生自前で使わないからなあ
きちんと概念学んで理解すると時々使うようになると思う

585 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:14:09 ]
「累乗のプログラムを作るときに出てきた累乗専用の何か」以上の理解がない俺に
誰か再帰の便利なとこ教えてくれ

586 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:18:41 ]
Haskellとか使うと嫌でも分かるよ。
というか再帰こそ自然で直観的なものだと思えるようになる。

587 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:28:01 ]
今から再帰で目覚めるためだけにlisp始めれ、というよりは若干やさしいか?




そうでもないか

588 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 02:59:41 ]
教科書の再帰関数は見かけ無駄な動作しかしないからな
フツーの言語で説明されても「こんなんループで書いたほうが早いってはい終了」と思って
即忘れてしまうのは無理もないと思う

589 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 05:48:31 ]
ヒルベルトとか

590 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 08:59:39 ]
クイックソートとかマージソートは再帰で書くと思うが。




591 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:03:17 ]
>>588
Rubyスクリプトだとfact(n)を書くのに
(1..n).each do |i| 以下略
とか
1.upto(n) do |i| 以下略
とか
そういう便利な繰り返しが真っ先に出てきちゃうからな
いや、Rubyに限ったことじゃないけど

592 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 12:42:17 ]
>>578のそもそもは「面接官の前で紙に該当のコード書け」という問題だからなあ
2分もあれば書けるだろうとか言われてるし

モニタの前でコーヒーとか飲みながらキーボードをパチパチやって答える問題ではない

593 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:11:19 ]
実務でクイックソートとかマージソート使う場面あるか?
まずほとんどの場面で、
単純なソートで大丈夫だぜ

594 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:43:51 ]
というか、普通はライブラリを使うだろ。

595 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:54:24 ]
「クイックソート自力で実装しました」とか言ったら普通はグーで殴られるよな

ソートの実装はそれこそ勉強用だ
絶対に自力で経験しないといけないが、絶対に実地で使ってはイカン(趣味でもな)

596 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:31:45 ]
Rubyみたいな言語での再帰の日常利用はある日天啓のごとくひらめくもんだと思う
ただし、たいがいはコードが美しくなるだけであって動作速度は普通に書くよりも遅い
ただでさえワンテンポ遅いRubyが再帰でさらに遅くなるのでトレードオフの見極めに注意

込み入ったプログラムでは使うと便利なこともあるけれど、初心者には無理かも

597 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:26:26 ]
再帰的処理は練習しないと肝心の「再帰処理で考えれば万事うまくいく」とこで再帰の使用をひらめかないから、
自作の速度クリティカルじゃないスクリプトでどんどん使って慣れておいたほうがいいぞ。

598 名前:デフォルトの名無しさん [2007/05/12(土) 12:44:58 ]
(1..100).each{|i|if i%3==0&&i%5==0 then s="FizzBuzz" elsif i%3==0 then s="Fizz" elsif i%5==0 then s="Buzz" else s = i end; puts s}

130bytes orz

599 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:55:39 ]
ラーメンタイマー作ってー
ramen.rb 180
ってやると残り時間を秒単位でカウントしていって
時間過ぎたら今度は経過時間を表示していくようなやつ

600 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 15:22:30 ]
# Windowsではベルは鳴らない(なんで?)。マイナス引数秒までカウントする
# バックスペース文字の連打で描画領域を確保するのは横着なので真似しないこと
time = Integer(ARGV[0])
$stdout.sync = true
time.downto(time*-1) do |t|
print "\a\a" if t < 1
print t.to_s.rjust(4)
sleep 1
print "\b\b\b\b \b\b\b\b"
end




601 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 16:08:51 ]
# 遠くから見て残り時間がわからなくて寂しかったので修正
# 5秒につき * が1個減ります
time = Integer(ARGV[0])
$stdout.sync=true
0.upto(time) do |i|
(print i / 60; next) if i % 60 == 0
(print '*') if i % 5 == 0
end
time.downto(time*-1) do |t|
print "\a" if t < 0
print "\b \b" if t % 5 == 0 && t >= 0
sleep 1
end


602 名前:デフォルトの名無しさん [2007/05/12(土) 16:25:52 ]
>>598
更新履歴兼雑記 - FizzBuzz アゲイン 15:51
d.hatena.ne.jp/shinichiro_h/20070509#1178693484

1.upto(?d){|n|puts ["Fizz#{s=[:Buzz][n%5]}"][n%3]||s||n}
1.upto(?d){|n|s=[:Buzz][n%5];puts n%3<1?"Fizz#{s}":s||n}
1.upto(?d){|n|n%3<1&&s=:Fizz;puts n%5<1?"#{s}Buzz":s||n}
1.upto(?d){|n|puts ["Fizz%s"%s=[:Buzz][n%5]][n%3]||s||n}



603 名前:デフォルトの名無しさん [2007/05/17(木) 20:58:14 ]
FizzBuzzの問題で不思議に思うこと。
いろんな言語で書いてあるのをみてみると
ふりわけするのにこういうパターン(ケース型?)がすごく多い。
if n % 15 == 0 then
puts "FizzBuzz"
elsif n % 3 == 0 then
puts "Fizz"
elsif n % 5 == 0 then
puts "Buzz"
else
puts n
end

15を先に調べるとなにかいいことある?
式の評価回数がふえるだけのような気がするんだけど。
ふつうにifの入れ子では駄目なのかなあ。

あ、短くする競争のものは、なんでもやってください。
そうじゃないものの話ね。


604 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:01:06 ]
改行の出力

605 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:26:13 ]
>>603
「3の倍数の場合」「5の倍数の場合」「3の倍数でもあり、5の倍数でもある場合」
のみっつのケースを特別視しないといけないから、素直にコードに落とすと
そうなるんじゃないか?

606 名前:sage [2007/05/17(木) 21:43:12 ]
私はこっちの方が素直だと思う。

if n % 3 == 0 then
if n % 5 == 0 then
puts "FizzBuzz"
else
puts "Fizz"
end
else
if n % 5 == 0 then
puts "Buzz"
else
puts n
end
end


607 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:13:42 ]
めんどいな

>>603
コードによってthen以下の処理内容は違うから一概には言えない
ただ、たとえば3や5を先にすると、15で割り切れるはずの30が先に3や5の処理に入ることがある
短くしたいとか奇を衒おうとかいうコードの場合、そういうのに対する余分な迂回処理は避けたいんだろう
だから分岐の時点で15を先に持ってくると

608 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:17:02 ]
>>606
n % 5 == 0 という条件式が繰り返されているので、仕様変更に弱い。

TABLE = [nil, "Fizz", "Buzz", "FizzBuzz"]
index = 0
index += 1 if n % 3 == 0
index += 2 if n % 5 == 0
word = TABLE[index]
puts word ? word : n


609 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 00:44:30 ]
仕様変更なんて起こらないだろ

そんなこと言ったら再利用に便利なようにメソッド化しモジュール化すべきだと言うぞ俺は

610 名前:デフォルトの名無しさん [2007/05/18(金) 01:19:00 ]
では、関数型っぽく(lisperっぽく?)

p (1..100).to_a.map {|i|
  if i % 15 == 0 then "FizzBuzz"
  elsif i % 3 == 0 then "Fizz"
  elsif i % 5 == 0 then "Buzz"
  else i
  end
}




611 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 02:21:25 ]
うーん。仕様変更に弱いですか。

実際、どれぐらい式の評価回数が違うか数えてみると
1から100の数字の場合、3でも5でも割り切れる場合が7個
3で割り切れる場合が27個、5で割り切れる場合が13個
それ以外が53個、ケース型の式の評価回数は、
7*1+27*2+(13+53)*3=259回
入れ子型の場合、2*100=200回
ケース型はデータによって変動するわけですが、
最良の場合は100回、最悪で300回。


612 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 10:10:49 ]
pc11.2ch.net/test/read.cgi/prog/1178626960/90


613 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 17:39:56 ]
これはどうでしょう・・・

1.upto(100) {|i|
s = ""
s << 'Fizz' if i % 3 == 0
s << 'Buzz' if i % 5 == 0
s << i.to_s if s == ""
puts s
}


614 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 00:25:39 ]
拡張すると、1-100の各数に対して素因数を全て書き出せ、という問題に

615 名前:デフォルトの名無しさん [2007/05/20(日) 08:31:31 ]
Fizz-Buzz問題
pc11.2ch.net/test/read.cgi/prog/1178626960/

616 名前:デフォルトの名無しさん [2007/05/21(月) 11:40:06 ]
無職さんの答え
(1..100).each{ |n|
  s = n.to_s
  s='Fizz' if n % 3 == 0
  s='Buzz' if n % 5 == 0
  s='FizzBuzz' if n % 15 == 0
  puts s
}

617 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 12:33:07 ]
そういうときはせめて elsif 使おうぜ
別に何かトリッキーな短くしようという書き方してるわけでもないだろ
今のままだと n が 15のとき

s #=> "15"
s #=> "Fizz"
s #=> "Buzz"
s #=> "FizzBuzz"

と 4回切り替わってるぞ

(1..100).each do |n|
if n % 15 == 0 then
s = 'FizzBuzz'
elsif n % 3 == 0 then
s = 'Fizz'
elsif n % 5 == 0 then
s = 'Buzz'
else
s = n.to_s
end
puts s
end

んで「 nが何回も評価されててうぜえ」と感じるなら case 文とか
そして、もしも「こんなん1から100まで入った配列をFizzやBuzz入りの配列に変換すりゃいいんだろ」と思えるのなら

618 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 12:58:33 ]
こんなん考えた

class Fixnum
def fizzbuzz
(ret = "#{["Fizz"][self % 3]}#{["Buzz"][self % 5]}").empty? and ret = to_s
ret
end
end

1.upto(100){|n|
puts n.fizzbuzz
}


619 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 13:05:48 ]
>>617
>>618を使うなら

puts (1..100).to_a.map{|i| i.fizzbuzz}

ってとこか?
どこぞで不評だったputsの特別機能(配列は改行つきで表示)がこんなとこでなにやら便利に

620 名前:デフォルトの名無しさん [2007/05/21(月) 13:07:42 ]
>>617
切り替わるとやばいかな。のちのち値を追いかけるときやばくなるとかですか。
理由をもうちっと教えてください。



621 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 13:41:35 ]
単にムダでイヤとかそういうスタイル上の理由じゃね

str = String.new
str = "hoge"

と同じような無駄(1行目で作られたStringオブジェクトは2行目で破棄される)
何か「まずい」ことがおきることはないはずだよ

622 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:10:10 ]
>>619
map使うならto_aは不要。

623 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:39:59 ]
なにげにEnumerableインクルードしてるからな

624 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:52:02 ]
まだやってんの蚊
お前ら人生の効率をもう少し重視したほうがいい

625 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 04:48:05 ]
3の倍数でFizz、5の倍数でBuzz、7の倍数でFuzz、11の倍数で……

626 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 16:35:08 ]
puts "1"
puts "2"
puts "Fizz"
 ・
 ・
 ・


じゃダメなのか?













と基本的なボケをしてみる。

627 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 19:04:31 ]
赤点ぎりぎりで合格!

628 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 01:00:12 ]
こんなのはやっぱり反則?
FizzBuzz.rb
1.upto(?d){|i|puts""==(a=$0[i*i%3*4-11..-4--i**4%5])?i:a}

629 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 18:03:52 ]
ruby初心者の俺が15の倍数をチェックしないバージョンを書いてみた

def FizzBuzz(x)
 r = "Fizz" if x % 3 == 0
 r = (r||"") + "Buzz" if x % 5 ==0
 return r || x
end

1.upto(100) {|x| puts FizzBuzz(x)}

630 名前:デフォルトの名無しさん [2007/05/28(月) 18:41:31 ]
>>628
うちだと、nil nil nil nil ...にしかならなかった



631 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 21:42:07 ]
ファイル名をFizzBuzz.rbにしてください。

632 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 21:50:44 ]
ファイル作るの面倒だったのでirbで無理矢理動かした。

>> $0 = 'FizzBuzz.rb'
>> 1.upto(?d){|i|puts""==(a=$0[i*i%3*4-11..-4--i**4%5])?i:a}

動作確認には十分。

633 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 22:09:33 ]
普通に、"FizzBuzz"[i*i%3*4-8..-1--i**4%5] でよさそうなもんだが。

634 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:36:53 ]
書き換えるのが面倒だったの

635 名前:デフォルトの名無しさん [2007/05/30(水) 17:02:25 ]
>>629-634
そういうことかww
やっときづいた

636 名前:デフォルトの名無しさん [2007/06/06(水) 15:42:44 ]
a = [1, 2, 0, 3, 4, 5]

配列の一番後ろを得たいときは、
 a.last
だよな?

後ろから2番目、3番目を得たいときは、どうするんだ?
 a[a.size - 2]
しかない?
 a.last(2)
は違うし・・・

637 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 15:49:18 ]
irb> a = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb> a[-2]
=> 4


638 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 15:59:27 ]
-1がlast
last一つ前は-2

639 名前:デフォルトの名無しさん [2007/06/06(水) 16:03:16 ]
>>637-638
インデックス、マイナスにできたのか。しらなかた

reverseしてから、アクセスとかやってた。
サンクスでう。


640 名前:デフォルトの名無しさん [2007/06/11(月) 02:35:33 ]
stringをarrayにする簡単な方法はないですか?
やりたいことは、arrayにして、sortしたいのですが・・・

s.to_aは行ごとだし・・・




641 名前:デフォルトの名無しさん [2007/06/11(月) 02:38:56 ]
srand
s = "hogemoge"
a = []; s.each_byte {|l| a << l.chr}
pp a.sort_by{ rand }.to_s

実際書いてみると、以外に短かかったw


642 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 03:43:29 ]
s.split(//).each

643 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 07:53:28 ]
確かに str.split(//e) が妥当だ(e は str の文字コード)
1文字ずつぶった切って配列にしてるんだなと読み下してもくれるし

644 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 16:10:21 ]
s.scan(/./)
s.split(//)
同じ長さだったか。

645 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:59:06 ]
パスカルの3角形を印字するプログラムを
作りたいのだが以下のプログラムで作るにはどうしたらいいのでしょうか?
教えてください。

print("Enter n: "); n = gets.chomp.to_i
if( n>30 || n<0 ) then
n = 10
end
a = Array.new( n )
a[0] = [1] # 要素が1 の長さ1の配列
# ここでパスカルの3角形を作る
# このとき、a[i]ごとに配列を作る
# そして、印字
for i in (0..a.length-1) do
for j in (0..a[i].length-1) do
print( " ", a[i][j] )
end
print( "\n" )
end

646 名前:デフォルトの名無しさん [2007/07/09(月) 06:58:16 ]
マルチ乙

647 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 08:18:09 ]
そんな事よりカレーの話しようぜ

648 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 14:54:25 ]
宿題スレ行け→マルチ乙
これはひどい

649 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:07:04 ]
回答してはいけないという空気?

650 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:25:33 ]
いや、いいんじゃない?
マルチと誤解されないためには、前スレに移動する由を書いとけばいい



651 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:39:33 ]
それこそ「宿題スレのほうがいい」というアドバイスを受けたからこっち来たんだろ
移動した旨は移動時に既にあっちに書いてあるし、イジられる以上の非難を受ける謂れは無いと思われ

652 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 18:09:50 ]
じゃ、とりあえず。いろいろ宿題の中身無視してるけ、どこんな感じで。

class Array
  def next_pascal
    next_pascal = Array.new

    next_pascal << self[0]

    self[0..-2].each_index do |i|
      next_pascal << self[i] + self[i + 1]
    end

    next_pascal << self[-1]
  end
end

p = [1]

10.times do
  puts p.join(' ')
  p = p.next_pascal
end






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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