Advertisement
Guest User

Untitled

a guest
Dec 15th, 2021
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.81 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. $filename = "15.txt";
  4.  
  5. open(FILE, $filename);
  6. @data = <FILE>;
  7. close(FILE);
  8.  
  9.  
  10. $part1 = 1; #set this to 1 to solve for part1 of puzzle.
  11.  
  12. for ($i = 0; $i < $#data + 1; $i++) {
  13.         $line = $data[$i];
  14.         $line =~ s/[^0-9]*//sgi;
  15.         @coords = split("", $line);
  16.         if ($part1 == 1) {
  17.                 $maxx = $#coords + 1;
  18.                 $maxy = $#data + 1;
  19.                 for ($v = 0; $v < $#coords + 1; $v++) {
  20.                         $map[$v][$i] = $coords[$v];
  21.                         $distance[$v][$i] = 1000000;
  22.                         $unvisited{$v.",".$i} = 1;
  23.                 }
  24.  
  25.         }
  26.         else
  27.         {
  28.                 $maxx = ($#coords + 1) * 5;
  29.                 $maxy = ($#data + 1) * 5;
  30.                 $ac = $#data + 1;
  31.                 $bc = $#coords + 1;
  32.                 for ($v = 0; $v < $#coords + 1; $v++) {
  33.  
  34.                         for ($m = 0; $m < 5; $m++) { #expand 5*5
  35.                         for ($n = 0; $n < 5; $n++) {
  36.                                 $uval = $coords[$v] + $m + $n;
  37.                                 if ($uval > 9) {
  38.                                         $uval = $uval - 9;
  39.                                 }
  40.  
  41.                                 $map[$v + ($bc * $m)][$i + ($ac * $n)] = $uval;
  42.                                 $distance[$v + ($bc * $m)][$i + ($ac * $n)] = 1000000;
  43.                                 $unvisited{($v + ($bc * $m)).",".($i + ($ac * $n))} = 1;
  44.                         }
  45.                         }
  46.                 }
  47.         }
  48.  
  49. }
  50.  
  51.  
  52. for ($t = 0; $t < $maxy; $t++) {
  53. for ($s = 0; $s < $maxx; $s++) {
  54.         print $map[$s][$t];
  55. }
  56. print "\n";
  57. }
  58.  
  59.  
  60.  
  61. $distance[0][0] = 0;
  62.  
  63. $x = 0;
  64. $y = 0;
  65.  
  66. $cnt = 0;
  67. %relevant = (); #Optimization - only scan unvisited neighbours that we have "seen" - thus we don't scan whole map unneccessary.
  68.  
  69. while (($x != $maxx - 1)||($y != $maxy - 1)) {
  70.  
  71.         #Implementation of djikstra algoritm.
  72.  
  73.         if (($unvisited{($x - 1).",".$y} == 1)&&($x > 0)) {
  74.                 $relevant{($x - 1).",".$y} = 1;
  75.                 if ($distance[$x - 1][$y] > $distance[$x][$y] + $map[$x - 1][$y]) {
  76.                         $distance[$x - 1][$y] = $distance[$x][$y] + $map[$x - 1][$y];
  77.                 }
  78.         }
  79.         if (($unvisited{($x + 1).",".$y} == 1)&&($x < $maxx)) {
  80.                 $relevant{($x + 1).",".$y} = 1;
  81.                 if ($distance[$x + 1][$y] > $distance[$x][$y] + $map[$x + 1][$y]) {
  82.                         $distance[$x + 1][$y] = $distance[$x][$y] + $map[$x + 1][$y];
  83.                 }
  84.         }
  85.         if (($unvisited{$x.",".($y - 1)} == 1)&&($y > 0)) {
  86.                 $relevant{$x.",".($y - 1)} = 1;
  87.                 if ($distance[$x][$y - 1] > $distance[$x][$y] + $map[$x][$y - 1]) {
  88.                         $distance[$x][$y - 1] = $distance[$x][$y] + $map[$x][$y - 1];
  89.                 }
  90.         }
  91.         if (($unvisited{$x.",".($y + 1)} == 1)&&($y < $maxy)) {
  92.                 $relevant{$x.",".($y + 1)} = 1;
  93.                 if ($distance[$x][$y + 1] > $distance[$x][$y] + $map[$x][$y + 1]) {
  94.                         $distance[$x][$y + 1] = $distance[$x][$y] + $map[$x][$y + 1];
  95.                 }
  96.         }
  97.  
  98.  
  99.         delete($unvisited{$x.",".$y});
  100.         delete($relevant{$x.",".$y});
  101.  
  102.         $smallestvalue = 1000000;
  103.         foreach $uvn (keys %relevant) {
  104.                 ($q, $z) = split(",",$uvn);
  105.                 if (($distance[$q][$z] < $smallestvalue)&&($unvisited{$uvn} == 1)) {
  106.                         $smallestvalue = $distance[$q][$z];
  107.                         $x = $q;
  108.                         $y = $z;
  109.                 }
  110.         }
  111.  
  112.         $cnt++;
  113.         if (($cnt / 500) == int($cnt / 500)) {
  114.                 print "passed through $cnt iterations\n";
  115.         }
  116. }
  117.  
  118. $risksum = $distance[$maxx - 1][$maxy - 1];
  119. print $risksum."\n";
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement