Você e um amigo entram em um bar. O barman trata você bem, então você decide dar uma gorjeta nele. Então você pega seu confiável computador de bolso e escreve um programa rápido para calcular uma dica para você, pois ele não possui uma calculadora embutida. Mas espere! As chaves do seu operador estão quebradas! Sua tarefa é calcular uma gorjeta de 20% para qualquer valor de entrada. As entradas de teste terão a forma de xx.xx, por exemplo, 20.96. Aqui estão as regras:
- Não é possível usar o seguinte em operadores de formato matemático:
+ - * / %
(Obrigado Wally West) - Nenhum uso de funções ou APIs de porcentagem incorporadas
- Não há acesso à rede
- Sem uso
eval
ou similar - Não há calculadora do Windows (sim, as pessoas já responderam antes)
- Nenhuma função de dica integrada (não que qualquer idioma tenha uma)
A saída deve ser arredondada para duas casas decimais.
A pontuação é baseada no comprimento em bytes.
-20% se o seu programa aceitar qualquer valor de gorjeta. A entrada para quantidade será dada na forma de xx, por exemplo, 35 e não 0,35
*
?Respostas:
Javascript 81
EDIT : O resultado agora é um arredondamento real, não truncado.
Não use QUALQUER matemática aqui, apenas manipulação de cadeias e operadores bit a bit.
Todos os
+
caracteres são concatenação de string ou conversão de string para float .Funciona para qualquer entrada e saída xx.xx no formato (x) x.xx
Truque explicado: 20% é dividido por 10 e multiplicado por 2.
fonte
99.99
, isso retorna19.998
, portanto, não é "arredondado para duas casas decimais" conforme o OP.J (9 caracteres)
Uma resposta curta em J:
fonte
^
mas aqui~
indica que a ordem deve ser revertida;(^.2)
é log (0,2), e a inicial^.
que é executada por último é o logaritmo de tudo compute dpreviously: assim log (32 ^ log (0,2))Pure bash,
5043 caracteresCertamente isso será superado, mas aqui está um começo:
Conforme os comentários:
/
não é um operador de divisão aqui, faz parte de uma expansão de parâmetro de substituição de padrão%
não é um operador de módulo aqui, é parte de uma expansão de parâmetro-
não é um operador de subtração aqui, é uma negação, o que foi permitido de acordo com os comentáriosResultado:
fonte
/
faz parte de uma expansão do parâmetro bash e não um operador de divisão. Permitido ou não?Python 98 * 0,8 = 78,4
Python 74 (sem bônus)
Nota
+
é usado para concatenação de cadeias*
usado para criar cópias de stringUngolfed
Nota
No espírito da pergunta, acredito que a seguinte solução, embora siga todas as regras da pergunta, seja um abuso
Python 41
Finalmente
Se você insiste que os símbolos matemáticos são proibidos, ela é uma solução de 90 caracteres
Python 90 (sem nenhum símbolo matemático)
fonte
*
e+
estão quebradas as CHAVES (para o que você as usar).No use of the following in mathematical form operators: + - * / % (Thanks Wally West)
. Em outras palavras, a questão precisa ser reformulada. E eu não usei-los em forma matemática0.05
.`input`
(backticks incluídos) em vez deraw_input
.APL (9 caracteres, novo código com 7 caracteres, corrigido com 13 caracteres)
Calcule 20% da quantidade fornecida.
Em APL
*
é o operador exponencial.Experimente online .
Mas por que usar uma função para isso? Veja esta nova versão:
Experimente online .
Por favor, antes da votação baixa, o
*
não é proibido como uma CHAVE e não significa multiplicação aqui.OK, aqui está a versão arredondada para 2 casas decimais (Dyalog APL):
fonte
*
não é permitida em nenhuma forma matemática, de acordo com as regras do desafio.*
ser proibido como chave e não como seu significado matemático.^
) para esse operador, ou uma chamada de função é usada. Não há especificação pelo OP que*
não seja permitida apenas se for usada no contexto de multiplicação. Suspeito que seria útil que o OP decidisse sobre isso, acertar qual de nós está interpretando mal as regras do desafio e esclarecer a confusão.×
e÷
sejam permitidos, esses não estão listados.R,
30273634Atualizado para arredondar para duas casas decimais
Guardou 2 caracteres graças ao plannapus
Cria um vetor de 0 a x e pega o 2º elemento.
Exemplo:
Mais explicações:
cria um vetor de comprimento 6 de 0 ao valor de entrada x, com os valores igualmente espaçados.
O primeiro valor é então 0%, o segundo 20%, o terceiro 40%, etc.
fonte
dc + sed + pipes (44 caracteres)
Minha terceira resposta (uma APL, uma J e agora uma com o antigo e venerável dc).
Ele solicitará uma entrada INTEGER e calculará 20% de uma maneira complicada. A entrada é convertida na base 5 (fácil de fazer com muitas outras ferramentas, mas espere ...); um ponto é acrescentado antes do último dígito com sed (infelizmente, dc não consegue lidar muito bem com seqüências de caracteres) e ENTÃO, dc converte de volta da base 5 em um número flutuante (nem todas as ferramentas podem fazer isso).
fonte
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. Com isso e removendosed
s-e
s, isso é 42. Mas o resultado ainda não foi especificado (sem duas casas decimais)Python, 88
Não é nem um pouco curto, mas isso demonstra como deve ser feita uma divisão mental normal por cinco. Isso pressupõe que a entrada deve estar no formato xx.xx
Ou para entrada de qualquer tamanho, é necessário adicionar 3 caracteres.
Explicação: Tomamos a entrada como sequência e, em seguida, movemos o ponto decimal uma casa para a frente (dividindo por 10). Em seguida, o convertemos para um float e usamos a
ldexp
função para multiplicá-lo por 2.Observe que nesta resposta, os
+
operadores de concatenação são string e%
são usados para formatarprint
.Se você insistir em não usar nenhum desses caracteres, aqui está uma solução de 159 caracteres:
fonte
+
e-
é permitido, pois as KEYS estão quebradas (o que elas significam no seu pedaço de código)..split('.')
na minha resposta, picada de um caracteredc + sed - 45 * 0,8 = 36
(Inspirado na resposta de ברוכאל )
Execuções de exemplo (a entrada é aceita via STDIN):
fonte
.0+
ideia é ótima; Votei na sua solução inspirada na minha, mas alguns podem dizer que você está usando adição; talvez alguma solução alternativa? Eu tentei,dc -e 9k5o?v2^p
mas tem mais 2 caracteres.-20%
!Mathematica, 19
No uso dos operadores matemáticos de
+
,-
,*
,/
, ou%
. Usa propriedades dos logaritmos para calcular a resposta; quando você simplifica a expressão, você obtém.2*Input[]
Com o bônus ( 30 * 0,8 = 24 ):
Insira a porcentagem primeiro e depois a quantidade.
Ao simplificar a expressão, você obtém
Input[]*Input[]*.01
.Agradecemos a ברוכאל pela ajuda na redução do código.
fonte
Log[E^2]
ouLog[E^Input[]]
pode ser escrito mais em breve. Even10^-1
pode ser escrito.01
(embora eu não use o Mathematica, mas tenho certeza que ele pode). A expressão inteira(E^10^-1)^Log[E^2]
parece ser algo comoE^.2
, não é?TI-89 Básico - 39 * 0,8 = 31,2
Funciona inserindo os dois números e, em seguida, usando as propriedades do logaritmo para calcular
x * y / 100
.Se eu puder assumir a entrada do posicionamento em variáveis globais
x
ey
, isso é muito menor, para uma pontuação de 17 * 0,8 = 13,6 :Sem bônus ( 12 ):
Mas se precisar ser envolvido em uma função, isso funcionará ( 38 caracteres, por 30,4 ):
fonte
Input x,y
??? Trabalha em 83/84.Input{x,y}
(não 83/84 temln
?)žr¹msmžr.n
- porta descarada deste código para 05AB1E.PHP 107 * .8 = 85,6
não posso realmente executar código-golfe com PHP, mas pelo menos eu posso operar com strings. aceita os dois números como argumentos da linha de comando.
tive que reverter isso duas vezes desde que eu não posso usar -2 :(
fonte
Python,
81 8089 caracteresExplicação
Tecnicamente, isso é trapaça, pois trunca para duas casas decimais em vez de arredondá-la, mas posso argumentar que ela é arredondada para baixo (melhor para você, menos dica).
fonte
[-3:]
vez de[-3:-1]
JavaScript 251 (restrição forçada: não +, -, *,? Ou% de qualquer maneira)
Embora eu saiba que isso não vai ganhar, imaginei que tentaria obter pontos brownie adotando uma abordagem muito rigorosa e nem sequer pensaria em usar os operadores restritos de qualquer forma ou forma ... como resultado, criei essa beleza ...
Eu usei operações bit a bit para criar a função Add
A
e comecei a encadear a partir daí:A função de divisão inteira
D
usou uma série de Adição Negada (subtração na forma deA(x,A(~y,1)
sobre um loop; o resto é manipulação e concatenação de cadeias, para evitar o uso de+
operadores de concatenação ...O número deve ser fornecido na forma decimal com duas casas decimais para que isso funcione ...
fonte
Perl,
5060 bytesA entrada é esperada em STDIN. Ele deve conter o separador decimal com dois dígitos decimais. A saída é gravada em STDOUT.
Atualização: a etapa
$_<<=1
remove os zeros iniciais. Portantom|\d{3}$|
, não corresponderia às contas <1. Portanto,$_="00$
foram adicionados dez bytes , agora mesmo0.00
funciona.Exemplos:
20.96
saída:4.19
12.34
saída:2.47
Versão não destruída:
Primeiro, o número é lido em STDIN. Em seguida, o ponto decimal é removido, multiplicado por 100. Em seguida, o valor é dobrado por um operador de deslocamento. Em seguida, o ponto decimal é reinserido e o resultado é impresso e arredondado para dois dígitos decimais.
50 bytes, se a conta for ≥ 1:
Se
x.xx
for maior ou igual a1.00
, 10 bytes podem ser removidos:fonte
JavaScript (ES6) (Regex) 142
Regex é ótimo e pode fazer muitas coisas. Pode até fazer matemática!
Versão legível:
A
tip()
função espera o argumento String, em vez de Number.Todas as instâncias de
*
,/
,+
não estão relacionados com operações matemáticas.+
é concatenação de strings em todas as instâncias em que é usado.*
faz parte da sintaxe RegExp/
é o delimitador do literal RegExpA entrada deve ser usada
.
como ponto decimal e deve haver haver 2 dígitos após o ponto decimal.Snippet de pilha
fonte
Haskell 32 caracteres -20% = 25,6 caracteres
Abusa do fato de que expoentes se tornam multiplicação em logaritmos.
fonte