Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %Filip Jander 7/8/19
- %Astrolabicon puzzle solver
- clear
- clc
- Asize = 8;
- A = 1:Asize;
- C = 1:Asize;
- C(1,1) = 2;
- C(1,2) = 1;
- %2 = rotate180
- %1 = rotate
- %0 = shift
- possibleResults = zeros(size(A,2)*size(A,2),size(A,2));
- for m = 1:size(A,2)
- for n = 1:size(A,2)
- if m == 1
- B = A;
- if n ~= size(A,2)
- B([n (n+1)]) = B([(n+1) n]);
- else
- B([1 size(A,2)]) = B([size(A,2) 1]);
- end
- possibleResults(n,:) = B;
- else
- possibleResults((m-1)*size(A,2)+n,:) = shift(possibleResults(n,:),m-1);
- end
- end
- end
- counter = 0;
- foundIt = 0;
- resultsArray = zeros(2,10);
- resultsArray = resultsArray + 5;
- z = 0;
- while foundIt == 0
- A = 1:Asize;
- for n = 1:size(resultsArray,2)
- x = fix(3*rand());
- %prevent repeats
- if x == z
- if x == 2
- x = 0;
- else
- x = x + 1;
- end
- end
- z = x;
- %prevents shift at start or end
- if (n == size(resultsArray,2) || n==1) && x == 0
- x = x + 1;
- end
- %if x == 1
- % x = 2;
- % z = x;
- %end
- if x < 1
- y = fix((size(A,2)-1)*rand())+1;
- A = shift(A,y);
- resultsArray(1,n) = x;
- resultsArray(2,n) = y;
- elseif x < 2
- y = fix((size(A,2)/2-1)*rand())+1;
- A = rotate(A,y);
- resultsArray(1,n) = x;
- resultsArray(2,n) = y;
- elseif x <3
- A = rotate180(A);
- end
- resultsArray(1,n) = x;
- if n > 3
- for k = 1:size(possibleResults,1)
- if A == possibleResults(k,:)
- %if A == C
- disp('win');
- foundIt = 1;
- resultsArray(:,n+1:size(resultsArray,2)) = 0;
- break;
- end
- end
- end
- if foundIt == 1
- break;
- end
- end
- counter = counter + 1;
- end
- resultsArray = fix(resultsArray)
- A
- function y = shift(x,shiftAmount)
- oldArray = x;
- y = zeros(1,size(x,2));
- for n = 1:size(x,2)
- y(1,n) = oldArray(1,mod(n-1-shiftAmount,size(oldArray,2))+1);
- end
- end
- function y = rotate(x,shiftAmount)
- y = x;
- oldArray = x;
- rotateArray = zeros(1,size(oldArray,2)/2);
- for n = 1:size(oldArray,2)/2
- if n <= size(oldArray,2)/4
- rotateArray(1,n) = y(1,n);
- else
- rotateArray(1,n) = y(1,size(oldArray,2)/2-(n-size(oldArray,2)/4)+1);
- end
- end
- rotateArray = shift(rotateArray,shiftAmount);
- for n = 1:size(oldArray,2)/2
- if n <= size(oldArray,2)/4
- y(1,n) = rotateArray(1,n);
- else
- y(1,n) = rotateArray(1,size(oldArray,2)/2-(n-size(oldArray,2)/4)+1);
- end
- end
- end
- function y = rotate180(x)
- y = x;
- oldArray = x;
- for n = 1:size(oldArray,2)/4
- y(1,n) = oldArray(1,n+size(oldArray,2)*2/4);
- end
- for n = size(oldArray,2)/2+1:size(oldArray,2)*3/4
- y(1,n) = oldArray(1,n-size(oldArray,2)/2);
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement