Skip to content

Instantly share code, notes, and snippets.

@victorolinasc
Created January 14, 2021 16:58
Show Gist options
  • Save victorolinasc/a00e7b440a68b51f963783bec77d2c3d to your computer and use it in GitHub Desktop.
Save victorolinasc/a00e7b440a68b51f963783bec77d2c3d to your computer and use it in GitHub Desktop.
Desafio Formação Elixir

Desafio Formação Elixir Stone

Seja bem-vindo(a) ao desafio de Formação Elixir Stone!

Formação Elixir Stone

A Stone está TE CONTRATANDO para aprender Elixir com um time que montou um banco inteiro na plataforma do zero! Nós queremos te ajudar na formação da sua carreira em desenvolvimento com a linguagem de programação Elixir criada pelo brasileiro José Valim.

Para ser aceito no programa de formação vamos pedir para solucionar um pequeno problema de desenvolvimento detalhado mais abaixo. Porém, antes de visualizar o desafio, saiba que:

  • Pode usar qualquer das linguagens a seguir para resolvê-lo: Java, JavaScript, Python, Ruby, Swift, Kotlin, Objective-C, Go, Erlang, Elixir, Emacs Lisp, Rust e C#
  • O objetivo aqui é saber se você tem alguma familiaridade com desenvolvimento. Caso você seja aceito, iremos formar você em desenvolvimento Elixir durante UM MÊS!
  • Caso passe no processo você já estará CONTRATADO. Isso quer dizer que mesmo durante a formação, você já estará recebendo seu salário e seus benefícios.
  • Após a formação, você entrará para um dos times Elixir para nos ajudar a continuar desenvolvendo o produto Stone em Elixir!
  • Não estamos preocupados aqui com performance, conhecimento de bibliotecas ou outros aspectos que iremos tratar na formação! Se preocupe em fazer uma solução que seja "clara" e "objetiva", ou seja, não inclua outras funcionalidades do que as pedidas, não dê "voltas" na solução e lembre que isso será avaliado por uma pessoa! Facilite a vida do avaliador :)

Como eu devo entregar o desafio?

Nosso desafio é simples o suficiente para ser feito em poucas horas e caber em 1 único arquivo de código. Assim, você poderá enviar sua solução para nosso time de recrutadores(as) por anexo via o canal de comunicação que tiver com eles(as).

Caso sua solução não caiba em um único arquivo, pode gerar um arquivo .zip (comprimido). Nós achamos que o desafio é simples o suficiente para caber em apenas um arquivo, mas não estamos limitando em "como" pode ser solucionado. No entanto, seja um arquivo ou seja um conjunto de arquivos comprimidos em um .zip, não ultrapassem o tamanho de 500kb no envio!!

Desafio

A Stone opera no mercado de pagamentos e financeiro. Ou seja, nós ajudamos nossos clientes a captar pagamentos, processá-los , operar agendamentos de recebíveis, fazer transferências, conciliar sua agenda financeira e muito mais. Assim, é muito importante sabermos operar e trabalhar com valores financeiros!

Problema

Imagine uma lista de compras. Ela possui:

  • itens
  • quantidade de cada item
  • preço por unidade/peso/pacote de cada item

Desenvolva uma função (ou método) que irá receber uma lista de compras (como a detalhada acima) e uma lista de e-mails. Aqui, cada e-mail representa uma pessoa. Queremos que a função:

  • Calcule a soma dos valores, ou seja, saiba multiplicar o preço de cada item por sua quantidade e somar todos os itens;
  • Divida o valor de forma igual entre a quantidade de e-mails
  • Retorne um mapa/dicionário onde a chave será o e-mail e o valor será quanto ele deve pagar nessa conta

!!! ATENÇÃO !!!

Quando fizer a divisão, é importante que não falte nenhum centavo!!! Portanto, cuidado quando tiver, por exemplo, um valor total de R$ 1,00 para dividir entre 3 e-mails!

Isso daria uma dízima infinita no valor 0,3333333333333333333... No entanto, o dinheiro não se divide assim :) O correto aqui é que duas pessoas fiquem com o valor 0,33 e a terceira fique com 0,34 totalizando assim o 1,00 do começo.

!!! IMPORTANTE !!!

Para facilitar e como boa prática, não trabalhe com valores com decimais. Ou seja, ponto flutuante ou float. Use inteiros para representar os valores! Como a menor unidade na nossa moeda é o centavo, use valores inteiros em centavos.

Assim, um real será representado por 100 (cem centavos é igual a um real).

!!! DICAS !!!

Para a avaliação, iremos gerar listas de itens de acordo com a função/método definido pelo candidato(a) e listas de e-mails aleatórias. Portanto, defina bem o comportamento para, por exemplo, uma lista vazia de itens ou uma lista vazia de e-mails.

Não vamos trabalhar com valores nulos. Podem assumir que os valores de entrada SEMPRE estarão preenchidos, porém, quando são listas, podem estar vazias.

Deixe documentado como vocês "testam" a solução. Por exemplo, "eu coloco o arquivo numa pasta /desafio e executo javac Desafio.java e depois java Desafio". Se tiverem familiaridade com testes automatizados tudo bem, mas não é necessário.

Para as linguagens que possuem um REPL (read-eval-print-loop... uma espécie de "shell" da linguagem) pode simplesmente dizer que executa o módulo/classe de dentro dele que tá tudo certo.

Para as linguagens que não possuem um REPL, podem incluir no código uma função que gera os dados e simplesmente chamar o "main" da linguagem. Por exemplo, no caso de Java seria algo nesse sentido:

class Desafio {
 
  public static void main(String[] args) {
    List<Item> itens = // gera seus itens aqui
    List<String> emails = // gera seus emails aqui
    
    Map<String, Integer> resultado = Desafio.calcula(itens, emails);
    System.out.println(xxxxx); // printa o resultado
  }
}

Não é necessário escrever o desafio em inglês, porém sinta-se a vontade caso esteja seguro do seu inglês técnico.

Dedique-se ao desafio com calma. Arrume um espaço e um horário que você possa se concentrar e não hesite de procurar dicas na internet, mas tome cuidado com copiar respostas prontas para problemas. Entenda o que está fazendo antes de sair copiando e verifique muitas vezes com dados diferentes a solução. Estresse bem o modelo com listas grandes de dados e coisas do tipo para se sentir seguro com a sua solução.

Caso ache necessário, pode incluir um arquivo de documentação a parte do código. Um "README.md" por exemplo onde você explica como chegou nessa solução, como executá-la e coisas do tipo.

Mensagem final

Divirta-se no processo como um todo! Mesmo que a gente acabe não fechando uma parceria, aproveite este pequeno desafio como uma prática divertida de problemas de programação iniciantes. Esse pode ser um pontapé inicial para acontecimentos maiores na sua carreira!

@edenpaulocruz
Copy link

Olá! Tudo blz?

Seria possível você me tirar uma dúvida quanto à Formação Elixir Stone?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment