Discussion:
[shell-script] Desafio Shell Script #001 do Mulato.
Alexandre Mulatinho alex@mulatinho.net [shell-script]
2016-08-17 20:15:26 UTC
Permalink
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
Ewerton Carvalho ewerton.carvalho@gmail.com [shell-script]
2016-08-17 20:34:08 UTC
Permalink
coloquei este blog no telegram.

https://telegram.me/scriptshell
Post by Alexandre Mulatinho ***@mulatinho.net [shell-script]
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
- *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
-
- “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
Christian Lyra lyra@pop-pr.rnp.br [shell-script]
2016-08-19 01:06:58 UTC
Permalink
Oi,

Interessante.... mas achei a explicação confusa! Faltou, por exemplo, dizer
logo que vc pode ter várias linhas "N V1 V2...". "N" é definido como numero
de opções, mas logo abaixo vc fala que o casal "N" vai ser casar dia X.
Falando nisso, "N" tá sobrando, pois vc poderia inferir pelo numero de
opções na linha :-). Se dois casais escolhem o mesmo dia, quem escolheu
primeiro é que leva, certo?
Alexandre Mulatinho alex@mulatinho.net [shell-script]
2016-08-19 14:53:41 UTC
Permalink
Fala Christian, Beleza!??

Entendi o que você falou, deveria ter feito com mais cuidado, fiquei
empolgado com a ideia do desafio e lancei muito rápido :P Esse fim de
semana vou tentar mandar a resposta para a lista, lembrando que tem 10000
formas de fazer isso, pra quem tá estudando SHELL ou quer um desafio acho
que vale a pena tentar;

Dá uma olhada na entrada de exemplo, você vai ver que sempre a primeira
linha (*T*) é o número de casais e que, se a gente contar a partir de 0
cada linha, a linha após a quantidade de casais vai ser 1, 2, 3, 4 e assim
por diante significando o número do casal. Essa já é uma dica de como
mostrar a saída no final. Outra dica é: não se preocupe em imprimir a saída
logo depois de ler uma entrada, LEIA TODA A ENTRADA, SETE OS VALORES DAS
SUAS VARIÁVEIS e só depois pense na SAÍDA DO TEXTO.

*P. Se dois casais escolhem o mesmo dia, quem escolheu primeiro é que leva,
certo?*
*R. *Em parte sim, o primeiro sempre vai levar primeiro mas aí é que tá a
brincadeira, se um casal já tiver escolhido o dia X, o próximo casal poderá
tentar o próximo item dos dias por eles selecionados, por exemplo:

Suponha que existe essa linha:
*4 12 9 5 7*

O enunciado de restrições abaixo diz que o dia a ser selecionado deve ser o
menor do grupo com *quatro* elementos, no caso neste grupo o número *5* é o
menor do grupo; agora suponha que antes algum casal já tinha escolhido o
dia *5 *então o enunciado de restrições diz que deve ser escolhido o
próximo número da lista (isso deveria ser o MENOR próximo número, mas como
não vale nenhum dinheiro aqui, você poderia escolher qualquer número do
grupo diferente do *5* que pra mim já tava valendo como resposta, desde que
nenhum outro casal o tenha pego). Outra coisa que poderia ser um erro é
mostrar 31 de Fevereiro, mas poxa, é só um desafio de colegas para divertir
e treinar shell então não precisa enlouquecer por causa disso, uma resposta
assim pra mim é válida por hora;

*T -> número de casais na fila*
*N -> são os dias selecionados pelo casal, mas se você contar a entrada
apartir de 0 também conta como o número do casal (dica) :-)*

*M -> sempre vai estar na última linha da entrada mostrando o mêsV -> são
os valores dos dias *


*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.”

Desculpa se me expressei mal, qualquer dúvida pode me mandar um e-mail aqui
ou para o e-mail pessoal :D

Atenciosamente,
Alexandre Mulatinho.
Post by Christian Lyra ***@pop-pr.rnp.br [shell-script]
Oi,
Interessante.... mas achei a explicação confusa! Faltou, por exemplo,
dizer logo que vc pode ter várias linhas "N V1 V2...". "N" é definido como
numero de opções, mas logo abaixo vc fala que o casal "N" vai ser casar dia
X. Falando nisso, "N" tá sobrando, pois vc poderia inferir pelo numero de
opções na linha :-). Se dois casais escolhem o mesmo dia, quem escolheu
primeiro é que leva, certo?
--
Alexandre Mulatinho
itamarnet@yahoo.com.br [shell-script]
2016-08-19 18:53:04 UTC
Permalink
Legal a ideia do desafio

