【激突】関数型言語 VS オブジェクト指向言語2
■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 21:26:47.61一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0424デフォルトの名無しさん
2012/04/15(日) 18:47:39.470425デフォルトの名無しさん
2012/04/15(日) 18:52:45.850426デフォルトの名無しさん
2012/04/15(日) 18:53:02.180427デフォルトの名無しさん
2012/04/15(日) 19:04:47.51汚いコードだけが「合格」www
勝手に判定してる(コード書けない)バカのセンスが露呈してますな
0428デフォルトの名無しさん
2012/04/15(日) 19:05:21.22perl書いたのオレなんだけれどもさ、その通りなんだよな…
0429デフォルトの名無しさん
2012/04/15(日) 19:08:10.88すげえ無理矢理くさくて笑えるw
関数型がオブジェクト指向を取り入れるのはもっと自然なのに
オブジェクト指向っていうかC系列はもう駄目なんだと思う
0430デフォルトの名無しさん
2012/04/15(日) 19:18:55.29そりゃ無理やりくさくもなるさ
0431デフォルトの名無しさん
2012/04/15(日) 19:28:01.70最近のC#の機能なんてC#以前から概念として存在してたはずなのに。
必要ないという当初の目論見は外れてるわけだ。
というか、資産っていうのはC風の構文そのものなんだよね・・・
C風じゃないとヤダヤダいう人が多すぎてD言語とかいちいち作られてる気がする。
C++、Java、C#、D言語
このへんは全て老害でしょ。
0432デフォルトの名無しさん
2012/04/15(日) 19:30:26.050433デフォルトの名無しさん
2012/04/15(日) 19:41:07.47fizz 3 -- "Fizz"
buzz 5 -- "Buzz"
buzz fizz 15 -- "FizzBuzz"
だったらHaskellでも解ける?
0434デフォルトの名無しさん
2012/04/15(日) 19:45:23.420435デフォルトの名無しさん
2012/04/15(日) 19:50:00.84C系列でまともなのはCだけ
0436デフォルトの名無しさん
2012/04/15(日) 19:50:26.06型の不整合が生じるから無理
0437デフォルトの名無しさん
2012/04/15(日) 19:52:02.10C#はどんどんダメな方向に向かってる気はするわー。
0438デフォルトの名無しさん
2012/04/15(日) 20:01:50.150439デフォルトの名無しさん
2012/04/15(日) 20:11:47.98>>303-304
0440デフォルトの名無しさん
2012/04/15(日) 20:19:32.18後付で入れてもらったのがScala、Clojure、F#でしょ
なんで後付を悪く言うのかな
0441デフォルトの名無しさん
2012/04/15(日) 20:41:24.35偉い人にはそれがわからんのです
0442デフォルトの名無しさん
2012/04/15(日) 21:08:30.57アホか
それらは最初から関数型言語として作られてるでしょ。
関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが
なんで今更関数型の要素を入れようとするんだよ。
0443デフォルトの名無しさん
2012/04/15(日) 21:16:51.80オーバーライドした toString() を println() に暗黙に呼ばせるとかいう
使い古されたチートをキメ顔で出してこられても…。
new myInteger(3).fizz() が "Fizz" を返せるとか少しは挑戦しようよ。
0444デフォルトの名無しさん
2012/04/15(日) 21:17:08.32くらいのノリだろ。たぶん
dynamic型導入したときもそんな感じだったし
0445デフォルトの名無しさん
2012/04/15(日) 21:18:37.55もともとJavaへの嫉妬から始まった言語だし。
0446デフォルトの名無しさん
2012/04/15(日) 21:21:52.66手続き型言語がまずあって、
そこへOOの機能を取り入れた。
こんどはさらに関数型の機能も取り入れようとしているだけ。
0447デフォルトの名無しさん
2012/04/15(日) 21:40:30.50C#だってCっぽくないとヤダヤダっていう老害のために
無理矢理作ってるんだから全然人のこといえねーわ。
ラムダとかそんなに良いんならなんで最初から関数型言語使わないんだよw
0448デフォルトの名無しさん
2012/04/15(日) 21:46:15.09> 関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが
> なんで今更関数型の要素を入れようとするんだよ。
オブジェクト指向最高はそうかもしれないが、
関数型は糞なんて言ってないだろ。
現実世界における物質(オブジェクト)に対応づけやすい
自然な発想に基づくオブジェクト指向。
そこに便利な関数型を取り入れただけ。
りんごの方程式とは何か?を考えれば
オブジェクト指向と関数型の関係がわかるだろう。
0449デフォルトの名無しさん
2012/04/15(日) 21:48:54.81だから、C#じゃクロージャ作るのに引数や戻り値にvoidがあると作れないw
やるには予めデリゲートを定義しなきゃならん。
クロージャを使うのを考えさせられる。
ありえん。手軽さが全然ない。
F#はローカル変数(厳密には違うが)を定義するのもクロージャを定義するのも同じ手間しかかからない。
クロージャをバンバン使っていけるのでクロージャの応用もどんどん閃ける。
F#やった方がC#が上手くなるという現実。
C#はやればやるほど馬鹿になる言語。
0450デフォルトの名無しさん
2012/04/15(日) 21:50:04.90関数型でOOPをするときは、返り値として変更したオブジェクトを返すより、新たなオブジェクトを返したほうが関数型ぽいのかね?
F#のことも思い出してあげてください
0452デフォルトの名無しさん
2012/04/15(日) 21:59:08.450453デフォルトの名無しさん
2012/04/15(日) 22:00:17.15どちらが糞でどちらが最高かなんて、問い詰められても答えなくていいと思うんだが
沈黙が正解って小学生でも知ってる奴は知ってるだろ
0454デフォルトの名無しさん
2012/04/15(日) 22:54:52.02>>443
がんばってみたんですが、糸口がみえてきません。もしよろしければアドバイスをいただけないでしょうか。
>new myInteger(3).fizz() が "Fizz" を返せる
�@ これは、「メソッド fizz() が副作用として "Fizz" を出力する」ということですか?
この場合、fizz(), buzz(), gizz() を通過してきて 3 でも 5 でも 7 でもわりきれなかった場合に元の数字を出力する、ということが不可能だと思います。
>>303 では妥協して endl() というメソッドを準備してこの処理を行うしかありませんでした。
�A それとも「メソッド fizz() の返り値が String("fizz") であるべき」ということですか?
String にメソッド fizz() を追加したいのであれば、 String から新しいクラスmyString を継承して、そこにメソッドを定義するということだろうと思いますが、
(new myString(3).fizz() が myString("Fizz") を返す)
�A-1 java.lang.String は final。
�A-2 メソッド fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない。多値を返したいのですが >>304 で精一杯。
>>304 の toString()#Object をオーバーライドする、ってこういうときには普通にすることだと思っていたんですが、何かまずい問題でもあるのでしょうか?
0455デフォルトの名無しさん
2012/04/15(日) 23:40:26.220456デフォルトの名無しさん
2012/04/15(日) 23:47:29.56>>303 の方針でがんばってみました。gizz() は最後に置かなければならない、と決めうちすることにしました。
http://toro.2ch.net/test/read.cgi/tech/1313183984/194
0457デフォルトの名無しさん
2012/04/15(日) 23:49:17.320458デフォルトの名無しさん
2012/04/15(日) 23:50:41.61> fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない
その一見回避不可能な問題を解決する方法を考えるのがこのクイズがクイズたるゆえんです。
言語によっては型システムの制約によりどうやっても実現できないこともあります。
0459デフォルトの名無しさん
2012/04/16(月) 00:02:21.18関数型に限らず、GCのあるOOPLだと
属性変更をせずに新規オブジェクトをサクサク作るやり方も結構使うね
0460デフォルトの名無しさん
2012/04/16(月) 00:45:51.08>>341の方法(元の数値をどこかにメモしておいて適宜参照)はJavaでも使えます。
0461デフォルトの名無しさん
2012/04/16(月) 01:11:55.59OOとPFの言語比較としてこのようなクイズを出したのは、
どのような観点からこれら両者のパラダイムの優劣を比較しようとしたのか
聞きたい
0462デフォルトの名無しさん
2012/04/16(月) 01:13:44.79このクイズではせっかくの労力を生産的でないことに費やしている
0463デフォルトの名無しさん
2012/04/16(月) 01:30:58.12クイズなんかそんなもんだろ。しょせん暇つぶし。
つーか、こんな程度のクイズ解くのに「労力」なんか大仰なもん必要か?
0464デフォルトの名無しさん
2012/04/16(月) 01:38:59.770465デフォルトの名無しさん
2012/04/16(月) 01:48:07.750466デフォルトの名無しさん
2012/04/16(月) 02:07:04.82tieとマクロ使ったのも書こうと思ったけれど手間がもったいなくなってやめた。
パラダイム比較としてもうすこし書く値打ちのあるテーマ出せよ、
このクイズじゃ再帰は使いどころないし
javaのnewだめ静的型システムダメ
何を有利に誘導したいんだか
せめて前スレのpermutationレベルのテーマを出題の下限レベルとしてクレヨ
0467466
2012/04/16(月) 02:18:35.03プログラムプロムナード、ナノピコ教室、Cマガ課題、オイラー4、AIアルゴリズム、OR最適化、
パーサ、マッチング、グラフ問題あたりの
小問題で再帰・高階/部分適用、遅延・カーリー化vsOOの比較できる題材が妥当かもな
step数は2chの1レスに収まるくらいの小問題でいいからサ
0468466
2012/04/16(月) 02:26:58.99たとえばqsortはperlやhaskellでpivotを適当に選択して再帰した短いコードと
pivot選択くどくど頑張ったCやjavaの長いコード比較してファンクショナルの再帰はマンセーみたいな
サイトがあちこちにあるだろ、
あのレベルでも今回のFizzBuzzGizzよりましだろ
0469466
2012/04/16(月) 02:35:35.130470466
2012/04/16(月) 02:44:04.67どのみち記述する言語の特徴または弱点、癖の比較レベルの議論に落ちがちな稀ガス
ズット前スレでヨンだが、意味論的にはOOとPFは相容れない物らしい
しかし生々しい実装レベルではいまんとこ清濁併せ呑んで実現するし
まあいいや寝るか。ノシ
0471デフォルトの名無しさん
2012/04/16(月) 02:46:25.77ズル呼ばわりされるわ、Rubyの>>377の挙動も再現できなかったしで散々だったしね。
0472デフォルトの名無しさん
2012/04/16(月) 02:53:06.66これ以上C++では無理かも。0xだと知らんが。
template< int e, unsigned t >
struct fizzbuzz
{
int in; std::string out;
fizzbuzz( int i ):in( i ){ init(); }
template< int e2, unsigned t2 >
fizzbuzz( const fizzbuzz< e2, t2 > &r )
:in( r.in ),out( r.out ){ init(); }
void init(){ if( in%e ) return;
unsigned tmp=t; out.append( (char*)&tmp, 4 ); }
operator const char *(){ return out.c_str(); }
operator int(){ return in; }
};
typedef fizzbuzz< 3, 'zziF' > fizz;
typedef fizzbuzz< 5, 'zzuB' > buzz;
typedef fizzbuzz< 7, 'zziG' > gizz;
int main()
{
int i = (gizz)(buzz)(fizz)1;
std::string t = (gizz)(buzz)(fizz)15;
std::string u = (gizz)(buzz)(fizz)105;
std::string v = gizz((buzz(fizz(105)))); //こうも書けるね
return 0;
}
0473466
2012/04/16(月) 02:54:29.65あれはね最初に書いたnewはだめって言われて仕方なくの面はあるのよ
$scalar = 関数(関数
と明示的にscalarで主値だけを受けとるように明示するのがホントは作法なんだ。
Rubyの>>377に関しては読んでなかったから挙動の再現にそもそも着手してないよ。
rubyは文法がかなりカオスになって来ちゃって残念だね
0474466
2012/04/16(月) 02:59:22.51それより前スレのpermutaion perl版はwebなど参照せず一から考えて書いて
オレなりに結構な自信作だったのに
なんの反応もなかったことの方が寂しかったな
0475デフォルトの名無しさん
2012/04/16(月) 03:19:21.920476デフォルトの名無しさん
2012/04/16(月) 06:20:08.75涙目でdisるスレです
0477デフォルトの名無しさん
2012/04/16(月) 06:53:26.91必死に難癖付けてて笑ったわww
0478デフォルトの名無しさん
2012/04/16(月) 08:13:17.85数や文字列に状態持たせる以外の方法が
理解できないんだろう
0479デフォルトの名無しさん
2012/04/16(月) 08:32:48.03数や文字列に状態持たせる方法が
許容できないんだろう
0480デフォルトの名無しさん
2012/04/16(月) 08:38:53.990481デフォルトの名無しさん
2012/04/16(月) 08:50:48.960482デフォルトの名無しさん
2012/04/16(月) 09:44:46.42Haskellとかでコンストラクタ無しで1以外の引数をとるとコンパイル時に
型エラーになる関数って定義できたっけ?
0483デフォルトの名無しさん
2012/04/16(月) 10:00:08.87template<> void func<1>(){}
・・・
func<2>();//エラー
0484デフォルトの名無しさん
2012/04/16(月) 12:34:04.90{-# LANGUAGE TemplateHaskell #-}
module FooTH where
import Language.Haskell.TH
foo 1 = [| 1 |]
foo _ = error ""
> cat Main.hs
{-# LANGUAGE TemplateHaskell #-}
import FooTH
main = print $(foo 1) -- foo 2 に変えるとコンパイルエラー
0485デフォルトの名無しさん
2012/04/16(月) 12:50:08.98あれ覚えてるよ、実は感心してた
ていうか、このスレでPerlの評価が結構変わったよ(もちろん高い方へ)
でも、読み易さ優先で書いてあれとは
Perl使いとは分かり合えないな...と思ったけどw
0486デフォルトの名無しさん
2012/04/16(月) 20:25:48.62許容はしてるだろう
エレガントさから程遠いと言ってるだけで
0487デフォルトの名無しさん
2012/04/16(月) 22:19:41.52エレガントってやつかw
0488285
2012/04/17(火) 00:46:48.85問題があれだし書き捨てだからやったが、実際には絶対にやりたくないな
0489デフォルトの名無しさん
2012/04/17(火) 00:47:44.00FizzBuzzすら書けない口だけ野郎の基準よりマシだろwww
お前はこのスレでは最底辺のカスなんだから敬語使えw
0490デフォルトの名無しさん
2012/04/17(火) 00:53:04.36ぶっちゃけ>>479のバカが理解できたのが
たまたまRubyのコードだっただけでRuby厨ですらねーと思うぜ
むしろバカにクソコード褒められてRuby可哀想ってなもんだ
0491デフォルトの名無しさん
2012/04/17(火) 00:59:54.740492466
2012/04/17(火) 01:35:17.45アレは学部・卒研レベルの課題をここに投げたのかなーと
オレは感じた。(真相はシラネ)
もしかしてオレ様はボクちゃんに利用されたのかなとww
0493デフォルトの名無しさん
2012/04/17(火) 10:56:11.26オープンクラスは使わずにブロック(無名関数)で。
| fb fizz buzz gizz |
fb := [:x :cond :str |
| p n |
p := Processor activeProcess.
(x isKindOf: Integer)
ifTrue: [p instVarNamed: #env put: (n := x). x := '']
ifFalse: [n := p instVarNamed: #env].
(cond value: n) ifTrue: [x, str] ifFalse: [x ifEmpty: [n]]].
fizz := [:x | fb value: x value: [:n | n isDivisibleBy: 3] value: 'Fizz' ].
buzz := [:x | fb value: x value: [:n | n isDivisibleBy: 5] value: 'Buzz'].
gizz := [:x | fb value: x value: [:n | n isDivisibleBy: 7] value: 'Gizz'].
self assert: (fizz value: 1) = 1.
self assert: (fizz value: 3) = 'Fizz'.
self assert: (buzz value: (fizz value: 1)) = 1.
self assert: (buzz value: (fizz value: 3)) = 'Fizz'.
self assert: (buzz value: (fizz value: 5)) = 'Buzz'.
self assert: (buzz value: (fizz value: 15)) = 'FizzBuzz'.
self assert: (gizz value: (buzz value: (fizz value: 105))) = 'FizzBuzzGizz'.
self assert: (buzz value: (gizz value: (fizz value: 105))) = 'FizzGizzBuzz'.
0494デフォルトの名無しさん
2012/04/17(火) 12:02:41.83Pythonも同じ方針のやつ
import threading
fbdata = threading.local()
def fb(x, cnd, msg):
if isinstance(x, int):
fbdata.m = n = x
s = ""
else:
n = fbdata.m
s = x
if cnd(n):
return s + msg
elif s <> "":
return s
else:
return n
def fizz(n): return fb(n, lambda n: n%3==0, "Fizz")
def buzz(n): return fb(n, lambda n: n%5==0, "Buzz")
def gizz(n): return fb(n, lambda n: n%7==0, "Gizz")
assert fizz(1) == 1
assert fizz(3) == "Fizz"
assert buzz(fizz(1)) == 1
assert buzz(fizz(3)) == "Fizz"
assert buzz(fizz(5)) == "Buzz"
assert buzz(fizz(15)) == "FizzBuzz"
assert gizz(buzz(fizz(105))) == "FizzBuzzGizz"
assert buzz(gizz(fizz(105))) == "FizzGizzBuzz"
0495デフォルトの名無しさん
2012/04/18(水) 13:10:30.340496デフォルトの名無しさん
2012/04/18(水) 13:31:40.560497デフォルトの名無しさん
2012/04/19(木) 02:49:08.33sub { my $x = shift;
$f->($f->($x)) } };
$rst = $t->($t)->($t)->($t)->(
sub{ my $x = shift;
$x + 1 })->(0);
print $rst, "\n";
0498デフォルトの名無しさん
2012/04/19(木) 09:02:56.87ケチがついた、オープンクラス、メソッドチェーン、リフレクションは無しで
require 'test/unit'
def fb(x, cnd, msg)
th = Thread.current
x.kind_of?(Integer) ? (th[:m] = n = x; s = "") : (n = th[:m]; s = x)
cnd[n] ? s + msg : !s.empty? ? s : n
end
def fizz(n); fb(n, proc{ |n| n%3==0 }, "Fizz") end
def buzz(n); fb(n, proc{ |n| n%5==0 }, "Buzz") end
def gizz(n); fb(n, proc{ |n| n%7==0}, "Gizz") end
class FizzBuzzQuizTest < Test::Unit::TestCase
def test_fbq
assert_equal( fizz(1), 1 )
assert_equal( fizz(3), "Fizz" )
assert_equal( buzz(fizz(1)), 1 )
assert_equal( buzz(fizz(3)), "Fizz" )
assert_equal( buzz(fizz(5)), "Buzz" )
assert_equal( buzz(fizz(15)), "FizzBuzz" )
assert_equal( gizz(buzz(fizz(105))), "FizzBuzzGizz" )
assert_equal( buzz(gizz(fizz(105))), "FizzGizzBuzz" )
end
end
0499デフォルトの名無しさん
2012/04/19(木) 09:53:30.31クソみたいな実装が出てくる出題だったけど
言語比較に役立つ何かは得られましたか?
0500デフォルトの名無しさん
2012/04/19(木) 10:07:54.14動的型であれ作るもんじゃないという幼稚園児並みの洞察が得られました
0501デフォルトの名無しさん
2012/04/19(木) 10:43:06.55「数値と文字列の組」と「数値または文字列」の違いが不明瞭だった。
リフレクションや継承で二つのクラスを一組にしたいのか、
それとも一つのクラスを数種類に分けたいのか明示されていなかった。
0502デフォルトの名無しさん
2012/04/19(木) 10:53:45.22関数的にはどう記述したらいいのかよかったら教えてください。
0503デフォルトの名無しさん
2012/04/19(木) 11:37:33.00関数型的にもオブジェクト指向的にも、どう記述したらいいかとか答えようがない。
0504デフォルトの名無しさん
2012/04/19(木) 12:23:49.22どうすればいいのでしょうか。たとえば、状態をfizzとかbuzzから
(引数として渡すことなしに)参照したり更新したりしたいのです。
0505デフォルトの名無しさん
2012/04/19(木) 12:50:34.08いまんとこHaskellからTLSを使う、「これ」といった定番はないようだ
0506デフォルトの名無しさん
2012/04/19(木) 12:58:07.140507デフォルトの名無しさん
2012/04/19(木) 13:20:53.20それは基本的にStateモナドの領域。
Readerモナドの中で、さらにサブルーチン的に他のReaderモナドを呼び出す時に、
一時的に書き換えたように見せかけたい、っていう場合ならばlocal関数が使えるけど。
Readerモナドで更新したいって、読み取り専用変数に書き込みたいって言ってるのと同じ事なのはわかってるよな…?
0508デフォルトの名無しさん
2012/04/19(木) 17:54:57.76(s -> a) -> (a -> s -> b) -> s -> b
Writer
(a,s) -> (a -> (b,s)) -> (b,s)
State
(s -> (a,s)) -> (a -> s -> (b,s)) -> s -> (b,s)
0509デフォルトの名無しさん
2012/04/20(金) 11:54:43.80あるときは a
またあるときは m a
m a -> (a -> m b) -> m b
0510デフォルトの名無しさん
2012/04/20(金) 17:52:20.760511デフォルトの名無しさん
2012/04/20(金) 22:29:27.340512デフォルトの名無しさん
2012/04/20(金) 22:55:07.28・1〜9のカードを各4枚ずつ用意、それをシャッフルして「ストック」とする
・ストックから7枚のカードを引く
・引いたカードの中から、プレイヤーは合計が15になるように数枚を選んで捨てる
(選ばせ方はプログラマが考える、ギブアップ手段も用意)
・捨てなかったカードと合わせて再び7枚になるか、もしくはストックが空になるまでストックからカードを引く
・また15になるように捨てる
・引いては捨ててを繰り返し、ストックと手札が共に空になったらおめでとう的な言葉を吐いて終了
0513デフォルトの名無しさん
2012/04/20(金) 23:16:37.510514デフォルトの名無しさん
2012/04/21(土) 01:27:35.30Squeak Smalltalk で。
| ui stock player |
ui := UIManager default.
stock := (1 to: 9) gather: [:each | Array new: 4 withAll: each].
stock := stock shuffled asOrderedCollection.
player := (stock removeFirst: 7) asOrderedCollection.
[ | choice |
[ | input |
input := ui request: player asSortedArray asString, 'から合計が15になるようにチョイス'.
choice := input subStrings collect: #asInteger.
choice ifEmpty: [(ui confirm: 'ギブアップ?')
ifTrue: [^self] ifFalse: [choice := {nil}]].
(choice allSatisfy: #isInteger)
and: [choice sum = 15]
and: (player includesAllOf: choice)
and: [choice asSet allSatisfy: [:card | (player occurrencesOf: card) >= (choice occurrencesOf: card)]]
] whileFalse.
player removeAll: choice.
player addAll: (stock removeFirst: (choice size min: stock size)).
player notEmpty] whileTrue.
ui inform: 'おめでとう!'
0515デフォルトの名無しさん
2012/04/21(土) 02:46:31.71なぜこの人は今どきSmalltalkの末裔を使っているのか理由をうかがいたいので
おしえてくださいです
0516デフォルトの名無しさん
2012/04/22(日) 01:52:01.88class CardNotFoundException < RuntimeError; end
def remove_cards(specs, tableau)
specs.each do |spec|
if idx = tableau.find_index{|card| card == spec }
then tableau.delete_at idx
else raise CardNotFoundException.new(spec.to_s)
end
end
end
stock = ((1..9).to_a * 4).shuffle
tableau = []
until tableau.empty? && stock.empty?
tableau.push stock.pop until tableau.size >= 7 || stock.empty?
printf "stock=%d tableau=%p\n? ", stock.size, tableau
k = gets or exit
specs = k.chomp.split(' ').map{|s| s == 'giveup' ? exit : s.to_i }
begin
remove_cards specs,tableau.dup
if (total = specs.inject{|result,n| result + n }) == 15
then remove_cards specs,tableau
else puts "total(#{total}) not equal to 15"
end
rescue CardNotFoundException => e
puts "not found `#{e}'."
end
end
puts 'Congraturations !'
0517デフォルトの名無しさん
2012/04/22(日) 02:31:25.32stock = ([*1..9]*4).shuffle
player = stock.shift(7)
loop do
choice = nil
loop do
puts player.sort.inspect + "から合計が15になるようにチョイス"
choice = gets.split(/[, ]/).map(&:to_i)
choice.delete(0)
if choice.empty?
puts "ギブアップ?[Y/n]"
!(gets=="n\n") ? exit : choice = [0]
end
break if choice.all?(&:integer?) and
choice.reduce(&:+) == 15 and
choice.uniq.all?{ |card| player.count(card) >= choice.count(card) }
end
choice.each{ |e| player.delete_at(player.index(e)) }
player += stock.shift([choice.size, stock.size].min)
break if player.empty?
end
puts "おめでとう!"
0518デフォルトの名無しさん
2012/04/22(日) 12:27:13.72>>514 のコードをどこに入力して、どう実行したら動くんだ?
0519デフォルトの名無しさん
2012/04/22(日) 17:54:43.651. http://sourceforge.jp/projects/squeak-ja/ から Squeak4.2-ja-all-in-one.zip を入手して展開。
2. 同梱 ReadMe-ja.txt などを参考に手元のOSでなんとか起動までこぎつける。無印VMでも新CogVMでもOK。
3. 「ツール」メニューから「ワークスペース」を選択してスクリプトなどのお試し実行用ウインドウを開く。
4. >>514 の | ui stock player | から ui inform: 'おめでとう!' をコピーして 3 のウインドウにペースト。
5. 改めて alt(Macならcmd)+a やマウスドラッグで全選択してから、alt(同cmd)+d で実行。
6. うまく動作すると入力欄がポップアップするので、そこに数字をでスペースなどで区切ってタイプ。
7. 「了解(s)」ボタンクリック(あるいはリターンキー)で入力決定。以降はこれの繰り返し。空決定でギブアップ。
ざっと調べた感じ最新の日本語化版である 4.2ja にこだわらなくても 3.9以降であれば動作するようです。
ただし公式英語版などでは日本語が化けますので適宜英語などに置き換えてからペーストしてください。
日本語版であってもペースト時にエラーがでるようならそのときの対処も同様です。
0520デフォルトの名無しさん
2012/04/22(日) 21:05:31.50let rec input hands =
printfn "合計が15になるように捨てるカードをスペース区切りで指定(ギブアップの場合は指定なし)"
match System.Console.ReadLine() with
| "" -> None
| inp ->
try
let discardCount = inp.Split([|' '|]) |> Seq.map int |> Seq.countBy id |> Map.ofSeq
let handCount = hands |> Seq.countBy id |> Map.ofSeq
if discardCount |> Map.exists (fun n c -> defaultArg (Map.tryFind n handCount) 0 < c)
|| discardCount |> Map.toSeq |> Seq.sumBy ((<||) (*)) |> (<>) 15 then input hands else
handCount |> Map.map (fun n c -> c - defaultArg (Map.tryFind n discardCount) 0)
|> Map.toList |> List.collect (fun (n, c) -> List.replicate c n) |> Some
with _ -> input hands
let rec play hands stocks =
if (hands, stocks) = ([], []) then printfn "おめでとう!" else
let cards = stocks |> Seq.truncate (7 - List.length hands) |> Seq.toList
let nowHands, nextStocks = hands @ cards, (stocks |> Seq.skip cards.Length |> Seq.toList)
nowHands |> Seq.sort |> Seq.map string |> String.concat " " |> printf "手札 : %s, "
printfn "山札の残り枚数 : %d" nextStocks.Length
match input nowHands with Some nextHands -> play nextHands nextStocks | None -> ()
let random = System.Random()
[for i in 1 .. 9 do yield! List.replicate 4 i] |> List.sortBy (fun _ -> random.Next()) |> play []
0521デフォルトの名無しさん
2012/04/23(月) 00:28:55.28ありがと。何か前に入れたバージョンでやってみたら「[ | input |」の行の左に「Period or right bracket expected ->」とか出たけど、実行の仕方自体は判ったから色々試してみる。
0522デフォルトの名無しさん
2012/04/23(月) 00:33:02.590523デフォルトの名無しさん
2012/04/23(月) 07:26:59.30■ このスレッドは過去ログ倉庫に格納されています