Introdução
Uma das primeiras coisas que aprendi em química foi dar a fórmula para a combustão de alcanos. O exemplo mais básico era: 2CH4 + 4O2 > 4H2O + 2CO2
. Observe que a equação poderia ter sido simplificada dividindo cada coeficiente por 2, obteríamos CH4 + 2O2 > 2H2O + CO2
. Para facilitar as coisas, vamos ignorar esta etapa .
Você pode ver que, com a combustão de qualquer alcano, é usado oxigênio. Após a reação, apenas CO2 e H2O são produzidos.
A tarefa:
Forneça um programa completo que receba informações do STDIN ou do equivalente mais próximo possível e produza a reação total usando STDOUT ou o equivalente mais próximo possível.
A entrada sempre estará no formato C(n)H(2n+2)
, com n > 0
. Estas são algumas entradas de exemplo:
CH4
C2H6
C3H8
C4H10
C5H12
C6H14
etc.
Uma dica útil:
Todo alcano possui um padrão na reação de combustão:
2C(n)H(2n+2) + (3n+1)O2 > (2n+2)H2O + (2n)CO2
por exemplo
C4H10
dá a seguinte equação: 2C(4)H(2*4+2) + (3*4+1)O2 > (2*4+2)H2O + (2*4)CO2
. Depois de calcular tudo, obtemos esta equação final:2C4H10 + 13O2 > 10H2O + 8CO2
Exemplos:
input: CH4
output: 2CH4 + 4O2 > 4H2O + 2CO2
input: C3H8
output: 2C3H8 + 10O2 > 8H2O + 6CO2
input: C4H10
output: 2C4H10 + 13O2 > 10H2O + 8CO2
input: C12H26
output: 2C12H26 + 37O2 > 26H2O + 24CO2
Regras:
- Você precisa fornecer um programa completo.
- Seu programa precisa receber informações do STDIN ou o equivalente mais próximo, se não for possível.
- Seu programa precisa produzir usando STDOUT, ou o equivalente mais próximo, se não for possível.
- Observe que eu usei espaços para os exemplos para aumentar a legibilidade, eles não são necessários .
2CH4 + 4O2 > 4H2O + 2CO2
e2CH4+4O2>4H2O+2CO2
são ambas saídas válidas. No entanto, se você usar espaços constantemente para a saída, receberá um bônus de -10% - Isso é código-golfe , então o programa com a menor quantidade de bytes vence!
Respostas:
Pitão, 40 bytes
Experimente online. Suíte de teste.
fonte
Python 3, 86 * 0,9 = 77,4 bytes
Extrai o número de
H
's em vez do número deC
' s da entrada. Isso evita casos especiaisCH4
e simplifica as expressões de saída em termos deN=2n+2
.A saída possui parâmetros conectados via formatação de string. O primeiro summand é apenas a string de entrada e o restante possui números calculados conectados. Observe que
N*1.5-2
(o mesmo queN*3/2-2
) fornece um valor flutuante, mas a formatação da string o converte em um int.fonte
Java, 0,9 * 202 = 181,8 bytes
Às vezes, me pergunto se estou me machucando com Java.
Agradecemos a @TNT e @TFeld por economizar 20 bytes!
Bem simples. Basicamente, cortei a entrada de
C
paraH
e recebo essa substring. Se não for nada, eu definon
um. Caso contrário, defino-o como o número entreC
eH
. O código a seguir apenas imprime e coloca na notação adequada.Ungolfed:
fonte
printf
vez de+
(-11 da sua pontuação bruta, se eu contar corretamente).printf
? (Um pouco finicky sobre isso, nunca usei isso antes: D.)printf
usa mecânica dejava.util.Formatter
. Você pode ter uma sequência para imprimir, como "% d", na sua declaração de impressão e, depois, algum valor ou variável que será impresso. Pode ser útil em situações em que você tem muitas variáveis para imprimir, por exemplo .Python 2,
12291 * 0,9 = 81,9 bytesfonte
Javascript ES6, 63 * .9 = 56,7 bytes
Semelhante à minha resposta ESMin.
fonte
Pitão,
69 bytes * 0,9 = 6263 * 0,9 = 5756 * 0,9 = 5053 * 0,9 = 48 bytesÉ exatamente como a resposta do xnor, onde eu uso os valores H. Uma variável J é usada para armazenar a quantidade de H na fórmula molecular da molécula.
Experimente aqui
fonte
Javascript ES6, 96 * 0,9 = 86,4
fonte
CJam,
4544 bytesExperimente online
Para evitar invólucro especial
CH4
, não uso o primeiro número e só extraio o número após oH
. Isso fornece o valor de2n+2
. Os valores restantes são calculados com base nisso e formatados.Explicação:
fonte
2r_[[~]W=_2/(3*)\_2-]"+%dO2>%dH2O+%dCO2"e%
salva um byte.Perl, (84 + 1) * 0,9 = 76,5
(+1 caractere para correr com a
-n
bandeira)Meu primeiro golfe Perl!
É importante que o STDIN não contenha uma nova linha à direita. Exemplo de uso:
Ungolfed-ish:
As linhas
são bastante interessantes aqui.
$#x
representa o "último índice preenchido" de@x
(e o destaque da sintaxe de SE acha que é um comentário porque é idiota), por$x[$#x]
isso selecionará a parte capturada doC(\d)
regex, se existir, ou1
não. (Perl não se importa que seja uma string em todos os outros casos, exceto1
; você pode usar operadores numéricos em strings muito bem no Perl.)fonte
JS, 118 (106) bytes
fonte
51, 51 * .9 = 45,9 caracteres / 64 * .9 = 57,6 bytes
Try it here (Firefox only).
Explicação
fonte
Python,
0,9 * 195 = 1750,9 * 190 = 1710,9 * 148 = 133 bytesExperimente aqui
fonte
print
e uma"
personagem, eaCO2
variável pode ser nomeado algo mais curto :)i[1]
tem a garantia de ser"H"
ou um dígito, você pode salvar outro byte comif i[1]>"9"
(ou substitua"9"
com qualquer outro personagem com um valor ASCII 58-71)F #, 113
fonte
MATLAB, 96 * 0,9 = 86,4 bytes
Bastante auto-explicativo. Pega uma string de entrada (é necessário colocá-la entre aspas para que o MATLAB não tente executá-la!). Em seguida, converte o número entre C e H na entrada em decimal. O valor 1 é anexado como uma matriz à saída do sscanf, de modo que, no caso
CH4
em que extraímos o primeiro índice da matriz emn
, obtemos 1 se não houver número entre C e H. Em seguida, apenas imprima com os espaços seguindo a fórmula na pergunta.Isso também deve funcionar com o Octave usando o intérprete online aqui .
fonte
C ++, 160 * 0,9 = 144 bytes
Um pouco mais do que eu esperava. Lê o primeiro caractere e o descarta, depois lê int e gera o resultado. O problema é
n
ser 1. Não consigo pensar em uma maneira mais curta de produzi-lo.Ungolfed
fonte
Clojure / ClojureScript, 98 * 0,9 = 88,2 bytes
Cria uma função anônima. Experimente indo aqui e entrando
(def f #(let...))
, então(f "C3H8")
.fonte
Excel, 123 * 0,9 = 110,7 bytes
Se pudéssemos considerar a entrada CH4 como C1H4, podemos ser reduzidos para 122 * 0,9 = 109,8 bytes
fonte
Gelatina , 33 bytes
Experimente online!
O bônus não ajuda aqui.
fonte