EP1 - Primeiro Exercício Programa

EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -
Número de respostas: 59

Boa tarde, pessoal!

O Enunciado do EP1 está no PACA, e a entrega deve ser realizada até as 23:55 do domingo dia 15/04/2018. Leiam com atenção o enunciado e as Instruções para envio dos EPs (sim, de novo, não custa nada, melhor prevenir do que remediar!).

Boas implementações!

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Raphael Ribeiro da Costa e Silva -
É permitido utilizar elif no código?
Em resposta à Raphael Ribeiro da Costa e Silva

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Olá, Raphael!

Foi somente por falta de oportunidade que não usamos a contração "elif" (else+if) em aula, já que ele é parte integrante do comando "if", então ele pode ser usado sim no EP1. Para quem mais quiser usar, a forma geral do comando condicional é

if condição1:

    comandos1

elif condição2:

    comandos2

elif ...

    ...

elif condiçãoK:

    comandosK

else:

    comandosSenão

sendo que o comando testa as condições em ordem de aparecimento, e executa o primeiro bloco de comandos que possua uma condição verdadeira (ou o último bloco "else" caso todas as condições anteriores sejam falsas).

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Antônio Carlos Santos de Lima -

1) É obrigatório que as mensagens do programa sejam exatamente iguais às do executável?

2) Se o humano quiser continuar o jogo, o N atual deve ser mantido ou o humano deverá digitar algum N de novo?

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Antônio Carlos Santos de Lima -

A tabela gerada pela função bônus precisa estar totalmente alinhada?

Em resposta à Antônio Carlos Santos de Lima

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Olá, Antônio!

> O lance anterior se refere, em uma rodada, ao lance do adversário ou ao lance do próprio jogador na rodada anterior?

As rodadas são completamente independentes umas das outras, então nenhuma informação da rodada anterior - excetuadas as pontuações - é utilizada na rodada atual. A finalidade do parâmetro lanceanterior na função jogada é garantir que o segundo jogador daquela rodada não repita o lance dado pelo primeiro jogador. Por isso o enunciado sugere que na chamada da função jogada para o primeiro jogador seja passado o valor lanceanterior=-1, o que na prática não impõe restrições adicionais ao lance do primeiro jogador (apenas a restrição 0<=lance<=N-1).

> É obrigatório que as mensagens do programa sejam exatamente iguais às do executável?

Sim, essa é a primeira frase da especificação: "Seu programa em Python deve se comportar exatamente como o executável disponível no PACA."

Há boas razões para isso, para além de facilitar o emprego de corretores automáticos: fazer uma especificação com todos os detalhes da implementação a ponto de não deixar espaço para nenhuma dúvida ou ambiguidade custaria muitas dezenas de páginas de enunciado, o que seria sofrível para nós todos. O executável permite responder facilmente várias dúvidas que surjam, como a próxima:

> Se o humano quiser continuar o jogo, o N atual deve ser mantido ou o humano deverá digitar algum N de novo?

Se você rodar o executável, verá que o N só é perguntado no início, bem como a frase "Aguarde enquanto envieso a roleta...", que está associada à geração da distribuição enviesada através da chamada da função distribuição. A ideia é que cada execução do programa está associada a uma única roleta enviesada, gerada antes da primeira rodada, e que será usada até o usuário desistir de jogar.

> É permitido usar alguma função para arredondar valores, conforme o que aparentemente foi feito no executável?

No executável não foi usada nenhuma função para arredondar valores, como round(), floor() ou ceil(), se foi essa a sua pergunta. Todas as variáveis e expressões aritméticas são inteiras. Nós vimos em aula a função int() que converte um float para inteiro através de truncamento da parte fracionária, por isso se x>=0 seria permitido usar int(x) para obter "floor(x)" e int(x+0.5) para obter "round(x)", mas nem mesmo a função int() foi usada no executável com essa finalidade (ela só é usada quando há um input() de um valor inteiro).

