風つかいです。
>とりあえず4つの数値 = (8,4,2,1) としますが、個数は
>4個以上にも簡単に拡張できること、各々の数値も(やろ
>うと思えば)変更できること、が条件です。表示の体裁は
>どうでもいいことにします。
組合せのプログラム少し加工してみました。
コマンドラインから数値を入力するようにしています。
入力数値のダブリはチェック無し、結果のソート無し
入力を使わないケース(結果は0)は考慮無しです。
dice 1 2 4 8 として起動すると、つぎのようになります。
-----^ AAA ( date:02-05-06 time:19:12 ) --------------------<cut here
1 : 1
2 : 2
4 : 4
8 : 8
3 : 1 2
5 : 1 4
9 : 1 8
6 : 2 4
10 : 2 8
12 : 4 8
7 : 1 2 4
11 : 1 2 8
13 : 1 4 8
14 : 2 4 8
15 : 1 2 4 8
-----$ AAA ( lines:15 words:62 ) ---------------------------<cut here
プログラムは、次のようになります。 以前 Icon入門講座で作った
procedureを使っていますが、どういう動作をするのかよくもう覚えて
いません。(汗)
-----^ DICE01.ICN ( date:02-05-06 time:19:09 ) -------------<cut here
####################
# 数字の組み合わせ Icon版
####################
# deice01.icn Rev.1.0 2002/05/06 windy 風つかい H.S.
# Usage : dice n1 n2 n3 n4 ... # 数字を n個引数にして起動
# function: 引数の組合わせの足し算で生成される数を出力
# This file is in the public domain.
procedure main(args) # 引数があれば argsへ格納される
Usage := "dice n1 n2 n3 n4 ..."
if *args = 0 then stop(Usage) # 引数が無いときは Usageを表示
#↑引数の数
every i := 1 to *args do { # 1〜argsの要素数までの全てに
every L := listcomb(args,i) do { # listcomb リストの i要素の組合せ
n := 0 # 足し算結果の初期化
every n +:= !L # リスト Lの全ての要素を足す
writes(n," :") # 足し算結果の書き出し
every writes(" ",!L) # リスト Lの全ての要素の書き出し
write() #
}
}
end
####################
# listの要素の組み合わせを生成
####################
# 1998/04/16 windy 名称変更 lcomb -> listcomb (BIPLとダブルので)
# nCm (n = *L) n個のものから、m個を選ぶ。
# arg: [1]: L: list (of string)
# [2]: m: integer
# value: list
# Usage: every LL := listcomb(L,m) do ...
# Icon入門講座3(11)
procedure listcomb(L,m)
/m := *L
if m = 0 then return []
suspend [L[i := 1 to *L]] ||| listcomb(L[i+1 : 0],m -1)
# ↑listの連結
end
-----$ DICE01.ICN ( lines:40 words:173 ) -------------------<cut here
風つかい(hshinoh@...)
IconのWWWは、http://www.cs.arizona.edu/icon/
UniconのWWWは、http://unicon.sourceforge.net/index.html
BGM: 無し。