Skip to content

Instantly share code, notes, and snippets.

@mulatinho
Last active August 25, 2016 20:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mulatinho/c5da322b52287cf990a332a7828a8e89 to your computer and use it in GitHub Desktop.
Save mulatinho/c5da322b52287cf990a332a7828a8e89 to your computer and use it in GitHub Desktop.
challenge001.sh
#!/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