|
From: | Raul Libório |
Subject: | Re: [shell-script] Re: Desafio Shell Script #001 do Mulato. |
Date: | Sat, 20 Aug 2016 14:29:05 -0300 |
Boa tarde!Bom, geralmente quando começo algo vou até o fim, espero não estar incomodando a lista com meu pequeno desafio.Conclui o script aqui que implementa 100% das restrições e a saída do desafio, na quarta-feira (24/08) posto o script completo aqui para o pessoal dar uma olhada. O script tem 93 linhas e aposto que o pessoal daqui consegue reduzir pra 20, que dirá o Julio que talvez transforme em um one-liner :P Hehehe!mlt@infinito:~/codez/scripts$ wc -l challenge001.sh93 challenge001.shO desafio está atualizado com as questões levantadas antes no BlogPor enquanto deixo aqui apenas os exemplos de entrada e saída geradas pelo script;Para não floodar muito a thread, quem quiser ver todos resultados está aqui -> http://pastebin.com/VvbxBZWD Deixo apenas um exemplo para saborear:mlt@infinito:~/codez/scripts$ ( 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)) ) > /tmp/in.txt ; \ echo; echo input; cat /tmp/in.txt; echo; echo; echo saida; cat /tmp/in.txt | ./challenge001.sh
input
20
1 2
5 8 12 26 15 19
1 2
1 26
4 28 13 16 9
2 30 30
5 25 25 13 25 7
5 2 28 4 3 29
5 13 4 1 14 15
1 29
2 13 21
1 5
2 11 3
5 12 13 12 27 23
1 4
4 17 25 8 2
3 28 24 25
4 19 22 10 1
5 17 7 17 8 14
1 17
8
saida
Padre, são 20 casamento(s) em Agosto
O casal número 1 ficou de casar no dia 2 de Agosto
O casal número 2 ficou de casar no dia 8 de Agosto
O casal número 3 só pode casar no próximo mês pois já tem um casal nos dias selecionados
O casal número 4 ficou de casar no dia 26 de Agosto
O casal número 5 ficou de casar no dia 9 de Agosto
O casal número 6 ficou de casar no dia 30 de Agosto
O casal número 7 ficou de casar no dia 7 de Agosto
O casal número 8 ficou de casar no dia 3 de Agosto
O casal número 9 ficou de casar no dia 1 de Agosto
O casal número 10 ficou de casar no dia 29 de Agosto
O casal número 11 ficou de casar no dia 13 de Agosto
O casal número 12 ficou de casar no dia 5 de Agosto
O casal número 13 ficou de casar no dia 11 de Agosto
O casal número 14 ficou de casar no dia 12 de Agosto
O casal número 15 ficou de casar no dia 4 de Agosto
O casal número 16 ficou de casar no dia 17 de Agosto
O casal número 17 ficou de casar no dia 24 de Agosto
O casal número 18 ficou de casar no dia 10 de Agosto
O casal número 19 ficou de casar no dia 14 de Agosto
O casal número 20 só pode casar no próximo mês pois já tem um casal nos dias selecionadosUm abraço a todos,Alexandre Mulatinho.--Em 17 de agosto de 2016 17:15, Alexandre Mulatinho <address@hidden> escreveu: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-s cript-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
T N V1 V2 V3 … Vx MPOR EXEMPLO
5 5 2 7 5 8 14 5 2 4 14 8 15 1 4 0 3 2 7 9 2RESTRIÇÕES
T > 0 && T <= 20
M >= 1 && M <= 12
N > 0 && N <= 5
V > 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 Fevereiro O casal número 1 ficou de casar no dia 2 de Fevereiro O casal número 2 ficou de casar no 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 Padre, foi encontrado uma inconsistência nos dados. O casal número 5 ficou de casar no dia 7 de FevereiroEXPLICAÇÃ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 FevereiroMAIS 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
5 5 21 26 4 1 15 5 19 11 7 16 17 1 28 4 29 6 21 25 1 11 5Teste #02
3 3 28 26 7 2 29 16 3 8 14 15 4Teste #03
5 3 17 31 16 1 15 1 7 4 31 30 12 1 2 20 27 3Teste #04
18 1 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 5Teste #05
11 5 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 7Conseguiu resolver? Poste suas respostas na thread ou lá no blog!
Atenciosamente,Alexandre MulatinhoAlexandre Mulatinho
[Prev in Thread] Current Thread [Next in Thread]
- Desafio Shell Script #001 do Mulato., Alexandre Mulatinho, 2016/08/17
- Re: [shell-script] Desafio Shell Script #001 do Mulato., Ewerton Carvalho, 2016/08/17
- Re: [shell-script] Desafio Shell Script #001 do Mulato., Christian Lyra, 2016/08/18
- Re: [shell-script] Desafio Shell Script #001 do Mulato., Alexandre Mulatinho, 2016/08/19
- Re: [shell-script] Desafio Shell Script #001 do Mulato., itamarnet, 2016/08/19
- Re: Desafio Shell Script #001 do Mulato., Alexandre Mulatinho, 2016/08/20
- Re: [shell-script] Re: Desafio Shell Script #001 do Mulato., Raul Libório <=
- Re: [shell-script] Re: Desafio Shell Script #001 do Mulato., Alexandre Mulatinho, 2016/08/24
- Re: [shell-script] Re: Desafio Shell Script #001 do Mulato., Alfredo Casanova, 2016/08/25
- Re: [shell-script] Re: Desafio Shell Script #001 do Mulato., Alexandre Mulatinho, 2016/08/25
- Prev by Date: Re: Desafio Shell Script #001 do Mulato.
- Next by Date: Desafio shellscript - Cálculo de milivolts por metro
- Previous by thread: Re: Desafio Shell Script #001 do Mulato.
- Next by thread: Re: [shell-script] Re: Desafio Shell Script #001 do Mulato.
- Index(es):