YAPC::EU 2018 Glasgow Update!
This commit is contained in:
parent
22f33d4004
commit
4e2d22a71d
1170 changed files with 15042 additions and 3047 deletions
|
|
@ -0,0 +1,29 @@
|
|||
# require HLPsolver
|
||||
|
||||
adjacent = [{-1, 0}, {0, -1}, {0, 1}, {1, 0}]
|
||||
|
||||
board1 = """
|
||||
0 0 0 0 0 0 0 0 0
|
||||
0 0 46 45 0 55 74 0 0
|
||||
0 38 0 0 43 0 0 78 0
|
||||
0 35 0 0 0 0 0 71 0
|
||||
0 0 33 0 0 0 59 0 0
|
||||
0 17 0 0 0 0 0 67 0
|
||||
0 18 0 0 11 0 0 64 0
|
||||
0 0 24 21 0 1 2 0 0
|
||||
0 0 0 0 0 0 0 0 0
|
||||
"""
|
||||
HLPsolver.solve(board1, adjacent)
|
||||
|
||||
board2 = """
|
||||
0 0 0 0 0 0 0 0 0
|
||||
0 11 12 15 18 21 62 61 0
|
||||
0 6 0 0 0 0 0 60 0
|
||||
0 33 0 0 0 0 0 57 0
|
||||
0 32 0 0 0 0 0 56 0
|
||||
0 37 0 1 0 0 0 73 0
|
||||
0 38 0 0 0 0 0 72 0
|
||||
0 43 44 47 48 51 76 77 0
|
||||
0 0 0 0 0 0 0 0 0
|
||||
"""
|
||||
HLPsolver.solve(board2, adjacent)
|
||||
119
Task/Solve-a-Numbrix-puzzle/Go/solve-a-numbrix-puzzle-1.go
Normal file
119
Task/Solve-a-Numbrix-puzzle/Go/solve-a-numbrix-puzzle-1.go
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var example1 = []string{
|
||||
"00,00,00,00,00,00,00,00,00",
|
||||
"00,00,46,45,00,55,74,00,00",
|
||||
"00,38,00,00,43,00,00,78,00",
|
||||
"00,35,00,00,00,00,00,71,00",
|
||||
"00,00,33,00,00,00,59,00,00",
|
||||
"00,17,00,00,00,00,00,67,00",
|
||||
"00,18,00,00,11,00,00,64,00",
|
||||
"00,00,24,21,00,01,02,00,00",
|
||||
"00,00,00,00,00,00,00,00,00",
|
||||
}
|
||||
|
||||
var example2 = []string{
|
||||
"00,00,00,00,00,00,00,00,00",
|
||||
"00,11,12,15,18,21,62,61,00",
|
||||
"00,06,00,00,00,00,00,60,00",
|
||||
"00,33,00,00,00,00,00,57,00",
|
||||
"00,32,00,00,00,00,00,56,00",
|
||||
"00,37,00,01,00,00,00,73,00",
|
||||
"00,38,00,00,00,00,00,72,00",
|
||||
"00,43,44,47,48,51,76,77,00",
|
||||
"00,00,00,00,00,00,00,00,00",
|
||||
}
|
||||
|
||||
var moves = [][2]int{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}
|
||||
|
||||
var (
|
||||
grid [][]int
|
||||
clues []int
|
||||
totalToFill = 0
|
||||
)
|
||||
|
||||
func solve(r, c, count, nextClue int) bool {
|
||||
if count > totalToFill {
|
||||
return true
|
||||
}
|
||||
|
||||
back := grid[r][c]
|
||||
|
||||
if back != 0 && back != count {
|
||||
return false
|
||||
}
|
||||
|
||||
if back == 0 && nextClue < len(clues) && clues[nextClue] == count {
|
||||
return false
|
||||
}
|
||||
|
||||
if back == count {
|
||||
nextClue++
|
||||
}
|
||||
|
||||
grid[r][c] = count
|
||||
for _, move := range moves {
|
||||
if solve(r+move[1], c+move[0], count+1, nextClue) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
grid[r][c] = back
|
||||
return false
|
||||
}
|
||||
|
||||
func printResult(n int) {
|
||||
fmt.Println("Solution for example", n, "\b:")
|
||||
for _, row := range grid {
|
||||
for _, i := range row {
|
||||
if i == -1 {
|
||||
continue
|
||||
}
|
||||
fmt.Printf("%2d ", i)
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
for n, board := range [2][]string{example1, example2} {
|
||||
nRows := len(board) + 2
|
||||
nCols := len(strings.Split(board[0], ",")) + 2
|
||||
startRow, startCol := 0, 0
|
||||
grid = make([][]int, nRows)
|
||||
totalToFill = (nRows - 2) * (nCols - 2)
|
||||
var lst []int
|
||||
|
||||
for r := 0; r < nRows; r++ {
|
||||
grid[r] = make([]int, nCols)
|
||||
for c := 0; c < nCols; c++ {
|
||||
grid[r][c] = -1
|
||||
}
|
||||
if r >= 1 && r < nRows-1 {
|
||||
row := strings.Split(board[r-1], ",")
|
||||
for c := 1; c < nCols-1; c++ {
|
||||
val, _ := strconv.Atoi(row[c-1])
|
||||
if val > 0 {
|
||||
lst = append(lst, val)
|
||||
}
|
||||
if val == 1 {
|
||||
startRow, startCol = r, c
|
||||
}
|
||||
grid[r][c] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sort.Ints(lst)
|
||||
clues = lst
|
||||
if solve(startRow, startCol, 1, 0) {
|
||||
printResult(n + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
90
Task/Solve-a-Numbrix-puzzle/Go/solve-a-numbrix-puzzle-2.go
Normal file
90
Task/Solve-a-Numbrix-puzzle/Go/solve-a-numbrix-puzzle-2.go
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
global nCells, cMap, best
|
||||
record Pos(r,c)
|
||||
|
||||
procedure main(A)
|
||||
puzzle := showPuzzle("Input",readPuzzle())
|
||||
QMouse(puzzle,findStart(puzzle),&null,0)
|
||||
showPuzzle("Output", solvePuzzle(puzzle)) | write("No solution!")
|
||||
end
|
||||
|
||||
procedure readPuzzle()
|
||||
# Start with a reduced puzzle space
|
||||
p := []
|
||||
nCells := maxCols := 0
|
||||
every line := !&input do {
|
||||
put(p,[: gencells(line) :])
|
||||
maxCols <:= *p[-1]
|
||||
}
|
||||
# Now normalize all rows to the same length
|
||||
every i := 1 to *p do p[i] := [: !p[i] | (|-1\(maxCols - *p[i])) :]
|
||||
return p
|
||||
end
|
||||
|
||||
procedure gencells(s)
|
||||
static WS, NWS
|
||||
initial {
|
||||
NWS := ~(WS := " \t")
|
||||
cMap := table() # Map to/from internal model
|
||||
cMap["_"] := 0; cMap[0] := "_"
|
||||
}
|
||||
|
||||
s ? while not pos(0) do {
|
||||
w := (tab(many(WS))|"", tab(many(NWS))) | break
|
||||
w := numeric(\cMap[w]|w)
|
||||
if -1 ~= w then nCells +:= 1
|
||||
suspend w
|
||||
}
|
||||
end
|
||||
|
||||
procedure showPuzzle(label, p)
|
||||
write(label," with ",nCells," cells:")
|
||||
every r := !p do {
|
||||
every c := !r do writes(right((\cMap[c]|c),*nCells+1))
|
||||
write()
|
||||
}
|
||||
return p
|
||||
end
|
||||
|
||||
procedure findStart(p)
|
||||
if \p[r := !*p][c := !*p[r]] = 1 then return Pos(r,c)
|
||||
end
|
||||
|
||||
procedure solvePuzzle(puzzle)
|
||||
if path := \best then {
|
||||
repeat {
|
||||
loc := path.getLoc()
|
||||
puzzle[loc.r][loc.c] := path.getVal()
|
||||
path := \path.getParent() | break
|
||||
}
|
||||
return puzzle
|
||||
}
|
||||
end
|
||||
|
||||
class QMouse(puzzle, loc, parent, val)
|
||||
|
||||
method getVal(); return val; end
|
||||
method getLoc(); return loc; end
|
||||
method getParent(); return parent; end
|
||||
method atEnd(); return (nCells = val, puzzle[loc.r,loc.c] = (val|0)); end
|
||||
method visit(r,c); return (/best, validPos(r,c), Pos(r,c)); end
|
||||
|
||||
method validPos(r,c)
|
||||
v := val+1 # number we're looking for
|
||||
xv := puzzle[r,c] | fail
|
||||
if (xv ~= 0) & (xv != v) then fail
|
||||
if xv = (0|v) then {
|
||||
ancestor := self
|
||||
while xl := (ancestor := \ancestor.getParent()).getLoc() do
|
||||
if (xl.r = r) & (xl.c = c) then fail
|
||||
return
|
||||
}
|
||||
end
|
||||
|
||||
initially
|
||||
val := val+1
|
||||
if atEnd() then return best := self
|
||||
QMouse(puzzle, visit(loc.r-1,loc.c) , self, val) # North
|
||||
QMouse(puzzle, visit(loc.r, loc.c+1), self, val) # East
|
||||
QMouse(puzzle, visit(loc.r+1,loc.c), self, val) # South
|
||||
QMouse(puzzle, visit(loc.r, loc.c-1), self, val) # West
|
||||
end
|
||||
40
Task/Solve-a-Numbrix-puzzle/Perl/solve-a-numbrix-puzzle.pl
Normal file
40
Task/Solve-a-Numbrix-puzzle/Perl/solve-a-numbrix-puzzle.pl
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
$_ = <<END;
|
||||
0 0 0 0 0 0 0 0 0
|
||||
0 0 46 45 0 55 74 0 0
|
||||
0 38 0 0 43 0 0 78 0
|
||||
0 35 0 0 0 0 0 71 0
|
||||
0 0 33 0 0 0 59 0 0
|
||||
0 17 0 0 0 0 0 67 0
|
||||
0 18 0 0 11 0 0 64 0
|
||||
0 0 24 21 0 1 2 0 0
|
||||
0 0 0 0 0 0 0 0 0
|
||||
END
|
||||
|
||||
my $gap = /.\n/ * $-[0];
|
||||
print;
|
||||
s/ (?=\d\b)/0/g;
|
||||
my $max = sprintf "%02d", tr/0-9// / 2;
|
||||
|
||||
solve( '01', $_ );
|
||||
|
||||
sub solve
|
||||
{
|
||||
my ($have, $in) = @_;
|
||||
$have eq $max and exit !print "solution\n", $in =~ s/\b0/ /gr;
|
||||
if( $in =~ ++(my $want = $have) )
|
||||
{
|
||||
$in =~ /($have|$want)( |.{$gap})($have|$want)/s and solve($want, $in);
|
||||
}
|
||||
else
|
||||
{
|
||||
($_ = $in) =~ s/$have \K00/$want/ and solve( $want, $_ ); # R
|
||||
($_ = $in) =~ s/$have.{$gap}\K00/$want/s and solve( $want, $_ ); # D
|
||||
($_ = $in) =~ s/00(?= $have)/$want/ and solve( $want, $_ ); # L
|
||||
($_ = $in) =~ s/00(?=.{$gap}$have)/$want/s and solve( $want, $_ ); # U
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,3 @@
|
|||
/// @Author: Alexandre Felipe (o.alexandre.felipe@gmail.com)
|
||||
/// @Date: 2017-May-10
|
||||
///
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// NumbrixSolver ///
|
||||
/// Solve the puzzle, by using system verilog randomization engine ///
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue