Or perhaps just use a language that's designed to solve those sorts of problems? In 14 lines of code.
Is there a similarly short/simple solution not using all of the built ins? Haven't worked with prolog in a while but should be easy enough with primitives (albeit with more duplication)?
Well no, not really. The whole point is to use the appropriate tool for the task at hand. In this case it's the CLP(FD) library, https://www.swi-prolog.org/pldoc/man?section=clpfd
Why not just
blocks(Rows, Blocks), maplist(all_distinct, Blocks), maplist(label, Rows)
Peter Seibel's original post is worth reading in its entirety.
It's a decently balanced piece. It leaves room for various views, and its summation seems about right.
https://gigamonkeys.wordpress.com/2009/10/05/coders-unit-tes...
Some comments 2 months ago (15 points, 7 comments)
2012 (28 points, 9 comments) https://news.ycombinator.com/item?id=4434744
2010 (65 points, 48 comments) https://news.ycombinator.com/item?id=1221399
The one from a couple months ago is here: https://news.ycombinator.com/item?id=45733410
I remember implementing some of these
https://www.stolaf.edu/people/hansonr/sudoku/12rules.htm
With a simple array of unsigned int and bit operations like 20 years ago. It could solve a lot of puzzles within microseconds. Later I realized rules 1, 2, 5, 6 are pretty much the same.