SWI- 프롤로그-250
오 소년, 나는 이것에 너무 오래 보냈다.
o(A,B,A+B).
o(A,B,A-B).
o(A,B,A*B).
t([],0).
t([A,B|T],D):-t(T,Q),o(A,B,C),o(C,Q,D).
t([A|T],C):-t(T,Q),o(A,Q,C).
a(A):-t(A,B),n(C),B>C,retract(n(C)),assert(n(B)).
m(A):-assert(n(0)),\+p(A),n(R),R2 is R,write(R2).
p(A):-permutation([0|A],B),a(B),0=1.
명령 줄에서 호출 (예 :)
> swipl -s filename.pl -g "m([1, 1, 1, 1, 1])" -t halt
6
(특별한 이유없이, 골프 기능 이름의 철자가 "토마토 냄비"라는 것이 놀랍습니다.)
언 골프 버전 :
% Possible operations
operation(Left, Right, Left + Right).
operation(Left, Right, Left - Right).
operation(Left, Right, Left * Right).
% Possible ways to transform
transform([], 0).
transform([A, B|T], D) :- transform(T, Q), operation(A, B, C), operation(C, Q, D).
transform([A|T], C) :- transform(T, Q), operation(A, Q, C).
% Throw the given array through every possible transformation and update the max
all_transforms(A) :- transform(A, B), n(C), B>C, retract(n(C)), assert(n(B)).
% Find all the permutations and transformations, then fail and continue execution.
prog(A) :- assert(n(0)), !, permutation([0|A], B), all_transforms(B), fail.
% End the program
finished :- n(R), write(R), nl, R2 is R, write(R2), nl.
% Run the program
main(A) :- ignore(prog(A)), finished.
설명:
- 배열을 인수로 사용하십시오.
- 배열의 모든 순열을 가져옵니다.
- 배열에 추가 할 연산자 배열을 찾으십시오. (이것은 동적 프로그래밍을 통해 이루어지며 처음 두 요소를 결합하면 더 나은지 여부를 알 수 있습니다.)
- 현재 최대 값과 비교하여 확인하십시오. 더 좋은 경우 교체하십시오.
- 우리가 검사를 계속 너무 실패 프로그램에게, 그러나 (사용하여 해당 부정
ignore
또는 \+
술어 전체 수익을 수 있도록) true
계속.
- 숫자 대신 술어 문자열이 제공되므로이를 사용하여 할당
is
한 다음 쓰십시오.