Se a sua pergunta se refere à operação de "descascar dígitos decimais", nesse caso o uso da divisão inteira "//" dispensa uma operação de arredondamento, já que o resultado dessa operação é sempre inteiro. Por outro lado, se a sua pergunta se refere aos valores fracionários truncados em 3 casas decimais que aparecem na função bônus, ali o que foi feito foi uma formatação da saída:

>>> print("{0:2.3f}".format(2**0.5))
1.414

> A tabela gerada pela função bônus precisa estar totalmente alinhada?

Como essa pergunta é uma variação da sua segunda pergunta, vou responder então a uma outra pergunta: "como alinhar valores impressos na forma de uma tabela?". A resposta é: garantindo que os valores numéricos possuem largura fixa (ver a formatação acima). Embora isso seja suficiente para permitir a escrita alinhada daquela tabela, um outro truque de formatação útil é usar o caractere TAB "\t" entre valores, pois isso alinha o valor seguinte a uma certa "coluna" da saída, compensando pequenas diferenças na largura dos números que vêm antes:

>>> for i in range(11): print(i,"\t",i**2,"\t",i**3,"\t",i**4)
...
0      0      0      0
1      1      1      1
2      4      8      16
3      9      27     81
4      16     64     256
5      25     125    625
6      36     216    1296
7      49     343    2401
8      64     512    4096
9      81     729    6561
10     100    1000   10000

Abraços,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Antônio Carlos Santos de Lima -

Olá, professor.

Muito obrigado por ter respondido às minhas perguntas.

Não consegui encontrar o link de submissão do EP. Por quê?

Em resposta à Antônio Carlos Santos de Lima

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Olá, Antônio!

O EP1 é para o dia 15/4, não há pressa. Na próxima semana colocarei o link no PACA.

Bom feriado!

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Antônio Carlos Santos de Lima -

Olá, professor.

Muito obrigado por responder.

Então a data de entrega do EP1 mudou? Pergunto isso, pois, no link "Informações importantes", a data é 8/4.

Em resposta à Antônio Carlos Santos de Lima

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Oi, Antônio!

SIM, a data que vale é a do enunciado. É que nem quando a gente vai na loja e a etiqueta do produto é mais barata do que o preço no caixa: o consumidor tem que fazer valer os seus direitos! sorriso

Já corrigi as informações importantes.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Tomás Eugenio -

Se utiliza corretor automático, é preciso pôr acentos no programa?

Em resposta à Tomás Eugenio

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Oi, Tomás!

Colocar acentos não deveria ser um problema em Python... você está tendo alguma dificuldade? Ela se manifesta no Idle3, no terminal ou nos dois? Qual sistema operacional você usa?

Se o problema aparece apenas no Prompt do Windows, mas as coisas funcionam no ambiente gráfico (Idle3), eu não me preocuparia nem um pouco. Se for esse mesmo o cenário, procure "UTF8 encoding windows command prompt" no Google, tem várias sugestões lá do que fazer, mas eu não posso testar.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Robson Shimohara -

Não consigo abrir o executável. O Windows Smart Defender acusa de que é um programa não confiável e não permite executar.

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Vitor Pereira da Silva -

Sobre a função:

# Função obrigatória
def distribuicao(N):
"""Devolve um inteiro dist onde cada dígito n=0,...N-1 representa
um peso relativo em uma distribuição de probabilidade,
verificando que dist esteja entre 0 e 10**N-1.
"""
# calcula, calcula, calcula...
assert dist in range(10**N)
return dist

Não especifíca se devo gerar os pN usando o randint e depois gerar a dist, ou gerar direto a dist usando randint.

Existe alguma preferência?

Em resposta à Vitor Pereira da Silva

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Oi, Vitor!

O enunciado diz o seguinte:

  • Na seção seguinte alguns detalhes da implementação dessa expressão serão discutidos; por enquanto, basta notar que deverão ser gerados N valores aleatórios ​ p0, p1,..., pN-1, cada um deles entre 0 e 9, que formam a representação decimal do número inteiro dist.
  • Dica: compute as potências ​100, 101,..., 10N-1 iterativamente, a fim de construir cada um dos termos da soma que define dist.

Mesmo considerando a dica opcional, a primeira frase exclui a possibilidade de você gerar a distribuição com um sorteio só, entre 0 e 10N-1. Isso sem mencionar a proibição do operador exponencial, mas entendo que você pretendia chegar no 10**N iterativamente.

Abraço,

Marcelo

 

 

Em resposta à Marcelo Queiroz

Pesos

por Arthur Sakayan Vieira de Melo -

É normal no executável os pesos serem iguais toda vez que eu "abro o jogo"?

Em resposta à Arthur Sakayan Vieira de Melo

Re: Pesos

por Marcelo Queiroz -

Muito legal que você notou isso, Arthur!

De fato é isso o que foi implementado na versão em C que gerou o executável, mas não foi intencional... nenhum de nós lembrou que por default o gerador de números aleatórios daquela linguagem é sempre inicializado com uma mesma "semente" (seed), e para garantir que rodadas consecutivas produzissem sequências aleatórias diferentes, teria sido importante definir uma semente diferente para cada execução. Em Python isso não é necessário, pois cada execução define uma semente diferente automaticamente sem que precisemos fazer nada.

Programas "pseudo-aleatórios" que geram as mesmas sequências em todas as execuções são muito úteis quando se quer fazer experimentos de forma controlada, permitindo a repetição exata dos resultados alcançados. Se algum dia por acaso vocês precisarem fazer isso em Python, basta definir manualmente uma semente. Experimentem rodar o código abaixo várias vezes:

from random import randint, seed

seed(0)
for i in range(10):
    print(randint(0,9))

Vocês verão sempre a mesma saída. Se comentarem a linha da semente, cada execução gerará uma saída diferente.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Mensagem de continuação

por Arthur Sakayan Vieira de Melo -

Reparei que quando se chega na parte do executável em que se pede ao usuário se ele deseja continuar jogando, o programa encerra se for escrito qualquer coisa (incluindo "Abra o jogo!") que não seja "S".

Devemos fazer isto no código em Python também?

Em resposta à Arthur Sakayan Vieira de Melo

Re: Mensagem de continuação

por Marcelo Queiroz -

Oi, Arthur!

Nesse caso a especificação do enunciado é suficiente para dirimir a dúvida: a pergunta feita é da forma (S/N), o que significa que o usuário deve digitar somente S ou N (ou ainda "Abra o jogo!" no caso de se optar por resolver a função bônus). Lembrando do item (9) das Instruções para envio dos EPs, seu programa pode fazer o que quiser nos outros casos, inclusive explodir sem ficar envergonhado...

Na implementação de referência, decidimos testar apenas se a resposta era S ou não-S; outra alternativa seria testar se a resposta era N ou não-N, ou ainda separar em 3 casos e ficar repetindo a pergunta se o usuário estiver de zoeira... como o programa de vocês não será testado com outro tipo de resposta, vocês não têm com o que se preocupar!

Abraços,

Marcelo

P.S.: sobre terminar a execução após "Abra o jogo!", sim, isso é esperado. Não teria graça ficar jogando quando você conhece os números mais frequentes, né?

Em resposta à Marcelo Queiroz

Re: Mensagem de continuação

por Leandro Rodrigues da Silva -

Boa noite professor. 

Acho que o que ele quis dizer é que após digitar "Abra o jogo!", o programa fecha automaticamente, sem exibir os números mais frequentes. Pelo menos é o que está acontecendo quando testo isso no executável

Em resposta à Leandro Rodrigues da Silva

Re: Mensagem de continuação

por Marcelo Queiroz -

Boa noite, Leandro!

