Hashtron inference

Translation of #Phix and Go

# 20240530 Raku programming solution

sub Inference($command, $bits, @program) {
   my  $out = 0;

   return $out unless @program.Bool;

   for ^$bits -> $j { # Iterate over the bits
      my $input = $command +| ($j +< 16);
      $input = Hashtron($input, @program[0][0], my $maxx = @program[0][1]);
      for @program[1..*] -> ($s, $max) {
         $input = Hashtron($input, $s, $maxx -= $max);
      }
      if ( $input +&= 1 ) != 0 { $out +|= 1 +< $j }
   }
   return $out;
}

sub Hashtron($n, $s, $max) {
   # Mixing stage, mix input with salt using subtraction
   my $m = $n - $s;

   # Hashing stage, use xor shift with prime coefficients
   for <-2 -3 +5 +7 -11 -13 +17 -19> -> $p {
      $m = ($m +^ ($m +> $p)) +& 0xFFFFFFFF; 
   }

   # Mixing stage 2, mix input with salt using addition
   $m = ($m + $s) +& 0xFFFFFFFF;

   # Modular stage using Lemire's fast alternative to modulo reduction
   return (($m * $max) +> 32) +& 0xFFFFFFFF;
}

sub MAIN() {
   say Inference(42, 64, (<0 2>,));

   for 0..^256 -> $i {
      say "$i ", Inference($i, 4, (
         <8776 79884>, <12638 1259>, <9953 1242>, <4658 1228>, <5197 1210>,
         <12043 1201>, <6892 1183>, <7096 1168>, <10924 1149>, <5551 1136>, 
         <5580 1123>, <3735 1107>, <3652 1091>, <12191 1076>, <14214 1062>, 
         <13056 1045>, <14816 1031>, <15205 1017>, <10736 1001>, <9804 989>, 
         <13081 974>, <6706 960>, <13698 944>, <14369 928>, <16806 917>, 
         <9599 906>, <9395 897>, <4885 883>, <10237 870>, <10676 858>,
         <18518 845>, <2619 833>, <13715 822>, <11065 810>, <9590 799>, 
         <5747 785>, <2627 776>, <8962 764>, <5575 750>, <3448 738>, 
         <5731 725>, <9434 714>, <3163 703>, <3307 690>, <3248 678>, 
         <3259 667>, <3425 657>, <3506 648>, <3270 639>, <3634 627>, 
         <3077 617>, <3511 606>, <27159 597>, <27770 589>, <28496 580>, 
         <28481 571>, <29358 562>, <31027 552>, <30240 543>, <30643 534>,
         <31351 527>, <31993 519>, <32853 510>, <33078 502>, <33688 495>, 
         <29732 487>, <29898 480>, <29878 474>, <26046 468>, <26549 461>, 
         <28792 453>, <26101 446>, <32971 439>, <29704 432>, <23193 426>, 
         <29509 421>, <27079 415>, <32453 409>, <24737 404>, <25725 400>, 
         <23755 395>, <52538 393>, <53242 386>, <19609 380>, <26492 377>, 
         <24566 358>, <31163 368>, <57174 363>, <26639 364>, <31365 357>,
         <60918 350>, <21235 338>, <28072 322>, <28811 314>, <27571 320>, 
         <17635 309>, <51968 169>, <54367 323>, <60541 254>, <26732 270>, 
         <52457 157>, <27181 276>, <19874 227>, <22797 320>, <59346 271>, 
         <25496 260>, <54265 231>, <22281 250>, <42977 318>, <26008 240>, 
         <87604 142>, <94647 314>, <52292 157>, <20999 216>, <89253 316>, 
         <22746 29>, <68338 312>, <22557 317>, <110904 104>, <70975 285>,
         <51835 277>, <51871 313>, <132221 228>, <18522 290>, <68512 285>, 
         <118816 302>, <150865 268>, <68871 273>, <68139 290>, <84984 285>, 
         <150693 266>, <396047 272>, <84923 269>, <215562 258>, <68015 248>, 
         <247689 235>, <214471 229>, <264395 221>, <263287 212>, <280193 201>, 
         <108065 194>, <263616 187>, <148609 176>, <263143 173>, <378205 162>, 
         <312547 154>, <50400 147>, <328927 140>, <279217 132>, <181111 127>,
         <672098 118>, <657196 113>, <459383 111>, <833281 105>, <520281 102>, 
         <755397 95>, <787994 91>, <492444 82>, <1016592 77>, <656147 71>, 
         <819893 66>, <165531 61>, <886503 57>, <1016551 54>, <3547827 49>, 
         <14398170 43>, <395900 41>, <4950628 37>, <11481175 33>, 
         <100014881 30>, <8955328 31>, <11313984 27>, <13640855 23>,
         <528553762 21>, <63483027 17>, <952477 8>, <950580 4>, <918378 2>, 
         <918471 1> )
      ) 
   } 
}

You may Attempt This Online!

Last updated

Was this helpful?