Sua tarefa é escrever um programa que receba entradas como esta:
a + b * c + a / 2
e gerará o código-fonte para um programa que recebe a entrada do usuário e avalia a expressão.
A expressão pode conter os operadores +
, -
, *
, /
; variáveis minúsculas de uma letra; e números inteiros entre 0 e 32000. A precedência aritmética padrão deve ser seguida corretamente. A expressão é limitada a 26 variáveis únicas de a a z. No entanto, uma única variável pode aparecer mais de uma vez.
Você pode assumir que a expressão de entrada é válida (segue estas regras).
O programa gerado deve solicitar a entrada do usuário neste formulário, solicitando apenas uma vez para cada variável:
a =
A entrada do usuário de 0 a 32000 deve ser tratada corretamente. Em seguida, imprimirá a expressão e o resultado correto. Você pode usar aritmética de número inteiro ou de ponto flutuante. Os cálculos devem ser realizados com pelo menos precisão de 32 bits. Além disso, você não precisa se preocupar com excesso ou divisão por zero.
Exemplo de um programa Perl gerado sem golfe para a expressão acima:
print "a = ";
my $a = <>;
print "b = ";
my $b = <>;
print "c = ";
my $c = <>;
print "a + b * c + a / 2 = " . ($a + $b * $c + $a / 2);
Exemplo de entrada e saída do programa gerado para a expressão acima:
a = 1
b = 2
c = 3
a + b * c + a / 2 = 7.5
A pontuação é calculada como o comprimento do programa + o comprimento do programa gerado para esta expressão:
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000
Menor pontuação ganha.
Atualização: Apenas para destacar alguns requisitos do problema, conforme declarado acima:
- A saída do programa deve ser o código fonte de outro programa que avalie a expressão.
- O programa deve imprimir a expressão original . Talvez haja alguma ambiguidade nisso (alguém poderia argumentar que
a+b
é a mesma expressão quea + b
), mas, para maior clareza, digamos que deve ser a expressão original com o espaço em branco intacto. Todas as respostas válidas até agora o fizeram dessa maneira.
\pL
pode substituir[a-z]
. Não há necessidade dedo
bloqueio. Pode simplesmente escrever:${$&}//=print"$& = "and<>
\pL
feito. Não é possível usarand
em nenhum dos programas, porque a precedência é muito baixa;and
tem precedência menor que//=
.Lua, 202 + 166 = 368
Arquivo "generate_code.lua"
Uso:
Código gerado (a ordem das variáveis não está especificada):
Código gerado em ação:
fonte
Tcl 198 + 155 = 352
gera
fonte
foreach
=>lmap
;va
=>v
Python 125 + 151 = 276
Agora executando:
fonte
z=sorted(set(filter(str,isalpha,t)))
porz=''.join(set(filter(str.isalpha,t)))
.