Last active
August 25, 2016 20:11
-
-
Save mulatinho/c5da322b52287cf990a332a7828a8e89 to your computer and use it in GitHub Desktop.
challenge001.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# https://alex.mulatinho.net/2016/08/17/desafio-shell-script-001/ | |
# Alexandre Mulatinho - http://alex.mulatinho.net - 20160820 | |
# | |
# run tests: | |
# $ ( TESTES=$(( (RANDOM % 20) + 1 )); echo $TESTES; \ | |
# for i in `seq 1 $TESTES`; \ | |
# do N=$(( (RANDOM % 5) + 1 )) ; echo -n "$N "; \ | |
# for x in `seq 1 $N`; do DIA=$(( (RANDOM % 31) + 1)); echo -n "$DIA "; done; \ | |
# echo; done; echo $(( (RANDOM % 12) +1 )) ) | ./challenge001.sh | |
# funcao: pegaMenorDia() -> 17 22 10 4 8 -> 4 | |
# retorno: 1-31 -> numero do menor dia se houver disponivel | |
# -1 -> se nao houver um dia possivel pro casal | |
# -2 -> se houver erro nos dados | |
function pegaMenorDia() { | |
entrada="$*" | |
# checa restricoes | |
if [ $1 -le 0 ] || [ $1 -gt 5 ] ; then | |
return -2 | |
fi | |
# sorteando numeros do menor para o maior; e removendo primeiro numero N; | |
items=`echo ${entrada#* } | xargs -n1 | sort -n | xargs` | |
# transformando em um array para facilitar abaixo | |
IFS=" " read -r -a arrayItems <<< "$items" | |
# loop atraves dos dias | |
tamanhoMenosUm=$(( ${#arrayItems[@]} - 1 )) | |
for loop in `seq 0 $tamanhoMenosUm`; do | |
# pega o Vx | |
n=${arrayItems[$loop]} | |
# checa restricoes | |
if [ $n -le 0 ] || [ $n -gt 31 ] ; then | |
return -2 | |
fi | |
# se o dia já tiver sido ocupado, tenta o proximo | |
if eval echo "\$DIA$n" | grep "ocupado" >/dev/null 2>&1 ; then | |
continue | |
else | |
# senao, retorna o dia do casamento | |
eval export DIA$n="ocupado" | |
return ${arrayItems[$loop]} | |
fi | |
done | |
return -1 | |
} | |
# ------------------- | |
# entrada do programa | |
# ------------------- | |
read T # le a primeira linha, pega o valor T | |
# loop para pegar todos casais e setar em LINHA1, LINHA2, LINHA3... LINHAX | |
for (( i = 1 ; $i <= $T ; i++ )) ; do | |
read LINHA${i} | |
done | |
read M # le o valor do mes corrente | |
# ----------------- | |
# saida do programa | |
# ----------------- | |
# checa restricoess | |
if [ $T -le 0 ] || [ $T -gt 20 ] ; then | |
echo "Padre, foi encontrado uma inconsistência nos dados." | |
exit | |
elif [ $M -le 0 ] || [ $M -gt 12 ] ; then | |
echo "Padre, foi encontrado uma inconsistência nos dados." | |
exit | |
fi | |
# imprime saida | |
Meses=("" "Janeiro" "Fevereiro" "Março" "Abril" "Maio" "Junho" "Julho" "Agosto" "Setembro" "Outubro" "Novembro" "Dezembro") | |
echo "Padre, são $T casamento(s) em ${Meses[$M]}" | |
for (( i = 1 ; $i <= $T ; i++ )) ; do | |
# fazemos a magica chamando nossa funcao aqui | |
eval pegaMenorDia \$LINHA$i | |
retval=$? # pega retorno da funcao | |
# validamos a saida e imprimos de acordo | |
if [ $retval -eq 255 ] ; then # retorno -1 | |
echo "O casal número $i só pode casar no próximo mês pois já tem um casal nos dias selecionados" | |
elif [ $retval -eq 254 ] ; then # retorno -2 | |
echo "Padre, foi encontrado uma inconsistência nos dados do casal $i. :(" | |
else | |
echo "O casal número $i ficou de casar no dia $retval de ${Meses[$M]}" | |
fi | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment