Desafio
Dado um número (ponto flutuante / decimal), retorne seu recíproco, ou seja, 1 dividido pelo número. A saída deve ser um número decimal / ponto flutuante, não apenas um número inteiro.
Especificação detalhada
- Você deve receber entrada na forma de um número decimal / ponto flutuante ...
- ... com pelo menos 4 dígitos significativos de precisão (se necessário).
- Mais é melhor, mas não conta na pontuação.
- Você deve produzir, com qualquer método de saída aceitável ...
- ... o recíproco do número.
- Isso pode ser definido como 1 / x, x⁻¹.
- Você deve produzir com pelo menos 4 dígitos significativos de precisão (se necessário).
A entrada será positiva ou negativa, com valor absoluto no intervalo [0,0001, 9999] inclusive. Você nunca terá mais que 4 dígitos além do ponto decimal, nem mais que 4 começando com o primeiro dígito diferente de zero. A saída precisa ser precisa até o quarto dígito, a partir do primeiro dígito diferente de zero.
(Obrigado @MartinEnder)
Aqui estão algumas entradas de amostra:
0.5134
0.5
2
2.0
0.2
51.2
113.7
1.337
-2.533
-244.1
-0.1
-5
Observe que você nunca receberá entradas com mais de 4 dígitos de precisão.
Aqui está uma função de exemplo no Ruby:
def reciprocal(i)
return 1.0 / i
end
Regras
- Todas as formas de saída aceitas são permitidas
- Falhas padrão proibidas
- Isso é código-golfe , a resposta mais curta em bytes vence, mas não será selecionada.
Esclarecimentos
- Você nunca receberá a entrada
0
.
Recompensas
Esse desafio é obviamente trivial na maioria dos idiomas, mas pode oferecer um desafio divertido em idiomas mais esotéricos e incomuns; portanto, alguns usuários desejam conceder pontos por fazer isso em idiomas incomumente difíceis.
O @DJMcMayhem concederá uma recompensa de +150 pontos à resposta mais curta ao cérebro, já que o cérebro é notoriamente difícil para números de ponto flutuanteA @ L3viathan concederá uma recompensa de +150 pontos à resposta mais curta do OIL . OIL não possui um tipo de ponto flutuante nativo nem possui divisão.
A @Riley concederá uma recompensa de +100 pontos à resposta sed mais curta.
O @EriktheOutgolfer concederá uma recompensa de +100 pontos à resposta mais curta do Sesos. A divisão em derivados do cérebro como o Sesos é muito difícil, sem falar na divisão de ponto flutuante.
Eu ( @Mendeleev ) atribuirei uma recompensa de +100 pontos à resposta mais curta da Retina.
Se houver um idioma que você acha divertido ver uma resposta e estiver disposto a pagar o representante, adicione seu nome a esta lista (classificado pelo valor da recompensa)
Entre os melhores
Aqui está um snippet de pilha para gerar uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
fonte
1/x
.Respostas:
Brain-Flak ,
772536530482480 + 1 = 481 bytesComo o Brain-Flak não suporta números de ponto flutuante, tive que usar a
-c
flag para ordenar a entrada e a saída com strings, daí o +1.Experimente online!
Explicação
A primeira coisa que precisamos cuidar é o caso negativo. Como o recíproco de um número negativo é sempre negativo, podemos simplesmente manter o sinal negativo até o fim. Começamos fazendo uma cópia do topo da pilha e subtraindo 45 (o valor ASCII de
-
) dela. Se for esse o caso, colocamos um zero no topo da pilha; se não, não fazemos nada. Em seguida, pegamos o topo da pilha para ser colocado no final do programa. Se a entrada começou com um-
este ainda é um-
no entanto, se ele é não acabamos pegando que o zero que colocamos.Agora que isso está fora do caminho, precisamos converter as realizações ASCII de cada dígito para os valores reais (0-9). Também vamos remover o ponto decimal
.
para facilitar os cálculos. Como precisamos saber onde o ponto decimal começou quando o reinserimos posteriormente, armazenamos um número para rastrear quantos dígitos estavam à frente do.
na barra.Aqui está como o código faz isso:
Começamos subtraindo 46 (o valor ASCII de
.
) de cada elemento da pilha (movendo-os simultaneamente para o offstack). Isso fará com que cada dígito seja mais dois do que deveria, mas fará.
exatamente o zero.Agora, movemos tudo para a pilha esquerda até atingirmos um zero (subtraindo dois de cada dígito enquanto avançamos):
Registramos a altura da pilha
Mova todo o resto para a pilha esquerda (subtraindo novamente os dois últimos de cada dígito à medida que os movemos)
E colocar a altura da pilha que registramos
Agora queremos combinar os dígitos em um único número base 10. Também queremos fazer uma potência de 10 com o dobro dos dígitos como esse número para uso no cálculo.
Começamos configurando um 1 no topo da pilha para aumentar a potência de 10 e empurrando a altura da pilha menos uma para a pilha on para o uso de loop.
Agora fazemos um loop na altura da pilha menos 1 vezes,
Cada vez que multiplicamos o elemento superior por 100 e, por baixo, multiplicamos o próximo elemento por 10 e adicionamos isso ao número abaixo.
Terminamos nosso loop
Agora, finalmente terminamos a configuração e podemos começar o cálculo real.
Foi isso ...
Dividimos o poder de 10 pela versão modificada da entrada usando o algoritmo de divisão inteira de 0, como encontrado no wiki . Isso simula a divisão de 1 pela entrada da única maneira que o Brain-Flak sabe.
Por fim, temos que formatar nossa saída no ASCII apropriado.
Agora que descobrimos
ne
, precisamos remover oe
. O primeiro passo para isso é convertê-lo em uma lista de dígitos. Este código é uma versão modificada de 0 ' 's algoritmo DIVMOD .Agora pegamos o número e adicionamos o ponto decimal de volta aonde ele pertence. Só de pensar nessa parte do código traz dores de cabeça, por enquanto, deixarei como um exercício para o leitor descobrir como e por que funciona.
Coloque o sinal negativo ou um caractere nulo se não houver sinal negativo.
fonte
I don't know what this does or why I need it, but I promise it's important.
1.0
ou10
-c
sinalizador seja executado com e sem ASCII. Como o Brain-Flak não suporta números flutuantes, preciso usar IO como uma string.Python 2 , 10 bytes
Experimente online!
fonte
Retina ,
9991 bytesExperimente online!
Woohoo, abaixo dos 100! Isso é surpreendentemente eficiente, considerando que ele cria (e combina contra) uma sequência com mais de 10 7 caracteres em um ponto. Tenho certeza de que ainda não é o ideal, mas estou muito feliz com o placar no momento.
Resultados com valor absoluto menor que 1 serão impressos sem o zero inicial, por exemplo,
.123
ou-.456
.Explicação
A idéia básica é usar a divisão inteira (porque isso é bastante fácil com regex e aritmética unária). Para garantir que obtivemos um número suficiente de dígitos significativos, dividimos a entrada em 10 7 . Dessa forma, qualquer entrada até 9999 ainda resulta em um número de 4 dígitos. Efetivamente, isso significa que multiplicamos o resultado por 10 7; portanto, precisamos acompanhar isso quando mais tarde reinserir o ponto decimal.
Começamos substituindo o ponto decimal, ou o final da string, se não houver ponto decimal por 8 ponto e vírgula. O primeiro deles é essencialmente o próprio ponto decimal (mas estou usando ponto e vírgula porque eles não precisam ser escapados), os outros 7 indicam que o valor foi multiplicado por 10 7 (ainda não é o caso, mas sabemos que faremos isso mais tarde).
Primeiro, transformamos a entrada em um número inteiro. Enquanto ainda houver dígitos após o ponto decimal, movemos um dígito para a frente e removemos um dos pontos e vírgulas. Isso ocorre porque mover o ponto decimal para a direita multiplica a entrada por 10 e, portanto, divide o resultado por 10 . Devido às restrições de entrada, sabemos que isso acontecerá no máximo quatro vezes; portanto, sempre há ponto e vírgula suficiente para ser removido.
Agora que a entrada é um número inteiro, a convertemos para unária e anexamos 10 7
1
s (separados por a,
).Dividimos o número inteiro em 10 7 , contando quantas referências anteriores se encaixam (
$#2
). Esta é a divisão inteira unária padrãoa,b
->b/a
. Agora só precisamos corrigir a posição do ponto decimal.Isso é basicamente o inverso do segundo estágio. Se ainda tivermos mais de um ponto e vírgula, isso significa que ainda precisamos dividir o resultado por 10 . Fazemos isso movendo os pontos e vírgulas uma posição para a esquerda e soltando um ponto e vírgula até atingirmos a extremidade esquerda do número ou ficamos com apenas um ponto e vírgula (que é o próprio ponto decimal).
Agora é uma boa hora para transformar o primeiro (e possivelmente apenas) de
;
volta.
.Se ainda houver ponto-e-vírgula, chegamos ao final esquerdo do número, portanto, dividir por 10 novamente inserirá zeros atrás do ponto decimal. Isso é feito facilmente, substituindo cada
;
um por um0
, já que eles estão imediatamente após o ponto decimal.fonte
\B;
por^;
para salvar 1 byte?-
na frente da;
.sim , 5 bytes
Experimente online! Isso pega a entrada da parte superior da pilha e deixa a saída na parte superior da pilha. O link TIO recebe entrada de argumentos da linha de comando, que é capaz apenas de receber entrada inteira.
Explicação
O yup possui apenas alguns operadores. Os usados nesta resposta são ln (x) (representado por
|
), 0 () (constante, função nilar retornando0
), - (subtração) e exp (x) (representado pore
).~
alterna os dois principais membros da pilha.Isso usa a identidade
o que implica que
fonte
LOLCODE ,
63, 56 bytes7 bytes salvos graças a @devRicher!
Isso define uma função 'r', que pode ser chamada com:
ou qualquer outro
NUMBAR
.Experimente online!
fonte
ITZ A NUMBAR
na atribuição deI
?HOW DUZ I r YR n VISIBLE QUOSHUNT OF 1 AN n IF U SAY SO
(adicionar novas linhas) é alguns bytes mais curto e pode ser chamado comr d
, onded
houverNUMBAR
.IZ
em vez deDUZ
por causa da regra de intérpretesed , 575 + 1 (
-r
sinalizador) =723718594588576 bytesExperimente online!
Nota: as flutuações para as quais o valor absoluto é menor que 1 terão que ser escritas sem um 0 inicial como em
.5
vez de0.5
. Além disso, o número de casas decimais é igual a , onden
é o número de casas decimais no número (assim, fornecer13.0
como entrada fornecerá mais casas decimais do que fornecer13
como entrada)Esta é a minha primeira submissão sed no PPCG. Idéias para a conversão decimal em unário foram extraídas dessa resposta surpreendente . Obrigado a @seshoumara por me guiar pelo sed!
Esse código executa divisão longa repetida para obter o resultado. A divisão leva apenas ~ 150 bytes. As conversões decimais unárias ocupam o máximo de bytes, e alguns outros bytes vão para números negativos e entradas de ponto flutuante
Explicação
Explicação sobre o TIO
Edições
s:s/(.)/(.)/g:y/\1/\2/g:g
economizar 1 byte em cada substituição (5 no total)\n
vez de;
separador, pude reduzir as substituições "multiplicar por 10" para economizar 12 bytes (obrigado a @Riley e @seshoumara por me mostrarem isso)fonte
JSFuck , 3320 bytes
O JSFuck é um estilo de programação esotérico e educacional baseado nas partes atômicas do JavaScript. Ele usa apenas seis caracteres diferentes
()[]+!
para escrever e executar código.Experimente online!
fonte
return 1/this
seria cerca de 76 bytes mais longo quereturn+1/this
.[].fill.constructor('alert(1/prompt())')
2929 bytes paste.ubuntu.com/p/5vGTqw4TQQ add()
2931OIL ,
14281420 bytesAh bem. Eu pensei que poderia muito bem experimentá-lo e, no final, consegui. Há apenas uma desvantagem: leva quase tanto tempo para ser executado quanto para escrever.
O programa é separado em vários arquivos, que possuem todos os nomes de arquivos de 1 byte (e contam para um byte adicional no meu cálculo de bytes). Alguns dos arquivos fazem parte dos arquivos de exemplo do idioma do OIL, mas não existe uma maneira real de chamá-los consistentemente (ainda não há caminho de pesquisa ou algo parecido no OIL, por isso não os considero uma biblioteca padrão), mas isso também significa que (no momento da postagem) alguns dos arquivos são mais detalhados que necessários, mas geralmente apenas com alguns bytes.
Os cálculos são precisos com 4 dígitos de precisão, mas o cálculo mesmo de um simples recíproco (como a entrada
3
) leva um tempo muito longo (mais de 5 minutos) para ser concluído. Para fins de teste, também criei uma variante menor com precisão de 2 dígitos, que leva apenas alguns segundos para ser executada, a fim de provar que funciona.Sinto muito pela enorme resposta, gostaria de poder usar algum tipo de tag de spoiler. Eu também poderia colocar a maior parte no gist.github.com ou algo semelhante, se desejado.
Aqui vamos nós:,
main
217 bytes (o nome do arquivo não conta para bytes):a
(verifica se uma determinada sequência está em outra), 74 + 1 = 75 bytes:b
(junta duas cadeias de caracteres), 20 + 1 = 21 bytes:c
(dado um símbolo, divide a sequência especificada na sua primeira ocorrência), 143 + 1 = 144 bytes (este ainda é obviamente ainda jogável):d
(dada uma sequência, obtém os 4 primeiros caracteres), 22 + 1 = 23 bytes:e
(divisão de alto nível (mas com perigo de divisão zero)), 138 + 1 = 139 bytes:f
(move um ponto 4 posições para a direita; "divide" por 10000), 146 + 1 = 147 bytes:g
(verifica se uma sequência começa com um determinado caractere), 113 + 1 = 114 bytes:h
(retorna tudo, exceto o primeiro caractere de uma determinada sequência), 41 + 1 = 42 bytes:i
(subtrai dois números), 34 + 1 = 35 bytes:j
(divisão de baixo nível que não funciona em todos os casos), 134 + 1 = 135 bytes:k
(multiplicação), 158 + 1 = 159 bytes:l
(retornar valor absoluto), 58 + 1 = 59 bytes:m
(adição), 109 + 1 = 110 bytes:fonte
J, 1 byte
%
é uma função que fornece o recíproco de sua entrada. Você pode executá-lo assimfonte
Táxi , 467 bytes
Experimente online!
Ungolfed:
fonte
Vim,
108 bytes / pressionamentos de teclaComo o V é compatível com versões anteriores, você pode experimentá-lo online!
fonte
=
. Confiando exclusivamente em outras macros, registradores para armazenar memória e teclas para navegar e modificar dados. Seria muito mais complexo, mas acho que seria muito legal! Eu acho quef
teria um papel enorme como teste condicional.6431.0
por isso é tratado como um número de ponto flutuantex86_64 linguagem de máquina Linux, 5 bytes
Para testar isso, você pode compilar e executar o seguinte programa C
Experimente online!
fonte
rcpss
apenas calcula uma recíproca aproximada (precisão de cerca de 12 bits). +1C,
1512 bytesExperimente online!
1613 bytes, se precisar manipular a entrada inteira também:Então você pode chamá-lo com em
f(3)
vez def(3.0)
.Experimente online!
Graças a @hvd por jogar 3 bytes!
fonte
f(x)
por1/x
. Quando a "função" é executada, o que pode acontecer tão tarde quanto o tempo de execução ou tão cedo quanto parece o seu compilador (e pode ser correto), tecnicamente não é a etapa do pré-processador.2
e-5
como entrada. Ambos2
e-5
são decimais, contendo dígitos no intervalo de 0 a 9.#define f 1./
funciona também.MATLAB / oitava, 4 bytes
Cria um identificador de função (nomeado
ans
) para ainv
função internaDemo Online
fonte
05AB1E , 1 byte
Experimente online!
fonte
GNU sed ,
377362 + 1 (sinalizador r) = 363 bytesAviso: o programa consumirá toda a memória do sistema tentando executar e precisará de mais tempo para terminar do que você gostaria de esperar! Veja abaixo uma explicação e uma versão rápida, mas menos precisa.
Isso se baseia na resposta da Retina de Martin Ender. Eu conto
\t
da linha 2 como uma guia literal (1 byte).Minha principal contribuição é o método de conversão de decimal para unário simples (linha 2) e vice-versa (linha 5). Consegui reduzir significativamente o tamanho do código necessário para fazer isso (em ~ 40 bytes combinados), em comparação com os métodos mostrados na dica anterior . Criei uma resposta de dica separada com os detalhes, onde forneço snippets prontos para usar. Como 0 não é permitido como entrada, mais alguns bytes foram salvos.
Explicação: para entender melhor o algoritmo de divisão, leia a resposta Retina primeiro
O programa está teoricamente correto, a razão pela qual consome tantos recursos computacionais é que a etapa de divisão é executada centenas de milhares de vezes, mais ou menos dependendo da entrada, e o regex usado gera um pesadelo de retorno. A versão rápida reduz a precisão (daí o número de etapas de divisão) e altera o regex para reduzir o retorno.
Infelizmente, o sed não possui um método para contar diretamente quantas vezes uma referência traseira se encaixa em um padrão, como na Retina.
Para uma versão rápida e segura do programa, mas menos precisa, você pode tentar isso online .
fonte
Japonês , 2 bytes
A solução óbvia seria
o que é, literalmente
1 / input
,. No entanto, podemos fazer um melhor:Isso é equivalente a
input ** J
eJ
é definido como -1 por padrão.Experimente online!
Curiosidade: assim como
p
a função power,q
a função root (p2
=**2
,q2
=**(1/2)
); isso significa queqJ
também funcionará, desde-1 == 1/-1
e, portantox**(-1) == x**(1/-1)
,.fonte
Javascript ES6, 6 bytes
Experimente online!
O Javascript é padronizado como divisão de ponto flutuante.
fonte
APL, 1 byte
÷
Calcula recíproco quando usado como função monádica. Experimente online!Usa o conjunto de caracteres Dyalog Classic.
fonte
Queijo Cheddar , 5 bytes
Experimente online!
Isso usa
&
, que vincula um argumento a uma função. Nesse caso,1
está vinculado ao lado esquerdo de/
, o que nos dá1/x
, para uma discussãox
. Isso é menor que o canônicox->1/x
em 1 byte.Como alternativa, nas versões mais recentes:
fonte
(1:/)
a mesma contagem de bytesJava 8, 6 bytes
Quase o mesmo que a resposta JavaScript .
fonte
MATL , 3 bytes
Experimente no MATL Online
Explicação
fonte
Python, 12 bytes
Um para 13 bytes:
Um por 14 bytes:
fonte
Mathematica, 4 bytes
Fornece um racional exato se você der um racional exato e um resultado de ponto flutuante se você der um resultado de ponto flutuante.
fonte
ZX Spectrum BASIC, 13 bytes
Notas:
SGN PI
vez de literal1
.Versão ZX81 para 17 bytes:
fonte
LET A=17
e refatorar seu aplicativo em uma linha para1 PRINT SGN PI/A
, precisará alterar o valor de A digitando mais cada vez que quiser executar seu programa.Haskell , 4 bytes
Experimente online!
fonte
R, 8 bytes
Bem direto. Emite diretamente o inverso da entrada.
Outra solução, porém com 1 byte de comprimento, pode ser:
scan()^-1
ou até mesmoscan()**-1
para um byte adicional. Ambos^
e**
o símbolo do poder.fonte
TI-Basic (TI-84 Plus CE),
652 bytes-1 byte graças à Timtech .
-3 bytes com
Ans
agradecimentos a Григорий Перельман .Ans
e⁻¹
são tokens de um byte .TI-Basic retorna implicitamente o último valor avaliado (
Ans⁻¹
).fonte
Ans
, para que você possa substituí-lo porAns⁻¹
Geléia , 1 byte
Experimente online!
fonte
Jelly programs consist of up to 257 different Unicode characters
.¶
e o caractere de avanço de linha podem ser usados de forma intercambiável , portanto, enquanto o modo Unicode "entende" 257 caracteres diferentes, eles mapeiam para 256 tokens.C, 30 bytes
fonte
0
para salvar um byte. Com1.
ele ainda será compilado como um duplo.1.
ainda é tratado como um número inteiro.echo -e "#include <stdio.h>\nfloat f(x){return 1./x;}main(){printf(\"%f\\\\n\",f(5));}" | gcc -o test -xc -
saída de./test
is0.200000
float f(float x){return 1/x;}
funcionaria corretamente..
- C converterá implicitamente em feliz(int)1
por(float)1
causa do tipo dex
.