> Acho que o que ele quis dizer é que após digitar "Abra o jogo!", o programa fecha automaticamente, sem exibir os números mais frequentes.

Acho que não foi isso não... de todo modo, acredito que você vai querer ler essa outra mensagem aqui pra resolver o seu problema.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Leandro Rodrigues da Silva -

Bom dia.

Quando o programa retorna "A roleta possui os números 0...N-1", como posso fazer pra variável não ficar espaçada da string? Posso usar a concatenação de strings?

=

Em resposta à Leandro Rodrigues da Silva

Re: EP1 - Primeiro Exercício Programa

por Roberto Piassi Passos Bodo -

Oi, Leandro! Bom dia!

A função print do python possui o argumento sep que define o separador entre as strings passadas entre vírgulas.

Acho que com sep="" você já resolve seu problema.

Abraços!

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Caio Túlio de Deus Andrade -

Bom dia.

Fiquei com algumas duvidas quanto ao uso de funções no ep : 

1) Posso criar funções não especificadas no enunciado? Por exemplo, uma função que soma os pesos, ao invés de deixar esse codigo dentro de outra função.

2) Devo usar uma função main? Para - por exemplo - interligar as outras funções utilizadas, ou devo deixar um codigo mais solto, e apenas utilizar funções para outros trechos de codigo?

3) Se eu usar uma função main, tem algum modo de faze-la ser executada ao abrir o programa no interpretador python, ao invés de ser obrigatório para o monitor digitar "main()" no terminal para executar?

Em resposta à Caio Túlio de Deus Andrade

Re: EP1 - Primeiro Exercício Programa

por Andrew Ijano Lopes -

Olá, Caio! Bom dia!

 

> 1) Posso criar funções não especificadas no enunciado? Por exemplo, uma função que soma os pesos, ao invés de deixar esse codigo dentro de outra função.

Pode sim, é até recomendado criar funções adicionais caso elas melhorem a legibilidade e diminuam a repetição de código.

 > 2) Devo usar uma função main? Para - por exemplo - interligar as outras funções utilizadas, ou devo deixar um codigo mais solto, e apenas utilizar funções para outros trechos de codigo?

Recomendo utilizar a função main também. Quando se está fazendo programas maiores e com várias funções (como esse EP1), definir uma main explicita o propósito daquele trecho de código e aumenta bastante a legibilidade dele.

> 3) Se eu usar uma função main, tem algum modo de faze-la ser executada ao abrir o programa no interpretador python, ao invés de ser obrigatório para o monitor digitar "main()" no terminal para executar?

Para fazer isso é bem simples. Como você colocou todo o código que estava solto dentro da função main, o interpretador vai pular tudo isso e vai procurar outro código fora de qualquer função para poder executar. Assim, é só chamar a main() depois de definir ela, por exemplo:

def main():

# código

# código

main()

Em resposta à Andrew Ijano Lopes

Re: EP1 - Primeiro Exercício Programa

por Caio Túlio de Deus Andrade -

Opa, obrigado pela ajuda, Andrew!

Em resposta à Caio Túlio de Deus Andrade

Re: EP1 - Primeiro Exercício Programa

por Edilson Jacob -

Acho que isso não é necessário (ou mesmo permitido) neste EP, mas, em geral, a forma recomendada é a seguinte:

if __name__ == "__main__":
    <código de inicialização>

Isso verifica se o script está sendo executado como o programa principal; do contrário, significa que está sendo importado por outro arquivo.
Ainda seria melhor declarar uma função "main" e chamá-la a partir do "if", mas, neste caso, é desnecessário.

Se quiser saber mais: https://stackoverflow.com/questions/419163/what-does-if-name-main-do

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Caio Túlio de Deus Andrade -

Boa Tarde,

Fiquei com algumas dúvidas em relação ao funcionamento da função "sorteia" : 

1) Por que deve-se sortear um s em [0,S-1]? Entendo que esse valor será utilizado posteriormente para encontrar o menor n tal que s < p0 +p1 + ... pn, mas não entendo como isso é usado para calcular a probabilidade enviesada dos termos

2) A função retorna o número n, ou um numero entre 0 e N-1, sorteado aleatoriamente? Porque em um ponto do enunciado, a função sorteia é definida da seguinte forma : 

sorteia(N,dist):
    calcule S de acordo com a fórmula acima

    sorteie um valor aleatório s inteiro entre 0 e S-1

    devolva o menor inteiro n (entre 0 e N-1) tal que s < p0+p1+...+p

 

Posteriormente, define-se como : 

 

# Função obrigatória def sorteia(N,dist):

   """Devolve o resultado de um sorteio enviesado dentre os inteiros de 0 a N-1 de acordo com a distribuição dist. ""

   # computa, computa, computa...

   "assert sorteio in range(N)

    return sorteio

Em resposta à Caio Túlio de Deus Andrade

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Boa noite, Caio!

Suas dúvidas são compreensíveis, pois de fato o enunciado não demonstra que o algoritmo sugerido funciona, e apenas tenta deixar claro como ele deve ser implementado. MAS é sempre melhor entender o que estamos implementando! sorriso Uma única advertência: o texto que segue serve apenas para vocês aprenderem um pouco de estatística, e seu entendimento não é pré-requisito para a implementação correta do mecanismo, que está precisamente descrito no enunciado.

Sobre a pergunta (1), ela tem a ver com uma interpretação "mecânica" da roleta enviesada: estamos pensando realmente num objeto físico como aquele da figura do enunciado, com S raios de tamanho igual, e uma bolinha que será solta em meio à roleta girando para que caia em um desses S raios, identificados com os valores 0,1,...,S-1 devolvidos pela função randint(). O que enviesa de fato a roleta é o fato de que vários raios têm o mesmo rótulo, que é um dos números n entre 0 e N-1. Se preferir pensar de outro modo, o mapeamento das probabilidades p0/S, p1/S, ..., pn/S, ..., pN-1/S no intervalo [0,1) poderia ser traduzido por uma regrinha de 3 no mapeamento dos pesos p0, p1, ..., pn, ..., pN-1 no intervalo [0,S), que é então tratado de forma discreta {0,1,...,S-1} e particionado em subconjuntos de tamanhos variáveis conforme os pesos: {0,...,p0-1} para o rótulo 0, {p0,...p0+p1-1} para o rótulo 1, {p0+p1,...,p0+p1+p2-1} para o rótulo 2, e assim por diante até o último intervalo {p0+p1+...+pN-2,...,p0+p1+...+pN-1-1 == S-1} associado ao rótulo N-1. Desse jeito, garantimos que um sorteio uniforme (ou seja, com probabilidades iguais, como aquele realizado pela função randint()) dentro dos valores inteiros {0,1,...,S-1} será mapeado em um desses N intervalos, cujos tamanhos são proporcionais às probabilidades respectivas dos rótulos 0,1,...,N-1. A condição s<p0+p1+...pn (para um n genérico) junto com a condição de ser aquele o menor n que satisfaz a desigualdade (e portanto s>=p0+p1+...pn-1) serve precisamente para encontrar o intervalo {p0+p1+...+pn-1,...,p0+p1+...+pn-1} correspondente ao rótulo n.

Sobre a pergunta (2), agora que você já entendeu a resposta da pergunta (1), você verá que o valor devolvido é ao mesmo tempo o menor n que satisfaz aquela desigualdade e também é precisamente o valor entre 0 e N-1 sorteado aleatoriamente, mas NÃO conforme o sorteio uniforme da função randint(), que atribui probabilidades iguais 1/N para cada valor entre 0 e N-1, e sim conforme as probabilidades enviesadas p0/S, p1/S, ..., pn/S, ..., pN-1/S que definem a roleta.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Victor Pereira Lima -

Posso usar uma função que retorna dois valores?

Em resposta à Victor Pereira Lima

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Oi, Victor!

Como respondi em aula, podemos usar sim funções que devolvem dois valores, mas não podemos mudar a especificação das funções obrigatórias, ou seja, essa possibilidade só se aplica a funções adicionais.

Abraço,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Caio Túlio de Deus Andrade -

É normal a minha função bônus rodar muito mais lentamente em relação ao executável fornecido? Imagino que seja mais lento pois o executável é em C e o programa em Python, mas deu uma diferença bem grande para N grande. Isso é normal, ou meu código poderia ser mais eficiente?

Em resposta à Caio Túlio de Deus Andrade

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Oi, Caio!

Isso é normal sim, essa é uma das diferenças principais entre linguagens compiladas e linguagens interpretadas. Só para dar uma ideia, rodei aqui na minha máquina para N=100 sem a parte de interação com o usuário, e o código em C levou 0.047s enquanto a versão em Python levou 3.158s.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Caio Túlio de Deus Andrade -

Boa tarde, professor.

Aqui, o python está demorando uns 60 segundos para rodar tudo para n = 100, então certamente tem algo errado no meu código haha eu devo fazer, para cada i em [0,N-1], 1000 sorteios e ver quantas vezes esse i é sorteado pela função sorteia? Ou estou fazendo algo errado em relação ao enunciado?

Em resposta à Caio Túlio de Deus Andrade

Re: EP1 - Primeiro Exercício Programa

por Caio Túlio de Deus Andrade -

Opa, não tinha lido que a função foi testada sem a interação com o usuário haha agora testei sem a interação e com algumas mudanças no código, e o tempo de execução está aceitável. Obrigado, professor!

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Leandro Rodrigues da Silva -

Boa noite.

Qual é a função do %N na operação dist(a,b) do enunciado?

Em resposta à Leandro Rodrigues da Silva

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Boa noite, Leandro!

O % em Python é o operador módulo: se A e N são inteiros, então A%N produz o único valor m entre 0 e N-1 que satisfaz a equação A=qN+m (com q inteiro). Essa é a função dele na expressão que define a distância entre a e b no "círculo" dos inteiros módulo N. Só agora me toquei que o termo "dist" foi usado em dois sentidos diferentes no enunciado: como distribuição e como distância. Melhor seria então usar distância(a,b) nesse contexto para evitar possíveis confusões.

Na aula em que discutimos a implementação da função cosseno pela série de Taylor vimos um outro uso do operador %, envolvendo floats. Naquele caso, X%Y era o (único) valor z em ponto flutuante no intervalo [0,Y) que satisfaz X=qY+z com q inteiro. Dá pra notar que a ideia é bem parecida.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Eduardo Brancher Urenha -

Oi, eu tambem não entendi essa função. Se a e b são dois numeros dos quais queremos a distancia. quem é N? ou N é o numero que queremos adivinhar, e a e b são tentativas?

 

 

Obrigado.

Em resposta à Eduardo Brancher Urenha

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Bom dia, Eduardo!

N é o número de rótulos da roleta, que define o espaço de possíveis apostas para os dois jogadores (as apostas devem ser números inteiros entre 0 e N-1). Os parâmetros a e b da função distância são também números inteiros entre 0 e N-1, e a função devolve a distância entre a e b pelo caminho mais curto num círculo (onde os extremos 0 e N-1 são vizinhos). Normalmente essa função vai ser usada para decidir qual das duas apostas (dos jogadores a e b) está mais perto do número sorteado pela roleta.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Eduardo Brancher Urenha -

Ah acho que entendi, é pra simular a distancia como se fosse de fato o lançamento em uma roleta, de modo que 9 fique perto de zero. Mas pra que serve o N? ele não é sempre maior ou igual aos valores adivinhados? e no exemplo que você deu, a seria o valor sorteado e b uma aposta, ou a e b são apostas dois dois jogadores a ser comparadas?

ou seja, eu tenho que comparar as adivinhações com um valor sorteado, e não entre si, certo?

além disso, como a distancia devolve valores negativos em potencial, queremos o valor absoluto minimo, correto?

 

Desculpe o incomodo.

Em resposta à Eduardo Brancher Urenha

Re: EP1 - Primeiro Exercício Programa

por Marcelo Queiroz -

Oi, Eduardo!

Não é exatamente o 9 que fica perto do 0, mas o N-1, porque a roleta tem tamanho configurável, lembra? O N é o primeiro valor que o usuário digita, e determina uma série de coisas: os valores que a roleta sorteia (0,1,...,N-1), a quantidade de pesos e também de dígitos da distribuição dist, e também os valores permitidos nas apostas dos jogadores. Sem o N você não consegue calcular a distância entre os números (a fórmula traz duas vezes o %N).

> no exemplo que você deu, a seria o valor sorteado e b uma aposta, ou a e b são apostas dois dois jogadores a ser comparadas? ou seja, eu tenho que comparar as adivinhações com um valor sorteado, e não entre si, certo?

Sim, as distâncias que você calcula são entre o valor sorteado e cada um dos lances dos jogadores, e não entre os lances: o lance que estiver mais próximo do valor sorteado ganha a rodada.

> além disso, como a distancia devolve valores negativos em potencial, queremos o valor absoluto minimo, correto?

Não, a distância nunca devolve valores negativos, pois qualquer valor %N tem como resultado um número entre 0 e N-1.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Thiago Jose Benitez Pena -

Professor, teria algum material ou referência do que seriam comentários bons e concisos, sem explicar demais ou de menos. Não só pra disciplina, mas pra qualquer código ser legível em outros contextos. : D

Em resposta à Thiago Jose Benitez Pena

Re: EP1 - Primeiro Exercício Programa

por Roberto Piassi Passos Bodo -

Oi, Thiago! Tudo bem?

Lembrei de um livro aqui que se chama Clean Code:

https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship-ebook/dp/B001GSTOAM

O capítulo 4 inteiro fala sobre comentários. Acho que você vai curtir.

Abraços,

Roberto

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Edilson Jacob -

Boa noite,

É permitido usar o operador ternário (por exemplo, a = b if c else d)?

E break (dentro de loops)?

Obrigado!

Em resposta à Edilson Jacob

Re: EP1 - Primeiro Exercício Programa

por Roberto Piassi Passos Bodo -

Olá, Edilson! Como vai?

Já aprendemos if e else, portanto não vejo motivo para proibir esse uso específico dos dois.

Sobre o break... não vejo problema também. Pode usar numa boa.

Abraços,

Roberto

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Edilson Jacob -

Mais uma dúvida, pois não ficou claro na explicação: Podemos usar o print("{0:2.3f}".format(a)) na função bônus, ou devemos achar outra forma de fazer?

Obrigado!

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por Robson Shimohara -

Professor, eu fiz o programa, mas estive 40 segundos atrasado. Posso enviar de alguma forma?

Em resposta à Robson Shimohara

Re: EP1 - Primeiro Exercício Programa

por Robson Shimohara -
Em resposta à Robson Shimohara

Re: EP1 - Primeiro Exercício Programa

por Robson Shimohara -

Eu fiquei colocando as anotações ao invés de upar o EP completo, mas sem terminar as anotações. Fui muito besta. Da próximo, vou ser mais esperto.

Em resposta à Marcelo Queiroz

Re: EP1 - Primeiro Exercício Programa

por João Pedro Turri -

Eu tambem percebi um pequeno erro no codigo um minuto depois de encerrar o prazo, e tambem que enviei sem cabeçalho

Se ainda for possivel mandar por aqui, deixo em anexo o arquivo do meu EP1 corrigido