doukaku.org の 自然数の分割
doukaku.org の 自然数の分割 を読んだ。
java, ruby, swi-prolog ですべて同じ出力を得るようにしてみた。
$ cat PartNumber.java
// See http://ja.doukaku.org/89/lang/java/
// javac PartNumber.java
// java -cp . PartNumber 5 3
public class PartNumber {
public static void main(String[] args) throws Exception {
part("", Integer.parseInt(args[0]), Integer.parseInt(args[1]));
}
private static void part(String s, int n, int m) {
if (m == 1) {
System.out.println("[" + s + n + "]");
} else for (int i = n; i >= 0; i--) {
part(s + i + ", ", n - i, m - 1);
}
}
}
$ cat PartNumber.rb
# http://ja.doukaku.org/89/lang/ruby/
# ruby PartNumber.rb
# jruby PartNumber.rb
def divNat(n, m, acc = [])
if m == 1
p acc << n
return
end
n.downto(0) {|i|
divNat(n-i, m-1, acc[0..-1] << i)
}
end
divNat(5,3)
$ cat PartNumber.pl
% http://ja.doukaku.org/89/lang/prolog/
% swipl -c PartNumber.pl
partNum(N, 1, [N]).
partNum(N, M, [J|L]) :- M > 1, M1 is M - 1,
between(0, N, I), J is N - I, partNum(I, M1, L).
solve(N,M) :- forall(partNum(N, M, L), writeln(L)).
:- solve(5, 3).
$ java -cp . PartNumber 5 3
[5, 0, 0]
[4, 1, 0]
[4, 0, 1]
...
ruby PartNumber.rb
[5, 0, 0]
[4, 1, 0]
[4, 0, 1]
...
$ swipl -s PartNumber.pl
[5, 0, 0]
[4, 1, 0]
[4, 0, 1]
...
erlang 版が、まだ dokkau,org には登録されていないな。
作れるかな?
ここでは、[4,1,0], [4,0,1] など組み合わせ的には同じものを区別している。
これらを同じとみなした場合の組み合わせとしての一覧出力するようにするには
どう書けば良い?
« ピックアップ: 「50%の完成度で世に出す」時代の終わり, コンピュUSAの閉店とアップルストアの盛況, etc... | トップページ | doukaku.org の 自然数の分割 (その2) »
この記事へのコメントは終了しました。
« ピックアップ: 「50%の完成度で世に出す」時代の終わり, コンピュUSAの閉店とアップルストアの盛況, etc... | トップページ | doukaku.org の 自然数の分割 (その2) »
コメント