day15: ugly hacks, second try success for both

main
Bryce Allen 4 years ago
parent 2aff679fea
commit 3a843c6b3e

@ -0,0 +1,100 @@
7257173117871274148119191397411866741961893915191233591781237171134183111991588567743913598398999129
9199956198317542321811795167539333593959845233586245178771259721629672984999396181817424129792113429
5678391114239515741618386378916979112716269165195269215584939279279177393199175187199511833999819385
7149919968927397171639311441114199789621399783958844626227879671633692776519178119978312379854918472
9571133571872511883799281362819193417112413972551887416264299171789218539132957196979811132721291672
8172584925581929988661688649146133971138896125391412411926754121134983167188929529959966385437588844
4914518468152915388917729744941583692326581473756415317665271248313684872717734981831164961169161441
2519894881987711813817528992187872878321614865385871812543911299816979364869972221856158852969592112
9859391668949943293812278997458981968712239911133451788394169935992685191958894671638974814216612719
2192529153611518191595896814996141119517992288611125714717119399491112913829241231917539211119881849
2337843263693226789699931111398112969887535286492296226999311848178157169949315516494848924316823474
1191281328169873275751982595447194592918411459316261266123821567822849396139339812112776322962112239
4587143466247931931363896317279914687959418292417719618921579781314932674121288194141812419924513491
9188217988495399118711317519126435116785399685763129885168131465437119937687542179912685827611129973
9281999423754831489181352222362255825969879819312357829319722961312991751988497399311813231979551234
8411642818749914959745792191319718911388132253292482346295961171634916811938584616484592994128913896
3388255416913192166863912671592797172349778144861261162626679169122118178816999781511482128586841931
1544111521579847285289829899211419185418871795132727999177828715458885628798278694521919225186212479
6112394533149912224244478554154888237766677192511968451313528663845219413639188496229811993163929889
7198784899159217522265428239842119185341314211991273329136173711277137989451533985143943379599711279
5322174898961411153515736312827315967799457744138498991267929611147897735269199298727139863199825449
9389598982325839969741219429682597992913484299849122148988986313319119891881251311761168419988993984
9731391996727591141584769372292618329676991274389449899178113115589128811112539136473142798111999659
5158499781719185191335698726337225419942769281296219215168381368296377583192114793345154114939919138
9489436472297254387595375823195948188155998979224885397929111219894329444244314131186498373329899628
5115948294552681116994961691838819122926817811428719719487293692225795236769313128246954783896581419
7842378538599781529689123131749873922371451111511113114844145628981899497289212258729489151386198379
5657182954384884192389177113923946799271142897712314759172399912237297817994565459889643847449996591
2114463882686822117918787199822775881529895139151499196692246274147217497821149527235387719991114714
2911917115481432912158219697929535145897818898214661343833193385121919978318122826712681212138729941
7919482212881442617559399592111184197611192148899237895295211389594619418194519266268597128875922164
5122782781762591222295946745991662147485323299849117125858933893496129327282821421189644352917799563
1136291298829627566691527929262125187126922289732289227716821815619551911944779995415278137991622552
4929328679851289388213321419985631998929472889692146329429231293698273199118713262892523784612611999
1327734151191996421344997185478394257228713274441955249899986342244731153572974191897991393662691931
2781117154312271979199389368319489151943763236781711191122134726691762925242929616867585411791129159
1439186637181196485238285593819594866112889871679966657834249176324314497819969991879491995926214924
8198715159568382591431231227339698151116662552918333813978498567586137499214111391961922138831958891
1791636999843894411347725615937522999231159118674816321332412988177251964743241117549699136494419193
2347191949569898652196299127952395252161168176339428456658821198913454439135327112298841851793131139
6517373396832351522818699933865532731822114597879322225665521379149517111835298818315911951121182358
9989219811198438961112789214341437915858986541454335893139567183897549391541933121816392249992757195
2751242393169519965822749148113198418478749175225597965669585119898274413133594511599239813819261729
2333615561781383963589211869624423159983279225123169449222598319329695159532597919931391498257683522
2326925593466238521963381246934599431321918392819124294951311331116521125288316176431186199751635491
9341367399225381779967242896675118399271292593248972922271792198875912499185119129993955719191131219
9419488192386241298831213479619891591112812195761439362996925799233613913141343831817117189287994755
9695968821621727482419983392371417945181396516317947384995853931879231912925789698357961179754119511
9819267839831973911319938469292179778511998125121931891146223692296192299952153342285175781729419271
1863816696271622173271985549176326189359343784972161815896794319879938399995919111197381311974788614
9951198498951459991236295523134837224482241663114944798913138999819143627393989956711324837996945589
5636493872291432645969776969437321939689259195165871611951271619514731193819693277839717689838523535
1599873877797591958659883217591162792939133915996748148738729819416279661719716399869947198411871934
8794639995351381527537286278892222682139243726394685977188691436889598769141824739519232576663818623
9312694112319895396113225123691699114916381799538178372616115397895462387932975997638239393799315212
5832652557695274383198568431192817489141326899824429893139485722158832888768989154554522478498498714
8782845924111831912127921565587919113818125774499381223562975114549551996121626761137916739478221568
9811929922686225152399211122397597158513891191615161416432783564767191169849849511985178913416153852
1137711214593792114391112795839813891552389836983814596893489181536998977653386261925692938856897897
2891454257881276297539979515161138819723112914812122617911912212922972482812982987377897974782821188
7671589249839457412545235186153935156941884381134221489611219191921272892597772389234492565914198258
1552483399116635372974898931188883743171689242311789612968114416972112951486134993116143393399793998
8711188851122588629852724495172527356897321495229616597821333465358285422331924491418522517979118993
9593315278649975951219952268211871741223727356181132397183838894499829221111978873973591418997289513
3969997988729933184995613429919894232321166598283911973373115779211228919166877393889434215381781389
5588221472469964598623295656797377199853717996631331495111278692241929496187813341637872397899624175
9921637195158912596622263381891921897978588191413981249169189173199699294541171879989121615634351342
3798931227871974751799777995169123924251123997219388112822621636398239724484812154741112812741472923
1318745799964813125829815417129787311384489283415939129112478189111179617966392125599951899588399933
9919168243159595589113819319611976889991646271868112472392818222893941139743434115977476121333191818
3115972825613468816687921319481739413919883837749478584158912513417673612383549994987313463899975111
9819245879871957475393932424291294189961391917998628819131487621819218799996929997391516748191973218
2543119159599118542114782197275925148321199297951316238291197471953953113117231732381348855871885341
8597192929968786896989279839331134411223192189898926119875521124153282436126568329811999323445191679
3975785449971831818312568579176154978689122133184732928183381881141862482849263341279915278911683894
3179111996949988298153199151389479257689125228811639199771592599998978715664289996372311512944263139
3717731949295466943999325285695444691229948881923328813265999285999127111938229969918689613331778988
3899774572142914257631398127999644341916848491762691872194259535697139312281868155191287342929193183
3419531741121147372119481389754229993641415577459396295899232815823975392974927395711568972974293925
1722176361244419285779288543598751211392531919462574932268633933695192352441119172662173735119515712
8259287379497359112197399192874789929899857534134534892997117372192299398799696792833998919968157692
9113588331521199442922126152433321148852971919741151158559612459789766141191421226791434779238851542
9934485995397918323116671821935121371411639119196141711221111598878781853442188129954293234742142941
5863996738774189559631311914763988372133998564893667341114799688887419869498499571261945352924543659
1219173111621632848325722799121771234351313226119137299611516914998734631224397849155891733316457236
2581119126696683198948223933432829124786552193519396275241779267529656466959196852322344769712989425
9967141179556989992264146994141761832265411668193157248414232474791714884711961318296968187812563731
2489879759889926897312354996751186797873869898953112749555984922414591917338857833991412625172181498
9389457158881973888911321813181681241492541783691881299169396894618761158125679495966134894392982199
9619992269841241296891999961333629572281414928995452682633291959449286127129612124227252269791663654
1614835267511194414153578263179929291589313129387133978158911722592272783869578732691311815861241491
9652116592834327221168619761719533625339966299211384947128885411279177514867942937963481178919941711
2933298721252991578245341817819977199267549571111491876711439883927615991991196211296294697272313774
1431715794741427753127381461152185596778586461419451428969132784392522194651111917169662896769767812
5919195742129923589897349316296264144952749521471522921641452152978765849165829872135669664214112327
6339474432243943991959119983361889756918344251994119969825144749941178381321286493218961118191911875
5517228343299391617317192214769719192189853799115811159493116197825637676714396432979816281155693495
6388461935842284623142112416943162883259817194297799981283439458172297191119123521515932483495126961
7843191912999868941538811232841971381689242136381989791436989848478992513449168132392761291119899184
1424114349573937523917871789194999469999119751164761884221519813273935995996288159921682217898434989

