Compare commits

...

3 Commits

Author SHA1 Message Date
Simon Ziegler
500de11910 tried stuff - nothing works yet 2025-12-11 17:58:03 +01:00
Simon Ziegler
aee88264c5 day 08 part 2 2025-12-11 14:57:47 +01:00
Simon Ziegler
4e26c55eb7 day 08 part 1 2025-12-11 14:22:11 +01:00
5 changed files with 787 additions and 64 deletions

View File

@@ -9,29 +9,31 @@ import (
"git.z1glr.de/advent-of-code-2025/pkg/aoc"
)
type Point struct {
type Node struct {
X, Y, Z int
Parent *Point
root *Node
Size int
id int
ID int
}
func (p *Point) DistanceTo(p2 *Point) float64 {
func (p *Node) DistanceTo(p2 *Node) float64 {
return math.Sqrt(float64((p.X-p2.X)*(p.X-p2.X) + (p.Y-p2.Y)*(p.Y-p2.Y) + (p.Z-p2.Z)*(p.Z-p2.Z)))
}
func (p *Point) GetRoot() *Point {
if p.Parent == nil || p.Parent == p {
func (p *Node) GetRoot() *Node {
if p.root == nil {
return p
} else {
return p.Parent.GetRoot()
root := p.root.GetRoot()
p.root = root
return root
}
}
func PointFromString(s string) Point {
func PointFromString(s string) Node {
parts := strings.Split(s, ",")
return Point{
return Node{
X: aoc.ParseInt(parts[0]),
Y: aoc.ParseInt(parts[1]),
Z: aoc.ParseInt(parts[2]),
@@ -41,30 +43,32 @@ func PointFromString(s string) Point {
type Connection struct {
Length float64
P1, P2 *Point
P1, P2 *Node
}
func do(test bool) (int, int) {
rows := aoc.ReadFileRows(test)
points := make([]Point, len(rows))
points := make([]Node, len(rows))
for ii, rr := range rows {
points[ii] = PointFromString(rr)
points[ii].id = ii
points[ii].ID = ii + 1
}
connections := []Connection{}
for ii := range points {
for jj := range points[ii+1:] {
for ii := range points[:len(points)-1] {
for jj := ii + 1; jj < len(points); jj++ {
// for jj := range points[ii+1:] {
p1 := &points[ii]
p2 := &points[jj]
// p2 := &points[ii+1+jj]
connections = append(connections, Connection{
Length: p1.DistanceTo(p2),
P1: &points[ii],
P2: &points[ii+1+jj],
P1: p1,
P2: p2,
})
}
}
@@ -72,58 +76,72 @@ func do(test bool) (int, int) {
// sort distances by length
sort.Slice(connections, func(i, j int) bool { return connections[i].Length < connections[j].Length })
for ii := range connections[:10] {
threshold := 1000
if test {
threshold = 10
}
var res1, res2 int
for ii := range connections {
if ii == threshold {
roots := []*Node{}
for ii := range points {
pp := &points[ii]
if pp.GetRoot() == pp {
roots = append(roots, pp)
}
}
sort.Slice(roots, func(i, j int) bool { return roots[i].Size > roots[j].Size })
res1 = roots[0].Size * roots[1].Size * roots[2].Size
fmt.Println(res1)
} else if ii > threshold {
cc := connections[ii-1]
// check wether it is one big circuit
root := points[0].GetRoot()
multipleCircuits := false
for jj := range points[1:] {
pp := &points[jj]
if pp.GetRoot() != root {
multipleCircuits = true
break
}
}
if !multipleCircuits {
res2 = cc.P1.X * cc.P2.X
fmt.Println(res2)
break
}
}
cc := &connections[ii]
// if both have no parent, make the first one as the parent
if cc.P1.Parent == nil && cc.P2.Parent == nil {
cc.P1.Parent = cc.P1
cc.P2.Parent = cc.P1
cc.P1.Size++
root1 := cc.P1.GetRoot()
root2 := cc.P2.GetRoot()
// if the second one has no parent, connect it to the first one
} else if cc.P2.Parent == nil {
cc.P2.Parent = cc.P1
if root1 != root2 {
root2.root = root1
cc.P1.GetRoot().Size++
} else if cc.P1.Parent == nil {
cc.P1.Parent = cc.P2
cc.P2.GetRoot().Size++
// both have a parent -> make the parent of p2's root p1
} else {
p2Root := cc.P2.GetRoot()
p2OldSize := p2Root.Size
cc.P2.GetRoot().Parent = cc.P1.GetRoot()
cc.P1.GetRoot().Size += p2OldSize
root1.Size += root2.Size
}
}
roots := []*Point{}
for ii := range points {
pp := &points[ii]
if pp.GetRoot() == pp {
roots = append(roots, pp)
fmt.Println(pp.Size)
}
}
sort.Slice(roots, func(i, j int) bool { return roots[i].Size > roots[j].Size })
res1 := roots[0].Size * roots[1].Size * roots[2].Size
fmt.Println(res1)
return res1, 0
return res1, res2
}
func main() {
if r1, r2 := do(true); r1 == 40 && r2 == 0 {
if r1, r2 := do(true); r1 == 40 && r2 == 25272 {
do(false)
}
}

View File

@@ -12,8 +12,12 @@ type Point struct {
X, Y int
}
func (p Point) Area(p2 Point) float64 {
return math.Abs(float64((p.X - p2.X + 1) * (p.Y - p2.Y + 1)))
type Rect struct {
P1, P2 *Point
}
func (r Rect) Area() float64 {
return math.Abs(float64((r.P1.X - r.P2.X + 1) * (r.P1.Y - r.P2.Y + 1)))
}
func do(test bool) (int, int) {
@@ -30,11 +34,27 @@ func do(test bool) (int, int) {
}
}
largestArea := 0.0
largestArea := 0
largestArea2 := 0
for ii, p1 := range points {
for _, p2 := range points[ii+1:] {
largestArea = math.Max(largestArea, p1.Area(p2))
rects := make([]*Rect, len(points)*(len(points)+1)/2)
for ii := range points {
for jj := range points[ii+1:] {
rects[ii+jj+1] = &Rect{
P1: &points[ii],
P2: &points[jj+ii+1],
}
}
}
for ii := range rects {
rr := &rects[ii]
// iterate all others
for jj := range rects {
if jj != ii {
}
}
}

585
11/input Normal file
View File

@@ -0,0 +1,585 @@
jcy: qqq xzi wqn tga eoa dki jjn xyo ywb kor ous mni gkm
ewa: qww tln
wns: lin
ldh: rnx zzx tpx
opp: xed
ahr: rnw
ues: ooa jcy cub
zgm: pxj
nvs: ztn abt
vxm: nwe
lix: wii
zsd: jdr xcr
gms: lqa siz kbp
wvv: xed kxy
qop: mfc
xyw: htg srd vpq cnn icw dfv pav yjs svm axd lqs ntk kgx mbv uzf czy hpv ysj rok aso rpf qlq eai
ruj: pcd qkg
oyz: rqd dwz tes tdq eeo mqm jzd sti wdx vak ruj omj gjk atk lmv jkd otz pdl rnk nvs dpn xva ils cgd mtp dyd
bbu: yza lbs wnt
rye: jcy bid
gaq: inl pmh bey ofx pof asv ohv nkx kao mpg
vpq: wgo
fuj: gci dly
knm: bpb vyn
taw: saj oli yga fco
mbm: ooa cub
ozq: led gni
igf: fgg mhd arm
nwl: psk tnb
egc: ysw xrt
meq: nju xed
ved: dfi gor zsd
vub: may
cae: tlf jds qki mrg
gki: mjz pss
gym: vja
tan: oli yga cgq
zno: nju kxy
kpa: iep hmf ufu cmc
ctp: ktj tft
eds: lgb ony
hni: gor zsd
rej: zrr rwt sdm
wst: igv qqg meq nwe
gju: kts nfm
whc: omw xry pcz
kxy: ebu jjk haj eom fau ixr tlo ttm apc qda blh
fes: rlt ldh
hsx: out
bcp: yhv uyb oyz
nju: qnr poc cbn akc hmx haj ebu yez ixr bjr vaz tlo eom fau
dni: cin xyw mfc
zpi: swo ymg isk
gbg: msf svn bgp
iep: bid jcy cub
fct: cjp tgk
ovp: aqd nkd ocg
qoi: ktn fft
wei: lfd wvv
qda: gqr kyg qoi
jzd: oqh mxu
ukm: oim fwq ntx
dof: nwa jed tif
zpb: zne fdm
sei: nhd
nkd: gaz qcx uft
iag: xnv vke
xrt: plt
lfd: kxy
mga: htl uft qcx gaz
szf: ooa
vbw: ooa jcy cub
gho: svn msf bgp
wlw: ive wvv
psk: gbg vvk
peg: psk tnb nhd
ebu: gyo qqp
cbn: cvv klx
xob: xed nju
qlq: crj
rrs: ymt egc fft gjs
bie: xis trn
qrb: trn bbu skd
xry: zyz qic
fwq: zno dxf
qqp: tlf mjr jds mrg
vkm: kxy nju
qtl: out
oek: igf
tun: ykg tgk cjp
dac: sxv emj
htg: izo sho btt bli
vwx: tft ktj pdq
ymd: mjz dsv pss
lkk: kpe
tlo: fmk
mvv: urx
alh: ooa cub
kjo: hbl
ztd: zpi
blh: bie gwt qrb
asv: kbp siz mkn
rsk: kpa dob ctf
ctf: ufu iep
hpv: rfb
cot: zrr sdm
nfw: raa dac lix cpl
jds: cmv
qxa: cin mfc
auh: cub ooa
drh: nog wia qww
lto: way pgj dfi gor
cii: ojz urx
mkn: unc
cmc: ooa jcy cub
mcv: mkn siz lqa
sxv: tgk ykg cjp
iyx: ahy wlw
kmv: bna gkh
cmz: bjj mfc xyw
fsk: ffa hbl tan
xvx: inl gms bey pmh ofx mpg sha wzh fuo pof mcv xpe kao ahr
lkc: tgk ykg you cjp
sds: vae bgp
qug: bjj
wuo: llf
mjz: tif hmc txn nwa jed
fuo: vxm
cin: yjs rxt srd dfv aso eai axd
vak: huw gki nsb ymd
ffa: cgq oli fco yga saj
gni: qzv efw
qqa: igv vkm qqg
dfv: ojz
yct: oyz qlj
oli: tun
pcz: qic zyz ufi
xcf: raa dac cpl
oae: uyb yhv
otz: uso chy
zrr: out
wjp: bhs yck
wgo: ehw
ybb: yon ldu nwb
mtp: oqh rfk
poc: cvv sfd
fno: gkl fjv jcm
arm: ddi wjp
bey: ovo rnw rmn awz kmv
kpe: uft qcx htl gwu gaz
yow: kpa dob
gyo: tlf mjr qki mrg
cvv: bcp mtf jdq asj
hcc: qlj uyb oyz
wia: cjp
gor: jdr nim xcr
kgx: ekb viq
vja: ztd vca lnv
kao: vts plr bqf
wzh: wst ybq ehu
vny: bey inl gms mpg nkx ohv ofx fuo wzh ahr nee kao xpe asv mcv pof
vts: yrh
hjd: out
teg: eds
bwj: nni
yez: qrb gwt
oyg: fjv jcm upm
yvj: yct wul rhq vke
fgg: hzg ddi qae skk
poh: nfw zpz xcf
aso: gij wgo
vcs: eqo mau nar
ikl: nfm bvm
eqo: xyw cin bjj mfc
ixr: rpb
blx: vnv plt uqv
ydb: nju kxy xed
jtk: out
pcy: vcs nnb
siz: xob ggb
qic: hsx
wrs: may vse
eom: gyo
rnw: ukm
srh: jbx ipz
qzv: wia nog tln lkc
kor: nfw zpz
htl: axv rcz qop
msf: you ykg tgk cjp
vyn: uwx
irn: dct qug pgs
vke: yhv uyb
xnv: oyz yhv uyb
uwx: cjp
dtw: hzv nwl peg
qeh: cmz nyd
zae: wns omw pcz
ppo: kpa
uob: ahy wei
ony: mhd
mrg: yvj ltc iag cmv
ofx: wst ybq qqa ehu
zmb: kxy nju
lqs: fuj
eai: ren
fft: yzt blx jpn xrt ysw
cmv: xnv yct
pmh: wst ehu ybq
vca: bvz zpi
zhm: pcz xry
tln: tgk you ykg
pao: nwb ues yon
uht: taw ffa tan ofg
otu: zzx rnx
sdm: out
beg: out
ren: rye pgb mbm ecy
bjr: gwt qrb
cnn: urx ojz jtq
jcm: oae nxt
vnv: uyb qlj
vzx: out
tqj: zne fdm szf
lgg: jdq fbb asj
rpb: oyg jbx ivr ipz
lgb: gxr mhd arm zee fgg
ntx: ytw
nee: afk vts ksc bqf
ksc: qbg
urx: seb
ovo: ukm
pub: dct pgs qxa
crj: pgb rye alh
haj: klx cvv sfd
oim: weh dxf zno ytw opp
npo: mhd arm fgg gxr
raa: sxv emj
rfk: fje
ktn: blx jpn xrt
lrv: ved lto hni
hwx: kpe mga
fei: cjp you ykg
lap: ldh otu
lnv: rtf bvz zpi
saj: uzy fct
skk: qtl yck jtk
cnr: vse may tqj zpb
jjk: lgg cvv sfd
rok: rfb gij
gpn: jcy
led: qzv drh
ksw: xvw gcs
cqj: uyb oyz
sti: gki huw nsb
swo: yxl xlx
rtf: swo
uyb: mqm pii eeo nvs rnk gjk tes dwz wdx tdq lmv
dki: hzv nwl sei nsg peg
rnx: out
bli: qix ixj
tlf: iag iwy ltc
huf: nps
qmy: bid cub jcy
huw: dof
nnb: mau bbf avw eqo nar
qqg: kxy xed
dyd: qeh chy
xmv: ztd llf lnv
yzt: plt uqv vnv
mqm: uso
myt: foi lap hdp
axd: esg vub wrs cnr
zyz: beg hsx hjd
ufi: fgo hsx beg
dfi: xcr
ecy: cub bid
fql: fes hdp lap
jjn: sei nsg peg
awz: gkh
cpl: wii
ous: sei nsg peg
efw: wia qww tln lkc
you: teg ndz ljf dga agc ikl zob oqw gra jbh gym zgm pye ctp ovj
cjp: ovj ctp zgm jbh gym gra ikl zob gju oqw agc dga ljf vwx bds lrv teg ndz bwj
lin: fgo
mxu: fje btx hhl wal
rwt: out
xed: eom fau blh dlw bjr apc vaz akc hmx jjk aan ebu haj yez ixr qnr poc qda
nlq: ooa jcy cub
ixj: cub jcy
lll: bey pmh inl gms mpg nkx ohv ofx fuo sha ahr nee xpe asv mcv
ybq: vkm
gci: ooa jcy
rfb: rsk
ywb: grr gni led
tya: opp
asj: yhv oyz
jpn: vnv
rqd: ymd nsb gki
qkg: tku irn
svr: lll vny xvx gaq
gqr: fft gjs ymt
chy: nyd vzu cmz
yza: uyb qlj oyz
nhd: sds gho
skd: yza cqj wnt vmk
eeo: lzk lkk
ykg: ctp ovj gym ikl gju gra fwv lrv bds vwx ljf bwj
fdm: bid
pdq: ayf fql myt irf btu
vvk: msf svn
zne: cub bid
gcs: tgk ykg
ooa: jjn xzi eoa ozq dki kor tga rtk ous mni
gjk: pcy
pgj: nim
ekb: dly qmy hwv
ive: xed nju kxy
omw: ufi
ehw: dob ctf
fvw: wei
pii: mxu zfo
ktj: fql irf btu
hmf: jcy
cgd: pcd rea qkg
xpe: ose iyx fvw uob
ztn: yvg nnb
wxi: weh dxf
ntl: ztd
oxb: mga aqd kpe ocg
cge: qjf pfe
svm: crj wlu ren hvz
nxt: uyb qlj oyz
cgq: hyr tun fei
ivr: upm jcm gkl fjv
jtq: ybb
dpn: pcd rea
qww: cjp tgk you
rxt: btt
afk: yrh wwz
nar: mfc bjj cin xyw
yck: out
svn: cjp ykg you tgk
uft: rcz ziq
upm: hcc
lzk: nkd
ufu: cub
qlj: xva nvs dpn dyd mtp cgd pdl rnk gjk otz jkd lmv atk pii ruj wdx vak sti eeo mqm jzd dwz tes tdq
irf: hdp fes
xlx: out
btu: foi
gjs: ysw xrt jpn blx yzt
apc: cae qqp
eoa: nfw
ocg: qcx uft htl gwu gaz
xva: hwx ovp lkk
klx: asj fbb bcp jdq
hhl: xyw
hwv: cub jcy ooa
ysj: hvz wlu crj
moo: qww tln nog
abt: vcs yvg nnb
jkd: nsb ymd huw
nwb: jcy cub
jlm: zrr rwt sdm izy
ofg: saj oli
zfo: dni
tgk: bwj ndz fwv teg bds lrv vwx ljf oqw gju ikl gra dga agc ovj gym jbh pye zgm
axv: xyw bjj
ils: oqh
dlw: bie qrb
hbl: cgq oli yga saj
kts: agr zhm zae
qnr: fmk rpb
fje: mfc bjj cin
nfm: whc
yxl: out
gwt: bbu
uzy: tgk cjp
ziq: mfc bjj xyw cin
tpx: out
zpz: cpl raa
may: gpn fdm nlq szf
nyd: cin
weh: kxy nju xed
lmv: pcy ztn
bjj: kgx cii mbv uzf hpv rok aso rpf eai qlq srd htg vpq cnn mvv rxt icw dfv pav yjs svm axd lqs
gkl: oae
rit: ofg ffa taw
wwz: sfu
wlu: ecy pgb rye
wul: qlj yhv
bgp: cjp
tga: jtb bpb
zzx: out
qki: iag iwy yvj
wdx: uso chy
dob: iep auh
llf: bvz
bvm: zhm whc agr
hmx: fmk
foi: rlt otu
yrh: tzi
bvz: isk
wqn: uht kjo fsk upc rit
ovj: vja xmv
lbs: uyb oyz
ljf: nni oek
bid: xyo kor ywb rtk ozq jjn
uzf: wrs blv cnr
yjs: esg
btx: bjj cin
avw: xyw
ehu: meq nwe qqg igv
jed: mfc xyw cin
aan: sfd lgg klx
fwv: xmv vja ntl
igv: xed
wal: cin xyw mfc
aqd: uft
gwu: rcz
gxr: skk
upc: hbl taw ffa tan ofg
hzv: nhd
izy: out
srd: viq
pav: izo bli sho
mbv: fuj ekb viq
emj: you
izo: vbw eor gpr ixj
vse: szf nlq fdm zne
pgb: jcy bid
jdq: yhv uyb
ayf: foi lap hdp fes
tzi: qjf
pcd: pub
yga: uzy
gpr: bid jcy cub
nim: ewr jlm crv rej
atk: oxb lzk
grr: moo qzv efw ewa drh
hzg: bhs yck
tft: btu irf myt fql
tdq: chy
uso: vzu
ymt: blx ysw
fbb: qlj uyb
zob: pdq
pss: hmc tif nwa
tnb: gbg vvk
qjf: nju
iej: nfw xcf
gkm: gni grr
mpg: kmv awz ovo rmn
dwz: pcy
blv: zpb tqj
ose: wlw ahy
ymg: xlx
sha: kmv rmn ovo rnw
eor: ooa
ldu: cub
nkg: gcs
wnt: yhv uyb
vae: you ykg tgk
pye: ved
rmn: gkh ukm bna
lqa: ggb xob
yhv: xva nvs dpn dyd mtp cgd ils pdl rnk gjk omj otz jkd atk lmv pii ruj vak sti eeo mqm jzd dwz rqd tdq
bhs: out
icw: urx
ltc: wul rhq vke
rhq: uyb
esg: zpb tqj vse
cub: rtk tga dtw jjn knm poh qqq dki iej
xyo: nkg ksw jtb vyn
nsg: psk tnb nhd
ysw: vnv
gkh: wxi oim fwq
akc: gqr rrs qoi
czy: wlu
jdr: ewr cot jlm crv
qqq: zpz
kyg: egc gjs ymt
agc: oek eds
bbf: mfc
ytw: kxy
tku: qxa dct qug
nsb: pss mjz dof
seb: yon
ggb: xed
nps: xed
tif: xyw bjj mfc
dsv: jed txn tif
nni: npo
dly: jcy cub
xcr: jlm rej crv ewr
hdp: ldh otu
ohv: vts ksc bqf
vmk: qlj yhv uyb oyz
qbg: cge huf sfu
bna: wxi tya fwq
ddi: jtk
trn: cqj
nwe: xed
ipz: upm gkl fjv
fco: tun fei uzy
rea: pub tku irn
bqf: qbg yrh
sho: gpr ixj qix vbw eor
pof: uob fvw iyx
isk: xlx vzx
dct: mfc bjj xyw cin
ntk: cnr wrs
nog: cjp ykg you tgk
rcz: bjj mfc cin
mfc: icw qlq eai vpq htg pav cnn mbv svm yjs
rlt: tpx zzx rnx
mau: bjj cin
pxj: dfi pgj way
xvw: cjp tgk you ykg
bds: bvm nfm kts
rpf: qvw wgo gij
vzu: bjj mfc
qae: yck bhs qtl
dxf: kxy nju
omj: oxb lzk hwx
pgs: mfc bjj xyw
ndz: eds oek nni
mni: peg sei nwl hzv
ewr: zrr izy
mtf: oyz yhv
yon: bid jcy cub
jbx: upm jcm gkl
gaz: axv ziq rcz
qcx: rcz qop axv
gij: yow
rnk: oqh
iwy: vke rhq
uqv: oyz uyb qlj
sfu: zmb qjf
nwa: bjj
ttm: gqr rrs kyg qoi
jtb: gcs uwx xvw
nkx: iyx
rtk: rit upc fsk kjo uht
agr: pcz omw
oqh: btx fje wal
fau: fmk rpb srh
sfd: jdq bcp asj
fjv: nxt oae
ojz: seb pao ybb
qix: bid
way: jdr
jbh: wuo
unc: kxy xed
kbp: ydb xob ggb unc
hvz: pgb mbm rye
wii: tgk you cjp
dga: kts nfm bvm
bpb: uwx
inl: wst ehu qqa
zee: wjp qae ddi
pdl: ovp hwx lzk oxb
gra: kts
crv: sdm rwt
oqw: lto
xzi: uht kjo fsk
hyr: you
xis: cqj yza lbs vmk wnt
ahy: lfd ive
plr: yrh
fgo: out
qvw: ehw ppo yow
viq: qmy
plt: oyz yhv
hmc: cin mfc
btt: qix eor vbw
pfe: nju xed
yvg: bbf eqo
tes: abt ztn pcy
fmk: ivr oyg fno ipz
mjr: iwy ltc
txn: cin mfc bjj
mhd: hzg ddi wjp skk
vaz: gyo cae qqp

90
11/main.go Normal file
View File

@@ -0,0 +1,90 @@
package main
import (
"fmt"
"strings"
"git.z1glr.de/advent-of-code-2025/pkg/aoc"
)
type Server struct {
Start, Out bool
Destinations map[string]*Server
}
func (s *Server) Walk() int {
if s.Out {
return 1
} else {
routes := 0
for _, dd := range s.Destinations {
routes += dd.Walk()
}
return routes
}
}
func ParseServerLine(s string) (*Server, string) {
stringFields := strings.Fields(s)
returnServer := Server{
Destinations: make(map[string]*Server),
}
for _, ff := range stringFields[1:] {
switch ff {
case "you":
returnServer.Start = true
case "out":
returnServer.Out = true
default:
returnServer.Destinations[ff] = nil
}
}
return &returnServer, stringFields[0][:len(stringFields[0])-1]
}
func do(test bool) (int, int) {
rows := aoc.ReadFileRows(test)
servers := make(map[string]*Server)
starts := []*Server{}
for _, rr := range rows {
thisServer, name := ParseServerLine(rr)
servers[name] = thisServer
if thisServer.Start {
starts = append(starts, thisServer)
}
}
// populate destinations
for ii := range servers {
ss := servers[ii]
for dd := range ss.Destinations {
ss.Destinations[dd] = servers[dd]
}
}
routes := 0
for _, ss := range starts[:1] {
routes += ss.Walk()
}
fmt.Println(routes)
return routes, 0
}
func main() {
if r1, r2 := do(true); r1 == 5 && r2 == 0 {
do(false)
}
}

10
11/test Normal file
View File

@@ -0,0 +1,10 @@
aaa: you hhh
you: bbb ccc
bbb: ddd eee
ccc: ddd eee fff
ddd: ggg
eee: out
fff: out
ggg: out
hhh: ccc fff iii
iii: out