RabbitFarm
2023-12-03
The Weekly Challenge 245 (Prolog Solutions)
The examples used here are from the weekly challenge problem statement and demonstrate the working solution.
Part 1
You are given two array of languages and its popularity. Write a script to sort the language based on popularity.
Solution
make_pairs(K, V, K-V).
sort_language(Languages, Popularity, SortedLanguages):-
maplist(make_pairs, Popularity, Languages, PopularityLanguages),
keysort(PopularityLanguages, SortedPopularityLanguages),
findall(Language, member(_-Language, SortedPopularityLanguages), SortedLanguages).
Sample Run
% gprolog --consult-file prolog/ch-1.p
| ?- sort_language([2, 1, 3], [perl, c, python], SortedLanguages).
SortedLanguages = [1,2,3]
yes
| ?-
Notes
A pretty standard Prolog convention is the -
separated Pair. So here
all we need do is generate the pairs of popularity and language, and
then use keysort/2
to get everything in the right order.
Part 2
You are given an array of integers >= 0. Write a script to return the largest number formed by concatenating some of the given integers in any order which is also multiple of 3. Return -1 if none found.
Solution
largest_of_three(Numbers, LargestOfThree):-
findall(Number,(
sublist(SubList, Numbers),
\+ SubList = [],
permutation(SubList, SubListPermutation),
number_codes(Number, SubListPermutation),
0 is Number mod 3), NumbersOfThree),
((NumbersOfThree = [], LargestOfThree = -1);
(max_list(NumbersOfThree, LargestOfThree))).
Sample Run
% gprolog --consult-file prolog/ch-2.p
| ?- largest_of_three("819", LargestOfThree).
LargestOfThree = 981
yes
| ?- largest_of_three("86710", LargestOfThree).
LargestOfThree = 8760
(1 ms) yes
| ?- largest_of_three("1", LargestOfThree).
LargestOfThree = -1 ?
yes
| ?-
Notes
This is perhaps the most naive solution to the problem: generate sublists and sort the matching permutations of those sublists.
References
posted at: 20:39 by: Adam Russell | path: /prolog | permanent link to this entry