@ -0,0 +1,192 @@
#!/usr/bin/env julia
#=
--- Day 15: Chiton ---
You've almost reached the exit of the cave, but the walls are getting closer together. Your submarine can barely still fit, though; the main problem is that the walls of the cave are covered in chitons, and it would be best not to bump any of them.
The cavern is large, but has a very low ceiling, restricting your motion to two dimensions. The shape of the cavern resembles a square; a quick scan of chiton density produces a map of risk level throughout the cave (your puzzle input). For example:
1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581
You start in the top left position, your destination is the bottom right position, and you cannot move diagonally. The number at each position is its risk level; to determine the total risk of an entire path, add up the risk levels of each position you enter (that is, don't count the risk level of your starting position unless you enter it; leaving it adds no risk to your total).
Your goal is to find a path with the lowest total risk. In this example, a path with the lowest total risk is highlighted here:
1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581
The total risk of this path is 40 (the starting position is never entered, so its risk is not counted).
What is the lowest total risk of any path from the top left to the bottom right?
=#
infile = length(ARGS) > 0 ? ARGS[1] : "input.txt"
println("infile = ", infile)
risk_map = reduce(vcat, [parse.(Int, split(line, ""))'
for line in eachline(infile)])
function least_risk(E)
nrows, ncols = size(E)
row = nrows
col = ncols
cost = 0
path = zeros(Int, size(E))
while row > 1 || col > 1
cost += E[row, col]
path[row, col] = 1
if col == 1
row -= 1
elseif row == 1
col -= 1
else
if E[row, col-1] < E[row-1, col]
col -= 1
else
row -= 1
end
end
end
return cost, path
end
function neighbor_idx(nrows, ncols, y, x)
v = CartesianIndex[]
if x > 1
push!(v, CartesianIndex(y, x-1))
end
if x < ncols
push!(v, CartesianIndex(y, x+1))
end
if y > 1
push!(v, CartesianIndex(y-1, x))
end
if y < nrows
push!(v, CartesianIndex(y+1, x))
end
return v
end
function get_costs(R)
costs = zeros(Int, size(R))
dirs = zeros(Int, size(R))
nrows, ncols = size(R)
for col in 2:ncols
costs[1, col] = costs[1, col-1] + R[1, col]
end
for row in 2:nrows
costs[row, 1] = costs[row-1, 1] + R[row, 1]
for col in 2:ncols
if costs[row-1, col] < costs[row, col-1]
dirs[row, col] = 1
costs[row, col] = costs[row-1, col] + R[row, col]
else
costs[row, col] = costs[row, col-1] + R[row, col]
end
end
end
if false
# more passes
for i in 1:max(nrows, ncols)
for col in ncols-1:-1:1
rcost = costs[end, col+1] + R[end, col]
if rcost < costs[end, col]
costs[end, col] = rcost
end
end
for row in nrows-1:-1:1
dcost = costs[row+1, end] + R[row, end]
if dcost < costs[row, end]
costs[row, end] = dcost
end
for col in ncols-1:-1:1
rcost = costs[row, col+1] + R[row, col]
if rcost < costs[row, col]
costs[row, col] = rcost
end
dcost = costs[row+1, col] + R[row, col]
if dcost < costs[row, col]
costs[row, col] = dcost
end
end
end
end
end
for row in nrows:-1:1
for col in ncols:-1:1
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
for row in nrows:-1:1
for col in 1:ncols
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
for row in 1:nrows
for col in ncols:-1:1
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
for row in 1:nrows
for col in 1:ncols
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
return costs, dirs
end
#=
cost, path = least_risk(risk_map)
display(path)
println()
println("cost = ", cost)
=#
costs, dirs = get_costs(risk_map)
display(costs)
println()
println("cost = ", costs[end, end])

@ -0,0 +1,284 @@
#!/usr/bin/env julia
#=
--- Part Two ---
Now that you know how to find low-risk paths in the cave, you can try to find your way out.
The entire cave is actually five times larger in both dimensions than you thought; the area you originally scanned is just one tile in a 5x5 tile area that forms the full map. Your original map tile repeats to the right and downward; each time the tile repeats to the right or downward, all of its risk levels are 1 higher than the tile immediately up or left of it. However, risk levels above 9 wrap back around to 1. So, if your original map had some position with a risk level of 8, then that same position on each of the 25 total tiles would be as follows:
8 9 1 2 3
9 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
Each single digit above corresponds to the example position with a value of 8 on the top-left tile. Because the full map is actually five times larger in both dimensions, that position appears a total of 25 times, once in each duplicated tile, with the values shown above.
Here is the full five-times-as-large version of the first example above, with the original map in the top left corner highlighted:
11637517422274862853338597396444961841755517295286
13813736722492484783351359589446246169155735727126
21365113283247622439435873354154698446526571955763
36949315694715142671582625378269373648937148475914
74634171118574528222968563933317967414442817852555
13191281372421239248353234135946434524615754563572
13599124212461123532357223464346833457545794456865
31254216394236532741534764385264587549637569865174
12931385212314249632342535174345364628545647573965
23119445813422155692453326671356443778246755488935
22748628533385973964449618417555172952866628316397
24924847833513595894462461691557357271266846838237
32476224394358733541546984465265719557637682166874
47151426715826253782693736489371484759148259586125
85745282229685639333179674144428178525553928963666
24212392483532341359464345246157545635726865674683
24611235323572234643468334575457944568656815567976
42365327415347643852645875496375698651748671976285
23142496323425351743453646285456475739656758684176
34221556924533266713564437782467554889357866599146
33859739644496184175551729528666283163977739427418
35135958944624616915573572712668468382377957949348
43587335415469844652657195576376821668748793277985
58262537826937364893714847591482595861259361697236
96856393331796741444281785255539289636664139174777
35323413594643452461575456357268656746837976785794
35722346434683345754579445686568155679767926678187
53476438526458754963756986517486719762859782187396
34253517434536462854564757396567586841767869795287
45332667135644377824675548893578665991468977611257
44961841755517295286662831639777394274188841538529
46246169155735727126684683823779579493488168151459
54698446526571955763768216687487932779859814388196
69373648937148475914825958612593616972361472718347
17967414442817852555392896366641391747775241285888
46434524615754563572686567468379767857948187896815
46833457545794456865681556797679266781878137789298
64587549637569865174867197628597821873961893298417
45364628545647573965675868417678697952878971816398
56443778246755488935786659914689776112579188722368
55172952866628316397773942741888415385299952649631
57357271266846838237795794934881681514599279262561
65719557637682166874879327798598143881961925499217
71484759148259586125936169723614727183472583829458
28178525553928963666413917477752412858886352396999
57545635726865674683797678579481878968159298917926
57944568656815567976792667818781377892989248891319
75698651748671976285978218739618932984172914319528
56475739656758684176786979528789718163989182927419
67554889357866599146897761125791887223681299833479
Equipped with the full map, you can now find a path from the top left corner to the bottom right corner with the lowest total risk:
11637517422274862853338597396444961841755517295286
13813736722492484783351359589446246169155735727126
21365113283247622439435873354154698446526571955763
36949315694715142671582625378269373648937148475914
74634171118574528222968563933317967414442817852555
13191281372421239248353234135946434524615754563572
13599124212461123532357223464346833457545794456865
31254216394236532741534764385264587549637569865174
12931385212314249632342535174345364628545647573965
23119445813422155692453326671356443778246755488935
22748628533385973964449618417555172952866628316397
24924847833513595894462461691557357271266846838237
32476224394358733541546984465265719557637682166874
47151426715826253782693736489371484759148259586125
85745282229685639333179674144428178525553928963666
24212392483532341359464345246157545635726865674683
24611235323572234643468334575457944568656815567976
42365327415347643852645875496375698651748671976285
23142496323425351743453646285456475739656758684176
34221556924533266713564437782467554889357866599146
33859739644496184175551729528666283163977739427418
35135958944624616915573572712668468382377957949348
43587335415469844652657195576376821668748793277985
58262537826937364893714847591482595861259361697236
96856393331796741444281785255539289636664139174777
35323413594643452461575456357268656746837976785794
35722346434683345754579445686568155679767926678187
53476438526458754963756986517486719762859782187396
34253517434536462854564757396567586841767869795287
45332667135644377824675548893578665991468977611257
44961841755517295286662831639777394274188841538529
46246169155735727126684683823779579493488168151459
54698446526571955763768216687487932779859814388196
69373648937148475914825958612593616972361472718347
17967414442817852555392896366641391747775241285888
46434524615754563572686567468379767857948187896815
46833457545794456865681556797679266781878137789298
64587549637569865174867197628597821873961893298417
45364628545647573965675868417678697952878971816398
56443778246755488935786659914689776112579188722368
55172952866628316397773942741888415385299952649631
57357271266846838237795794934881681514599279262561
65719557637682166874879327798598143881961925499217
71484759148259586125936169723614727183472583829458
28178525553928963666413917477752412858886352396999
57545635726865674683797678579481878968159298917926
57944568656815567976792667818781377892989248891319
75698651748671976285978218739618932984172914319528
56475739656758684176786979528789718163989182927419
67554889357866599146897761125791887223681299833479
The total risk of this path is 315 (the starting position is still never entered, so its risk is not counted).
Using the full map, what is the lowest total risk of any path from the top left to the bottom right?
=#
infile = length(ARGS) > 0 ? ARGS[1] : "input.txt"
println("infile = ", infile)
risk_map = reduce(vcat, [parse.(Int, split(line, ""))'
for line in eachline(infile)])
function tile_map(R)
R2 = Matrix{eltype(R)}(undef, size(R) .* 5)
nrows, ncols = size(R)
for tile_row in 0:4
for tile_col in 0:4
add = tile_row + tile_col
rowstart = 1 + tile_row*nrows
rowend = rowstart + nrows - 1
colstart = 1 + tile_col*ncols
colend = colstart + ncols - 1
R2[rowstart:rowend, colstart:colend] = mod.(R .+ add .- 1, 9) .+ 1
end
end
return R2
end
risk_map = tile_map(risk_map)
#display(risk_map)
#println()
#exit()
function neighbor_idx(nrows, ncols, y, x)
v = CartesianIndex[]
if x > 1
push!(v, CartesianIndex(y, x-1))
end
if x < ncols
push!(v, CartesianIndex(y, x+1))
end
if y > 1
push!(v, CartesianIndex(y-1, x))
end
if y < nrows
push!(v, CartesianIndex(y+1, x))
end
return v
end
function get_costs(R)
costs = zeros(Int, size(R))
dirs = zeros(Int, size(R))
nrows, ncols = size(R)
for col in 2:ncols
costs[1, col] = costs[1, col-1] + R[1, col]
end
for row in 2:nrows
costs[row, 1] = costs[row-1, 1] + R[row, 1]
for col in 2:ncols
if costs[row-1, col] < costs[row, col-1]
dirs[row, col] = 1
costs[row, col] = costs[row-1, col] + R[row, col]
else
costs[row, col] = costs[row, col-1] + R[row, col]
end
end
end
if false
# more passes
for i in 1:max(nrows, ncols)
for col in ncols-1:-1:1
rcost = costs[end, col+1] + R[end, col]
if rcost < costs[end, col]
costs[end, col] = rcost
end
end
for row in nrows-1:-1:1
dcost = costs[row+1, end] + R[row, end]
if dcost < costs[row, end]
costs[row, end] = dcost
end
for col in ncols-1:-1:1
rcost = costs[row, col+1] + R[row, col]
if rcost < costs[row, col]
costs[row, col] = rcost
end
dcost = costs[row+1, col] + R[row, col]
if dcost < costs[row, col]
costs[row, col] = dcost
end
end
end
end
end
for i in 1:max(nrows, ncols)
for row in nrows:-1:1
for col in ncols:-1:1
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
for row in nrows:-1:1
for col in 1:ncols
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
for row in 1:nrows
for col in ncols:-1:1
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
for row in 1:nrows
for col in 1:ncols
idx = neighbor_idx(nrows, ncols, row, col)
c = minimum(costs[i] for i in idx) + R[row, col]
if c < costs[row, col]
costs[row, col] = c
end
end
end
end
return costs, dirs
end
#=
cost, path = least_risk(risk_map)
display(path)
println()
println("cost = ", cost)
=#
costs, dirs = get_costs(risk_map)
if length(costs) < 1000
display(costs)
println()
end
println("cost = ", costs[end, end])

@ -0,0 +1,10 @@
1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581

@ -0,0 +1,50 @@
11637517422274862853338597396444961841755517295286
13813736722492484783351359589446246169155735727126
21365113283247622439435873354154698446526571955763
36949315694715142671582625378269373648937148475914
74634171118574528222968563933317967414442817852555
13191281372421239248353234135946434524615754563572
13599124212461123532357223464346833457545794456865
31254216394236532741534764385264587549637569865174
12931385212314249632342535174345364628545647573965
23119445813422155692453326671356443778246755488935
22748628533385973964449618417555172952866628316397
24924847833513595894462461691557357271266846838237
32476224394358733541546984465265719557637682166874
47151426715826253782693736489371484759148259586125
85745282229685639333179674144428178525553928963666
24212392483532341359464345246157545635726865674683
24611235323572234643468334575457944568656815567976
42365327415347643852645875496375698651748671976285
23142496323425351743453646285456475739656758684176
34221556924533266713564437782467554889357866599146
33859739644496184175551729528666283163977739427418
35135958944624616915573572712668468382377957949348
43587335415469844652657195576376821668748793277985
58262537826937364893714847591482595861259361697236
96856393331796741444281785255539289636664139174777
35323413594643452461575456357268656746837976785794
35722346434683345754579445686568155679767926678187
53476438526458754963756986517486719762859782187396
34253517434536462854564757396567586841767869795287
45332667135644377824675548893578665991468977611257
44961841755517295286662831639777394274188841538529
46246169155735727126684683823779579493488168151459
54698446526571955763768216687487932779859814388196
69373648937148475914825958612593616972361472718347
17967414442817852555392896366641391747775241285888
46434524615754563572686567468379767857948187896815
46833457545794456865681556797679266781878137789298
64587549637569865174867197628597821873961893298417
45364628545647573965675868417678697952878971816398
56443778246755488935786659914689776112579188722368
55172952866628316397773942741888415385299952649631
57357271266846838237795794934881681514599279262561
65719557637682166874879327798598143881961925499217
71484759148259586125936169723614727183472583829458
28178525553928963666413917477752412858886352396999
57545635726865674683797678579481878968159298917926
57944568656815567976792667818781377892989248891319
75698651748671976285978218739618932984172914319528
56475739656758684176786979528789718163989182927419
67554889357866599146897761125791887223681299833479

@ -0,0 +1,4 @@
19111
19191
11191
99991

@ -0,0 +1,5 @@
11199
99199
11199
19999
11111
Loading…
Cancel
Save