作者: Hiroshi Shinohara
日時: 2002/5/06(19:53)
風つかいです。

>とりあえず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: 無し。