Percursos
/
Python
Python
/
Exercícios
/
Mitigação de Fusão
Mitigação de Fusão

Mitigação de Fusão

Exercício de aprendizagem

Introdução

Em Python, as condicionais if, elif (uma contração de 'else and if') e else são usadas para controlar o fluxo da execução e tomar decisões num programa. Ao contrário de muitas outras linguagens de programação, as versões 3.9 e anteriores do Python não oferecem uma instrução formal de comutação de casos; em vez disso, usam várias instruções elif para um propósito semelhante.

O Python 3.10 introduz uma variante da instrução de comutação de casos chamada structural pattern matching, que será abordada à parte, noutro conceito.

As condicionais usam expressões que têm de resultar em True ou False: quer devolvendo diretamente um tipo bool, quer sendo avaliadas como "truthy" ou "falsy".

x = 10
y = 5

# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
    print("x is greater than y")
...
>>> x is greater than y

Quando associado a um if, um bloco de código else opcional é executado quando a condição original do if for avaliada como False:

x = 5
y = 10

# The comparison '>' here returns the bool 'False',
# so the 'else' block is executed instead of the 'if' block.
if x > y:
    print("x is greater than y")
else:
    print("y is greater than x")
...
>>> y is greater than x

O elif permite várias avaliações e ramificações.

x = 5
y = 10
z = 20

# The 'elif' statement allows for the checking of more conditions.
if x > y:
    print("x is greater than y and z")
elif y > z:
    print("y is greater than x and z")
else:
    print("z is greater than x and y")
...
>>> z is greater than x and y

As operações Boolean e as comparações podem ser combinadas com condicionais para fazer testes mais complexos:

>>> def classic_fizzbuzz(number):
        if number % 3 == 0 and number % 5 == 0:
            say = 'FizzBuzz!'
        elif number % 5 == 0:
            say = 'Buzz!'
        elif number % 3 == 0:
            say = 'Fizz!'
        else:
            say = str(number)
        
        return say

>>> classic_fizzbuzz(15)
'FizzBuzz!'

>>> classic_fizzbuzz(13)
'13'

Instruções

Neste exercício, vamos desenvolver um sistema de controlo simples para um reator nuclear.

Para que um reator produza potência, tem de estar num estado de criticalidade. Se o reator estiver num estado abaixo da criticalidade, pode sofrer danos. Se o estado do reator ultrapassar a criticalidade, pode sobrecarregar e provocar uma fusão do núcleo. Queremos reduzir a probabilidade de uma fusão do núcleo e gerir corretamente o estado do reator.

As três tarefas seguintes estão todas relacionadas com a escrita de código para manter o estado ideal do reator.

1. Verifica a criticalidade

A primeira coisa que um sistema de controlo tem de fazer é verificar se o reator está equilibrado na criticalidade. Diz-se que um reator está equilibrado na criticalidade se cumprir as seguintes condições:

  • A temperatura é inferior a 800 K.
  • O número de neutrões emitidos por segundo é superior a 500.
  • O produto da temperatura pelo número de neutrões emitidos por segundo é inferior a 500000.

Implementa a função is_criticality_balanced(), que recebe temperature, medido em kelvin, e neutrons_emitted como parâmetros, e devolve True se as condições de criticalidade se verificarem e False se não.

>>> is_criticality_balanced(750, 600)
True

2. Determina o intervalo de potência de saída

Assim que o reator começa a produzir potência, é preciso determinar a sua eficiência. A eficiência pode ser agrupada em 4 faixas:

  1. green -> eficiência de 80% ou mais,
  2. orange -> eficiência inferior a 80%, mas de pelo menos 60%,
  3. red -> eficiência inferior a 60%, mas ainda 30% ou mais,
  4. black -> eficiência inferior a 30%.

O valor percentual pode ser calculado como (generated_power/theoretical_max_power)*100, em que generated_power = voltage * current. Tem em atenção que o valor percentual normalmente não é um número inteiro, por isso certifica-te de que consideras o uso correto das comparações < e <=.

Implementa a função reactor_efficiency(<voltage>, <current>, <theoretical_max_power>), com três parâmetros: voltage, current e theoretical_max_power. Esta função deve devolver a faixa de eficiência do reator: 'green', 'orange', 'red' ou 'black'.

>>> reactor_efficiency(200,50,15000)
'orange'

3. Mecanismo à prova de falhas

A tua última tarefa consiste em criar um mecanismo à prova de falhas para evitar sobrecargas e uma fusão do núcleo. Este mecanismo determina se o reator está abaixo, igual ou acima do limiar ideal de criticalidade. A criticalidade pode depois ser aumentada, reduzida ou interrompida através da inserção (ou remoção) de barras de controlo no reator.

Implementa a função chamada fail_safe(), que recebe 3 parâmetros: temperature, medido em kelvin, neutrons_produced_per_second e threshold, e devolve um código de estado para o reator.

  • Se temperature * neutrons_produced_per_second < 90% de threshold, devolve o código de estado 'LOW', que indica que as barras de controlo têm de ser removidas para produzir potência.

  • Se o valor temperature * neutrons_produced_per_second estiver dentro de 10% de threshold (ou seja, 0-10% abaixo do limiar, exatamente no limiar, ou 0-10% acima do limiar), o reator está em criticalidade e deve ser devolvido o código de estado 'NORMAL', que indica que o reator está em condições ótimas e que as barras de controlo estão numa posição ideal.

  • Se temperature * neutrons_produced_per_second não estiver nos intervalos indicados acima, o reator está a entrar em fusão do núcleo e é preciso devolver o código de estado 'DANGER' para desligar imediatamente o reator.

>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'
Editar via GitHub A ligação abre numa nova janela ou separador
Python Exercism

Estás pronto para começar Mitigação de Fusão?

Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.