no this isn't about alexandria ocasio-cortez
1#!/bin/bash
2
3set -e
4
5# Determine current day based on EST timezone (puzzles unlock at midnight EST)
6EST_DAY=$(TZ="America/New_York" date +%-d)
7EST_MONTH=$(TZ="America/New_York" date +%-m)
8
9if [ "$EST_MONTH" -ne 12 ]; then
10 echo "Error: Advent of Code runs in December"
11 exit 1
12fi
13
14if [ "$EST_DAY" -gt 12 ]; then
15 echo "Error: This event only has 12 days (current EST day: $EST_DAY)"
16 exit 1
17fi
18
19DAY=$EST_DAY
20
21declare -a WORDS=("" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten"
22 "eleven" "twelve")
23
24DAY_WORD=${WORDS[$DAY]}
25
26SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27CMD_DIR="$SCRIPT_DIR/cmd/$DAY_WORD"
28
29# Capitalize first letter for struct name
30DAY_WORD_CAP="$(echo "${DAY_WORD:0:1}" | tr '[:lower:]' '[:upper:]')${DAY_WORD:1}"
31
32# Open browser to puzzle page
33URL="https://adventofcode.com/2025/day/$DAY"
34if command -v xdg-open &> /dev/null; then
35 xdg-open "$URL"
36elif command -v open &> /dev/null; then
37 open "$URL"
38elif command -v start &> /dev/null; then
39 start "$URL"
40else
41 echo "Could not detect browser opener. Please visit: $URL"
42fi
43
44# Create directory and main.go
45if [ -d "$CMD_DIR" ]; then
46 echo "Directory $CMD_DIR already exists"
47else
48 mkdir -p "$CMD_DIR"
49 cat > "$CMD_DIR/main.go" << EOF
50package main
51
52import (
53 "strings"
54
55 "tangled.org/evan.jarrett.net/aoc2025/internal/puzzle"
56)
57
58type Day${DAY_WORD_CAP} struct {
59 // parsed input fields
60}
61
62func (d *Day${DAY_WORD_CAP}) ParseInput(input string) error {
63 for line := range strings.SplitSeq(strings.TrimSpace(input), "\n") {
64 line = strings.TrimSpace(line)
65 if line == "" {
66 continue
67 }
68 // TODO: parse line
69 }
70 return nil
71}
72
73func (d *Day${DAY_WORD_CAP}) Part1() (int, error) {
74 // TODO: solve part 1
75 return 0, nil
76}
77
78func (d *Day${DAY_WORD_CAP}) Part2() (int, error) {
79 // TODO: solve part 2
80 return 0, nil
81}
82
83func main() {
84 puzzle.Run($DAY, &Day${DAY_WORD_CAP}{})
85}
86EOF
87 cat > "$CMD_DIR/main_test.go" << EOF
88package main
89
90import (
91 "testing"
92)
93
94const testInput = \`\`
95
96func TestPart1(t *testing.T) {
97 d := &Day${DAY_WORD_CAP}{}
98 if err := d.ParseInput(testInput); err != nil {
99 t.Fatalf("ParseInput failed: %v", err)
100 }
101
102 got, err := d.Part1()
103 if err != nil {
104 t.Fatalf("Part1 failed: %v", err)
105 }
106
107 want := 0 // TODO: set expected value
108 if got != want {
109 t.Errorf("Part1() = %d, want %d", got, want)
110 }
111}
112
113func TestPart2(t *testing.T) {
114 d := &Day${DAY_WORD_CAP}{}
115 if err := d.ParseInput(testInput); err != nil {
116 t.Fatalf("ParseInput failed: %v", err)
117 }
118
119 got, err := d.Part2()
120 if err != nil {
121 t.Fatalf("Part2 failed: %v", err)
122 }
123
124 want := 0 // TODO: set expected value
125 if got != want {
126 t.Errorf("Part2() = %d, want %d", got, want)
127 }
128}
129EOF
130 echo "Created $CMD_DIR/main.go"
131 echo "Created $CMD_DIR/main_test.go"
132fi