RabbitFarm

2020-11-15

Perl Weekly Challenge 086

Part 1

You are given an array of integers @N and an integer $A. Write a script to find find if there exists a pair of elements in the array whose difference is $A. Print 1 if exists otherwise 0.

Solution


:- use_module(library(optparse)).
/*
    You are given an array of integers @N and an integer $A.
    Write a script to find find if there exists a pair of elements 
    in the array whose difference is $A.
    Print 1 if exists otherwise 0.
*/
opts_spec(
    [
        [opt(numbers), 
        default([10, 8, 12, 15, 5]),
        longflags([numbers])],

        [opt(a), 
        default(7),
        longflags([a])]
    ]).

ch_1(L, N):-
    member(A, L),
    member(B, L),
    A =\= B,
    D is A - B,
    N = D,
    writeln(1).
    
ch_1(_, _):-  
    writeln(0).
    
main:-
    opts_spec(OptsSpec),
    opt_arguments(OptsSpec, [numbers(L), a(A)], _AdditionalArguments),
    ch_1(L, A),
    halt.

Sample Run


$ swipl -s ch-1.p -g main --numbers="[10, 30, 20, 50, 40]" --a=15
0
$ swipl -s ch-1.p -g main --numbers="[10, 8, 12, 15, 5]" --a=7
1

Notes

My approach here is very similar to what I did last week. Please do check that out if you’re interested in a slightly longer discussion of the use of optparse to handle the command line arguments.

Part 2

You are given Sudoku puzzle (9x9). Write a script to complete the puzzle

Solution


:- use_module(library(clpfd)).
 
sudoku(Puzzle, Solution) :-
        Solution = Puzzle,
        Puzzle = [S11, S12, S13, S14, S15, S16, S17, S18, S19,
                  S21, S22, S23, S24, S25, S26, S27, S28, S29,
                  S31, S32, S33, S34, S35, S36, S37, S38, S39,
                  S41, S42, S43, S44, S45, S46, S47, S48, S49,
                  S51, S52, S53, S54, S55, S56, S57, S58, S59,
                  S61, S62, S63, S64, S65, S66, S67, S68, S69,
                  S71, S72, S73, S74, S75, S76, S77, S78, S79,
                  S81, S82, S83, S84, S85, S86, S87, S88, S89,
                  S91, S92, S93, S94, S95, S96, S97, S98, S99],
 
        ins(Puzzle, 1..9),
 
        Row1 = [S11, S12, S13, S14, S15, S16, S17, S18, S19],
        Row2 = [S21, S22, S23, S24, S25, S26, S27, S28, S29],
        Row3 = [S31, S32, S33, S34, S35, S36, S37, S38, S39],
        Row4 = [S41, S42, S43, S44, S45, S46, S47, S48, S49],
        Row5 = [S51, S52, S53, S54, S55, S56, S57, S58, S59],
        Row6 = [S61, S62, S63, S64, S65, S66, S67, S68, S69],
        Row7 = [S71, S72, S73, S74, S75, S76, S77, S78, S79],
        Row8 = [S81, S82, S83, S84, S85, S86, S87, S88, S89],
        Row9 = [S91, S92, S93, S94, S95, S96, S97, S98, S99],
 
        Column1 = [S11, S21, S31, S41, S51, S61, S71, S81, S91],
        Column2 = [S12, S22, S32, S42, S52, S62, S72, S82, S92],
        Column3 = [S13, S23, S33, S43, S53, S63, S73, S83, S93],
        Column4 = [S14, S24, S34, S44, S54, S64, S74, S84, S94],
        Column5 = [S15, S25, S35, S45, S55, S65, S75, S85, S95],
        Column6 = [S16, S26, S36, S46, S56, S66, S76, S86, S96],
        Column7 = [S17, S27, S37, S47, S57, S67, S77, S87, S97],
        Column8 = [S18, S28, S38, S48, S58, S68, S78, S88, S98],
        Column9 = [S19, S29, S39, S49, S59, S69, S79, S89, S99],
 
        SubBox1 = [S11, S12, S13, S21, S22, S23, S31, S32, S33],
        SubBox2 = [S41, S42, S43, S51, S52, S53, S61, S62, S63],
        SubBox3 = [S71, S72, S73, S81, S82, S83, S91, S92, S93],
        SubBox4 = [S14, S15, S16, S24, S25, S26, S34, S35, S36],
        SubBox5 = [S44, S45, S46, S54, S55, S56, S64, S65, S66],
        SubBox6 = [S74, S75, S76, S84, S85, S86, S94, S95, S96],
        SubBox7 = [S17, S18, S19, S27, S28, S29, S37, S38, S39],
        SubBox8 = [S47, S48, S49, S57, S58, S59, S67, S68, S69],
        SubBox9 = [S77, S78, S79, S87, S88, S89, S97, S98, S99],
 
        valid([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9,
               Column1, Column2, Column3, Column4, Column5, Column6, Column7, Column8, Column9,
               SubBox1, SubBox2, SubBox3, SubBox4, SubBox5, SubBox6, SubBox7, SubBox8, SubBox9]).
 
valid([]).
valid([H|T]) :-
    all_different(H),
    valid(T).

Sample Run


$ swipl -s prolog/ch-2.p
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.2)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).

?- sudoku([_,_,_,2,6,_,7,_,1,6,8,_,_,7,_,_,9,_,1,9,_,_,_,4,5,_,_,8,2,_,1,_,_,_,4,_,_,_,4,6,_,2,9,_,_,_,5,_,_,_,3,_,2,8,_,_,9,3,_,_,_,7,4,_,4,_,_,5,_,_,3,6,7,_,3,_,1,8,_,_,_],Solution).
Solution = [4, 3, 5, 2, 6, 9, 7, 8, 1|...].

?- halt.

Notes

How many Prolog programmers saw this part of the challenge and thought “finally my training has paid off!” For the unfamiliar, Sudoku is a natural fit for a language like Prolog and quite a few variations are possible. My approach here is to make some use of clpfd but favored a more verbose style so that what is happening should be fairly clear. The clpfd manual includes a much more terse example.

posted at: 23:49 | path: /prolog | permanent link to this entry