Advertisement
Guest User

Astrolabicon puzzle solver

a guest
Sep 17th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.13 KB | None | 0 0
  1. %Filip Jander 7/8/19
  2. %Astrolabicon puzzle solver
  3.  
  4. clear
  5. clc
  6. Asize = 8;
  7. A = 1:Asize;
  8. C = 1:Asize;
  9. C(1,1) = 2;
  10. C(1,2) = 1;
  11. %2 = rotate180
  12. %1 = rotate
  13. %0 = shift
  14.  
  15. possibleResults = zeros(size(A,2)*size(A,2),size(A,2));
  16. for m = 1:size(A,2)
  17.     for n = 1:size(A,2)
  18.         if m == 1
  19.             B = A;
  20.             if n ~= size(A,2)
  21.                 B([n (n+1)]) = B([(n+1) n]);
  22.             else
  23.                 B([1 size(A,2)]) = B([size(A,2) 1]);
  24.             end
  25.             possibleResults(n,:) = B;
  26.         else
  27.             possibleResults((m-1)*size(A,2)+n,:) = shift(possibleResults(n,:),m-1);
  28.         end
  29.     end
  30. end
  31.  
  32. counter = 0;
  33. foundIt = 0;
  34. resultsArray = zeros(2,10);
  35. resultsArray = resultsArray + 5;
  36. z = 0;
  37. while foundIt == 0
  38.     A = 1:Asize;
  39.     for n = 1:size(resultsArray,2)
  40.         x = fix(3*rand());
  41.        
  42.         %prevent repeats
  43.         if x == z
  44.             if x == 2
  45.                 x = 0;
  46.             else
  47.                 x = x + 1;
  48.             end
  49.         end
  50.         z = x;
  51.        
  52.         %prevents shift at start or end
  53.         if (n == size(resultsArray,2) || n==1) && x == 0
  54.             x = x + 1;
  55.         end
  56.        
  57.         %if x == 1
  58.          %   x = 2;
  59.           %  z = x;
  60.         %end
  61.        
  62.         if x < 1
  63.             y = fix((size(A,2)-1)*rand())+1;
  64.             A = shift(A,y);
  65.             resultsArray(1,n) = x;
  66.             resultsArray(2,n) = y;
  67.         elseif x < 2
  68.             y = fix((size(A,2)/2-1)*rand())+1;
  69.             A = rotate(A,y);
  70.             resultsArray(1,n) = x;
  71.             resultsArray(2,n) = y;
  72.         elseif x <3
  73.             A = rotate180(A);
  74.         end
  75.         resultsArray(1,n) = x;
  76.         if n > 3
  77.             for k = 1:size(possibleResults,1)
  78.                 if A == possibleResults(k,:)
  79.                 %if A == C
  80.                     disp('win');
  81.                     foundIt = 1;
  82.                     resultsArray(:,n+1:size(resultsArray,2)) = 0;
  83.                     break;
  84.                 end
  85.             end
  86.         end
  87.         if foundIt == 1
  88.             break;
  89.         end
  90.     end
  91.  
  92.    
  93.     counter = counter + 1;
  94. end
  95. resultsArray = fix(resultsArray)
  96. A
  97.  
  98.  
  99. function y = shift(x,shiftAmount)
  100. oldArray = x;
  101. y = zeros(1,size(x,2));
  102. for n = 1:size(x,2)
  103.     y(1,n) = oldArray(1,mod(n-1-shiftAmount,size(oldArray,2))+1);
  104. end
  105.  
  106. end
  107.  
  108. function y = rotate(x,shiftAmount)
  109. y = x;
  110. oldArray = x;
  111. rotateArray = zeros(1,size(oldArray,2)/2);
  112. for n = 1:size(oldArray,2)/2
  113.     if n <= size(oldArray,2)/4
  114.         rotateArray(1,n) = y(1,n);
  115.     else
  116.         rotateArray(1,n) = y(1,size(oldArray,2)/2-(n-size(oldArray,2)/4)+1);
  117.        
  118.     end
  119. end
  120. rotateArray = shift(rotateArray,shiftAmount);
  121. for n = 1:size(oldArray,2)/2
  122.     if n <= size(oldArray,2)/4
  123.         y(1,n) = rotateArray(1,n);
  124.     else
  125.         y(1,n) = rotateArray(1,size(oldArray,2)/2-(n-size(oldArray,2)/4)+1);
  126.     end
  127. end
  128. end
  129.  
  130. function y = rotate180(x)
  131. y = x;
  132. oldArray = x;
  133. for n = 1:size(oldArray,2)/4
  134.     y(1,n) = oldArray(1,n+size(oldArray,2)*2/4);
  135. end
  136. for n = size(oldArray,2)/2+1:size(oldArray,2)*3/4
  137.     y(1,n) = oldArray(1,n-size(oldArray,2)/2);
  138. end
  139. end
  140.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement