further noodling on day 18
This commit is contained in:
parent
917be0d8f1
commit
cc7256461e
55
18/main.go
55
18/main.go
@ -117,18 +117,32 @@ func Add(left, right *pair) *pair {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Reduce(p *pair) *pair {
|
func Reduce(p *pair) {
|
||||||
return &pair{} // ???
|
for {
|
||||||
|
if MustExplode(0, p) {
|
||||||
|
Explode(p)
|
||||||
|
} else if MustSplit(p) {
|
||||||
|
Split(p)
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Split(p *pair) *pair {
|
func Split(p *pair) bool {
|
||||||
if p.left > 9 {
|
if p.left > 9 {
|
||||||
p.leftp = &pair{
|
p.leftp = &pair{
|
||||||
left: p.left / 2,
|
left: p.left / 2,
|
||||||
right: (p.left / 2) + (p.left % 2),
|
right: (p.left / 2) + (p.left % 2),
|
||||||
}
|
}
|
||||||
p.left = 0
|
p.left = 0
|
||||||
return p
|
return true
|
||||||
|
}
|
||||||
|
if p.leftp != nil {
|
||||||
|
m := Split(p.leftp)
|
||||||
|
if m {
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if p.right > 9 {
|
if p.right > 9 {
|
||||||
p.rightp = &pair{
|
p.rightp = &pair{
|
||||||
@ -136,9 +150,34 @@ func Split(p *pair) *pair {
|
|||||||
right: (p.right / 2) + (p.right % 2),
|
right: (p.right / 2) + (p.right % 2),
|
||||||
}
|
}
|
||||||
p.right = 0
|
p.right = 0
|
||||||
return p
|
return true
|
||||||
}
|
}
|
||||||
return p
|
if p.rightp != nil {
|
||||||
|
m := Split(p.rightp)
|
||||||
|
if m {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func MustSplit(p *pair) bool {
|
||||||
|
if p.left > 9 || p.right > 9 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if p.leftp != nil {
|
||||||
|
m := MustSplit(p.leftp)
|
||||||
|
if m {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if p.rightp != nil {
|
||||||
|
m := MustSplit(p.rightp)
|
||||||
|
if m {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func MustExplode(depth int, p *pair) bool {
|
func MustExplode(depth int, p *pair) bool {
|
||||||
@ -160,6 +199,10 @@ func MustExplode(depth int, p *pair) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Explode(p *pair) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func partOne() {
|
func partOne() {
|
||||||
scanner := makeScanner(false)
|
scanner := makeScanner(false)
|
||||||
|
|
||||||
|
@ -43,6 +43,58 @@ func TestMustExplode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSplit(t *testing.T) {
|
||||||
|
cases := map[*pair]string{
|
||||||
|
{left: 1, right: 1}: "[1,1]",
|
||||||
|
{left: 10, right: 1}: "[[5,5],1]",
|
||||||
|
{left: 11, right: 1}: "[[5,6],1]",
|
||||||
|
{left: 12, right: 1}: "[[6,6],1]",
|
||||||
|
{left: 12, right: 12}: "[[6,6],12]",
|
||||||
|
{left: 2, right: 12}: "[2,[6,6]]",
|
||||||
|
{
|
||||||
|
leftp: &pair{left: 15, right: 9},
|
||||||
|
rightp: &pair{left: 8, right: 1},
|
||||||
|
}: "[[[7,8],9],[8,1]]",
|
||||||
|
{
|
||||||
|
leftp: &pair{left: 1, right: 9},
|
||||||
|
rightp: &pair{left: 8, right: 15},
|
||||||
|
}: "[[1,9],[8,[7,8]]]",
|
||||||
|
}
|
||||||
|
for input, expected := range cases {
|
||||||
|
Split(input)
|
||||||
|
if input.String() != expected {
|
||||||
|
t.Log(input.String(), expected)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMustSplit(t *testing.T) {
|
||||||
|
cases := map[*pair]bool{
|
||||||
|
{left: 1, right: 1}: false,
|
||||||
|
{left: 10, right: 1}: true,
|
||||||
|
{left: 11, right: 1}: true,
|
||||||
|
{left: 12, right: 1}: true,
|
||||||
|
{left: 12, right: 12}: true,
|
||||||
|
{left: 2, right: 12}: true,
|
||||||
|
{
|
||||||
|
leftp: &pair{left: 1, right: 9},
|
||||||
|
rightp: &pair{left: 8, right: 5},
|
||||||
|
}: false,
|
||||||
|
{
|
||||||
|
leftp: &pair{left: 1, right: 9},
|
||||||
|
rightp: &pair{left: 8, right: 15},
|
||||||
|
}: true,
|
||||||
|
}
|
||||||
|
for input, output := range cases {
|
||||||
|
result := MustSplit(input)
|
||||||
|
if result != output {
|
||||||
|
t.Log(input.String())
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestAdd(t *testing.T) {
|
func TestAdd(t *testing.T) {
|
||||||
cases := map[string][]*pair{
|
cases := map[string][]*pair{
|
||||||
"[[1,2],[[3,4],5]]": {
|
"[[1,2],[[3,4],5]]": {
|
||||||
@ -59,6 +111,32 @@ func TestAdd(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReduce(t *testing.T) {
|
||||||
|
cases := map[*pair]string{
|
||||||
|
{left: 1, right: 1}: "[1,1]",
|
||||||
|
{left: 10, right: 1}: "[[5,5],1]",
|
||||||
|
{left: 11, right: 1}: "[[5,6],1]",
|
||||||
|
{left: 12, right: 1}: "[[6,6],1]",
|
||||||
|
{left: 12, right: 13}: "[[6,6],[6,7]]",
|
||||||
|
{left: 2, right: 12}: "[2,[6,6]]",
|
||||||
|
{
|
||||||
|
leftp: &pair{left: 15, right: 9},
|
||||||
|
rightp: &pair{left: 8, right: 1},
|
||||||
|
}: "[[[7,8],9],[8,1]]",
|
||||||
|
{
|
||||||
|
leftp: &pair{left: 1, right: 9},
|
||||||
|
rightp: &pair{left: 8, right: 15},
|
||||||
|
}: "[[1,9],[8,[7,8]]]",
|
||||||
|
}
|
||||||
|
for input, expected := range cases {
|
||||||
|
Reduce(input)
|
||||||
|
if input.String() != expected {
|
||||||
|
t.Log(input.String(), expected)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMagnitude(t *testing.T) {
|
func TestMagnitude(t *testing.T) {
|
||||||
cases := map[int]*pair{
|
cases := map[int]*pair{
|
||||||
29: {left: 9, right: 1},
|
29: {left: 9, right: 1},
|
||||||
|
Loading…
Reference in New Issue
Block a user