Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.38 KB | None | 0 0
  1. # Numbrix puzzel => n*n raster => 1 tem n² invullen als een slang => getal kleiner en getal groter moeten buren zijn.
  2. # Mogelijke cellen in een cel => Verzameling voor elke cel
  3. # Kunnen weten of element aanwezig is => hashes (niet gegeven) => 3 dimensies => [x][y]{nummer}
  4. # Steeds testen van een criterium, tot het niet meer nodig is. Als er twee zijn: eerst crit 1, dan crit 2, dat in loop.
  5. # Bij 3 kan je kiezen tussen 123 123 123 en 1212123123 (afh of 2 iets oplevert)
  6.     # 1) alle getallen die nog niet in het raster aanwezig zijn in elke cel.
  7.     # 2) Criteria toepassen:
  8.         # A) Elke kandidaat in elke cel 1 voor 1 aflopen en afvragen of die daar kan staan => Het getal kleiner en groter moet in de mogelijke buurcellen staan. => herhalen tot geen verbetering meer brengt
  9.             # Elementen verwijderen uit hash met delete. (niet gegeven)
  10.             # Houd cellen bij die maar 1 kandidaat hebben => zo weinig mogelijk specialekes doen.
  11.             # Maak extra rijen en kolommen voor randen (0 wordt toch niet gebruikt) en maak die leeg. (niet gegeven)
  12.         # B) Ga op zoek naar de cellen met maar één kandidaat en verwijder die kandidaat uit de andere cellen. => Ook ittereren
  13.             # Programma moet stoppen! => Zorg dat kan vaststellen als hij gestopt is en intermediaire shit kan uitschrijven.
  14.         # C) Als een kandidaat maar in één cel mogelijk is, vul het dan in.
  15.  
  16. use Data::Dumper;
  17.  
  18. @ARGV = "A.numbrix";
  19. ($bestand) = @ARGV;
  20. $aantal = 0;            #we willen van 1 tot en met 5 opvullen ,  0 en 6 moeten undef zijn.
  21. my %aanwezig;          
  22. while(<>) {
  23.     $aantal++;
  24.     # print Dumper @rij;  
  25.     for $rij (split " ", $_){
  26.         if ($rij ne "...") {
  27.             # print ("\$_ in if = $_");
  28.             $aanwezig{int($rij)} = 1;
  29.         }
  30.        
  31.     }
  32. }
  33.  
  34. for my $j (0 .. ($aantal + 1)) {
  35.     $structuur[$j][$aantal+1]{undef} = undef;
  36.     $structuur[$j][0]{undef} = undef;
  37.     $structuur[$aantal+1][$j]{undef} = undef;
  38.     $structuur[0][$j]{undef} = undef;
  39. }
  40.  
  41.  
  42. @ARGV = $bestand;
  43.  
  44. while(<>){
  45.     $x += 1;
  46.     $y = 0;
  47.     for $rij (split " ", $_){
  48.         $y += 1;
  49.         if($rij eq "..."){
  50.             for $kandidaat (1..$aantal*$aantal){
  51.                 unless (exists $aanwezig{$kandidaat}){
  52.                     $structuur[$x][$y]{$kandidaat} = 1;
  53.                 }              
  54.             }          
  55.         }
  56.         else{
  57.             $structuur[$x][$y]{int($rij)} = 1;
  58.         }
  59.     }
  60. }
  61.  
  62. # print "\$. = $.";
  63. # $. is nu aantal rijen/kolommen
  64.  
  65.  
  66. print Dumper @structuur;
  67.  
  68. # # if defined dan ...
  69. # # verwijderen uit array met splice
  70. # # alle getallen die nog niet aanwezig zijn:
  71. # # dit is super inefficient
  72.  
  73. for my $k (1 .. $.){
  74.     for my $l (1 .. $.) {
  75.         unless (defined($structuur[$k][$l])){
  76.             for my $m (1 .. $.*$.) {
  77.                 unless (defined($aanwezig{$m})){
  78.                     $structuur[$k][$l]{$m} = 1;
  79.                 }
  80.             }
  81.         }
  82.     }
  83. }  
  84.  
  85. # print("initialisatie: \n");
  86. # for $cel (1..$aantal*$aantal){
  87. #   $x = $cel%$aantal;
  88. #   # Randgeval als rechtse kolom wordt gebruikt
  89. #   if($cel%$aantal == 0){
  90. #           $x = $aantal;
  91. #       }  
  92. #   $y = int(($cel-1)/$aantal)+1;
  93. #   print "cel: $cel ($x, $y) || ";
  94. #   print join ",\t", sort keys %{$structuur[$x][$y]};
  95. #   print "\n";
  96. # }
  97.  
  98. # mogelijke waarden zitten er in -> nu werken met deze structuur constant.
  99. # criterium 1: voor elke waarde checken of in de aanliggende een waarde ligt die er voor en er na komt
  100.  
  101.  
  102.  
  103. for $a (1 .. $aantal){
  104.     for $b (1 .. $aantal) {
  105.         foreach $key (sort {$a <=> $b} keys $structuur[$a][$b]) {
  106.             # print "a = $a: b = $b: $key\n";
  107.             $vorigeGevonden = 0;
  108.             $volgendeGevonden = 0;
  109.             if (($key ne $aantal*$aantal) and ($key ne 1)){
  110.                 if (exists($structuur[$a+1][$b]->{$key+1}) or exists($structuur[$a-1][$b]->{$key+1})
  111.                     or exists($structuur[$a][$b+1]->{$key+1}) or exists($structuur[$a][$b-1]->{$key+1})) {
  112.                     $volgendeGevonden = 1;
  113.                 }
  114.                 if (exists($structuur[$a+1][$b]->{$key-1}) or exists($structuur[$a-1][$b]->{$key-1})
  115.                     or exists($structuur[$a][$b+1]->{$key-1}) or exists($structuur[$a][$b-1]->{$key-1})) {
  116.                     $vorigeGevonden = 1;
  117.                 }
  118.                 if ($vorigeGevonden == 0 or $volgendeGevonden == 0) {
  119.                     delete $structuur[$a][$b]->{$key};
  120.                     # print "a = $a: b = $b: $key DELETED, $vorigeGevonden && $volgendeGevonden\n";
  121.                 }
  122.             }
  123.             if ($key eq $aantal*$aantal) {
  124.                 if (exists($structuur[$a+1][$b]->{$key-1}) or exists($structuur[$a-1][$b]->{$key-1})
  125.                     or exists($structuur[$a][$b+1]->{$key-1}) or exists($structuur[$a][$b-1]->{$key-1})) {
  126.                     $vorigeGevonden = 1;
  127.                 }
  128.                 unless ($vorigeGevonden) {
  129.                     delete $structuur[$a][$b]->{$key};
  130.                     # print "a = $a: b = $b: $key DELETED, $vorigeGevonden\n";
  131.                 }
  132.             }
  133.             if ($key eq 1) {
  134.                 if (exists($structuur[$a+1][$b]->{$key+1}) or exists($structuur[$a-1][$b]->{$key+1})
  135.                     or exists($structuur[$a][$b+1]->{$key+1}) or exists($structuur[$a][$b-1]->{$key+1})) {
  136.                     $volgendeGevonden = 1;
  137.                 }
  138.                 unless ($volgendeGevonden) {
  139.                     delete $structuur[$a][$b]->{$key};
  140.                     print "a = $a: b = $b: $key DELETED, $volgendeGevonden\n";
  141.                 }
  142.             }
  143.  
  144.         }
  145.     }
  146. }
  147. print("\nCriterium 1: \n\n");
  148. for $cel (1..$aantal*$aantal){
  149.     $x = $cel%$aantal;
  150.     # Randgeval als rechtse kolom wordt gebruikt
  151.     if($cel%$aantal == 0){
  152.             $x = $aantal;
  153.         }  
  154.     $y = int(($cel-1)/$aantal)+1;
  155.     print "cel: $cel ($x, $y) || ";
  156.     print join ",\t", sort keys %{$structuur[$x][$y]};
  157.     print "\n";
  158. }
  159.  
  160. for $k (1 .. $aantal){
  161.     for $l (1 .. $aantal) {
  162.         @array = keys(%{$structuur[$k][$l]});
  163.         $value = $array[0];
  164.         $size = @array;
  165.         if ($size == 1){
  166.             for my $x (1 .. $.){
  167.                 for my $y (1 .. $.) {
  168.                     delete($structuur[$x][$y]{$value});
  169.                 }
  170.             }
  171.         }
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement