day 8
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 19 Dec 2025 14:35:01 +0000 (15:35 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 19 Dec 2025 14:35:01 +0000 (15:35 +0100)
day-8.awk [new file with mode: 0644]
day-8.txt [new file with mode: 0644]
day-8_test.txt [new file with mode: 0644]
day-8b.awk [new file with mode: 0644]

diff --git a/day-8.awk b/day-8.awk
new file mode 100644 (file)
index 0000000..84d6fd8
--- /dev/null
+++ b/day-8.awk
@@ -0,0 +1,152 @@
+#!/usr/bin/awk -f
+
+BEGIN {
+       FS = ","
+       N = 1000
+       n = 0
+}
+
+!/^[0-9,]*$/ {
+       print "error line", NR, $0
+}
+
+{
+       n++
+       x[n] = $1
+       y[n] = $2
+       z[n] = $3
+}
+
+function dist(x, y, z, i, j,   xx, yy, zz) {
+       xx = (x[i] - x[j])
+       yy = (y[i] - y[j])
+       zz = (z[i] - z[j])
+       return xx * xx + yy * yy + zz * zz
+}
+
+function mat(d, x, y, z, n,   i, j) {
+       for (i = 1; i <= n; i++) {
+               for (j = 1; j <= n; j++) {
+                       if (i < j) d[i "," j] = dist(x, y, z, i, j)
+               }
+       }
+}
+
+function min(d, n,   i, j, m, m0, d0, t) {
+       d0 = 0
+       m0 = ""
+       for (i = 1; i <= n; i++) {
+               for (j = 1; j < i; j++) {
+                       m = i "," j
+                       t = d[m]
+                       if ((t > 0) && ((d0 == 0) || (d0 > t))) {
+                               d0 = t
+                               m0 = m
+                       }
+               }
+       }
+       return m0
+}
+
+function disp(d, x, y, z, p,   i, j) {
+       i = p[1]
+       j = p[2]
+       printf "%d: (%d %d) %d,%d,%d -> %d,%d,%d\n", d[i "," j], i, j, x[i], y[i], z[i], x[j], y[j], z[j]
+}
+
+function dispmat(d, n,   i, j) {
+       for (i = 1; i <= n; i++) {
+               for (j = 1; j <= n; j++) {
+                       printf " %1.4e", d[i "," j]
+               }
+               printf "\n"
+       }
+}
+
+function sortmat(d, o, N,   i, j, b, t, L) {
+       L = 0
+       for (i in d) b[++L] = i
+       for (i = 0; i < N; i++) {
+               printf "\b\b\b%d%%", i * 100 / N
+               for (j = 1; j < L - i; j++) {
+                       if (d[b[j]] < d[b[j + 1]]) {
+                               t = b[j]
+                               b[j] = b[j + 1]
+                               b[j + 1] = t
+                       }
+               }
+       }
+       printf "\n"
+       for (i = 1; i <= N; i++) o[i] = b[L - i + 1]
+}
+
+function group(g, p,   f, gg, i, j, k, l) {
+       for (i in g) {
+               delete gg
+               split(g[i], gg, ",")
+               delete f
+               for (j in gg) for (k in p) if (gg[j] == p[k]) f[k] = 1
+               if (length(f) > 0) {
+                       l = length(gg)
+                       for (k in p) {
+                               if (!f[k]) g[i] = g[i] "," p[k]
+                       }
+                       delete gg
+                       split(g[i], gg, ",")
+                       return (l < length(gg)) ? 2 : 1
+               }
+       }
+       return 0
+}
+
+function last(g,   i, n) {
+       n = 0
+       for (i in g) if (i > n) n = i
+       return n
+}
+
+function adisp(n, g,   i) {
+       printf "%s:", n
+       for (i in g) printf " %s", g[i]
+       printf "\n"
+}
+
+END {
+       print "distance"
+       mat(d, x, y, z, n)
+       #dispmat(d, n)
+
+       print "sort"
+       L = sortmat(d, o, N)
+       for (i = 1; i <= N; i++) printf " %s", o[i]; printf "\n"
+
+       print "pairing"
+       delete g
+       for (i = 1; i <= N; i++) {
+               m = o[i]
+               split(m, p, ",")
+               printf "%d: ", i; disp(d, x, y, z, p)
+               if (group(g, p) == 0) {
+                       g[i] = m
+               } else {
+                       for (j in g) {
+                               split(g[j], p, ",")
+                               if (group(g, p) == 2) delete g[j]
+                       }
+               }
+       }
+       adisp("group", g)
+
+       print "size"
+       for (i in g) {
+               split(g[i], gg, ",")
+               s[i] = length(gg)
+       }
+       adisp("size", s)
+       
+       print "result"
+       asort(s)
+       r = 1
+       for (i = 0; i < 3; i++) r *= s[length(s) - i]
+       print r
+}
diff --git a/day-8.txt b/day-8.txt
new file mode 100644 (file)
index 0000000..182c46a
--- /dev/null
+++ b/day-8.txt
@@ -0,0 +1,1000 @@
+2003,26067,72758
+75355,33832,416
+30456,58025,11108
+50345,48499,75382
+3725,49456,41389
+26766,31067,6012
+2577,88080,67312
+42607,1258,50954
+21976,21736,7222
+25164,65502,33712
+12595,35660,82974
+43469,70108,73370
+65571,20640,94235
+27571,44492,17285
+17505,23661,48581
+75251,73385,64610
+20729,32875,98422
+67144,62810,2279
+39058,48758,30953
+24372,87714,52165
+66505,764,3061
+46736,253,98684
+31389,68188,93075
+26813,303,8432
+93049,63204,8385
+46412,72383,59661
+61525,81350,15992
+54513,79619,44514
+32860,54353,8397
+90865,50759,27655
+57328,13464,90952
+23863,53473,50677
+41870,51538,55556
+28056,6722,31040
+35652,65647,69754
+70235,76117,99626
+47461,86503,85514
+90036,85160,32183
+43402,79341,54752
+42452,94354,8197
+67383,59744,26147
+3541,54676,44343
+55712,11899,95855
+30094,74600,28785
+85713,52460,58857
+58702,92323,65076
+57458,53584,44367
+73647,39973,9194
+99117,82430,4567
+26233,64688,49812
+38633,57392,7973
+43744,48548,93721
+54566,34283,64748
+88259,43383,45477
+11375,55413,9054
+49695,54237,19017
+34664,38594,358
+46961,8968,61817
+80498,6830,81701
+29606,62094,94920
+91616,22557,93133
+34438,30771,11256
+92643,50533,49758
+32377,75372,17447
+28885,94587,17502
+32384,74734,47440
+47344,12212,17793
+65829,35942,81949
+10237,10025,93555
+41690,62046,71279
+70839,63452,24259
+12104,59862,98061
+79497,41323,77312
+20081,38532,11442
+47742,25617,57111
+705,41356,32242
+77111,7192,31793
+35126,90188,76378
+43086,10390,8753
+47650,40186,51791
+78866,6532,68306
+94889,61345,86717
+67171,52881,52191
+74763,26804,28451
+80905,27569,31768
+8311,67143,41978
+76128,12841,92493
+92124,57407,97611
+47615,25180,55554
+60927,95895,33157
+23562,40209,86695
+77147,6500,7528
+95055,62200,32317
+42338,34499,53891
+92918,48108,16944
+908,40318,33627
+33362,17817,37964
+33069,22935,76096
+29694,39086,42383
+13678,61719,57177
+53754,69459,30351
+8146,14086,71696
+38854,48631,77659
+1727,60358,1379
+47420,37641,94775
+80330,30754,78099
+21255,17670,43369
+3163,24182,97095
+48223,46807,70659
+29857,32075,11385
+46871,76905,85730
+25913,95921,85250
+23750,42502,12240
+21677,21359,34811
+29371,18911,59509
+42064,26144,3644
+10202,26348,78302
+22249,2860,40655
+1572,77120,36082
+53086,90934,7208
+17720,27837,28087
+2232,67846,16963
+43372,7210,24665
+85504,14054,17128
+81336,45425,12001
+60023,13519,56230
+80369,38279,52315
+9127,90740,24860
+17449,20692,74766
+64652,60561,46330
+23240,96247,21417
+84930,31692,10839
+70760,87421,46383
+90606,86123,33011
+24374,96702,72007
+79252,83338,97972
+17510,83516,42862
+76647,64403,93534
+81919,10925,1451
+99370,84698,294
+78646,66074,67178
+65535,53422,39656
+63296,58202,2479
+54390,65908,55042
+3741,9343,23210
+81183,66473,20081
+65121,5932,50408
+58278,1173,29823
+10871,39289,86614
+38289,63615,4333
+87126,32047,15062
+19712,95354,67459
+18676,7225,20403
+841,21778,55825
+10686,42521,67414
+99360,2820,91716
+29176,85337,56272
+58510,32012,87924
+22650,40050,55737
+19352,67205,23999
+19811,78489,61249
+52132,5278,6343
+70817,13387,12795
+34577,97599,10572
+72324,55738,71575
+84110,81236,79898
+35106,94646,31760
+90766,99756,93032
+7459,70376,49662
+9258,50865,22212
+28673,3339,82664
+11639,98386,62322
+46724,34778,25838
+33581,57509,74290
+34334,29789,87496
+56037,79737,63852
+85360,64068,44093
+99858,2137,34245
+35772,80589,96139
+36910,62410,93597
+19880,85792,82443
+11125,78154,9982
+20753,17796,8201
+85668,52012,71880
+25557,8874,55252
+17758,15920,65020
+38619,29952,29821
+8473,33485,62633
+56748,48740,91264
+56849,55069,70405
+59313,13992,87804
+13011,9043,35282
+39154,53515,80291
+99500,47503,67790
+51693,65148,5031
+75453,53130,37918
+17692,72489,79790
+3229,50301,33298
+19293,39025,66036
+74405,55776,62637
+6711,48973,4975
+32699,6388,18968
+69587,92671,25936
+91327,87601,65036
+87234,18455,750
+57479,53175,40848
+64377,36211,81318
+81526,92592,32829
+95864,5301,17547
+44747,3119,99821
+93617,44283,81249
+64977,95721,45896
+25146,59793,16106
+77191,23617,24782
+20939,28053,98836
+98074,72653,99181
+89642,77037,87113
+60418,11350,46891
+77619,49211,58627
+33684,37089,67584
+25660,22374,42369
+63728,23321,69445
+92726,42276,58094
+93110,50683,30139
+66565,28583,65287
+16165,44812,28857
+73892,80518,79193
+87018,91832,70512
+36724,70073,74031
+64391,55396,28867
+27433,83305,40954
+77774,47710,68404
+13199,91873,72708
+77655,96196,20165
+83431,82845,39762
+59746,31523,57377
+29159,27649,40722
+50218,53863,31053
+74639,90032,89807
+981,10692,69455
+11246,74139,31714
+25107,4204,88716
+84577,70872,52423
+85419,46206,15609
+15504,59575,39299
+21567,7107,4446
+5641,45032,6001
+82913,47228,68746
+24567,3310,3068
+48468,6143,96260
+31132,79338,95061
+60217,94710,56560
+7,82682,14654
+88232,63894,47487
+93438,84107,31006
+2734,63695,24646
+16687,12764,78070
+31267,96424,25855
+74732,46349,32166
+8890,4470,64657
+94899,84279,42348
+74868,57029,32676
+75946,98082,57043
+28881,30176,91295
+56412,65700,67730
+98183,46183,846
+76952,21942,32992
+71321,3068,98993
+63521,45675,92519
+15856,87990,91248
+46993,21210,30027
+86722,37422,92076
+18079,2284,17869
+56920,45968,44331
+34084,13523,3670
+39268,16531,98599
+48259,33611,27609
+26521,46084,63807
+38180,62385,95625
+98983,99892,90253
+53805,60007,63128
+79935,12106,46849
+41976,8772,61281
+68221,19105,10645
+10503,19083,6484
+69728,87703,25740
+70000,56543,99160
+9541,94528,88612
+7723,69391,13793
+45887,47766,63333
+79559,55020,11237
+69152,65839,88293
+50915,14381,34444
+78380,75197,4194
+62800,94173,81737
+10583,7454,34551
+56794,63157,47175
+94330,72175,47920
+87842,21838,44442
+49034,82756,91737
+91311,84908,12342
+45234,70650,95628
+7268,26858,18689
+37038,90186,61058
+99184,57432,50030
+40295,25627,57178
+66165,30689,47820
+17584,29719,72130
+84317,92410,98716
+51695,97580,69679
+91,46004,21822
+70347,3218,57431
+69483,68321,30022
+47794,24082,8705
+99421,2054,20650
+10588,88292,23715
+73695,60759,6342
+76900,23062,6037
+53241,90700,74397
+6294,47955,36317
+40262,16349,82757
+73142,75107,72709
+68693,46252,10022
+97428,61033,54358
+56843,24245,8989
+7355,74264,56514
+85077,58621,86945
+88547,58035,45771
+71469,44806,66203
+60139,76785,99349
+83425,9487,21334
+42116,99530,49060
+1485,21577,35494
+55829,86645,54227
+98005,71403,53181
+90956,37943,66587
+93118,35940,96516
+99759,2968,44019
+5747,81245,24368
+73163,6395,84657
+40891,36384,76316
+95933,86255,5975
+40923,82707,48238
+47306,594,35963
+52514,51226,38425
+56912,31841,46664
+16970,73184,61844
+88036,81105,97025
+16250,56972,22856
+25926,35629,2459
+44996,13361,46337
+77393,66217,48874
+24943,48605,19210
+16172,285,49408
+2566,93042,75711
+72710,1166,4532
+50886,34453,1636
+91821,21682,63870
+8514,53574,41699
+42735,42393,8135
+76289,40615,48210
+7048,63837,99364
+5034,59837,96558
+56016,48517,53300
+29042,59082,54266
+25751,34838,5679
+90659,87136,35173
+84044,9463,23120
+77500,52750,73461
+37443,11356,80512
+14136,38747,93625
+42006,6482,71030
+11783,49727,49726
+90742,81267,61093
+54995,66826,99500
+45881,86842,95520
+4069,21167,53652
+91399,24540,49814
+30837,15606,56778
+71461,64684,96694
+54321,60876,98029
+67782,84675,32730
+81283,3960,58524
+81432,53879,78254
+8934,33027,67068
+34021,85494,18520
+55068,81765,77646
+55969,78535,93383
+92694,55442,63731
+74950,70523,66399
+38970,28068,9877
+52390,43938,50762
+34221,61270,19496
+12677,20365,19686
+8093,60390,14777
+4634,35761,50853
+43183,69825,54014
+71870,83842,44741
+87253,25141,86798
+95218,22275,20459
+26162,78577,50277
+49151,23821,37384
+7728,74844,67219
+24549,85346,43073
+5248,10312,79212
+75404,71981,87573
+35105,74673,92725
+15825,97037,35953
+38366,52499,69796
+82339,37770,41974
+69137,38838,42369
+21544,83925,24071
+77993,66862,53673
+94708,65689,19371
+59942,76968,52154
+99762,98379,82932
+51253,25451,92623
+45402,58172,78980
+5105,36388,87222
+57514,11260,22896
+91272,11660,21744
+85225,15859,22177
+45875,92690,3015
+84553,93189,28214
+49,69255,58377
+45007,16201,96763
+47911,57405,57341
+34809,99894,35242
+15541,65555,57444
+22097,89032,34583
+61494,6626,9419
+34570,82323,81480
+90121,74373,57073
+53329,24221,70104
+9904,61825,24905
+76666,14406,5564
+49440,65608,97007
+3719,92499,84012
+53186,76907,99117
+87130,53519,57601
+86797,88703,97324
+25912,93173,83196
+41778,61744,76123
+55632,2886,48996
+90810,51410,21040
+15799,89301,50620
+82717,39670,27369
+1082,36291,45185
+96906,60029,74181
+20360,15940,76252
+36341,36849,19122
+89134,27352,77390
+75458,6731,7386
+15268,74947,56522
+87604,7141,38181
+36088,25145,19136
+11417,59698,8763
+11956,71130,35037
+61172,33736,16046
+73090,60770,68070
+18498,46231,27096
+31796,20888,53845
+89330,24642,34961
+22208,4328,76500
+52397,73045,44031
+82914,33484,12090
+86133,44307,67712
+60438,16183,47602
+15428,24602,54037
+32395,45025,49249
+17927,38785,85634
+45069,21116,25765
+63382,34360,90125
+1912,80647,12281
+1048,12446,15551
+11889,48142,55954
+54369,67457,3665
+51733,46538,51128
+61796,75319,72140
+72032,15276,20023
+99860,60829,18660
+9823,61641,53539
+95160,81558,83876
+50989,38250,8838
+56980,79648,8435
+57288,41265,58564
+88830,30676,50945
+79217,19852,94038
+16192,975,8179
+86326,39635,26205
+93125,68315,65709
+44762,45045,87870
+3572,77397,76041
+94343,54662,28452
+18972,46193,19834
+8118,2840,44275
+6636,58447,42726
+90087,40927,21414
+12286,30066,57424
+4681,63810,59362
+7792,15748,62351
+41080,72053,58814
+59334,58306,86742
+83740,20570,79304
+41539,81891,62010
+42652,33116,80302
+22913,84874,71411
+60696,4094,53117
+88007,42286,23407
+98661,10410,12401
+40810,1697,8724
+63817,1750,65768
+44841,25708,55142
+63036,18451,31500
+56826,44055,1750
+3279,51805,22560
+36096,1972,90274
+45191,62357,75069
+19808,85452,13409
+60587,76184,2222
+86155,85088,80240
+56170,63205,34510
+20486,27278,85580
+15133,38712,56842
+9886,46080,36769
+95819,71379,98206
+30358,64732,31430
+83033,4015,69653
+9578,91629,79408
+13904,90658,31037
+26140,50005,92376
+25242,94997,24243
+72799,60920,83250
+34025,27382,13643
+90256,92247,56244
+88134,50163,33382
+92198,23076,42666
+2259,43890,25157
+59018,1964,84783
+13339,10233,94275
+73552,28922,99691
+11215,23818,33029
+80271,55056,7695
+4830,84251,6270
+17958,32449,55384
+82902,75059,66488
+49840,73792,27962
+72673,74719,13324
+99805,66043,38117
+53310,91520,51546
+27627,82754,7331
+3835,68824,27839
+67027,37813,41590
+50521,40235,98049
+20035,36721,79576
+3102,16594,95479
+52716,45189,38286
+63851,20163,68136
+34084,53053,77192
+30327,28072,67856
+57349,34365,90232
+60821,73050,52550
+12095,37268,69588
+55065,90443,36406
+74162,15396,11127
+73397,95963,11062
+94855,20087,49182
+94713,65553,26349
+33239,95312,23063
+76362,76598,37125
+9389,35481,77969
+77939,10355,63662
+15167,61050,11962
+54663,23801,18665
+57477,49459,19561
+29303,22509,74761
+76163,17165,31266
+69197,10940,37305
+88512,91072,39229
+43505,54435,1827
+62644,14226,69945
+1793,63313,70603
+69408,62116,2315
+65677,38441,65102
+14815,38593,73273
+90527,63495,96085
+32923,87108,45346
+16976,98782,55092
+42117,36451,41415
+60587,91886,94614
+59769,66571,26273
+68913,92471,25410
+35579,19930,88440
+48118,71293,83438
+69091,75488,83222
+34021,66703,93707
+86365,23839,2998
+94234,12578,88028
+94032,95822,83823
+80508,67801,60769
+40246,12668,40316
+22171,17698,65443
+65831,32506,29219
+12670,3728,73670
+4254,61451,95330
+30863,61498,73955
+71969,92210,89358
+65531,74966,59209
+99684,51692,10466
+63722,26116,31637
+83733,10486,21565
+55,59143,70154
+18614,42891,37583
+97461,93329,89089
+95517,65079,62625
+68488,222,6582
+15982,75186,32386
+62564,84035,78210
+81622,41841,82301
+69815,54160,56241
+83894,46993,73760
+37171,85782,47708
+93347,21157,33503
+60200,13033,67851
+11726,66182,9370
+8495,33514,16012
+55577,42309,3748
+51026,29330,86646
+37810,37675,33723
+68608,31676,51995
+28942,21568,15901
+76049,98540,21291
+26223,48216,25453
+39453,53944,19430
+45468,2044,61167
+18805,90416,96404
+78743,75485,10195
+38373,32893,81537
+99119,4465,33985
+41899,52272,79844
+55671,5283,6108
+24336,44954,93887
+8248,99174,63452
+46386,91351,17853
+48562,74746,86910
+8988,58276,73339
+37227,89563,84567
+40901,42323,7643
+73535,10124,96888
+97028,13545,74112
+28224,97636,59493
+47079,76381,97484
+67876,62265,63226
+90960,65753,52208
+67803,77076,60898
+54581,65279,27170
+90754,65561,38908
+78139,76286,17075
+45956,81984,91945
+74663,5687,99865
+34894,49776,90421
+36934,1914,49896
+88836,98174,89444
+78447,87267,13830
+75551,65356,82419
+51713,28851,473
+13958,51802,1247
+42880,43615,92674
+83408,47074,28202
+19172,45118,34794
+46142,23452,9674
+22190,63376,7611
+61474,4378,26745
+53168,99622,92087
+76961,51842,94967
+72136,94088,91710
+2458,29205,54974
+54560,20322,70647
+62462,33144,69469
+58713,32519,73299
+14034,91135,18899
+45251,32423,16952
+50801,43652,29137
+10818,31604,57413
+4156,7150,34366
+71554,48878,61705
+60075,5184,46451
+29746,38800,26246
+28069,38717,32807
+46630,84701,72134
+88768,5122,91920
+47806,17211,12881
+61470,65808,99035
+21802,51335,63257
+18174,93315,11805
+57651,46944,89587
+10873,97382,6625
+84435,11979,96512
+43910,33908,91089
+85579,97547,50700
+332,6221,35532
+69353,60410,55014
+68063,55476,93956
+1840,45243,19651
+73403,76160,30538
+20722,28219,7244
+64759,42154,42098
+93026,53088,65173
+42415,24880,90080
+50441,52496,74530
+33836,64691,28913
+3571,81728,51803
+53265,85005,65969
+376,63195,33411
+3669,89180,87604
+6455,22615,24947
+39562,68932,58475
+87548,87664,50484
+31601,80709,97434
+13512,99996,35893
+38284,46126,9843
+68432,50285,15342
+61035,74798,16902
+13834,56369,1431
+79066,11448,4132
+70720,73439,24461
+78702,87107,35906
+56084,91153,63240
+12471,84011,10087
+83188,4248,27610
+882,11864,9947
+73537,15641,77199
+99773,91294,44825
+98848,81015,28755
+81338,97227,89842
+33971,77600,52716
+82706,87105,97751
+59997,19498,22826
+46721,60165,61334
+38552,39598,5183
+43427,24619,85740
+14177,18339,14937
+37120,68987,7679
+51296,57196,93968
+6894,30513,30760
+519,84483,74334
+64786,4992,25412
+30075,41667,55858
+30487,91649,28129
+15068,86263,81714
+22353,14190,21179
+75549,27994,58834
+15904,84907,74143
+85103,46795,86013
+51456,31089,44653
+94074,19912,31356
+7562,84361,56741
+13582,22009,28983
+46779,68796,12297
+8816,51826,49190
+99699,17851,86843
+88679,78898,8231
+73129,43067,91558
+88376,12343,40651
+30112,99934,85696
+55793,59878,85526
+64469,382,84559
+30065,30602,70828
+82919,92583,60329
+96296,24779,98270
+24603,53324,88548
+89817,87339,89261
+51030,77248,94471
+97253,48154,30594
+29557,97512,65339
+16391,19602,28215
+55867,80539,465
+47454,25519,769
+30365,22486,38211
+93157,46685,79037
+56626,80959,40442
+58636,10986,68708
+14900,32188,72946
+10539,60385,3388
+17864,95370,22420
+5530,62794,71342
+41112,13127,27893
+2441,67875,7924
+51512,47963,12910
+23977,93096,13252
+80644,53905,39780
+72392,18086,97955
+31885,71517,35528
+37771,86701,97340
+83488,90499,9143
+28971,52580,57919
+70134,72480,42948
+5539,29713,24450
+61139,52953,10338
+91707,99047,8275
+48373,54999,31766
+54159,87244,51475
+8660,72960,26472
+38082,70161,55125
+16550,10390,87343
+53246,33087,90673
+23067,48613,75263
+68427,53941,76004
+96816,5759,67754
+83217,83507,90525
+78632,76089,63303
+89720,43904,47930
+56091,83745,55211
+9076,3090,35074
+39514,1406,34719
+44612,42229,60920
+24534,99719,75603
+541,26413,77926
+71200,1123,89894
+38759,42808,79772
+12622,86181,99602
+70279,9712,19277
+35367,85066,44972
+13926,86838,67600
+45111,71214,97878
+42586,27235,73985
+95995,54800,33838
+37102,51789,92334
+34379,27961,4784
+37872,20979,87710
+7341,24358,14075
+49338,44765,76134
+57857,33165,18757
+51004,44341,92704
+44127,15354,67903
+81824,67779,56815
+1676,47811,13440
+85182,65177,12187
+26330,81386,44899
+52951,6121,10254
+51105,26721,92983
+19924,73940,78606
+5722,58961,8106
+50747,19866,71258
+79929,69320,40708
+94304,54945,24340
+46702,23698,63211
+49473,4051,97120
+27978,10755,36976
+45406,59265,56900
+59739,3615,4891
+10957,67490,37842
+79044,67237,51229
+36309,93111,30569
+57088,18358,39842
+11434,87886,10352
+63746,92958,32928
+74631,65600,23729
+30120,23374,44750
+71253,40605,67285
+8959,83800,11650
+35458,27831,65362
+64271,81524,51174
+97994,91360,21818
+6785,6107,43016
+56896,87604,21533
+60913,67118,92063
+32600,92546,78984
+3462,58293,358
+27184,3241,573
+2430,92623,80574
+46512,6577,35432
+18809,83598,27358
+96961,44960,61908
+62372,50644,29464
+55511,89849,99195
+22302,1129,81284
+57728,31766,97415
+80921,17986,61903
+45226,26241,48850
+69822,48746,92812
+53724,6142,56062
+24528,90034,42030
+48022,95617,79403
+1975,54649,16815
+25355,96027,574
+37414,26438,88111
+40059,73562,50122
+99877,11007,62064
+1270,60027,24028
+37542,1002,98168
+71876,24751,54109
+93455,74766,37790
+65098,76547,27576
+2230,45538,3101
+97598,43721,49937
+3201,42521,68249
+88176,25960,34051
+78525,88423,4505
+74650,55235,37686
+68810,62151,97012
+9733,8363,32574
+11558,14463,91148
+23632,67561,42387
+32742,16959,70826
+89965,74941,32396
+39334,67383,66404
+25821,70353,50820
+89482,66261,85197
+54428,36543,20309
+34947,84494,7843
+68363,59665,41729
+98008,66774,97335
+44290,15018,59363
+21281,11712,53773
+20618,57408,31090
+94857,39108,46228
+22803,72723,88573
+83475,17072,47625
+52814,63136,65718
+90905,41524,46430
+94495,79802,72874
+44964,51161,20422
+51678,51005,74745
+40459,85548,16345
+42878,71112,22056
+40855,77902,50449
+44663,10668,17576
+2415,4377,77957
+12481,53600,85579
+56567,72597,54650
+80175,96069,95117
+37196,91346,79333
+64775,24413,26536
+34143,80824,768
+99092,56638,34725
+609,37420,60934
+94804,60102,42935
+82161,61512,58325
+57482,20138,35351
+43470,6075,57962
+92626,42841,1374
+77925,28265,11074
+6903,19401,94415
+1804,1592,36921
+15327,2321,9249
+67610,77995,48697
+13518,65861,1993
+17123,77906,8847
+56157,43980,7629
+82615,72806,67248
+97109,77471,77883
+61573,95693,19696
+6943,91649,31862
+49892,68828,67882
+15723,39853,40492
+78505,78138,85418
+16715,30051,48619
+35144,7364,97869
+70532,68675,22593
+8316,55014,63894
+85643,64639,32503
+37000,17029,28096
+8151,77104,9277
+17902,85493,80346
+75686,78252,98451
+84581,90409,71241
+68967,47039,59119
+77658,16753,17633
+36752,7317,38054
+59005,30546,57346
+26573,34945,34858
+73202,70431,72712
+98360,36569,49040
+24860,8137,74822
+51176,99285,67172
+6638,89262,13388
+19037,20720,91462
+24156,29496,66467
+75620,6610,33200
+17453,93162,40513
+53583,40811,30471
+13516,84979,72126
+56225,28307,12534
+99067,50229,83836
+32676,5158,69185
+32653,70593,27474
+11598,15777,65439
+79989,71810,39665
+80280,71335,47721
+63957,69660,40490
+80195,25136,4922
+6015,61105,77581
+22059,81606,86110
+88807,39782,57858
+27046,5479,25500
+85769,67988,39886
+78022,61215,1893
+57901,34817,9810
+38502,66834,39398
diff --git a/day-8_test.txt b/day-8_test.txt
new file mode 100644 (file)
index 0000000..e98a3b6
--- /dev/null
@@ -0,0 +1,20 @@
+162,817,812
+57,618,57
+906,360,560
+592,479,940
+352,342,300
+466,668,158
+542,29,236
+431,825,988
+739,650,466
+52,470,668
+216,146,977
+819,987,18
+117,168,530
+805,96,715
+346,949,466
+970,615,88
+941,993,340
+862,61,35
+984,92,344
+425,690,689
diff --git a/day-8b.awk b/day-8b.awk
new file mode 100644 (file)
index 0000000..b3e0ef3
--- /dev/null
@@ -0,0 +1,158 @@
+#!/usr/bin/awk -f
+
+BEGIN {
+       FS = ","
+       N = -1
+       n = 0
+}
+
+!/^[0-9,]*$/ {
+       print "error line", NR, $0
+}
+
+{
+       n++
+       x[n] = $1
+       y[n] = $2
+       z[n] = $3
+}
+
+function dist(x, y, z, i, j,   xx, yy, zz) {
+       xx = (x[i] - x[j])
+       yy = (y[i] - y[j])
+       zz = (z[i] - z[j])
+       return xx * xx + yy * yy + zz * zz
+}
+
+function mat(d, x, y, z, n,   i, j) {
+       for (i = 1; i <= n; i++) {
+               for (j = 1; j <= n; j++) {
+                       if (i < j) d[i "," j] = dist(x, y, z, i, j)
+               }
+       }
+}
+
+function min(d, n,   i, j, m, m0, d0, t) {
+       d0 = 0
+       m0 = ""
+       for (i = 1; i <= n; i++) {
+               for (j = 1; j < i; j++) {
+                       m = i "," j
+                       t = d[m]
+                       if ((t > 0) && ((d0 == 0) || (d0 > t))) {
+                               d0 = t
+                               m0 = m
+                       }
+               }
+       }
+       return m0
+}
+
+function disp(d, x, y, z, p,   i, j) {
+       i = p[1]
+       j = p[2]
+       printf "%d: (%d %d) %d,%d,%d -> %d,%d,%d\n", d[i "," j], i, j, x[i], y[i], z[i], x[j], y[j], z[j]
+}
+
+function dispmat(d, n,   i, j) {
+       for (i = 1; i <= n; i++) {
+               for (j = 1; j <= n; j++) {
+                       printf " %1.4e", d[i "," j]
+               }
+               printf "\n"
+       }
+}
+
+function sortmat(d, o, N,   i, j, b, t, L) {
+       L = 0
+       for (i in d) b[++L] = i
+       if (N == -1) N = L
+       for (i = 0; i < N; i++) {
+               printf "\b\b\b%d%%", i * 100 / N
+               for (j = 1; j < L - i; j++) {
+                       if (d[b[j]] < d[b[j + 1]]) {
+                               t = b[j]
+                               b[j] = b[j + 1]
+                               b[j + 1] = t
+                       }
+               }
+       }
+       printf "\n"
+       for (i = 1; i <= N; i++) o[i] = b[L - i + 1]
+       return N
+}
+
+function group(g, p,   f, gg, i, j, k, l) {
+       for (i in g) {
+               delete gg
+               split(g[i], gg, ",")
+               delete f
+               for (j in gg) for (k in p) if (gg[j] == p[k]) f[k] = 1
+               if (length(f) > 0) {
+                       l = length(gg)
+                       for (k in p) {
+                               if (!f[k]) g[i] = g[i] "," p[k]
+                       }
+                       delete gg
+                       split(g[i], gg, ",")
+                       return (l < length(gg)) ? 2 : 1
+               }
+       }
+       return 0
+}
+
+function last(g,   i, n) {
+       n = 0
+       for (i in g) if (i > n) n = i
+       return n
+}
+
+function adisp(n, g,   i) {
+       printf "%s:", n
+       for (i in g) printf " %s", g[i]
+       printf "\n"
+}
+
+END {
+       print "distance"
+       mat(d, x, y, z, n)
+       #dispmat(d, n)
+
+       print "sort"
+       N = sortmat(d, o, N)
+       for (i = 1; i <= N; i++) printf " %s", o[i]; printf "\n"
+
+       print "pairing"
+       delete g
+       for (i = 1; i <= N; i++) {
+               m = o[i]
+               split(m, p, ",")
+               printf "%d: ", i; disp(d, x, y, z, p)
+               if (group(g, p) == 0) {
+                       g[i] = m
+               } else {
+                       for (j in g) {
+                               split(g[j], p, ",")
+                               if (group(g, p) == 2) delete g[j]
+                       }
+               }
+       }
+       adisp("group", g)
+
+       split(m, p, ",")
+       print "prod", x[p[1]] * x[p[2]]
+
+       print "size"
+       for (i in g) {
+               split(g[i], gg, ",")
+               s[i] = length(gg)
+       }
+       adisp("size", s)
+       
+       print "result"
+       asort(s)
+       r = 1
+       for (i = 0; i < 3; i++) r *= s[length(s) - i]
+       print r
+
+}