/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* sudoku.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jyeo <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/08/12 16:18:46 by jyeo #+# #+# */
/* Updated: 2017/08/12 18:43:01 by mhernand ### ########.fr */
/* */
/* ************************************************************************** */
/******************************************************************************/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int ft_solver(char **argv, char **copy, int row, int col);
int ft_fill_number(char **argv, char **copy, int row, int col);
int ft_putchar(char c)
{
write(1, &c, 1);
return (0);
}
void ft_print_sudoku(int argc, char **argv)
{
int i;
int j;
i = 1;
j = 0;
while (i < argc)
{
while (argv[i][j])
{
ft_putchar(argv[i][j]);
ft_putchar(' ');
j++;
}
ft_putchar('\n');
j = 0;
i++;
}
}
int ft_check_number(char *str)
{
int i;
i = 0;
while (str[i] != '\0')
{
if((str[i] < '0' || str[i] > '9') && (str[i] != '.'))
return (0);
i++;
}
if (i != 9)
return(0);
return (1);
}
/******************************************************************************/
char **ft_copy(char **args)
{
int i;
int j;
char **board;
i = 0;
j = 0;
board
= malloc(sizeof(char*) * 10); while (i < 10)
{
board
[i
] = malloc(sizeof(char) * 9); while (j < 9)
{
board[i][j] = args[i][j];
j++;
}
i++;
j = 0;
}
return (board);
}
void free_copy(int **sud)
{
int i;
int j;
i = 0;
j = 0;
while (i < 9)
{
sud[i] = NULL;
i++;
}
sud = NULL;
}
void free_argv(char **sud)
{
int i;
int j;
i = 0;
j = 0;
while (i < 10)
{
//sud[i] = NULL;
i++;
}
//sud = NULL;
}
//char ft_strcpy(char **dest, char **src, int size)
//{
// int i;
// int j;
//
// i = 0;
// j = 0;
//
// while (i < size)
// {
// while (src[i][j] != '\0')
// {
// dest[i][j] = src[i][j];
// j++;
// }
// dest[i][j] = '\0';
// i++;
// }
// return (**dest);
//}
/******************************************************************************/
//int is_used(int a, int b)
//{
// if (a == b)
// return (0);
// else
// return (1);
//}
//
//int *ft_fill_row(char *str)
//{
// int i;
// int j;
// int k;
//
// i = 0;
// while (str[i] != '\0')
// {
// if(str[i] == '.')
// {
// j = 1;
// k = 0;
// while (j < 10)
// {
// if(is_used(str[k], j) == 0)
// {
// j
// }
// }
// }
// i++;
// }
//}
/******************************************************************************/
int ft_row_col(char **copy, int row, int col, int nb)
{
int i;
i = 0;
while (i < 9)
{
if (copy[row][i] == (nb + 48))
return (0);
if (copy[i][col] == (nb + 48))
return (0);
i++;
}
return (1);
}
/******************************************************************************/
int ft_grid(char **copy, int row, int col, int nb)
{
int sr;
int sc;
sr = ((row / 3) * 3) + 1;
while (sr < ((row / 3) * 3 + 4))
{
sc = (col / 3) * 3;
while (sc < ((col / 3) * 3 + 3))
{
if (copy[sr][sc] == (nb + 48))
return (0);
sc++;
}
sr++;
}
return (1);
}
/******************************************************************************/
int ft_backtrack(char **argv, char **copy, int row, int col)
{
int nb;
nb = (copy[row][col] - 48);
printf("code stop at argv row : %d col : %d\n", row
, col
); printf("code stop at argv : %d copy : %d nb : %d\n\n", argv
[row
][col
] - 48, copy
[row
][col
] -48, nb
); while (nb < 10)
{
if (ft_row_col(copy, row, col, nb) && ft_grid(copy, row, col, nb)
&& copy[row][col] != nb)
{
//printf("code stop at argv : %d copy : %d \n", argv[row][col], copy[row][col]);
copy[row][col] = nb + 48;
//free_argv(copy);
//copy = NULL;
return ft_fill_number(argv, copy, row , col +1);
}
nb++;
}
if (nb == 10)
{
copy[row][col] = '.';
//free(copy);
//printf("code stop at argv row : %d col : %d\n", row, col);
//printf("code stop at argv : %d copy : %d nb : %d\n\n", argv[row][col] - 48, copy[row][col] -48, nb);
if(col == 0)
{
ft_backtrack(argv, copy, row - 1, col +8);
}
else
{
ft_backtrack(argv, copy, row , col - 1);
}
}
return (0);
}
/******************************************************************************/
int ft_fill_number(char **argv, char **copy, int row, int col)
{
int nb;
nb = 1;
while (nb < 10)
{
//printf("code stop at argv : %d copy : %d nb : %d\n", argv[row][col], copy[row][col], nb);
if (ft_row_col(copy, row, col, nb) && ft_grid(copy, row, col, nb)
&& argv[row][col] != nb)
{
//printf("code stop at argv : %d copy : %d \n", argv[row][col], copy[row][col]);
copy[row][col] = nb + 48;
return ft_solver(argv, copy, row , col +1);
}
nb++;
}
if (nb == 10)
{
if(col == 0)
{
ft_backtrack(argv, copy, row - 1, col +8);
}
else
{
ft_backtrack(argv, copy, row , col - 1);
}
}
return (0);
}
/******************************************************************************/
int ft_solver(char **argv, char **copy, int row, int col)
{
if (row < 10 && col < 10)
{
if (copy[row][col] != '.')
{
if ((col + 1) < 10)
{
return ft_solver(argv, copy, row, col + 1);
}
else if ((row + 1) < 11)
{
return ft_solver(argv, copy, row + 1 , 0);
}
}
else
{
return ft_fill_number(argv, copy, row, col);
}
}
printf("code stop at row : %d col : %d \n", row
, col
); return (1);
return (**copy);
}
/******************************************************************************/
int main(int argc, char **argv)
{
int i;
char **copy;
i = 1;
if(argc != 10)
{
return (0);
}
else
{
while (i < argc)
{
if(ft_check_number(argv[i]) == 0)
{
//printf("%s i'm the problem \n", argv[i]);
//printf("i'm inside here");
return (0);
}
i++;
}
}
copy = ft_copy(argv);
**argv = ft_solver(argv, copy, 1, 0);
ft_print_sudoku(argc, copy);
return (0);
}
LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6OiAgICAgIDo6Ojo6Ojo6ICAgKi8KLyogICBzdWRva3UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6KzogICAgICA6KzogICAgOis6ICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzorICs6KyAgICAgICAgICs6KyAgICAgKi8KLyogICBCeToganllbyA8bWFydmluQDQyLmZyPiAgICAgICAgICAgICAgICAgICAgICAgICsjKyAgKzorICAgICAgICsjKyAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIysjKyMrIysjKyAgICsjKyAgICAgICAgICAgKi8KLyogICBDcmVhdGVkOiAyMDE3LzA4LzEyIDE2OjE4OjQ2IGJ5IGp5ZW8gICAgICAgICAgICAgICMrIyAgICAjKyMgICAgICAgICAgICAgKi8KLyogICBVcGRhdGVkOiAyMDE3LzA4LzEyIDE4OjQzOjAxIGJ5IG1oZXJuYW5kICAgICAgICAgIyMjICAgIyMjIyMjIyMuZnIgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCAgICAgZnRfc29sdmVyKGNoYXIgKiphcmd2LCBjaGFyICoqY29weSwgaW50IHJvdywgaW50IGNvbCk7CmludCAgICAgZnRfZmlsbF9udW1iZXIoY2hhciAqKmFyZ3YsIGNoYXIgKipjb3B5LCBpbnQgcm93LCBpbnQgY29sKTsKCmludAkJZnRfcHV0Y2hhcihjaGFyIGMpCnsKICAgIHdyaXRlKDEsICZjLCAxKTsKICAgIHJldHVybiAoMCk7Cn0KCnZvaWQgICAgZnRfcHJpbnRfc3Vkb2t1KGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IGk7CiAgICBpbnQgajsKCiAgICBpID0gMTsKICAgIGogPSAwOwogICAgd2hpbGUgKGkgPCBhcmdjKQogICAgewogICAgICAgIHdoaWxlIChhcmd2W2ldW2pdKQogICAgICAgIHsKICAgICAgICAgICAgZnRfcHV0Y2hhcihhcmd2W2ldW2pdKTsKICAgICAgICAgICAgZnRfcHV0Y2hhcignICcpOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGZ0X3B1dGNoYXIoJ1xuJyk7CiAgICAgICAgaiA9IDA7CiAgICAgICAgaSsrOwogICAgfQp9CgppbnQgICAgIGZ0X2NoZWNrX251bWJlcihjaGFyICpzdHIpCnsKICAgIGludCBpOwogICAgCiAgICBpID0gMDsKICAgIHdoaWxlIChzdHJbaV0gIT0gJ1wwJykKICAgIHsKICAgICAgICBpZigoc3RyW2ldIDwgJzAnIHx8IHN0cltpXSA+ICc5JykgJiYgKHN0cltpXSAhPSAnLicpKQogICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgIGkrKzsKICAgIH0KICAgIGlmIChpICE9IDkpCiAgICAgICAgcmV0dXJuKDApOwogICAgcmV0dXJuICgxKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KY2hhcgkJKipmdF9jb3B5KGNoYXIgKiphcmdzKQp7CiAgICBpbnQJaTsKICAgIGludAlqOwogICAgY2hhcgkqKmJvYXJkOwogICAgCiAgICBpID0gMDsKICAgIGogPSAwOwogICAgYm9hcmQgPSBtYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIDEwKTsKICAgIHdoaWxlIChpIDwgMTApCiAgICB7CiAgICAgICAgYm9hcmRbaV0gPSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogOSk7CiAgICAgICAgd2hpbGUgKGogPCA5KQogICAgICAgIHsKICAgICAgICAgICAgYm9hcmRbaV1bal0gPSBhcmdzW2ldW2pdOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgICBqID0gMDsKICAgIH0KICAgIHJldHVybiAoYm9hcmQpOwp9Cgp2b2lkCWZyZWVfY29weShpbnQgKipzdWQpCnsKICAgIGludAlpOwogICAgaW50CWo7CiAgICAKICAgIGkgPSAwOwogICAgaiA9IDA7CiAgICB3aGlsZSAoaSA8IDkpCiAgICB7CiAgICAgICAgZnJlZShzdWRbaV0pOwogICAgICAgIHN1ZFtpXSA9IE5VTEw7CiAgICAgICAgaSsrOwogICAgfQogICAgZnJlZShzdWQpOwogICAgc3VkID0gTlVMTDsKfQoKdm9pZAlmcmVlX2FyZ3YoY2hhciAqKnN1ZCkKewogICAgaW50CWk7CiAgICBpbnQJajsKICAgIAogICAgaSA9IDA7CiAgICBqID0gMDsKICAgIHdoaWxlIChpIDwgMTApCiAgICB7CiAgICAgICAgZnJlZShzdWRbaV0pOwogICAgICAgIC8vc3VkW2ldID0gTlVMTDsKICAgICAgICBpKys7CiAgICB9CiAgICBmcmVlKHN1ZCk7CiAgICAvL3N1ZCA9IE5VTEw7Cn0KCi8vY2hhciAgICBmdF9zdHJjcHkoY2hhciAqKmRlc3QsIGNoYXIgKipzcmMsIGludCBzaXplKQovL3sKLy8gICAgaW50IGk7Ci8vICAgIGludCBqOwovLyAgICAKLy8gICAgaSA9IDA7Ci8vICAgIGogPSAwOwovLyAgICAKLy8gICAgd2hpbGUgKGkgPCBzaXplKQovLyAgICB7Ci8vICAgICAgICB3aGlsZSAoc3JjW2ldW2pdICE9ICdcMCcpCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgZGVzdFtpXVtqXSA9IHNyY1tpXVtqXTsKLy8gICAgICAgICAgICBqKys7Ci8vICAgICAgICB9Ci8vICAgICAgICBkZXN0W2ldW2pdID0gJ1wwJzsKLy8gICAgICAgIGkrKzsKLy8gICAgfQovLyAgICByZXR1cm4gKCoqZGVzdCk7Ci8vfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovL2ludCAgICAgaXNfdXNlZChpbnQgYSwgaW50IGIpCi8vewovLyAgICBpZiAoYSA9PSBiKQovLyAgICAgICAgcmV0dXJuICgwKTsKLy8gICAgZWxzZQovLyAgICAgICAgcmV0dXJuICgxKTsKLy99Ci8vCi8vaW50ICAgICAqZnRfZmlsbF9yb3coY2hhciAqc3RyKQovL3sKLy8gICAgaW50IGk7Ci8vICAgIGludCBqOwovLyAgICBpbnQgazsKLy8gICAgCi8vICAgIGkgPSAwOwovLyAgICB3aGlsZSAoc3RyW2ldICE9ICdcMCcpCi8vICAgIHsKLy8gICAgICAgIGlmKHN0cltpXSA9PSAnLicpCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgaiA9IDE7Ci8vICAgICAgICAgICAgayA9IDA7Ci8vICAgICAgICAgICAgd2hpbGUgKGogPCAxMCkKLy8gICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgIGlmKGlzX3VzZWQoc3RyW2tdLCBqKSA9PSAwKQovLyAgICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgICBqCi8vICAgICAgICAgICAgICAgIH0KLy8gICAgICAgICAgICB9Ci8vICAgICAgICB9Ci8vICAgICAgICBpKys7Ci8vICAgIH0KLy99Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQgICAgIGZ0X3Jvd19jb2woY2hhciAqKmNvcHksIGludCByb3csIGludCBjb2wsIGludCBuYikKewogICAgaW50IGk7CiAgICAKICAgIGkgPSAwOwogICAgd2hpbGUgKGkgPCA5KQogICAgewogICAgICAgIGlmIChjb3B5W3Jvd11baV0gPT0gKG5iICsgNDgpKQogICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgIGlmIChjb3B5W2ldW2NvbF0gPT0gKG5iICsgNDgpKQogICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybiAoMSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQgICAgIGZ0X2dyaWQoY2hhciAqKmNvcHksIGludCByb3csIGludCBjb2wsIGludCBuYikKewogICAgaW50IHNyOwogICAgaW50IHNjOwogICAgCiAgICBzciA9ICgocm93IC8gMykgKiAzKSArIDE7CiAgICB3aGlsZSAoc3IgPCAoKHJvdyAvIDMpICogMyArIDQpKQogICAgewogICAgICAgIHNjID0gKGNvbCAvIDMpICogMzsKICAgICAgICB3aGlsZSAoc2MgPCAoKGNvbCAvIDMpICogMyArIDMpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNvcHlbc3JdW3NjXSA9PSAobmIgKyA0OCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgICAgICBzYysrOwogICAgICAgIH0KICAgICAgICBzcisrOwogICAgfQogICAgcmV0dXJuICgxKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50ICAgICBmdF9iYWNrdHJhY2soY2hhciAqKmFyZ3YsIGNoYXIgKipjb3B5LCBpbnQgcm93LCBpbnQgY29sKQp7CiAgICBpbnQgbmI7CiAgICAKICAgIG5iID0gKGNvcHlbcm93XVtjb2xdIC0gNDgpOwogICAgcHJpbnRmKCJjb2RlIHN0b3AgYXQgYXJndiByb3cgOiAlZCBjb2wgOiAlZFxuIiwgcm93LCBjb2wpOwogICAgcHJpbnRmKCJjb2RlIHN0b3AgYXQgYXJndiA6ICVkIGNvcHkgOiAlZCBuYiA6ICVkXG5cbiIsIGFyZ3Zbcm93XVtjb2xdIC0gNDgsIGNvcHlbcm93XVtjb2xdIC00OCwgbmIpOwogICAgd2hpbGUgKG5iIDwgMTApCiAgICB7CiAgICAgICAgCiAgICAgICAgaWYgKGZ0X3Jvd19jb2woY29weSwgcm93LCBjb2wsIG5iKSAmJiBmdF9ncmlkKGNvcHksIHJvdywgY29sLCBuYikKICAgICAgICAgICAgJiYgY29weVtyb3ddW2NvbF0gIT0gbmIpCiAgICAgICAgewogICAgICAgICAgICAvL3ByaW50ZigiY29kZSBzdG9wIGF0IGFyZ3YgOiAlZCBjb3B5IDogJWQgXG4iLCBhcmd2W3Jvd11bY29sXSwgY29weVtyb3ddW2NvbF0pOwogICAgICAgICAgICBjb3B5W3Jvd11bY29sXSA9IG5iICsgNDg7CiAgICAgICAgICAgIC8vZnJlZV9hcmd2KGNvcHkpOwogICAgICAgICAgICAvL2NvcHkgPSBOVUxMOwogICAgICAgICAgICByZXR1cm4gZnRfZmlsbF9udW1iZXIoYXJndiwgY29weSwgcm93ICwgY29sICsxKTsKICAgICAgICB9CiAgICAgICAgbmIrKzsKICAgIH0KICAgIGlmIChuYiA9PSAxMCkKICAgIHsKICAgICAgICBjb3B5W3Jvd11bY29sXSA9ICcuJzsKICAgICAgICAvL2ZyZWUoY29weSk7CiAgICAgICAgLy9wcmludGYoImNvZGUgc3RvcCBhdCBhcmd2IHJvdyA6ICVkIGNvbCA6ICVkXG4iLCByb3csIGNvbCk7CiAgICAgICAgLy9wcmludGYoImNvZGUgc3RvcCBhdCBhcmd2IDogJWQgY29weSA6ICVkIG5iIDogJWRcblxuIiwgYXJndltyb3ddW2NvbF0gLSA0OCwgY29weVtyb3ddW2NvbF0gLTQ4LCBuYik7CiAgICAgICAgaWYoY29sID09IDApCiAgICAgICAgewogICAgICAgICAgICBmdF9iYWNrdHJhY2soYXJndiwgY29weSwgcm93IC0gMSwgY29sICs4KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZnRfYmFja3RyYWNrKGFyZ3YsIGNvcHksIHJvdyAsIGNvbCAtIDEpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50ICAgICBmdF9maWxsX251bWJlcihjaGFyICoqYXJndiwgY2hhciAqKmNvcHksIGludCByb3csIGludCBjb2wpCnsKICAgIGludCBuYjsKICAgIAogICAgbmIgPSAxOwogICAgd2hpbGUgKG5iIDwgMTApCiAgICB7CiAgICAgICAgLy9wcmludGYoImNvZGUgc3RvcCBhdCBhcmd2IDogJWQgY29weSA6ICVkIG5iIDogJWRcbiIsIGFyZ3Zbcm93XVtjb2xdLCBjb3B5W3Jvd11bY29sXSwgbmIpOwogICAgICAgIGlmIChmdF9yb3dfY29sKGNvcHksIHJvdywgY29sLCBuYikgJiYgZnRfZ3JpZChjb3B5LCByb3csIGNvbCwgbmIpCiAgICAgICAgICAgICYmIGFyZ3Zbcm93XVtjb2xdICE9IG5iKQogICAgICAgIHsKICAgICAgICAgICAgLy9wcmludGYoImNvZGUgc3RvcCBhdCBhcmd2IDogJWQgY29weSA6ICVkIFxuIiwgYXJndltyb3ddW2NvbF0sIGNvcHlbcm93XVtjb2xdKTsKICAgICAgICAgICAgY29weVtyb3ddW2NvbF0gPSBuYiArIDQ4OwogICAgICAgICAgICByZXR1cm4gZnRfc29sdmVyKGFyZ3YsIGNvcHksIHJvdyAsIGNvbCArMSk7CiAgICAgICAgfQogICAgICAgIG5iKys7CiAgICB9CiAgICBpZiAobmIgPT0gMTApCiAgICB7CiAgICAgICAgaWYoY29sID09IDApCiAgICAgICAgewogICAgICAgICAgICBmdF9iYWNrdHJhY2soYXJndiwgY29weSwgcm93IC0gMSwgY29sICs4KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZnRfYmFja3RyYWNrKGFyZ3YsIGNvcHksIHJvdyAsIGNvbCAtIDEpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCAgICAgZnRfc29sdmVyKGNoYXIgKiphcmd2LCBjaGFyICoqY29weSwgaW50IHJvdywgaW50IGNvbCkKewogICAgCiAgICBpZiAocm93IDwgMTAgJiYgY29sIDwgMTApCiAgICB7CiAgICAgICAgaWYgKGNvcHlbcm93XVtjb2xdICE9ICcuJykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoY29sICsgMSkgPCAxMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ0X3NvbHZlcihhcmd2LCBjb3B5LCByb3csIGNvbCArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgICgocm93ICsgMSkgPCAxMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ0X3NvbHZlcihhcmd2LCBjb3B5LCByb3cgKyAxICwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ0X2ZpbGxfbnVtYmVyKGFyZ3YsIGNvcHksIHJvdywgY29sKTsKICAgICAgICB9CiAgICB9CiAgICBwcmludGYoImNvZGUgc3RvcCBhdCByb3cgOiAlZCBjb2wgOiAlZCBcbiIsIHJvdywgY29sKTsKICAgIHJldHVybiAoMSk7CiAgICByZXR1cm4gKCoqY29weSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CQltYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IGk7CiAgICBjaGFyICoqY29weTsKICAgIAogICAgaSA9IDE7CiAgICBpZihhcmdjICE9IDEwKQogICAgewogICAgICAgIHJldHVybiAoMCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgd2hpbGUgKGkgPCBhcmdjKQogICAgICAgIHsKICAgICAgICAgICAgaWYoZnRfY2hlY2tfbnVtYmVyKGFyZ3ZbaV0pID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlcyBpJ20gdGhlIHByb2JsZW0gXG4iLCBhcmd2W2ldKTsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJpJ20gaW5zaWRlIGhlcmUiKTsKICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgIH0KICAgIGNvcHkgPSBmdF9jb3B5KGFyZ3YpOwogICAgKiphcmd2ID0gZnRfc29sdmVyKGFyZ3YsIGNvcHksIDEsIDApOwogICAgZnRfcHJpbnRfc3Vkb2t1KGFyZ2MsIGNvcHkpOwogICAgcmV0dXJuICgwKTsKfQo=