shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Re: Desafio Shell Script #001 do Mulato.


From: Raul Libório
Subject: Re: [shell-script] Re: Desafio Shell Script #001 do Mulato.
Date: Sat, 20 Aug 2016 14:29:05 -0300

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.

2016-08-20 13:35 GMT-03:00 Alexandre Mulatinho address@hidden [shell-script] <address@hidden>:
 

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.sh
93 challenge001.sh

O desafio está atualizado com as questões levantadas antes no Blog

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:
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 selecionados
Um 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-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

T
N V1 V2 V3 … Vx
M

POR EXEMPLO

5
5 2 7 5 8 14
5 2 4 14 8 15
1 4
0
3 2 7 9
2

RESTRIÇÕ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 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

5
5 21 26 4 1 15 
5 19 11 7 16 17 
1 28 
4 29 6 21 25 
1 11 
5

Teste #02

3
3 28 26 7 
2 29 16 
3 8 14 15 
4

Teste #03

5
3 17 31 16 
1 15 
1 7 
4 31 30 12 1 
2 20 27 
3

Teste #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 
5

Teste #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 
7

Conseguiu resolver? Poste suas respostas na thread ou lá no blog!😉


​Atenciosamente,
Alexandre Mulatinho



--
Alexandre Mulatinho



reply via email to

[Prev in Thread] Current Thread [Next in Thread]