Bernd é um estudante do ensino médio que tem alguns problemas em química. Na aula, ele tem que projetar equações químicas para alguns experimentos que estão fazendo, como a combustão de heptano:
C 7 H 16 + 11O 2 → 7CO 2 + 8H 2 O
Como a matemática não é exatamente o assunto mais forte de Bernd, ele costuma ter dificuldade em encontrar as proporções exatas entre os profissionais e os educadores da reação. Como você é o tutor de Bernd, é seu trabalho ajudá-lo! Escreva um programa que calcule a quantidade de cada substância necessária para obter uma equação química válida.
Entrada
A entrada é uma equação química sem quantidades. Para tornar isso possível em ASCII puro, escrevemos quaisquer assinaturas como números comuns. Os nomes dos elementos sempre começam com uma letra maiúscula e podem ser seguidos por um minúsculo. As moléculas são separadas por +
sinais; uma seta da arte ASCII ->
é inserida entre os dois lados da equação:
Al+Fe2O4->Fe+Al2O3
A entrada é finalizada com uma nova linha e não contém espaços. Se a entrada for inválida, seu programa poderá fazer o que quiser.
Você pode supor que a entrada nunca tenha mais que 1024 caracteres. Seu programa pode ler a entrada da entrada padrão, do primeiro argumento ou de uma maneira definida por implementação em tempo de execução, se nada for possível.
Saída
A saída do seu programa é a equação de entrada aumentada com números extras. O número de átomos para cada elemento deve ser o mesmo nos dois lados da seta. Para o exemplo acima, uma saída válida é:
2Al+Fe2O3->2Fe+Al2O3
Se o número de uma molécula for 1, solte-o. Um número deve sempre ser um número inteiro positivo. Seu programa deve gerar números de forma que sua soma seja mínima. Por exemplo, o seguinte é ilegal:
40Al+20Fe2O3->40Fe+20Al2O3
Se não houver solução, imprima
Nope!
em vez de. Uma entrada de amostra que não tem solução é
Pb->Au
Regras
- Isso é código-golfe. O código mais curto vence.
- Seu programa deve terminar em tempo razoável para todas as entradas razoáveis.
Casos de teste
Cada caso de teste possui duas linhas: uma entrada e uma saída correta.
C7H16+O2->CO2+H2O
C7H16+11O2->7CO2+8H2O
Al+Fe2O3->Fe+Al2O3
2Al+Fe2O3->2Fe+Al2O3
Pb->Au
Nope!
solve(
função eeval(
para interpretar a entrada :)Respostas:
C, 442
505caracteresCorrer como:
Resultados:
fonte
Mathematica 507
Empreguei a abordagem de matriz de composição química aumentada descrita em
LRThorne, Uma abordagem inovadora para equilibrar equações de reação química: uma técnica simplificada inversa de matriz para determinar o espaço nulo da matriz. Chem.Educator , 2010, 15, .
Um pequeno ajuste foi adicionado: eu dividi a transposição do vetor de espaço nulo pelo maior divisor comum dos elementos para garantir valores inteiros em qualquer solução. Minha implementação ainda não lida com casos em que há mais de uma solução para equilibrar a equação.
Testes
Análise
Ele funciona configurando a seguinte tabela de composição química, consistindo em espécies químicas por elementos, à qual um vetor de nulidade adicional é adicionado (tornando-se a tabela de composição química aumentada:
As células internas são removidas como uma matriz e invertidas, produzindo.
A coluna mais à direita é extraída, produzindo:
Cada elemento do vetor é dividido pelo MDC dos elementos (1/8), fornecendo:
onde os valores negativos serão colocados no lado esquerdo da seta. Os valores absolutos destes são os números necessários para equilibrar a equação original:
fonte
Python, 880 caracteres
Testes:
Saída:
Pode ser bem menor que 880, mas meus olhos já estão me matando ...
fonte
Python 2, 635 bytes
contagens de bytes anteriores: 794, 776, 774, 765, 759, 747, 735, 734, 720, 683, 658, 655, 655, 654, 653, 651, 638, 637, 636 bytes.
O segundo nível de recuo é apenas uma guia, o terceiro é uma guia e, em seguida, um espaço.
Para ser honesto, esta é a resposta de jadkik94, mas muitos bytes foram raspados, eu tive que fazê-lo. Diga-me se consigo raspar alguns bytes!
fonte
''.join(map(chr,range(97,122)))
Dmap(chr,range(97,123))
funciona com 12 bytes salvos.JavaScript, 682 bytes
Essa é uma resposta muito mais desafiadora (décadas de personagens!) De Kuilin. Pode não ser competitivo porque certos recursos de JS pós-datam o desafio.
fonte
Javascript, 705 bytes
(não concorrente, alguns recursos pós-datam o desafio)
Todas as outras soluções tinham elementos de força bruta. Tentei uma abordagem mais determinística, representando a equação química como um conjunto de equações lineares e, em seguida, resolvendo usando o algoritmo de Gauss-Jordan para assumir a forma reduzida de escalão de linha dessa matriz. Para isolar o caso trivial em que tudo é zero, presumo que um dos elementos seja um número constante - e esse número seja determinado apenas por todos os números multiplicados juntos, para não ter frações. Como passo final, dividiremos cada um pelo MDC para satisfazer a última condição.
Ungolfed:
Golfe
fonte