aboutsummaryrefslogtreecommitdiff
path: root/challenge-241
diff options
context:
space:
mode:
authorBob Lied <boblied+github@gmail.com>2023-11-19 21:00:10 -0600
committerBob Lied <boblied+github@gmail.com>2023-11-19 21:00:10 -0600
commit66f1c9fd388b38344817d9b2a802ff047cc56fd6 (patch)
treebe160b23e468747570a20f2401eabef0c9ed642d /challenge-241
parentdc0651a859d9824512ffbd2c84aba36b7392e84f (diff)
downloadperlweeklychallenge-club-66f1c9fd388b38344817d9b2a802ff047cc56fd6.tar.gz
perlweeklychallenge-club-66f1c9fd388b38344817d9b2a802ff047cc56fd6.tar.bz2
perlweeklychallenge-club-66f1c9fd388b38344817d9b2a802ff047cc56fd6.zip
Add benchmark data and blog reference
Diffstat (limited to 'challenge-241')
-rw-r--r--challenge-241/bob-lied/blog.txt1
-rw-r--r--challenge-241/bob-lied/perl/bm.pl197
-rw-r--r--challenge-241/bob-lied/perl/ch-1.pl7
-rw-r--r--challenge-241/bob-lied/perl/jdense1000
-rw-r--r--challenge-241/bob-lied/perl/jsparse1000
5 files changed, 2202 insertions, 3 deletions
diff --git a/challenge-241/bob-lied/blog.txt b/challenge-241/bob-lied/blog.txt
index e69de29bb2..b8205108f2 100644
--- a/challenge-241/bob-lied/blog.txt
+++ b/challenge-241/bob-lied/blog.txt
@@ -0,0 +1 @@
+https://dev.to/boblied/pwc-241-triplets-sorting-and-a-profiling-digression-1mj0
diff --git a/challenge-241/bob-lied/perl/bm.pl b/challenge-241/bob-lied/perl/bm.pl
new file mode 100644
index 0000000000..ef1f3fd85b
--- /dev/null
+++ b/challenge-241/bob-lied/perl/bm.pl
@@ -0,0 +1,197 @@
+#!/usr/bin/env perl
+
+use v5.38;
+
+use Benchmark qw/:all/;
+
+use Getopt::Long;
+my $Verbose = 0;
+my $DoTest = 0;
+
+my $Diff;
+my $Rep = 1;
+
+GetOptions("diff:i" => \$Diff, "repeat:i" => \$Rep, "test" => \$DoTest, "verbose" => \$Verbose);
+exit(!runTest()) if $DoTest;
+
+die "Usage: $0 -d DIFF m n o ..." unless defined $Diff && @ARGV > 0;
+
+cmpthese($Rep, {
+ # 'Original ' => sub { triplet_1($Diff, @ARGV) },
+ 'No k loop ' => sub { triplet_2($Diff, \@ARGV) },
+ 'Early k stop' => sub { triplet_3a($Diff, \@ARGV) },
+ 'Early j stop' => sub { triplet_3b($Diff, \@ARGV) },
+ 'Early exit ' => sub { triplet_3($Diff, \@ARGV) },
+ 'Shift i ' => sub { triplet_4($Diff, @ARGV) },
+ 'Shift i,j ' => sub { triplet_4a($Diff, @ARGV) },
+} );
+
+sub triplet_4a($diff, @nums)
+{
+ use integer;
+ my $count = 0;
+ while ( defined(my $i = shift @nums ) )
+ {
+ my @rest = @nums;
+ while ( defined(my $j = shift @rest) )
+ {
+ my $dj = $j - $i;
+
+ # Input is sorted, so stop once the difference is too big.
+ if ( $dj > $diff ) { last }
+ elsif ( $dj < $diff ) { next }
+
+ for my $k ( @rest )
+ {
+ my $dk = $k - $j;
+ if ( $dk > $diff ) { last }
+ elsif ( $dk == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
+
+sub triplet_4($diff, @nums)
+{
+ my $count = 0;
+ while ( defined(my $i = shift @nums ) )
+ {
+ for my $j ( 0 .. ($#nums-1) )
+ {
+ my $dj = $nums[$j] - $i;
+
+ # Input is sorted, so stop once the difference is too big.
+ if ( $dj > $diff ) { last }
+ elsif ( $dj < $diff ) { next }
+
+ for ( my $k = ($j+1) ; $k <= $#nums ; $k++ )
+ {
+ my $dk = $nums[$k] - $nums[$j];
+ if ( $dk > $diff ) { last }
+ elsif ( $dk == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
+sub triplet_3($diff, $nums)
+{
+ my $count = 0;
+ for ( my $i = 0 ; $i <= $nums->$#*-2; $i++ )
+ {
+ for ( my $j = $i+1; $j <= $nums->$#*-1; $j++ )
+ {
+ my $dj = $nums->[$j] - $nums->[$i];
+
+ # Input is sorted, so stop once the difference is too big.
+ if ( $dj > $diff ) { last }
+ elsif ( $dj < $diff ) { next }
+
+ for ( my $k = $j+1; $k <= $nums->$#* ; $k++ )
+ {
+ my $dk = $nums->[$k] - $nums->[$j];
+ if ( $dk > $diff ) { last }
+ elsif ( $dk == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
+
+sub triplet_3b($diff, $nums)
+{
+ my $count = 0;
+ for ( my $i = 0 ; $i <= $nums->$#*-2; $i++ )
+ {
+ for ( my $j = $i+1; $j <= $nums->$#*-1; $j++ )
+ {
+ my $dj = $nums->[$j] - $nums->[$i];
+
+ # Input is sorted, so stop once the difference is too big.
+ if ( $dj > $diff ) { last }
+ elsif ( $dj < $diff ) { next }
+
+ for ( my $k = $j+1; $k <= $nums->$#* ; $k++ )
+ {
+ my $dk = $nums->[$k] - $nums->[$j];
+ if ( $dk == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
+
+sub triplet_3a($diff, $nums)
+{
+ my $count = 0;
+ for ( my $i = 0 ; $i <= $nums->$#*-2; $i++ )
+ {
+ for ( my $j = $i+1; $j <= $nums->$#*-1; $j++ )
+ {
+ next unless $nums->[$j] - $nums->[$i] == $diff;
+ for ( my $k = $j+1; $k <= $nums->$#* ; $k++ )
+ {
+ my $dk = $nums->[$k] - $nums->[$j];
+ if ( $dk - $diff ) { last }
+ elsif ( $dk == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
+
+sub triplet_2($diff, $nums)
+{
+ my $count = 0;
+ for ( my $i = 0 ; $i <= $nums->$#*-2; $i++ )
+ {
+ for ( my $j = $i+1; $j <= $nums->$#*-1; $j++ )
+ {
+ next unless $nums->[$j] - $nums->[$i] == $diff;
+ for ( my $k = $j+1; $k <= $nums->$#* ; $k++ )
+ {
+ if ( $nums->[$k] - $nums->[$j] == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
+
+sub triplet_1($diff, @nums)
+{
+ my $count = 0;
+ for ( my $i = 0 ; $i <= $#nums-2; $i++ )
+ {
+ for ( my $j = $i+1; $j <= $#nums-1; $j++ )
+ {
+ for ( my $k = $j+1; $k <= $#nums ; $k++ )
+ {
+ if ( $nums[$k] - $nums[$j] == $diff
+ && $nums[$j] - $nums[$i] == $diff )
+ {
+ $count++;
+ }
+ }
+ }
+ }
+ return $count;
+}
diff --git a/challenge-241/bob-lied/perl/ch-1.pl b/challenge-241/bob-lied/perl/ch-1.pl
index efb05edce9..2e0ad922b9 100644
--- a/challenge-241/bob-lied/perl/ch-1.pl
+++ b/challenge-241/bob-lied/perl/ch-1.pl
@@ -42,11 +42,12 @@ sub triplet($diff, @nums)
{
my $count = 0;
my @show;
- for ( my $i = 0 ; $i <= $#nums-2; $i++ )
+ # for ( my $i = 0 ; $i <= $#nums-2; $i++ )
+ while ( defined(my $i = shift @nums ) )
{
- for ( my $j = $i+1; $j <= $#nums-1; $j++ )
+ for ( my $j = 0; $j <= $#nums-1; $j++ )
{
- my $dj = $nums[$j] - $nums[$i];
+ my $dj = $nums[$j] - $i;
# Input is sorted, so stop once the difference is too big.
last if $dj > $diff;
diff --git a/challenge-241/bob-lied/perl/jdense b/challenge-241/bob-lied/perl/jdense
new file mode 100644
index 0000000000..b47cdae97a
--- /dev/null
+++ b/challenge-241/bob-lied/perl/jdense
@@ -0,0 +1,1000 @@
+0
+2
+2
+3
+3
+4
+4
+4
+4
+7
+8
+8
+9
+9
+10
+10
+11
+14
+14
+15
+16
+17
+18
+19
+19
+20
+21
+21
+22
+24
+24
+25
+25
+26
+26
+27
+28
+29
+30
+32
+33
+34
+36
+37
+38
+38
+41
+43
+44
+45
+48
+48
+50
+51
+51
+51
+51
+52
+54
+55
+56
+57
+58
+59
+62
+62
+66
+68
+68
+69
+71
+72
+73
+74
+75
+77
+77
+78
+79
+79
+80
+80
+80
+80
+82
+87
+87
+90
+91
+91
+93
+96
+96
+96
+97
+99
+99
+101
+102
+103
+104
+104
+106
+107
+107
+107
+108
+109
+109
+109
+110
+111
+113
+114
+114
+115
+116
+117
+119
+119
+120
+121
+121
+122
+124
+125
+126
+126
+126
+126
+127
+129
+131
+131
+132
+132
+133
+134
+135
+136
+136
+137
+137
+137
+139
+139
+140
+140
+141
+141
+142
+144
+144
+144
+144
+146
+146
+146
+147
+150
+150
+153
+153
+154
+154
+155
+155
+156
+157
+157
+158
+159
+159
+161
+161
+162
+162
+164
+165
+165
+166
+166
+166
+170
+171
+172
+172
+174
+174
+175
+175
+176
+176
+176
+177
+177
+179
+179
+180
+181
+182
+182
+182
+184
+185
+186
+187
+189
+190
+191
+192
+193
+194
+196
+197
+197
+198
+198
+198
+200
+201
+201
+201
+204
+205
+206
+206
+206
+208
+208
+209
+210
+211
+211
+213
+213
+213
+214
+215
+215
+215
+216
+216
+216
+217
+219
+219
+220
+221
+221
+224
+228
+229
+229
+230
+230
+230
+231
+231
+232
+234
+234
+234
+234
+234
+235
+235
+235
+236
+237
+238
+239
+239
+239
+239
+240
+241
+241
+243
+244
+245
+247
+249
+249
+249
+249
+251
+251
+252
+252
+252
+255
+257
+258
+258
+260
+261
+263
+263
+265
+265
+266
+267
+268
+269
+272
+273
+274
+275
+279
+279
+282
+282
+283
+285
+286
+286
+287
+287
+288
+288
+293
+293
+294
+294
+295
+296
+297
+299
+300
+301
+302
+302
+303
+303
+303
+305
+306
+308
+318
+318
+318
+319
+319
+321
+322
+323
+324
+326
+326
+327
+328
+329
+329
+330
+331
+332
+334
+335
+336
+336
+337
+337
+338
+338
+340
+343
+345
+346
+347
+348
+348
+348
+348
+350
+350
+351
+351
+353
+354
+355
+355
+355
+357
+360
+363
+363
+364
+364
+364
+367
+369
+371
+372
+373
+375
+375
+375
+376
+376
+376
+377
+379
+379
+381
+381
+381
+381
+382
+383
+383
+385
+386
+386
+387
+387
+388
+388
+389
+390
+390
+390
+390
+390
+391
+391
+392
+393
+394
+394
+394
+394
+394
+395
+396
+398
+398
+403
+404
+406
+406
+408
+408
+410
+410
+410
+410
+411
+411
+412
+412
+412
+415
+415
+416
+417
+418
+420
+425
+426
+427
+430
+431
+432
+435
+435
+440
+441
+441
+442
+443
+444
+445
+445
+446
+446
+446
+451
+451
+451
+451
+452
+453
+454
+454
+455
+457
+457
+458
+458
+459
+459
+459
+459
+459
+459
+460
+462
+465
+465
+467
+467
+467
+467
+468
+469
+476
+476
+476
+477
+479
+479
+479
+482
+482
+484
+487
+487
+491
+495
+495
+497
+498
+499
+500
+500
+504
+506
+508
+510
+511
+511
+513
+515
+515
+516
+516
+516
+517
+519
+520
+521
+521
+523
+523
+524
+525
+525
+526
+527
+528
+530
+530
+535
+536
+539
+540
+540
+541
+542
+544
+544
+545
+547
+550
+551
+552
+553
+556
+556
+557
+557
+558
+560
+560
+563
+563
+565
+566
+567
+567
+569
+569
+570
+571
+572
+572
+573
+574
+577
+579
+579
+584
+586
+586
+587
+587
+587
+589
+590
+590
+592
+592
+592
+594
+596
+596
+597
+598
+598
+599
+601
+603
+603
+603
+606
+607
+608
+609
+610
+611
+612
+614
+614
+616
+616
+616
+616
+618
+618
+619
+622
+623
+623
+624
+625
+626
+627
+629
+630
+632
+633
+634
+635
+636
+638
+638
+639
+640
+643
+645
+646
+646
+646
+646
+646
+647
+647
+648
+648
+650
+650
+650
+651
+651
+652
+653
+655
+656
+657
+657
+657
+658
+658
+658
+661
+661
+661
+662
+662
+664
+664
+664
+666
+667
+668
+668
+669
+672
+673
+675
+676
+676
+680
+680
+681
+684
+685
+685
+686
+687
+688
+690
+691
+691
+692
+692
+693
+693
+696
+697
+697
+698
+700
+704
+705
+705
+705
+705
+706
+708
+709
+710
+710
+710
+711
+712
+712
+713
+715
+717
+718
+718
+721
+721
+721
+721
+722
+722
+722
+723
+724
+725
+727
+728
+729
+729
+730
+731
+731
+731
+734
+735
+738
+741
+742
+743
+745
+747
+747
+747
+749
+749
+750
+750
+750
+752
+753
+757
+758
+759
+760
+761
+761
+762
+764
+764
+764
+765
+765
+767
+768
+769
+769
+770
+770
+772
+772
+772
+773
+773
+774
+775
+775
+775
+778
+778
+779
+779
+781
+781
+783
+785
+790
+793
+795
+796
+798
+798
+799
+803
+805
+806
+806
+809
+811
+812
+812
+815
+816
+816
+817
+819
+819
+820
+821
+821
+822
+822
+823
+823
+824
+827
+828
+830
+831
+832
+833
+833
+836
+837
+837
+838
+839
+839
+840
+841
+843
+844
+847
+848
+849
+849
+851
+852
+853
+854
+855
+859
+859
+859
+859
+863
+864
+865
+867
+868
+868
+868
+869
+870
+871
+871
+872
+872
+874
+875
+876
+877
+878
+879
+880
+880
+881
+881
+884
+885
+886
+887
+889
+891
+891
+893
+893
+894
+894
+895
+895
+895
+896
+896
+899
+899
+899
+901
+901
+906
+907
+907
+907
+909
+910
+910
+910
+911
+912
+914
+914
+915
+917
+918
+920
+921
+922
+922
+924
+925
+925
+926
+927
+928
+932
+932
+936
+938
+940
+941
+942
+943
+945
+947
+947
+948
+948
+949
+949
+949
+950
+952
+953
+954
+955
+955
+956
+956
+957
+958
+959
+960
+961
+963
+963
+965
+966
+966
+966
+967
+967
+967
+968
+969
+973
+973
+973
+974
+974
+974
+975
+977
+977
+977
+978
+981
+981
+982
+982
+984
+985
+986
+987
+987
+988
+988
+989
+993
+995
+996
+997
+997
+998
diff --git a/challenge-241/bob-lied/perl/jsparse b/challenge-241/bob-lied/perl/jsparse
new file mode 100644
index 0000000000..fa04921737
--- /dev/null
+++ b/challenge-241/bob-lied/perl/jsparse
@@ -0,0 +1,1000 @@
+15375
+22459
+33715
+45257
+64666
+75944
+90587
+95397
+102327
+120488
+138112
+144686
+149384
+153591
+176064
+193187
+200227
+207650
+212521
+240711
+247272
+258403
+279028
+281515
+282170
+291411
+294878
+307862
+324070
+327821
+351900
+357895
+398843
+404798
+416139
+446558
+447956
+448173
+462858
+475933
+477618
+479714
+482485
+490615
+491107
+492341
+494156
+497368
+525282
+526560
+545930
+548783
+566764
+566874
+568428
+595560
+598329
+608718
+644052
+653668
+658886
+661457
+665233
+691026
+693828
+717677
+727328
+734707
+742600
+746785
+756226
+781641
+788287
+792907
+795894
+823781
+833718
+848535
+859230
+883800
+901527
+928164
+932413
+932604
+940506
+947265
+948406
+949184
+949934
+956726
+958964
+960450
+961263
+962566
+973800
+981171
+990319
+1011085
+1029867
+1036199
+1043469
+1058432
+1076031
+1089279
+1091455
+1095210
+1097786
+1113245
+1113611
+1129279
+1131237
+1136713
+1148318
+1157679
+1186896
+1191672
+1201912
+1202343
+1210695
+1221565
+1222010
+1230355
+1274828
+1275094
+1277778
+1289695
+1295605
+1301284
+1308612
+1313377
+1314785
+1324582
+1330172
+1352894
+1357452
+1360439
+1394054
+1394171
+1401843
+1407566
+1409482
+1419042
+1420357
+1430499
+1433104
+1464068
+1469747
+1484475
+1498551
+1541719
+1543887
+1551102
+1553359
+1576310
+1578475
+1599076
+1618532
+1625138
+1642390
+1662989
+1664198
+1669654
+1677819
+1678411
+1683373
+1690843
+1695734
+1713906
+1717127
+1739869
+1750346
+1751612
+1760734
+1769732
+1780926
+1784674
+1788632
+1809740
+1810965
+1812832
+1813907
+1840174
+1840442
+1842221
+1863102
+1864080
+1866232
+1867188
+1870129
+1880066
+1887288
+1905365
+1909955
+1916731
+1942260
+1959414
+1975301
+1976167
+1981783
+1998649
+2002193
+2012972
+2014208
+2015625
+2022485
+2023109
+2028862
+2030531
+2038659
+2045982
+2070268
+2108734
+2109283
+2109711
+2148918
+2155036
+2162611
+2163478
+2172738
+2184522
+2201770
+2204091
+2205020
+2208271
+2210329
+2235126
+2235417
+2237751
+2242802
+2285117
+2295786
+2300830
+2311961
+2313652
+2316177
+2329157
+2332918
+2344252
+2348460
+2363273
+2382094
+2414407
+2415795
+2428074
+2447678
+2449096
+2449736
+2455352
+2456448
+2460650
+2470685
+2487694
+2492914
+2505226
+2517171
+2523274
+2528196
+2528761
+2538848
+2544922
+2565003
+2618779
+2626652
+2626847
+2642107
+2644058
+2647743
+2677831
+2691530
+2691622
+2723242
+2725530
+2732136
+2749162
+2751427
+2759555
+2772549
+2786891
+2787264
+2801309
+2832583
+2833101
+2849747
+2849774
+2852016
+2855001
+2856457
+2856761
+2859210
+2862558
+2863018
+2869758
+2881198
+2917430
+2922590
+2936127
+2958878
+2979708
+3002277
+3019783
+3028040
+3061970
+3063452
+3063643
+3066111
+3075986
+3081861
+3095492
+3107993
+3130171
+3134925
+3203675
+3205308
+3207823
+3220542
+3220624
+3221457
+3236491
+3241562
+3256435
+3260257
+3286995
+3305771
+3325087
+3329455
+3337365
+3360947
+3362847
+3363930
+3370926
+3382609
+3383281
+3384220
+3385416
+3392910
+3402458
+3403558
+3423668
+3425423
+3437873
+3451298
+3470188
+3476746
+3484337
+3490437
+3497902
+3514101
+3514205
+3529242
+3531059
+3533259
+3537262
+3543425
+3549492
+3557193
+3571437
+3579410
+3588778
+3615939
+3620165
+3626828
+3643555
+3649811
+3666150
+3666767
+3677648
+3687353
+3692622
+3718505
+3733128
+3747867
+3764599
+3774767
+3776920
+3778979
+3782399
+3792181
+3799657
+3805486
+3809588
+3846948
+3865313
+3869920
+3880888
+3884935
+3887275
+3893802
+3896370
+3903585
+3921451
+3925668
+3932561
+3972802
+3973537
+3994526
+4006673
+4008492
+4011406
+4013888
+4014165
+4032331
+4034279
+4057538
+4077050
+4080453
+4085289
+4095173
+4104268
+4109022
+4112919
+4113800
+4130618
+4143710
+4145042
+4146072
+4146083
+4148163
+4160163
+4162121
+4164646
+4172781
+4178733
+4196373
+4197370
+4216281
+4253170
+4262648
+4264878
+4286898
+4292000
+4334601
+4345071
+4354979
+4359850
+4384975
+4385631
+4386116
+4398474
+4407963
+4414875
+4415699
+4419329
+4435068
+4454726
+4475414
+4483819
+4491215
+4497278
+4497491
+4500790
+4531979
+4546862
+4555575
+4564567
+4573517
+4589723
+4618965
+4631798
+4638168
+4640587
+4657917
+4678660
+4680269
+4691468
+4692468
+4694965
+4701673
+4711636
+4729706
+4736095
+4739218
+4749939
+4755542
+4779368
+4821053
+4834961
+4843389
+4848130
+4848913
+4862924
+4878975
+4879421
+4879979
+4891733
+4911406
+4913129
+4924094
+4930890
+4931281
+4932702
+4958024
+4960953
+4972210
+4972237
+4977832
+5014600
+5019212
+5030436
+5035504
+5059736
+5109641
+5120524
+5128592
+5131207
+5135910
+5144867
+5147648
+5156757
+5194027
+5218225
+5220014
+5232117
+5232620
+5233216
+5235839
+5241542
+5250854
+5275093
+5282948
+5287021
+5293085
+5294049
+5294873
+5310120
+5347452
+5352222
+5353776
+5360768
+5418211
+5420768
+5420809
+5441320
+5453890
+5459809
+5460485
+5490022
+5492075
+5502596
<