diff options
| author | Bob Lied <boblied+github@gmail.com> | 2023-11-19 21:00:10 -0600 |
|---|---|---|
| committer | Bob Lied <boblied+github@gmail.com> | 2023-11-19 21:00:10 -0600 |
| commit | 66f1c9fd388b38344817d9b2a802ff047cc56fd6 (patch) | |
| tree | be160b23e468747570a20f2401eabef0c9ed642d /challenge-241 | |
| parent | dc0651a859d9824512ffbd2c84aba36b7392e84f (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-241/bob-lied/perl/bm.pl | 197 | ||||
| -rw-r--r-- | challenge-241/bob-lied/perl/ch-1.pl | 7 | ||||
| -rw-r--r-- | challenge-241/bob-lied/perl/jdense | 1000 | ||||
| -rw-r--r-- | challenge-241/bob-lied/perl/jsparse | 1000 |
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 < |