Porém nem sempre temos a disponibilidade de resolver um problema específico num determinado momento devido a correria do dia-a-dia, e nisso podemos perder a oportunidade de exercitar nossos conhecimentos.

Um colaborador aqui a um tempo deixou um link para um site que tem uma grande lista de desafios matemáticos e que é possível ter soluções em Shell Script. Logicamente o site em si deixa em aberto a qq linguagem que possa oferecer uma solução. Cheguei a fazer alguns conforme o tempo deixava e talvez possa ser mais acessível a todos.

O site é o Project Euler : https://projecteuler.net https://projecteuler.net

Tentei recuperar o nome do colaborador que sugeriu, mas não encontrei então desde já peço desculpas.

Acho interessante pois cada um pode fazer em seu ritmo e a cada problema resolvido tem acesso as outras soluções que demais usuários tenham oferecido

É mais uma opção

[]'s
Itamar
Alexandre Mulatinho alex@mulatinho.net [shell-script]
2016-08-20 16:35:33 UTC
Permalink
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!

***@infinito:~/codez/scripts$ wc -l challenge001.sh
93 challenge001.sh

O desafio está atualizado com as questões levantadas antes no Blog
https://alex.mulatinho.net/2016/08/17/desafio-shell-script-001/

Por 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:

***@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 selecionados

Um abraço a todos,
Alexandre Mulatinho.
Post by Alexandre Mulatinho ***@mulatinho.net [shell-script]
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
- *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
-
- “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
--
Alexandre Mulatinho
Raul Libório rauhmaru@gmail.com [shell-script]
2016-08-20 17:29:05 UTC
Permalink
A ideia do desafio legal, mas acho que deve ser algo mais dinâmico, sem
precisar de muita explicação, bem no estilo de como aparecem os problemas
aqui.
Eu sei que muita gente aqui tem condições de resolver o problema proposto,
mas não quis por conta da explicação :)
resumindo: tl;dr


Raul Libório
http://rauhmaru.blogspot.com/
openSUSE Member | Linux User #4444581

/etc/httpd/conf.d/ssl.conf:7
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
Post by Alexandre Mulatinho ***@mulatinho.net [shell-script]
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!
93 challenge001.sh
O desafio está atualizado com as questões levantadas antes no Blog
https://alex.mulatinho.net/2016/08/17/desafio-shell-script-001/
Por 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
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 selecionados
Um abraço a todos,
Alexandre Mulatinho.
Post by Alexandre Mulatinho ***@mulatinho.net [shell-script]
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
- *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
-
- “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
--
Alexandre Mulatinho
Alexandre Mulatinho alex@mulatinho.net [shell-script]
2016-08-25 00:53:06 UTC
Permalink
​Fala galera!

Conforme dito antes segue o resultado do desafio! Valeu!!

https://gist.github.com/mulatinho/c5da322b52287cf990a332a7828a8e89​
(coloquei no github para não alongar tanto aqui)

Um abraço!
Alexandre Mulatinho
Blog: https://alex.mulatinho.net
Twitter: @alexmulatinho
Alfredo Casanova atcasanova@gmail.com [shell-script]
2016-08-25 16:54:54 UTC
Permalink
Tá dando 404 :(
Post by Alexandre Mulatinho ***@mulatinho.net [shell-script]
​Fala galera!
Conforme dito antes segue o resultado do desafio! Valeu!!
https://gist.github.com/mulatinho/c5da322b52287cf990a332a7828a8e89​
(coloquei no github para não alongar tanto aqui)
Um abraço!
Alexandre Mulatinho
Blog: https://alex.mulatinho.net
Alexandre Mulatinho alex@mulatinho.net [shell-script]
2016-08-25 18:25:26 UTC
Permalink
Post by Alfredo Casanova ***@gmail.com [shell-script]
Tá dando 404 :(
​Oxe! Por algum motivo ficou um caracter a mais no link :P Mals ae!

Segue novamente o link
https://gist.github.com/mulatinho/c5da322b52287cf990a332a7828a8e89

Também enviando em anexo. :)​

​Abraços,
Alexandre Mulatinho
Blog: https://alex.mulatinho.net
Twitter: @alexmulatinho


[As partes desta mensagem que não continham texto foram removidas]
Loading...