Voltar para a aula de química


15

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

C4H10dá 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 + 2CO2e 2CH4+4O2>4H2O+2CO2sã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 é , então o programa com a menor quantidade de bytes vence!

totalmente diferentes, mas relacionadas: Estruturas Desenho de Lewis de alcanos
Não que Charles

Então, podemos assumir que a entrada terá fórmulas corretas?
TanMath

@TanMath, sim, você não precisa se preocupar com fórmulas inválidos
Adnan

"use consistentemente os espaços" - consistentemente usando 0 espaços contados?
Mego

1
@Mego, não. Usar 0 espaços não é usar espaços, por isso a regra não se aplica #
315 Adnan

Respostas:



7

Python 3, 86 * 0,9 = 77,4 bytes

s=input()
N=int(s.split('H')[1])
print("2%s + %dO2 > %dH20 + %dCO2"%(s,N*1.5-2,N,N-2))

Extrai o número de H's em vez do número de C' s da entrada. Isso evita casos especiais CH4e simplifica as expressões de saída em termos de N=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 que N*3/2-2) fornece um valor flutuante, mas a formatação da string o converte em um int.


4

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!

classe A {public static void main (String [] a) {String s = a [0] .substring (1, a [0] .indexOf ("H")); long n = Long.parseLong ((s.length ()> 0)? S: "1"; System.out.printf ("2% s +% dO2>% dH2O +% dCO2", a [0], 3 * n + 1,2 * n + 2 , 2 * n);}}

Bem simples. Basicamente, cortei a entrada de Cpara He recebo essa substring. Se não for nada, eu defino num. Caso contrário, defino-o como o número entre Ce H. O código a seguir apenas imprime e coloca na notação adequada.

Ungolfed:

classe A{
    public static void main (String [] a) {
         String s = a [0] .substring (1, a [0] .indexOf ("H"));
         long n = Long.parseLong ((s.length ()> 0)? s: "1");
         System.out.printf ("2% s +% dO2>% dH2O +% dCO2", a [0], 3 * n + 1,2 * n + 2,2 * n);
    }
}

2
Boa resposta, mas você deve usar STDIN e não os argumentos da linha de comando. Embora você possa reduzi-lo usando em printfvez de +(-11 da sua pontuação bruta, se eu contar corretamente).
TNT

Foi-me dito que o uso de argumentos de linha de comando é uma alternativa aceitável ao STDIN. Além disso, você poderia esclarecer como pretende usar printf? (Um pouco finicky sobre isso, nunca usei isso antes: D.)
Addison Crump

printfusa mecânica de java.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 .
TNT

E o fato de que argumentos de linha de comando são aceitáveis ​​no lugar de STDIN é uma novidade nova (e bastante útil) para mim. :)
TNT

1
@VoteToClose Sim, você está se machucando com Java.
precisa saber é o seguinte

4

Python 2, 122 91 * 0,9 = 81,9 bytes

i=input()
n=2*int(i[1:i.find('H')]or 1)
print'2%s + %dO2 > %dH2O + %dCO2'%(i,n*3/2+1,n+2,n)

3

Javascript ES6, 63 * .9 = 56,7 bytes

_=>`2${_} + ${$=_.split`H`[1],$*1.5-2}O2 > ${$}H2O + ${$-2}CO2`

Semelhante à minha resposta ESMin.


3

Pitão, 69 bytes * 0,9 = 62 63 * 0,9 = 57 56 * 0,9 = 50 53 * 0,9 = 48 bytes

