clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

chore/regenerate-vhs-gifs
puzzletea / hitori / benchmark_test.go
benchmark_test.go 1.9K
1package hitori23import (4 "fmt"5 "math/rand/v2"6 "testing"7)89func skipBenchmarkInShortMode(b *testing.B) {10 b.Helper()11 if testing.Short() {12 b.Skip("skipping benchmark in short mode")13 }14}1516type hitoriBenchMode struct {17 size int18 blackRatio float6419}2021var hitoriBenchModes = []hitoriBenchMode{22 {size: 5, blackRatio: 0.32},23 {size: 6, blackRatio: 0.32},24 {size: 8, blackRatio: 0.30},25 {size: 9, blackRatio: 0.30},26 {size: 10, blackRatio: 0.30},27 {size: 12, blackRatio: 0.28},28}2930func BenchmarkGenerateBySize(b *testing.B) {31 skipBenchmarkInShortMode(b)3233 for _, mode := range hitoriBenchModes {34 name := fmt.Sprintf("%dx%d", mode.size, mode.size)35 b.Run(name, func(b *testing.B) {36 rng := rand.New(rand.NewPCG(uint64(mode.size), uint64(mode.size*23+5)))37 b.ReportAllocs()38 b.ResetTimer()3940 for range b.N {41 base := generateLatinSquareSeeded(mode.size, rng)42 mask := generateValidMaskSeeded(mode.size, mode.blackRatio, rng)43 puzzle := constructPuzzleSeeded(base, mask, rng)44 if len(puzzle) != mode.size {45 b.Fatalf("unexpected puzzle size %d", mode.size)46 }47 }48 })49 }50}5152func BenchmarkCountPuzzleSolutionsBySize(b *testing.B) {53 skipBenchmarkInShortMode(b)5455 for _, mode := range hitoriBenchModes {56 name := fmt.Sprintf("%dx%d", mode.size, mode.size)57 b.Run(name, func(b *testing.B) {58 rng := rand.New(rand.NewPCG(uint64(mode.size*97), uint64(mode.size*31+7)))59 puzzle := buildSolverBenchPuzzle(mode.size, rng)6061 b.ReportAllocs()62 b.ResetTimer()6364 for range b.N {65 count := countPuzzleSolutions(puzzle, mode.size, 2)66 if count < 1 {67 b.Fatalf("countPuzzleSolutions returned %d, want >= 1", count)68 }69 }70 })71 }72}7374func buildSolverBenchPuzzle(size int, rng *rand.Rand) grid {75 puzzle := generateLatinSquareSeeded(size, rng)7677 for y := range size {78 x := (y * 2) % size79 next := (x + 1) % size80 puzzle[y][next] = puzzle[y][x]81 }8283 return puzzle84}