This commit is contained in:
wi11-holdsworth 2025-08-26 20:23:31 +10:00
commit db96d762ad
5 changed files with 77 additions and 0 deletions

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.direnv

30
README.md Normal file
View file

@ -0,0 +1,30 @@
# Project 1: Maths Puzzles
## Math Puzzle
- each digit must be 1-9
- each row contains no repeated digit
- each column contains no repeated digit
- all squares on the diagonal line from top left corner to bottom right corner must contain the same value
- the heading of each row holds either:
- the sum of all the digits in that row
- the product of all the digits in that row
- the heading of each column holds either:
- the sum of all the digits in that column
- the product of all the digits in that column
## Input
A math puzzle with most/all squares empty **except** for the headings
## Solution
### Structure
A predicate `puzzle_solution/1` which holds when the argument is a solved math puzzle
### Approach
Utilise constraint logic programming
1. unify all squares on the diagonal
2. check rows are valid
1. all distinct
2. sum to heading
3. product to head
3. check columns are valid via `transpose/2`

25
flake.lock generated Normal file
View file

@ -0,0 +1,25 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1746904237,
"narHash": "sha256-3e+AVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ=",
"rev": "d89fc19e405cb2d55ce7cc114356846a0ee5e956",
"revCount": 797896,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.797896%2Brev-d89fc19e405cb2d55ce7cc114356846a0ee5e956/0196c1a7-7ad3-74a9-9d50-1b854aca6d6c/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/NixOS/nixpkgs/0.1"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

20
flake.nix Normal file
View file

@ -0,0 +1,20 @@
{
description = "A Nix-flake-based Swi-prolog development environment";
inputs.nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1";
outputs = inputs:
let
supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
forEachSupportedSystem = f: inputs.nixpkgs.lib.genAttrs supportedSystems (system: f {
pkgs = import inputs.nixpkgs { inherit system; };
});
in
{
devShells = forEachSupportedSystem ({ pkgs }: {
default = pkgs.mkShell {
packages = with pkgs; [ swi-prolog ];
};
});
};
}