Alexandre Mulatinho alex@mulatinho.net [shell-script]
2016-08-17 20:15:26 UTC
Bom, incitado pelo Júlio fiz rapidamente um desafio que considero fácil
porém envolve uma complexidade de coisas (ifs, whiles, fors, manipulação de
entrada e saÃda) que um iniciante pode achar complexo; Joguei lá no meu
blog e colei aqui na Ãntegra.
P.S.: Não sou nenhum mestre do Shell e também não ficarei decepcionado se
ninguém responder ou simplesmente não gostar do desafio, crÃticas são
válidas desde que construtivas! :-D
*DESAFIO*
Fonte: https://alex.mulatinho.net/2016/08/17/desafio-shell-script-001/
Dona Fernanda resolveu casar-se com Carlos, o padre porém disse que os
noivos não poderiam escolher a data de casamento devido a grande quantidade
de solicitações na igreja. Vários noivos também estavam ansiosos para saber
quando poderiam se casar naquela linda igreja, para dizer a cada casal o
dia exato em que eles poderiam se casar o padre solicitou que eles
fornecessem de 1 até 5 dias no mês de sua preferência e desenvolveu um
algoritmo que ajudaria a resolver este impasse de forma aleatória e justa
agora e no futuro, ele definiu:
- *T* â quantidade de casamentos na fila
- *M* â mês do casamento
- *N* â quantidade de dias do mês disponÃvel
- *Vx* â Valor do dia na posição X (V1, V2, V3âŠ)
*ENTRADA VÃLIDA*
TN V1 V2 V3 ⊠VxM
*POR EXEMPLO*
55 2 7 5 8 145 2 4 14 8 151 403 2 7 92
*RESTRIÃÃES*
*T > 0 && T <= 20M >= 1 && M <= 12N > 0 && N <= 5V > 1 && V < 32 *
- - O dia a ser escolhido deve ser o menor do grupo
- - Caso um casal tenha selecionado um dia já escolhido por outro ele
ficará com o próximo dia possÃvel, se houver (por exemplo, *A* = 4 = {
1, 3, 4, 6 } se os dias *1, 3 e 4* já tiverem sido escolhidos, o casal
poderá tentar o próximo item, o quarto número, o dia *6*)
- - Em caso de não haver outro dia disponÃvel para o casal deverá ser
escrito:
-
- âO casal número *N* só pode casar no próximo mês pois já tem um
casal no dia *Vx* :(â
- - Em caso de violação de restrição deverá ser escrito
- - âPadre, foi encontrado uma inconsistência nos dados.â
*RESPOSTA VÃLIDA / SAÃDA VÃLIDA*
Padre, são 5 Casamentos em FevereiroO casal número 1 ficou de casar no
dia 2 de FevereiroO casal número 2 ficou de casar no dia 4 de
FevereiroO casal número 3 só pode casar no próximo mês pois já tem um
casal no dia 4[image: ðŠ]Padre, foi encontrado uma inconsistência nos
dados.O casal número 5 ficou de casar no dia 7 de Fevereiro
*EXPLICAÃÃO DA SAÃDA*
*âPadre, são 5 casamentos em Fevereiroâ* é o número *T* de casamentos de
entrada e o mês *M* da entrada
*âO casal número 1 ficou de casar no dia 2 de Fevereiroâ*é o primeiro casal
que tem os dias N = {2, 7, 5, 8, 14} disponÃveis e o menor possÃvel é o dia
2 de Fevereiro
*âO casal número 2 ficou de casar no dia 4 de Fevereiroâ* é o segundo casal
que tem os dias N = {2, 4, 14, 8, 15} disponÃveise o menor possÃvel é o dia
4 de Fevereiro
*âO casal número 3 só pode casar no próximo mês pois já tem um casal no dia
4 :(â*é o terceiro casal que tem os dias N = {4} disponÃveis mas como já
existia um casal com o dia 4, não é possÃvel realizar o casamento
*âPadre, foi encontrado uma inconsistência nos dados do casal 4. :(â*é a
mensagem de erro em caso de violação de restrição
*âO casal número 5 ficou de casar no dia 7 de Fevereiroâ*é o quinto casal
que tem os dias N = {2 7 9} disponÃveis e o menor possÃvel é o dia 7 de
Fevereiro
MAIS TESTES PARA VALIDAÃÃO
*Gerador de testes aleatórios*
bash$ T=$(( (RANDOM % 20) + 1 )); echo $T; \
for i in `seq 1 $T`; \
do N=$(( (RANDOM % 5) + 1 )) ; echo -n "$N "; \
for x in `seq 1 $N`; do V=$(( (RANDOM % 31) + 1)); echo -n "$V "; done; \
echo; done; echo $(( (RANDOM % 12) +1 ))
*Teste #01*
55 21 26 4 1 15 5 19 11 7 16 17 1 28 4 29 6 21 25 1 11 5
*Teste #02*
33 28 26 7 2 29 16 3 8 14 15 4
*Teste #03*
53 17 31 16 1 15 1 7 4 31 30 12 1 2 20 27 3
*Teste #04*
181 21 3 23 24 5 5 15 11 19 28 8 5 11 9 16 16 5 1 4 1 4 4 4 8 7 26 4
23 12 11 28 1 7 2 28 27 3 27 13 31 3 30 29 11 5 2 5 10 20 14 5 4 16 5
17 25 2 3 20 2 17 2 5 19 21 2 24 25 5 16 8 18 23 28 5
*Teste #05*
115 7 19 30 2 22 3 8 23 30 5 25 4 16 17 31 3 18 31 14 3 6 3 19 2 20 1
2 27 22 2 16 19 4 9 28 18 21 2 10 20 2 29 9 7
Conseguiu resolver? Poste suas respostas na thread ou lá no blog![image: ð]
âAtenciosamente,
â
Alexandre Mulatinho
porém envolve uma complexidade de coisas (ifs, whiles, fors, manipulação de
entrada e saÃda) que um iniciante pode achar complexo; Joguei lá no meu
blog e colei aqui na Ãntegra.
P.S.: Não sou nenhum mestre do Shell e também não ficarei decepcionado se
ninguém responder ou simplesmente não gostar do desafio, crÃticas são
válidas desde que construtivas! :-D
*DESAFIO*
Fonte: https://alex.mulatinho.net/2016/08/17/desafio-shell-script-001/
Dona Fernanda resolveu casar-se com Carlos, o padre porém disse que os
noivos não poderiam escolher a data de casamento devido a grande quantidade
de solicitações na igreja. Vários noivos também estavam ansiosos para saber
quando poderiam se casar naquela linda igreja, para dizer a cada casal o
dia exato em que eles poderiam se casar o padre solicitou que eles
fornecessem de 1 até 5 dias no mês de sua preferência e desenvolveu um
algoritmo que ajudaria a resolver este impasse de forma aleatória e justa
agora e no futuro, ele definiu:
- *T* â quantidade de casamentos na fila
- *M* â mês do casamento
- *N* â quantidade de dias do mês disponÃvel
- *Vx* â Valor do dia na posição X (V1, V2, V3âŠ)
*ENTRADA VÃLIDA*
TN V1 V2 V3 ⊠VxM
*POR EXEMPLO*
55 2 7 5 8 145 2 4 14 8 151 403 2 7 92
*RESTRIÃÃES*
*T > 0 && T <= 20M >= 1 && M <= 12N > 0 && N <= 5V > 1 && V < 32 *
- - O dia a ser escolhido deve ser o menor do grupo
- - Caso um casal tenha selecionado um dia já escolhido por outro ele
ficará com o próximo dia possÃvel, se houver (por exemplo, *A* = 4 = {
1, 3, 4, 6 } se os dias *1, 3 e 4* já tiverem sido escolhidos, o casal
poderá tentar o próximo item, o quarto número, o dia *6*)
- - Em caso de não haver outro dia disponÃvel para o casal deverá ser
escrito:
-
- âO casal número *N* só pode casar no próximo mês pois já tem um
casal no dia *Vx* :(â
- - Em caso de violação de restrição deverá ser escrito
- - âPadre, foi encontrado uma inconsistência nos dados.â
*RESPOSTA VÃLIDA / SAÃDA VÃLIDA*
Padre, são 5 Casamentos em FevereiroO casal número 1 ficou de casar no
dia 2 de FevereiroO casal número 2 ficou de casar no dia 4 de
FevereiroO casal número 3 só pode casar no próximo mês pois já tem um
casal no dia 4[image: ðŠ]Padre, foi encontrado uma inconsistência nos
dados.O casal número 5 ficou de casar no dia 7 de Fevereiro
*EXPLICAÃÃO DA SAÃDA*
*âPadre, são 5 casamentos em Fevereiroâ* é o número *T* de casamentos de
entrada e o mês *M* da entrada
*âO casal número 1 ficou de casar no dia 2 de Fevereiroâ*é o primeiro casal
que tem os dias N = {2, 7, 5, 8, 14} disponÃveis e o menor possÃvel é o dia
2 de Fevereiro
*âO casal número 2 ficou de casar no dia 4 de Fevereiroâ* é o segundo casal
que tem os dias N = {2, 4, 14, 8, 15} disponÃveise o menor possÃvel é o dia
4 de Fevereiro
*âO casal número 3 só pode casar no próximo mês pois já tem um casal no dia
4 :(â*é o terceiro casal que tem os dias N = {4} disponÃveis mas como já
existia um casal com o dia 4, não é possÃvel realizar o casamento
*âPadre, foi encontrado uma inconsistência nos dados do casal 4. :(â*é a
mensagem de erro em caso de violação de restrição
*âO casal número 5 ficou de casar no dia 7 de Fevereiroâ*é o quinto casal
que tem os dias N = {2 7 9} disponÃveis e o menor possÃvel é o dia 7 de
Fevereiro
MAIS TESTES PARA VALIDAÃÃO
*Gerador de testes aleatórios*
bash$ T=$(( (RANDOM % 20) + 1 )); echo $T; \
for i in `seq 1 $T`; \
do N=$(( (RANDOM % 5) + 1 )) ; echo -n "$N "; \
for x in `seq 1 $N`; do V=$(( (RANDOM % 31) + 1)); echo -n "$V "; done; \
echo; done; echo $(( (RANDOM % 12) +1 ))
*Teste #01*
55 21 26 4 1 15 5 19 11 7 16 17 1 28 4 29 6 21 25 1 11 5
*Teste #02*
33 28 26 7 2 29 16 3 8 14 15 4
*Teste #03*
53 17 31 16 1 15 1 7 4 31 30 12 1 2 20 27 3
*Teste #04*
181 21 3 23 24 5 5 15 11 19 28 8 5 11 9 16 16 5 1 4 1 4 4 4 8 7 26 4
23 12 11 28 1 7 2 28 27 3 27 13 31 3 30 29 11 5 2 5 10 20 14 5 4 16 5
17 25 2 3 20 2 17 2 5 19 21 2 24 25 5 16 8 18 23 28 5
*Teste #05*
115 7 19 30 2 22 3 8 23 30 5 25 4 16 17 31 3 18 31 14 3 6 3 19 2 20 1
2 27 22 2 16 19 4 9 28 18 21 2 10 20 2 29 9 7
Conseguiu resolver? Poste suas respostas na thread ou lá no blog![image: ð]
âAtenciosamente,
â
Alexandre Mulatinho