... ou existe?
Seu desafio é analisar minha fatura de almoço, que contém o preço base, dicas, descontos, cupons e extras e descobrir se meu almoço foi de US $ 0 ou menos . Se esta é a entrada:
12.34
15 tip
25 discount
1.5 extra
2 coupon
Então a saída pode ser false
. Veja como funciona:
12.34
é o preço base.
15 tip
significa adicionar 15% ao total.
25 discount
significa subtrair 25% do total.
1.5 extra
significa adicionar 1,5 ao total.
2 coupon
significa subtrair 2 do total.
Pode haver várias dicas, descontos, cupons e extras, mas sempre haverá um preço base.
Então fazemos (12.34 * 1.15) * 0.75 + 1.5 - 2
para uma saída de 10.14. 10.14 é maior que 0, então produzimos false. Meu almoço não foi de graça.
Regras
number tip
significa adicionar porcentagem do número ao total.
number discount
significa subtrair por cento do número do total
number extra
significa adicionar número ao total
number coupon
significa subtrair número do total
Outro exemplo:
10
20 tip
20 discount
2 coupon
2 coupon
1 coupon
50 discount
2.55 coupon
O preço é -0.24
((10 * 1,20 * 0,80 - 2 - 2 - 1) * 0,5 - 2,55), portanto a saída é verdadeira (meu almoço foi grátis.)
Notas:
- A precisão deve ter pelo menos 2 casas decimais.
- Você pode receber a entrada como uma sequência de caracteres com novas linhas (nova linha à direita opcional) ou outro caractere de separação, ou uma matriz / lista das entradas.
15 tip
como0.15 tip
Respostas:
05AB1E ,
373334 bytesExperimente online!
Explicação
Empresta o
mod 7
truque da resposta de Jonathan Allan Jellyfonte
1
quando o valor é <1.JavaScript (ES6),
8885 bytesRecebe entrada como uma matriz de seqüências de caracteres. Retorna
0
para não grátis ou1
de graça.Como funciona
Cada linha é dividida no espaço para obter
a
= quantidade,b
= tipo de operação. Se não houver nenhuma operação (como é o caso na primeira linha),b
é definido por padrão como"e"
"extra".Para adicionar a quantidade correta ao total
t
, usamos um objeto cujas chaves são a primeira letra da operação:Nota : Se a conta consistisse em apenas um elemento,
map()
retornaria uma matriz de elemento único que seria coagida a um número inteiro quando aplicado o|
operador, fazendo com que o teste final falhasse. Mas o OP confirmou que isso não pode acontecer. (Matrizes de 2 ou mais elementos são coagidas a 0.)Demo
Mostrar snippet de código
fonte
CJam ,
4542 bytesTome a entrada como uma matriz de seqüências de caracteres e use a dica e o desconto como decimais.
Experimente online!
Explicação
O código que é avaliado dependendo das primeiras letras:
fonte
Geléia ,
4239 bytesRecebe uma lista de strings com números decimais formatado
(Zeros irá funcionar, mas têm o efeito secundário de impressão zeros para stdOut antes de o resultado final).
Experimente online! - não é grátis; ou grátis .
Quão?
fonte
GNU sed + dc,
117111107 bytesUsando o
-z
sinalizador de intérprete (incluído na pontuação como 1 byte):Explicação
Como a entrada já está muito próxima da notação polonesa reversa, é uma questão simples de transformar
extra
ecoupon
para+
e-
, e não muito mais, alterar as porcentagens em multiplicadores. Em seguida, invoquedc
e produza um resultado legível, dependendo de-
sua localização (temos que negar o resultado, portanto,-
implica "não livre"; caso contrário, 0 seria um caso especial que precisaria de seu próprio tratamento).Exemplo
O segundo caso da pergunta é:
Isso se torna este
dc
programa:Resultando em:
fonte
JavaScript,
173169145 bytesAinda deve haver muito golfe para fazer
Experimente online!(145 bytes atualmente)
Experimente:
Obrigado a programmer5000 por todos os seus conselhos sobre golfe
fonte
{w=i.split`<nl>`
onde <nl> é um literal de nova linhaf=
peça, isso é permitido pelas regras e pode ser substituído$.split(' ')
por$.split` `
.JavaScript (ES6),
97107Insira como uma sequência multilinha com uma nova linha à direita.
O regexp divide a parte do texto numérico e opcional para cada linha em d e b .
Os cálculos devem ser mais ou menos óbvios. Apenas algumas notas:
- usando
-=
para evitar problemas misturando número com strings- a soma é negada para salvar 1 byte; portanto, a última verificação é para em
>= 0
vez de<= 0
PS ainda muito mais tempo do que o @ Arnauld. Ratos.
Teste
fonte
C #
324219 bytesNão é bonito e provavelmente não é o melhor caminho, mas aqui está. Requer que a entrada seja passada como uma matriz de seqüências de caracteres e dicas / descontos passados como flutuadores (
0.15 tip
vez de15 tip
), pois isso foi esclarecido como aceitável nos comentários das especificações.Explicação:
Deve haver uma maneira melhor de fazer isso, mas isso funciona pelo menos
fonte
100
nat
agência.float.Parse(s.Split(' ')[0])
algo para reduzir a duplicação. Isso economizará cerca de 80 caracteres.PowerShell ,
218156143 bytesExperimente online!
EDITAR bytes salvos dividindo a variável canalizada previamente
EDIT 2 Armazenei a segunda parte da string para que eu pudesse fazer melhores chamadas curinga
fonte
Python 133 bytes
Semelhante à versão JavaScript ES6. Mas a conversão de tipo é necessária para
float
valores em Python.Explicação:
Extraia o primeiro valor e converta-o para flutuar.
Para cada outra linha na fatura:
float
dict
para selecionar a operação correta de acordo com a primeira letraUso:
fonte
Java 227 bytes
Já faz um tempo e ainda não há resposta Java que eu possa ver, então aqui está minha resposta C # portada para Java, ao custo de 8 bytes
Para uma explicação e tal, veja minha resposta em C #
Assim, essa resposta espera que a gorjeta e o desconto sejam passados como flutuadores (
0.15
não15
)fonte
var
tipo genérico, e lambdas (Eu sei que Java tem-los, mas C #' s são Golfier)Jq 1.5 ,
129119114112 bytesExpandido
Experimente online!
fonte