Js>z+xz\H1s[\2z%" + %dO2 > %dH2O + %dCO2"[-*1.5J2J-J2

É 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


Você gasta seis bytes no espaçamento, mas obtém apenas cinco bytes do bônus, portanto não vale a pena.
lirtosiast

2

Javascript ES6, 96 * 0,9 = 86,4

f=s=>`2C${(n=(s.match(/\d+(?!.*\d)/)[0]-2))>2?n/2:''}H${n+2} + ${1.5*n+1}O2 > ${n+2}H2O + ${n}CO2`

2

CJam, 45 44 bytes

2r_'H/1=[i_((_2/1$+)@@]"+%dO2>%dH2O+%dCO2"e%

Experimente online

Para evitar invólucro especial CH4, não uso o primeiro número e só extraio o número após o H. Isso fornece o valor de 2n+2. Os valores restantes são calculados com base nisso e formatados.

Explicação:

2       Push leading 2 for output.
r       Get input.
_'H/    Copy and split at 'H.
1=      Take second part after split, this is 2n+2.
[       Start list.
  i       Convert string value to integer.
  _((     Copy and decrement twice, giving 2n.
  _2/     Copy and divide by 2, giving n.
  1$      Copy the 2n to the top.
  +       Add, to get 3n.
  )       Increment, giving 3n+1. We now have 2n+2, 2n, 3n+1 on stack.
  @@      Rotate top 3 entries twice, to get 3n+1, 2n+2, 2n.
]       Close list.
"+%dO2>%dH2O+%dCO2"
        Format string for output.
e%      "printf" operator.

2r_[[~]W=_2/(3*)\_2-]"+%dO2>%dH2O+%dCO2"e%salva um byte.
Dennis

2

Perl, (84 + 1) * 0,9 = 76,5

(+1 caractere para correr com a -nbandeira)

Meu primeiro golfe Perl!

@x=(1,m/C(\d)/g);$n=$x[$#x];say"2$_ + ".(3*$n+1)."O2 > ".(($n*=2)+2)."H20 + ${n}CO2"

É importante que o STDIN não contenha uma nova linha à direita. Exemplo de uso:

llama@llama:...code/perl/ppcg64412chemistry$ printf CH4 | perl -n chemistry.pl
2CH4 + 4O2 > 4H20 + 2CO2

Ungolfed-ish:

#!/usr/bin/perl
use 5.10.0;

$_ = 'C3H8';
my @x = (1, m/C(\d)/g);
my $n = $x[$#x];
say "2$_ + ".(3*$n+1)."O2 > ".(($n*=2)+2)."H20 + ${n}CO2";

As linhas

my @x = (1, m/C(\d)/g);
my $n = $x[$#x];

são bastante interessantes aqui. $#xrepresenta 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 do C(\d)regex, se existir, ou 1não. (Perl não se importa que seja uma string em todos os outros casos, exceto 1; você pode usar operadores numéricos em strings muito bem no Perl.)


1

JS, 118 (106) bytes

x=prompt();y=x.replace("CH","C1H").match(/\d{1,}/g)[0];alert(2+x+" + "+(3*y+1)+"O2 > "+(2*y+2)+"H2O + "+(2*y)+"CO2");

1

51, 51 * .9 = 45,9 caracteres / 64 * .9 = 57,6 bytes

a=ïČ`H”[1],`2⦃ï} + ⦃a*1.5-2}O2 > ⦃a}H2O + ⦃a-2}CO2`

Try it here (Firefox only).

Explicação

a=ïČ`H”[1],      // split input along H to get 2n+2
`  2⦃ï}          // 2C(n)H(2n+2) – this is the same as 2[input alkane's formula]
   + ⦃a*1.5-2}O2 // + 2(3n+1)O2
   > ⦃a}H2O      // > (2n+2)H2O
   + ⦃a-2}CO2    // + (2n)O2
`                // implicitly output the template string above

Quem votou mal na minha resposta, eu poderia obter uma explicação?
Mama Fun rolo

1

Python, 0,9 * 195 = 175 0,9 * 190 = 171 0,9 * 148 = 133 bytes

i=raw_input()
O=3*int(i[1:i.find('H')]or 1)+1;C=2*int(i[1:i.find('H')]or 1);print"2"+i+" + "+`O`+"O2"+" > "+i[i.find('H')+1:]+"H2O"+ " + "+`C`+"CO2"

Experimente aqui


Você não precisa de um espaço entre printe uma "personagem, ea CO2variável pode ser nomeado algo mais curto :)
undergroundmonorail

@undergroundmonorail agradecimentos #
TanMath

Desde i[1]tem a garantia de ser "H"ou um dígito, você pode salvar outro byte com if i[1]>"9"(ou substitua "9"com qualquer outro personagem com um valor ASCII 58-71)
undergroundmonorail

1

F #, 113

let s=stdin.ReadLine()
float s.[1+s.IndexOf 'H'..]|>fun f->printf"2%s + %gO2 > %gH2O + %gCO2"s<|f*1.5-2.<|f<|f-2.

1

MATLAB, 96 * 0,9 = 86,4 bytes

s=input('');i=[sscanf(s,'C%dH'),1];n=i(1);fprintf('%s + %dO2 > %dH2O + %dCO2',s,3*n+1,2*n+2,2*n)

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 CH4em 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 .


1

C ++, 160 * 0,9 = 144 bytes

#include<iostream>
int main(){int n=1,t;std::cin.get();std::cin>>n;t=2*n;printf("2C");n-1&&printf("%i",n);printf("H%i + %iO2 > %iH2O + %iCO2",t+2,t+n+1,t+2,t);}

Um pouco mais do que eu esperava. Lê o primeiro caractere e o descarta, depois lê int e gera o resultado. O problema é nser 1. Não consigo pensar em uma maneira mais curta de produzi-lo.

Ungolfed

#include <iostream>
int main()
{
    int n = 1, t;
    std::cin.get();
    std::cin >> n;
    t = 2 * n;
    printf("2C");
    n - 1 && printf("%i", n);
    printf("H%i + %iO2 > %iH2O + %iCO2", t + 2, t + n + 1, t + 2, t);
}

1

Clojure / ClojureScript, 98 * 0,9 = 88,2 bytes

#(let[n(max 1(int((re-find #"C(.*)H"%)1)))m(* 2 n)](str "2"%" + "(inc(* 3 n))"O2 > "(+ 2 m)"H2O + "m"CO2"))

Cria uma função anônima. Experimente indo aqui e entrando (def f #(let...)), então (f "C3H8").


1

Excel, 123 * 0,9 = 110,7 bytes

=="2"&A1&" + "&(3*MID(A1,FIND("H",A1)+1,9)/2-2)&"O2 > "&MID(A1,FIND("H",A1)+1,9)&"H2O + "&(MID(A1,FIND("H",A1)+1,9)-2)&"CO2"

Se pudéssemos considerar a entrada CH4 como C1H4, podemos ser reduzidos para 122 * 0,9 = 109,8 bytes

="2"&A1&" + "&3*MID(A1,2,FIND("H",A1)-2)+1&"O2"&" > "&MID(A1,FIND("H",A1)+1,9)&"H2O + "&(MID(A1,FIND("H",A1)+1,9)-2)&"CO2"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.