#include <iostream>
using namespace std;
void printArray (int arr[][9], int rowSize, int columnSize)
{
for (int i = 0; i < rowSize; i++)
{
for (int j = 0; j < columnSize; j++)
{
cout << arr[i][j] <<" ";
}
cout<<endl;
}
}
void convertStringToInt (string line,int arr[][9], int rowSize, int whichRow )
{
int step = 0;
for(int i=0; i< line.length(); i++)
{
if ( !isspace(line[i]) )
{
arr[whichRow ][step] = line[i]-48;
//cout << arr[whichRow][step]<<" ";
step++;
}
}
}
bool compareDigitsInLine (int arr[][9], int rowSize, int columnSize,int startAtRow, int startAtColumn)
{
bool isDifferent = true;
for(int i=0; i < rowSize; i++)
{
for(int j=0; j < columnSize-1; j++)
{
for (int k = 1; k < columnSize - j; k++)
{
int rowIndex = startAtRow+i;
int colIndex = startAtColumn+j;
if ( arr[rowIndex][colIndex]==arr[rowIndex][colIndex+k] || arr[rowIndex ][colIndex] < 1 || arr[rowIndex ][colIndex] > 9 )
{
isDifferent = false;
return isDifferent;
}
}
}
}
return isDifferent;
}
bool compareDigitsInSmallSquares(int arr[][9], int rowSize, int columnSize,int startAtRow, int startAtColumn)
{
bool isDifferent = true;
int multiplier = rowSize/3;
int jumpRow =0;
int jumpCol = 0;
int colStartPos = 0;
int rowStartPos = 0;
int rowIndx = 0;
int colIndx = 0;
int rowRootIndx =0;
int colRootIndx =0;
int k=0, m=0;
while (jumpCol < multiplier)
{
while (jumpRow < multiplier )
{
for (int i = 0; i<rowSize/multiplier; i++ )
{
for (int j = 0; j <columnSize/multiplier; j++)
{
for ( k = 0; k < rowSize/multiplier - rowStartPos; k++)
{
if (i==0 && j==0 && k==0)
{
rowStartPos = 0;
colStartPos = 1;
}
if (i==0 && j ==0 && k>0)
{
rowStartPos = 0;
colStartPos = 0;
}
if (i==0 && j==1 && k==0)
{
rowStartPos = 0;
colStartPos = 2;
}
if (i==0 && j==1 && k>0)
{
rowStartPos = 0;
colStartPos = 0;
}
if (i==0 && j==2 && k==0)
{
rowStartPos = 0;
colStartPos = 3;
}
if (i==0 && j==2 && k>0)
{
rowStartPos = 0;
colStartPos = 0;
}
if (i==1 && j==0 && k==0)
{
rowStartPos = 1;
colStartPos = 1;
}
if (i==1 && j==0 && k>0)
{
rowStartPos = 1;
colStartPos = 0;
}
if (i==1 && j==1 && k==0)
{
rowStartPos = 1;
colStartPos = 2;
}
if (i==1 && j==1 && k>0)
{
rowStartPos = 1;
colStartPos = 0;
}
if (i==1 && j==2 && k==0)
{
rowStartPos = 1;//bez znaczenia
colStartPos = 3;
}
if (i==1 && j==2 && k>0)
{
rowStartPos = 1;
colStartPos = 0;
}
if (i==2 && j==0 && k==0)
{
rowStartPos = 2;
colStartPos = 1;
}
if (i==2 && j==1 && k==0)
{
rowStartPos = 2;
colStartPos = 2;
}
if (i==2 && j==2 && k==0)
{
rowStartPos = 2;
colStartPos = 3;
}
for ( m = 0; m < columnSize/multiplier - colStartPos; m++)
{
rowIndx = k + rowStartPos + jumpRow*multiplier;
colIndx = m + colStartPos + jumpCol*multiplier;
rowRootIndx = i + jumpRow*multiplier;
colRootIndx = j + jumpCol*multiplier;
if ( arr[rowRootIndx][colRootIndx]==arr[rowIndx][colIndx] || arr[rowRootIndx][colRootIndx] < 1 || arr[rowRootIndx][colRootIndx] > 9 )
{
isDifferent = false;
return isDifferent;
}
}
}
}
}
jumpRow ++;
}
jumpCol++;
if ( jumpRow == multiplier )
jumpRow=0;
}
return isDifferent;
}
bool checkRowColumnSum (int arr[][9], int rowSize, int columnSize, int criteriaForTrue)
{
bool verdict = true;
int sum = 0;
int i=0,goByRow=0, goByCol = 0;
for ( i = 0; i < rowSize; i++)
{
if (verdict == true)
{
for ( goByCol = 0; goByCol < columnSize; goByCol++)
{
sum+= arr[i][goByCol];
}
if (sum != criteriaForTrue)
{
verdict = false;
return verdict;
}
sum = 0;
for ( goByRow = 0; goByRow < rowSize; goByRow++)
{
sum+= arr[goByRow][i];
}
if (sum != criteriaForTrue)
{
verdict = false;
return verdict;
}
if (sum != criteriaForTrue)
{
verdict = false;
return verdict;
}
sum = 0;
}
else if (verdict == false)
return verdict;
}
return verdict;
}
void checkSudoku (int arr[][9], int rowSize, int columnSize,int initialPositionForRow, int initialPositionForColumn, int totalSumLimit)
{
bool isDifferent = true;
bool isCorrect = true;
bool isDifferentInSmallSquareCorrect = true;
isDifferentInSmallSquareCorrect = compareDigitsInSmallSquares(arr, rowSize, columnSize,initialPositionForRow,initialPositionForColumn);
isDifferent = compareDigitsInLine(arr, rowSize, columnSize,initialPositionForRow,initialPositionForColumn);
isCorrect = checkRowColumnSum(arr,rowSize,columnSize, totalSumLimit);
if (isDifferent == true && isCorrect == true && isDifferentInSmallSquareCorrect == true )
{
cout<<"TAK"<<endl;
}
else
{
cout<<"NIE"<<endl;
}
}
int main()
{
int rowSize = 9;
int columnSize = 9;
int totalSum = 45; // Suma w linii od 1 do 9 zawsze wynosi 45 - kryterium prawdy ulozenia liczb w Sudoku
int arr1 [9][9]= { 2, 5, 1, 7, 6, 9, 3, 4, 8,
9, 8, 6, 3, 4, 5, 2, 7, 1,
3, 7, 4, 8, 2, 1, 6, 9, 5,
4, 2, 9, 6, 3, 8, 5, 1, 7,
8, 6, 3, 5, 1, 7, 9, 2, 4,
5, 1, 7, 4, 9, 2, 8, 3, 6,
7, 9, 5, 1, 8, 3, 4, 6, 2,
1, 4, 2, 9, 5, 6, 7, 8, 3,
6, 3, 8, 2, 7, 4, 1, 5, 9
};
int arr2 [9][9]= { 100, 5, 1, 7, 6, 9, 3, 4, 8,
9, 8, 6, 3, 4, 5, 2, 7, 1,
3, 7, 4, 8, 2, 1, 6, 9, 5,
4, 2, 9, 6, 3, 8, 5, 1, 7,
8, 6, 3, 5, 1, 7, 9, 2, 4,
5, 1, 7, 4, 9, 2, 8, 3, 6,
7, 9, 5, 1, 8, 3, 4, 6, 2,
1, 4, 2, 9, 5, 6, 7, 8, 3,
6, 3, 8, 2, 7, 4, 1, 5, 9
};
int arr3 [9][9]= { 4, 2, 9, 6, 3, 8, 5, 1, 7,
8, 6, 3, 5, 1, 7, 9, 2, 4,
5, 1, 7, 4, 9, 2, 8, 3, 6,
7, 9, 5, 1, 8, 3, 4, 6, 2,
1, 4, 2, 9, 5, 6, 7, 8, 3,
6, 3, 8, 2, 7, 4, 1, 5, 9,
2, 5, 1, 7, 6, 9, 3, 4, 8,
9, 8, 6, 3, 4, 5, 2, 7, 1,
3, 7, 4, 8, 2, 1, 6, 9, 5
};
int arr4 [9][9]= { 2, 5, 1, 7, 6, 9, 3, 4, 8,
9, 8, 6, 3, 4, 5, 2, 7, 1,
3, 7, 4, 8, 2, 1, 6, 9, 5,
4, 2, 9, 6, 3, 8, 5, 1, 7,
8, 6, 3, 5, 1, 7, 9, 2, 4,
5, 1, 7, 4, 9, 2, 8, 3, 6,
7, 9, 5, 1, 8, 3, 4, 6, 2,
1, 4, 2, 9, 5, 6, 7, 8, 3,
6, 3, 8, 2, 7, 4, 1, 9, 5,
};
int arr5 [9][9]= { 2, 5, 1, 7, 6, 9, 3, 4, 8,
9, 8, 6, 3, 4, 5, 2, 7, 1,
3, 7, 4, 8, 2, 1, 6, 9, 5,
4, 2, 9, 6, 3, 8, 5, 1, 7,
8, 6, 3, 5, 1, 7, 9, 2, 4,
5, 1, 7, 4, 9, 2, 8, 3, 6,
7, 9, 5, 1, 8, 3, 4, 6, 2,
1, 4, 2, 9, 8, 6, 7, 5, 3,
6, 3, 8, 2, 7, 4, 1, 5, 9,
};
int arr6 [9][9]= { 2, 5, 0, 7, 6, 10, 3, 4, 8,
10, 8, 6, 3, 4, 5, 2, 7, 0,
3, 7, 4, 8, 2, 0, 6, 10, 5,
4, 2, 10, 6, 3, 8, 5, 0, 7,
8, 6, 3, 5, 0, 7, 10, 2, 4,
5, 0, 7, 4, 10, 2, 8, 3, 6,
7, 10, 5, 0, 8, 3, 4, 6, 2,
0, 4, 2, 10, 5, 6, 7, 8, 3,
6, 3, 8, 2, 7, 4, 0, 5, 10,
};
int arr7 [9][9]= { 8, 1, 6, 8, 1, 6, 8, 1, 6,
3, 5, 7, 3, 5, 7, 3, 5, 7,
4, 9, 2, 4, 9, 2, 4, 9, 2,
8, 1, 6, 8, 1, 6, 8, 1, 6,
3, 5, 7, 3, 5, 7, 3, 5, 7,
4, 9, 2, 4, 9, 2, 4, 9, 2,
8, 1, 6, 8, 1, 6, 8, 1, 6,
3, 5, 7, 3, 5, 7, 3, 5, 7,
4, 9, 2, 4, 9, 2, 4, 9, 2,
};
/*printArray(arr1, rowSize,columnSize);
printArray(arr2, rowSize,columnSize);
printArray(arr3, rowSize,columnSize);
printArray(arr3, rowSize,columnSize);
printArray(arr5, rowSize,columnSize);
printArray(arr6, rowSize,columnSize);
printArray(arr7, rowSize,columnSize);*/
checkSudoku(arr1, rowSize, columnSize,0,0,totalSum);
checkSudoku(arr2, rowSize, columnSize,0,0,totalSum);
checkSudoku(arr3, rowSize, columnSize,0,0,totalSum);
checkSudoku(arr4, rowSize, columnSize,0,0,totalSum);
checkSudoku(arr5, rowSize, columnSize,0,0,totalSum);
//checkSudoku(arr6, rowSize, columnSize,0,0,totalSum);
//checkSudoku(arr7, rowSize, columnSize,0,0,totalSum);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgp2b2lkIHByaW50QXJyYXkgKGludCBhcnJbXVs5XSwgaW50IHJvd1NpemUsIGludCBjb2x1bW5TaXplKQp7CgoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93U2l6ZTsgaSsrKQogICAgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uU2l6ZTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCBhcnJbaV1bal0gPDwiICI7CiAgICAgICAgfQogICAgICAgIGNvdXQ8PGVuZGw7CiAgICB9Cgp9Cgp2b2lkIGNvbnZlcnRTdHJpbmdUb0ludCAoc3RyaW5nIGxpbmUsaW50IGFycltdWzldLCBpbnQgcm93U2l6ZSwgaW50IHdoaWNoUm93ICkKCnsKICAgIGludCBzdGVwID0gMDsKICAgIGZvcihpbnQgaT0wOyBpPCBsaW5lLmxlbmd0aCgpOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCAhaXNzcGFjZShsaW5lW2ldKSApCiAgICAgICAgewogICAgICAgICAgICBhcnJbd2hpY2hSb3cgXVtzdGVwXSA9IGxpbmVbaV0tNDg7CiAgICAgICAgICAgIC8vY291dCA8PCBhcnJbd2hpY2hSb3ddW3N0ZXBdPDwiICI7CiAgICAgICAgICAgIHN0ZXArKzsKICAgICAgICB9CgogICAgfQp9Cgpib29sIGNvbXBhcmVEaWdpdHNJbkxpbmUgKGludCBhcnJbXVs5XSwgaW50IHJvd1NpemUsIGludCBjb2x1bW5TaXplLGludCBzdGFydEF0Um93LCBpbnQgc3RhcnRBdENvbHVtbikKCnsKICAgIGJvb2wgaXNEaWZmZXJlbnQgPSB0cnVlOwoKICAgIGZvcihpbnQgaT0wOyBpIDwgcm93U2l6ZTsgaSsrKQoKICAgIHsKICAgICAgICBmb3IoaW50IGo9MDsgaiA8IGNvbHVtblNpemUtMTsgaisrKQogICAgICAgIHsKCiAgICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgY29sdW1uU2l6ZSAtIGo7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHJvd0luZGV4ID0gc3RhcnRBdFJvdytpOwogICAgICAgICAgICAgICAgaW50IGNvbEluZGV4ID0gc3RhcnRBdENvbHVtbitqOwogICAgICAgICAgICAgICAgaWYgKCBhcnJbcm93SW5kZXhdW2NvbEluZGV4XT09YXJyW3Jvd0luZGV4XVtjb2xJbmRleCtrXSB8fCBhcnJbcm93SW5kZXggXVtjb2xJbmRleF0gPCAxIHx8IGFycltyb3dJbmRleCBdW2NvbEluZGV4XSA+IDkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRGlmZmVyZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiBpc0RpZmZlcmVudDsKfQoKYm9vbCBjb21wYXJlRGlnaXRzSW5TbWFsbFNxdWFyZXMoaW50IGFycltdWzldLCBpbnQgcm93U2l6ZSwgaW50IGNvbHVtblNpemUsaW50IHN0YXJ0QXRSb3csIGludCBzdGFydEF0Q29sdW1uKQoKewogICAgYm9vbCBpc0RpZmZlcmVudCA9IHRydWU7CiAgICBpbnQgbXVsdGlwbGllciA9IHJvd1NpemUvMzsKICAgIGludCBqdW1wUm93ID0wOwogICAgaW50IGp1bXBDb2wgPSAwOwogICAgaW50IGNvbFN0YXJ0UG9zID0gMDsKICAgIGludCByb3dTdGFydFBvcyA9IDA7CiAgICBpbnQgcm93SW5keCA9IDA7CiAgICBpbnQgY29sSW5keCA9IDA7CiAgICBpbnQgcm93Um9vdEluZHggPTA7CiAgICBpbnQgY29sUm9vdEluZHggPTA7CiAgICBpbnQgaz0wLCBtPTA7CgogICAgd2hpbGUgKGp1bXBDb2wgPCBtdWx0aXBsaWVyKQogICAgewogICAgICAgIHdoaWxlIChqdW1wUm93IDwgbXVsdGlwbGllciApCiAgICAgICAgewogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTxyb3dTaXplL211bHRpcGxpZXI7IGkrKyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDxjb2x1bW5TaXplL211bHRpcGxpZXI7IGorKykKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgZm9yICggayA9IDA7IGsgPCByb3dTaXplL211bHRpcGxpZXIgLSByb3dTdGFydFBvczsgIGsrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT0wICYmIGo9PTAgJiYgaz09MCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3RhcnRQb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3RhcnRQb3MgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT0wICYmIGogPT0wICYmIGs+MCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3RhcnRQb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3RhcnRQb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT0wICYmIGo9PTEgJiYgaz09MCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3RhcnRQb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3RhcnRQb3MgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT0wICYmIGo9PTEgJiYgaz4wKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTdGFydFBvcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTAgJiYgaj09MiAmJiBrPT0wKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTdGFydFBvcyA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTAgJiYgaj09MiAmJiBrPjApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0YXJ0UG9zID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFN0YXJ0UG9zID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09MSAmJiBqPT0wICYmIGs9PTApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0YXJ0UG9zID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFN0YXJ0UG9zID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTEgJiYgaj09MCAmJiBrPjApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0YXJ0UG9zID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFN0YXJ0UG9zID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09MSAmJiBqPT0xICYmIGs9PTApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1N0YXJ0UG9zID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFN0YXJ0UG9zID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09MSAmJiBqPT0xICYmIGs+MCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3RhcnRQb3MgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3RhcnRQb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT0xICYmIGo9PTIgJiYgaz09MCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3RhcnRQb3MgPSAxOy8vYmV6IHpuYWN6ZW5pYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3RhcnRQb3MgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT0xICYmIGo9PTIgJiYgaz4wKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTdGFydFBvcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTIgJiYgaj09MCAmJiBrPT0wKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTdGFydFBvcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTIgJiYgaj09MSAmJiBrPT0wKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTdGFydFBvcyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTIgJiYgaj09MiAmJiBrPT0wKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTdGFydFBvcyA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBtID0gMDsgbSA8IGNvbHVtblNpemUvbXVsdGlwbGllciAtIGNvbFN0YXJ0UG9zOyAgbSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5keCA9IGsgKyByb3dTdGFydFBvcyArIGp1bXBSb3cqbXVsdGlwbGllcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZHggPSBtICsgY29sU3RhcnRQb3MgKyBqdW1wQ29sKm11bHRpcGxpZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dSb290SW5keCA9IGkgKyBqdW1wUm93Km11bHRpcGxpZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xSb290SW5keCA9IGogKyBqdW1wQ29sKm11bHRpcGxpZXI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhcnJbcm93Um9vdEluZHhdW2NvbFJvb3RJbmR4XT09YXJyW3Jvd0luZHhdW2NvbEluZHhdIHx8IGFycltyb3dSb290SW5keF1bY29sUm9vdEluZHhdIDwgMSB8fCBhcnJbcm93Um9vdEluZHhdW2NvbFJvb3RJbmR4XSA+IDkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRGlmZmVyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGp1bXBSb3cgKys7CiAgICAgICAgfQogICAgICAgIGp1bXBDb2wrKzsKICAgICAgICBpZiAoIGp1bXBSb3cgPT0gbXVsdGlwbGllciApCiAgICAgICAgICAgIGp1bXBSb3c9MDsKICAgIH0KCgoKICAgIHJldHVybiBpc0RpZmZlcmVudDsKfQoKCmJvb2wgY2hlY2tSb3dDb2x1bW5TdW0gKGludCBhcnJbXVs5XSwgaW50IHJvd1NpemUsIGludCBjb2x1bW5TaXplLCBpbnQgY3JpdGVyaWFGb3JUcnVlKQoKewogICAgYm9vbCB2ZXJkaWN0ID0gdHJ1ZTsKICAgIGludCBzdW0gID0gMDsKCiAgICBpbnQgaT0wLGdvQnlSb3c9MCwgZ29CeUNvbCA9IDA7CgogICAgZm9yICggaSA9IDA7IGkgPCByb3dTaXplOyBpKyspCiAgICB7CiAgICAgICAgaWYgKHZlcmRpY3QgPT0gdHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoIGdvQnlDb2wgPSAwOyBnb0J5Q29sIDwgY29sdW1uU2l6ZTsgZ29CeUNvbCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdW0rPSBhcnJbaV1bZ29CeUNvbF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdW0gIT0gY3JpdGVyaWFGb3JUcnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ZXJkaWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gdmVyZGljdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VtID0gMDsKCiAgICAgICAgICAgIGZvciAoIGdvQnlSb3cgPSAwOyBnb0J5Um93IDwgcm93U2l6ZTsgZ29CeVJvdysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdW0rPSBhcnJbZ29CeVJvd11baV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN1bSAhPSBjcml0ZXJpYUZvclRydWUpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICB2ZXJkaWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gdmVyZGljdDsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdW0gIT0gY3JpdGVyaWFGb3JUcnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ZXJkaWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gdmVyZGljdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VtID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodmVyZGljdCA9PSBmYWxzZSkKICAgICAgICAgICAgcmV0dXJuIHZlcmRpY3Q7CgogICAgfQogICAgcmV0dXJuIHZlcmRpY3Q7Cn0KCnZvaWQgY2hlY2tTdWRva3UgKGludCBhcnJbXVs5XSwgaW50IHJvd1NpemUsIGludCBjb2x1bW5TaXplLGludCBpbml0aWFsUG9zaXRpb25Gb3JSb3csIGludCBpbml0aWFsUG9zaXRpb25Gb3JDb2x1bW4sIGludCB0b3RhbFN1bUxpbWl0KQoKewogICAgYm9vbCBpc0RpZmZlcmVudCA9IHRydWU7CiAgICBib29sIGlzQ29ycmVjdCA9IHRydWU7CiAgICBib29sIGlzRGlmZmVyZW50SW5TbWFsbFNxdWFyZUNvcnJlY3QgPSB0cnVlOwoKICAgIGlzRGlmZmVyZW50SW5TbWFsbFNxdWFyZUNvcnJlY3QgPSBjb21wYXJlRGlnaXRzSW5TbWFsbFNxdWFyZXMoYXJyLCByb3dTaXplLCBjb2x1bW5TaXplLGluaXRpYWxQb3NpdGlvbkZvclJvdyxpbml0aWFsUG9zaXRpb25Gb3JDb2x1bW4pOwogICAgaXNEaWZmZXJlbnQgPSBjb21wYXJlRGlnaXRzSW5MaW5lKGFyciwgcm93U2l6ZSwgY29sdW1uU2l6ZSxpbml0aWFsUG9zaXRpb25Gb3JSb3csaW5pdGlhbFBvc2l0aW9uRm9yQ29sdW1uKTsKICAgIGlzQ29ycmVjdCA9IGNoZWNrUm93Q29sdW1uU3VtKGFycixyb3dTaXplLGNvbHVtblNpemUsIHRvdGFsU3VtTGltaXQpOwoKCiAgICBpZiAoaXNEaWZmZXJlbnQgPT0gdHJ1ZSAmJiBpc0NvcnJlY3QgPT0gdHJ1ZSAmJiBpc0RpZmZlcmVudEluU21hbGxTcXVhcmVDb3JyZWN0ID09IHRydWUgICkKICAgIHsKICAgICAgICBjb3V0PDwiVEFLIjw8ZW5kbDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBjb3V0PDwiTklFIjw8ZW5kbDsKICAgIH0KCn0KCgoKCgppbnQgbWFpbigpCnsKICAgIGludCByb3dTaXplID0gOTsKICAgIGludCBjb2x1bW5TaXplID0gOTsKICAgIGludCB0b3RhbFN1bSA9IDQ1OyAvLyBTdW1hIHcgbGluaWkgb2QgMSBkbyA5IHphd3N6ZSB3eW5vc2kgNDUgLSBrcnl0ZXJpdW0gcHJhd2R5IHVsb3plbmlhIGxpY3piIHcgU3Vkb2t1CgoKICAgIGludCBhcnIxIFs5XVs5XT0geyAyLCA1LCAxLCA3LCA2LCA5LCAzLCA0LCA4LAogICAgICAgICAgICAgICAgICAgICAgIDksIDgsIDYsIDMsIDQsIDUsIDIsIDcsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgMywgNywgNCwgOCwgMiwgMSwgNiwgOSwgNSwKICAgICAgICAgICAgICAgICAgICAgICA0LCAyLCA5LCA2LCAzLCA4LCA1LCAxLCA3LAogICAgICAgICAgICAgICAgICAgICAgIDgsIDYsIDMsIDUsIDEsIDcsIDksIDIsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgNSwgMSwgNywgNCwgOSwgMiwgOCwgMywgNiwKICAgICAgICAgICAgICAgICAgICAgICA3LCA5LCA1LCAxLCA4LCAzLCA0LCA2LCAyLAogICAgICAgICAgICAgICAgICAgICAgIDEsIDQsIDIsIDksIDUsIDYsIDcsIDgsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgNiwgMywgOCwgMiwgNywgNCwgMSwgNSwgOQogICAgICAgICAgICAgICAgICAgICB9OwoKICAgIGludCBhcnIyIFs5XVs5XT0geyAxMDAsIDUsIDEsIDcsIDYsIDksIDMsIDQsIDgsCiAgICAgICAgICAgICAgICAgICAgICAgOSwgOCwgNiwgMywgNCwgNSwgMiwgNywgMSwKICAgICAgICAgICAgICAgICAgICAgICAzLCA3LCA0LCA4LCAyLCAxLCA2LCA5LCA1LAogICAgICAgICAgICAgICAgICAgICAgIDQsIDIsIDksIDYsIDMsIDgsIDUsIDEsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgOCwgNiwgMywgNSwgMSwgNywgOSwgMiwgNCwKICAgICAgICAgICAgICAgICAgICAgICA1LCAxLCA3LCA0LCA5LCAyLCA4LCAzLCA2LAogICAgICAgICAgICAgICAgICAgICAgIDcsIDksIDUsIDEsIDgsIDMsIDQsIDYsIDIsCiAgICAgICAgICAgICAgICAgICAgICAgMSwgNCwgMiwgOSwgNSwgNiwgNywgOCwgMywKICAgICAgICAgICAgICAgICAgICAgICA2LCAzLCA4LCAyLCA3LCA0LCAxLCA1LCA5CiAgICAgICAgICAgICAgICAgICAgIH07CgogICAgaW50IGFycjMgWzldWzldPSB7IDQsIDIsIDksIDYsIDMsIDgsIDUsIDEsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgOCwgNiwgMywgNSwgMSwgNywgOSwgMiwgNCwKICAgICAgICAgICAgICAgICAgICAgICA1LCAxLCA3LCA0LCA5LCAyLCA4LCAzLCA2LAogICAgICAgICAgICAgICAgICAgICAgIDcsIDksIDUsIDEsIDgsIDMsIDQsIDYsIDIsCiAgICAgICAgICAgICAgICAgICAgICAgMSwgNCwgMiwgOSwgNSwgNiwgNywgOCwgMywKICAgICAgICAgICAgICAgICAgICAgICA2LCAzLCA4LCAyLCA3LCA0LCAxLCA1LCA5LAogICAgICAgICAgICAgICAgICAgICAgIDIsIDUsIDEsIDcsIDYsIDksIDMsIDQsIDgsCiAgICAgICAgICAgICAgICAgICAgICAgOSwgOCwgNiwgMywgNCwgNSwgMiwgNywgMSwKICAgICAgICAgICAgICAgICAgICAgICAzLCA3LCA0LCA4LCAyLCAxLCA2LCA5LCA1CiAgICAgICAgICAgICAgICAgICAgIH07CgogICAgaW50IGFycjQgWzldWzldPSB7IDIsIDUsIDEsIDcsIDYsIDksIDMsIDQsIDgsCiAgICAgICAgICAgICAgICAgICAgICAgOSwgOCwgNiwgMywgNCwgNSwgMiwgNywgMSwKICAgICAgICAgICAgICAgICAgICAgICAzLCA3LCA0LCA4LCAyLCAxLCA2LCA5LCA1LAogICAgICAgICAgICAgICAgICAgICAgIDQsIDIsIDksIDYsIDMsIDgsIDUsIDEsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgOCwgNiwgMywgNSwgMSwgNywgOSwgMiwgNCwKICAgICAgICAgICAgICAgICAgICAgICA1LCAxLCA3LCA0LCA5LCAyLCA4LCAzLCA2LAogICAgICAgICAgICAgICAgICAgICAgIDcsIDksIDUsIDEsIDgsIDMsIDQsIDYsIDIsCiAgICAgICAgICAgICAgICAgICAgICAgMSwgNCwgMiwgOSwgNSwgNiwgNywgOCwgMywKICAgICAgICAgICAgICAgICAgICAgICA2LCAzLCA4LCAyLCA3LCA0LCAxLCA5LCA1LAogICAgICAgICAgICAgICAgICAgICB9OwoKICAgIGludCBhcnI1IFs5XVs5XT0geyAyLCA1LCAxLCA3LCA2LCA5LCAzLCA0LCA4LAogICAgICAgICAgICAgICAgICAgICAgIDksIDgsIDYsIDMsIDQsIDUsIDIsIDcsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgMywgNywgNCwgOCwgMiwgMSwgNiwgOSwgNSwKICAgICAgICAgICAgICAgICAgICAgICA0LCAyLCA5LCA2LCAzLCA4LCA1LCAxLCA3LAogICAgICAgICAgICAgICAgICAgICAgIDgsIDYsIDMsIDUsIDEsIDcsIDksIDIsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgNSwgMSwgNywgNCwgOSwgMiwgOCwgMywgNiwKICAgICAgICAgICAgICAgICAgICAgICA3LCA5LCA1LCAxLCA4LCAzLCA0LCA2LCAyLAogICAgICAgICAgICAgICAgICAgICAgIDEsIDQsIDIsIDksIDgsIDYsIDcsIDUsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgNiwgMywgOCwgMiwgNywgNCwgMSwgNSwgOSwKICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICBpbnQgYXJyNiBbOV1bOV09IHsgMiwgNSwgMCwgNywgNiwgMTAsIDMsIDQsIDgsCiAgICAgICAgICAgICAgICAgICAgICAgMTAsIDgsIDYsIDMsIDQsIDUsIDIsIDcsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgMywgNywgNCwgOCwgMiwgMCwgNiwgMTAsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgNCwgMiwgMTAsIDYsIDMsIDgsIDUsIDAsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgOCwgNiwgMywgNSwgMCwgNywgMTAsIDIsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgNywgNCwgMTAsIDIsIDgsIDMsIDYsCiAgICAgICAgICAgICAgICAgICAgICAgNywgMTAsIDUsIDAsIDgsIDMsIDQsIDYsIDIsCiAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgMiwgMTAsIDUsIDYsIDcsIDgsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgNiwgMywgOCwgMiwgNywgNCwgMCwgNSwgMTAsCiAgICAgICAgICAgICAgICAgICAgIH07CgoKICAgIGludCBhcnI3IFs5XVs5XT0geyA4LCAxLCA2LCA4LCAxLCA2LCA4LCAxLCA2LAogICAgICAgICAgICAgICAgICAgICAgIDMsIDUsIDcsIDMsIDUsIDcsIDMsIDUsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgNCwgOSwgMiwgNCwgOSwgMiwgNCwgOSwgMiwKICAgICAgICAgICAgICAgICAgICAgICA4LCAxLCA2LCA4LCAxLCA2LCA4LCAxLCA2LAogICAgICAgICAgICAgICAgICAgICAgIDMsIDUsIDcsIDMsIDUsIDcsIDMsIDUsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgNCwgOSwgMiwgNCwgOSwgMiwgNCwgOSwgMiwKICAgICAgICAgICAgICAgICAgICAgICA4LCAxLCA2LCA4LCAxLCA2LCA4LCAxLCA2LAogICAgICAgICAgICAgICAgICAgICAgIDMsIDUsIDcsIDMsIDUsIDcsIDMsIDUsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgNCwgOSwgMiwgNCwgOSwgMiwgNCwgOSwgMiwKICAgICAgICAgICAgICAgICAgICAgfTsKCgoKICAgIC8qcHJpbnRBcnJheShhcnIxLCByb3dTaXplLGNvbHVtblNpemUpOwogICAgcHJpbnRBcnJheShhcnIyLCByb3dTaXplLGNvbHVtblNpemUpOwogICAgcHJpbnRBcnJheShhcnIzLCByb3dTaXplLGNvbHVtblNpemUpOwogICAgcHJpbnRBcnJheShhcnIzLCByb3dTaXplLGNvbHVtblNpemUpOwogICAgcHJpbnRBcnJheShhcnI1LCByb3dTaXplLGNvbHVtblNpemUpOwogICAgcHJpbnRBcnJheShhcnI2LCByb3dTaXplLGNvbHVtblNpemUpOwogICAgcHJpbnRBcnJheShhcnI3LCByb3dTaXplLGNvbHVtblNpemUpOyovCgogICAgY2hlY2tTdWRva3UoYXJyMSwgcm93U2l6ZSwgY29sdW1uU2l6ZSwwLDAsdG90YWxTdW0pOwogICAgY2hlY2tTdWRva3UoYXJyMiwgcm93U2l6ZSwgY29sdW1uU2l6ZSwwLDAsdG90YWxTdW0pOwogICAgY2hlY2tTdWRva3UoYXJyMywgcm93U2l6ZSwgY29sdW1uU2l6ZSwwLDAsdG90YWxTdW0pOwogICAgY2hlY2tTdWRva3UoYXJyNCwgcm93U2l6ZSwgY29sdW1uU2l6ZSwwLDAsdG90YWxTdW0pOwogICAgY2hlY2tTdWRva3UoYXJyNSwgcm93U2l6ZSwgY29sdW1uU2l6ZSwwLDAsdG90YWxTdW0pOwogICAgLy9jaGVja1N1ZG9rdShhcnI2LCByb3dTaXplLCBjb2x1bW5TaXplLDAsMCx0b3RhbFN1bSk7CiAgICAvL2NoZWNrU3Vkb2t1KGFycjcsIHJvd1NpemUsIGNvbHVtblNpemUsMCwwLHRvdGFsU3VtKTsKCgogICAgcmV0dXJuIDA7Cn0K