https://odz.sakura.ne.jp/projecteuler/index.php?Problem+116
久しぶりにProject Euler解きました。競技プログラミングはChatGPTなどの登場でかなり下火になってるらしいですが…ただ自分が解き済みの問題やらせてみたら全然正答できないのもありますね。
答えなどは省略
%problem116
:- dynamic combination_count_assert/3.
:-lib(ic).
%combination_count_assert(tile_rest,block_size,combinatin_count).
solve:-
retractall(combination_count_assert(,,_)),
combination_count(50, 2, CombinationCount2),
combination_count(50, 3, CombinationCount3),
combination_count(50, 4, CombinationCount4),
Answer is CombinationCount2 + CombinationCount3 + CombinationCount4 – 3,
printf(output,”answer = %d = %d + %d + %d – 3\n”,[Answer,CombinationCount2,CombinationCount3,CombinationCount4]).
combination_count(RestTiles, BlockSize, CombinationCount):-
combination_count_assert(RestTiles,BlockSize,CombinationCount),!. % メモしたケースにヒット
combination_count(0, , 1):-!. combination_count(RestTiles, , 0):-
RestTiles<0,
!.
combination_count(RestTiles, BlockSize, CombinationCount):-
RestTiles1 is RestTiles – BlockSize,
combination_count(RestTiles1, BlockSize, CombinationCount1), % 一番左にBlockを配置したケース
RestTiles2 is RestTiles – 1,
combination_count(RestTiles2, BlockSize, CombinationCount2), % 一番左が空のケース
CombinationCount is CombinationCount1 + CombinationCount2,
assert(combination_count_assert(RestTiles, BlockSize, CombinationCount)).
コメントを残す