RabbitFarm
2023-08-20
The Weekly Challenge 230 (Prolog Solutions)
The examples used here are from the weekly challenge problem statement and demonstrate the working solution.
Part 1
You are given an array of positive integers. Write a script to separate the given array into single digits.
Solution
clone(X, [X]).
separate(Number, Digits):-
number_chars(Number, Chars),
maplist(clone, Chars, DigitChars),
maplist(number_chars, Digits, DigitChars).
separate_digits(Numbers, Digits):-
maplist(separate, Numbers, D),
flatten(D, Digits).
Sample Run
$ gprolog --consult-file prolog/ch-1.p
| ?- separate_digits([1, 34, 5, 6], Digits).
Digits = [1,3,4,5,6] ?
yes
Notes
For a long time I really never embraced the full power of maplist
. At present I can't
seem to get enough! In this solution to TWC230.1 we use maplist to first create a
singleton list for each digit character in each of the given numbers, we then use maplist
to convert these singleton lists to single digit numbers as required.
Part 2
You are given an array of words made up of alphabetic characters and a prefix. Write a script to return the count of words that starts with the given prefix.
Solution
prefix_match(Prefix, Word, Match):-
atom_chars(Prefix, PrefixChars),
atom_chars(Word, WordChars),
((prefix(PrefixChars, WordChars), Match = 1);
(\+ prefix(PrefixChars, WordChars), Match = 0)).
count_words(Prefix, Words, Count):-
maplist(prefix_match(Prefix), Words, Matches),
sum_list(Matches, Count).
Sample Run
$ gprolog --consult-file prolog/ch-2.p
| ?- count_words(at, [pay, attention, practice, attend], Count).
Count = 2 ?
yes
| ?- count_words(ja, [janet, julia, java, javascript], Count).
Count = 3 ?
(1 ms) yes
| ?-
Notes
Another nice use of maplist, but a bit less gratuitous. In this solution to TWC230.2 we
use maplist to generate a list of 0s or 1s, depending on whether a given word starts with
the given prefix. The count of matching words is then the sum_list/2
of those results.
References
posted at: 21:40 by: Adam Russell | path: /prolog | permanent link to this entry