Reto
Dado un número (coma flotante / decimal), devuelve su recíproco, es decir, 1 dividido por el número. La salida debe ser un número de coma flotante / decimal, no solo un número entero.
Especificación detallada
- Debe recibir la entrada en forma de número de coma flotante / decimal ...
- ... que tiene al menos 4 dígitos significativos de precisión (si es necesario).
- Más es mejor, pero no cuenta en el puntaje.
- Debe generar, con cualquier método de salida aceptable ...
- ... el recíproco del número.
- Esto se puede definir como 1 / x, x⁻¹.
- Debe generar al menos 4 dígitos significativos de precisión (si es necesario).
La entrada será positiva o negativa, con un valor absoluto en el rango [0.0001, 9999] inclusive. Nunca se le darán más de 4 dígitos más allá del punto decimal, ni más de 4 a partir del primer dígito distinto de cero. La salida debe ser precisa hasta el cuarto dígito del primer dígito distinto de cero.
(Gracias @MartinEnder)
Aquí hay algunas entradas de muestra:
0.5134
0.5
2
2.0
0.2
51.2
113.7
1.337
-2.533
-244.1
-0.1
-5
Tenga en cuenta que nunca se le darán entradas que tengan más de 4 dígitos de precisión.
Aquí hay una función de muestra en Ruby:
def reciprocal(i)
return 1.0 / i
end
Reglas
- Todas las formas aceptadas de salida están permitidas
- Lagunas estándar prohibidas
- Este es el código de golf , la respuesta más corta en bytes gana, pero no se seleccionará.
Aclaraciones
- Nunca recibirá la entrada
0
.
Recompensas
Este desafío es obviamente trivial en la mayoría de los idiomas, pero puede ofrecer un desafío divertido en idiomas más esotéricos e inusuales, por lo que algunos usuarios están dispuestos a otorgar puntos por hacerlo en idiomas inusualmente difíciles.
@DJMcMayhem otorgará una recompensa de +150 puntos a la respuesta más breve de brain-flak, ya que brain-flak es notoriamente difícil para los números de coma flotante@ L3viathan otorgará una recompensa de +150 puntos a la respuesta OIL más corta . OIL no tiene ningún tipo de coma flotante nativa, ni tiene división.
@Riley otorgará una recompensa de +100 puntos a la respuesta sed más corta.
@EriktheOutgolfer otorgará una recompensa de +100 puntos a la respuesta más breve de Sesos. La división en derivados de cerebro como Sesos es muy difícil, y mucho menos la división de punto flotante.
Yo ( @Mendeleev ) otorgaré una recompensa de +100 puntos a la respuesta más breve de Retina.
Si cree que sería divertido ver una respuesta en un idioma y está dispuesto a pagar el representante, siéntase libre de agregar su nombre a esta lista (ordenado por cantidad de recompensa)
Tabla de clasificación
Aquí hay un fragmento de pila para generar una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
fuente
1/x
.Respuestas:
Brain-Flak ,
772536530482480 + 1 = 481 bytesComo Brain-Flak no admite números de coma flotante, tuve que usar el
-c
indicador en orden de entrada y salida con cadenas, de ahí el +1.Pruébalo en línea!
Explicación
Lo primero que debemos cuidar es el caso negativo. Como el recíproco de un número negativo siempre es negativo, simplemente podemos mantener el signo negativo hasta el final. Comenzamos haciendo una copia de la parte superior de la pila y restando 45 (el valor ASCII de
-
). Si este es uno, ponemos un cero en la parte superior de la pila, si no, no hacemos nada. Luego, recogemos la parte superior de la pila para colocar al final del programa. Si la entrada comenzó con un,-
esto sigue siendo un-
sin embargo, si no es así , terminamos recogiendo ese cero que colocamos.Ahora que eso está fuera del camino, necesitamos convertir las realizaciones ASCII de cada dígito en sus valores reales (0-9). También vamos a eliminar el punto decimal
.
para facilitar los cálculos. Como necesitamos saber dónde comenzó el punto decimal cuando lo volvemos a insertar más tarde, almacenamos un número para realizar un seguimiento de cuántos dígitos había delante del.
la pila.Así es como el código hace eso:
Comenzamos restando 46 (el valor ASCII de
.
) de cada elemento en la pila (moviéndolos simultáneamente a todos en la pila). Esto hará que cada dígito sea dos más de lo que debería ser, pero hará que sea.
exactamente cero.Ahora movemos todo a la pila izquierda hasta que lleguemos a cero (restando dos de cada dígito mientras avanzamos):
Registramos la altura de la pila
Mueve todo lo demás a la pila izquierda (una vez más restando los dos últimos de cada dígito a medida que los movemos)
Y pon la altura de la pila que registramos
Ahora queremos combinar los dígitos en un solo número base 10. También queremos hacer una potencia de 10 con el doble de dígitos que ese número para usar en el cálculo.
Comenzamos configurando un 1 en la parte superior de la pila para obtener la potencia de 10 y empujando la altura de la pila menos uno a la pila para el uso del bucle.
Ahora giramos la altura de la pila menos 1 vez,
Cada vez que multiplicamos el elemento superior por 100 y debajo, multiplicamos el siguiente elemento por 10 y lo sumamos al número siguiente.
Terminamos nuestro ciclo
Ahora finalmente hemos terminado con la configuración y podemos comenzar el cálculo real.
Eso fue todo...
Dividimos el poder de 10 por la versión modificada de la entrada usando el algoritmo de división de enteros de 0 como se encuentra en la wiki . Esto simula la división de 1 por la entrada de la única forma en que Brain-Flak sabe cómo.
Por último, tenemos que formatear nuestra salida en el ASCII apropiado.
Ahora que hemos descubierto
ne
necesitamos sacar ele
. El primer paso para esto es convertirlo en una lista de dígitos. Este código es una versión modificada del algoritmo divmod de 0 ' ' .Ahora tomamos el número y agregamos el punto decimal donde pertenece. Solo pensar en esta parte del código trae dolores de cabeza, así que por ahora lo dejaré como un ejercicio para que el lector descubra cómo y por qué funciona.
Ponga el signo negativo hacia abajo o un carácter nulo si no hay signo negativo.
fuente
I don't know what this does or why I need it, but I promise it's important.
1.0
o10
-c
bandera se ejecute con ASCII dentro y fuera. Como Brain-Flak no admite números flotantes, necesito tomar IO como una cadena.Python 2 , 10 bytes
Pruébalo en línea!
fuente
Retina ,
9991 bytesPruébalo en línea!
Woohoo, sub-100! Esto es sorprendentemente eficiente, considerando que crea (y luego compara) una cadena con más de 10 7 caracteres en un punto. Estoy seguro de que aún no es óptimo, pero estoy bastante contento con el puntaje en este momento.
Los resultados con un valor absoluto inferior a 1 se imprimirán sin el cero inicial, por ejemplo,
.123
o-.456
.Explicación
La idea básica es usar la división de enteros (porque eso es bastante fácil con expresiones regulares y aritmética unaria). Para garantizar que obtengamos un número suficiente de dígitos significativos, dividimos la entrada en 10 7 . De esa manera, cualquier entrada hasta 9999 todavía da como resultado un número de 4 dígitos. Efectivamente, eso significa que estamos multiplicando el resultado por 10 7, por lo que debemos hacer un seguimiento de eso cuando más tarde reinserte el punto decimal.
Comenzamos reemplazando el punto decimal, o el final de la cadena si no hay un punto decimal con 8 puntos y comas. El primero de ellos es esencialmente el punto decimal en sí mismo (pero estoy usando punto y coma porque no necesitan escapar), los otros 7 indican que el valor se ha multiplicado por 10 7 (este no es el caso todavía, pero sabemos que lo haremos más tarde).
Primero convertimos la entrada en un número entero. Mientras haya dígitos después del punto decimal, movemos un dígito al frente y eliminamos uno de los puntos y comas. Esto se debe a que mover el punto decimal hacia la derecha multiplica la entrada por 10 y, por lo tanto, divide el resultado por 10 . Debido a las restricciones de entrada, sabemos que esto sucederá como máximo cuatro veces, por lo que siempre hay suficientes puntos y comas para eliminar.
Ahora que la entrada es un número entero, la convertimos en unario y agregamos 10 7
1
s (separados por a,
).Dividimos el número entero en 10 7 contando cuántas referencias posteriores caben (
$#2
). Esta es la división de enteros unarios estándara,b
->b/a
. Ahora solo tenemos que corregir la posición del punto decimal.Esto es básicamente lo contrario de la segunda etapa. Si todavía tenemos más de un punto y coma, eso significa que aún debemos dividir el resultado por 10 . Hacemos esto moviendo los puntos y coma una posición hacia la izquierda y soltando un punto y coma hasta que lleguemos al extremo izquierdo del número, o nos quedemos con solo un punto y coma (que es el punto decimal en sí).
Ahora es un buen tiempo para convertir la primera (y posiblemente el único)
;
de nuevo en.
.Si todavía quedan puntos y comas, hemos llegado al extremo izquierdo del número, por lo que dividir entre 10 nuevamente insertará ceros detrás del punto decimal. Esto se hace fácilmente reemplazando cada uno restante
;
con un0
, ya que de todos modos están inmediatamente después del punto decimal.fuente
\B;
con^;
para guardar 1 byte?-
frente a la;
.sí , 5 bytes
Pruébalo en línea!Esto toma información de la parte superior de la pila y deja la salida en la parte superior de la pila. El enlace TIO toma datos de los argumentos de la línea de comandos, que solo es capaz de tomar datos enteros.
Explicación
Sí, solo tiene unos pocos operadores. Los que se usan en esta respuesta son ln (x) (representado por
|
), 0 () (constante, retorno de la función nilar0
), - (sustracción) y exp (x) (representado pore
).~
cambia los dos primeros miembros de la pila.Esto usa la identidad
lo que implica que
fuente
LOLCODE ,
63, 56 bytes¡7 bytes guardados gracias a @devRicher!
Esto define una función 'r', que se puede llamar con:
o cualquier otro
NUMBAR
.Pruébalo en línea!
fuente
ITZ A NUMBAR
en la asignación deI
?HOW DUZ I r YR n VISIBLE QUOSHUNT OF 1 AN n IF U SAY SO
(agregar nuevas líneas) es unos pocos bytes más cortos y se puede llamar conr d
, donded
hay algunoNUMBAR
.IZ
lugar deDUZ
debido a la regla del intérpretesed , 575 + 1 (
-r
bandera) =723718594588576 bytesPruébalo en línea!
Nota: los flotantes para los cuales el valor absoluto es menor que 1 deberán escribirse sin un 0 inicial en
.5
lugar de0.5
. Además, el número de lugares decimales es igual a , donden
es el número de lugares decimales en el número (por lo que dar13.0
como entrada dará más lugares decimales que dar13
como entrada)Esta es mi primera presentación de sed en PPCG. Las ideas para la conversión de decimal a unario se tomaron de esta sorprendente respuesta . ¡Gracias a @seshoumara por guiarme a través de sed!
Este código realiza una división larga repetida para obtener el resultado. La división solo toma ~ 150 bytes. Las conversiones decimales unitarias toman la mayor cantidad de bytes, y algunos otros bytes son compatibles con números negativos y entradas de punto flotante
Explicación
Explicación sobre TIO
Ediciones
s:s/(.)/(.)/g:y/\1/\2/g:g
para guardar 1 byte en cada sustitución (5 en total)\n
lugar de;
como separador, pude acortar las sustituciones "multiplicar por 10" para ahorrar 12 bytes (gracias a @Riley y @seshoumara por mostrarme esto)fuente
JSFuck , 3320 bytes
JSFuck es un estilo de programación educativo y esotérico basado en las partes atómicas de JavaScript. Utiliza solo seis caracteres diferentes
()[]+!
para escribir y ejecutar código.Pruébalo en línea!
fuente
return 1/this
sería aproximadamente 76 bytes más largo quereturn+1/this
.[].fill.constructor('alert(1/prompt())')
2929 bytes paste.ubuntu.com/p/5vGTqw4TQQ add()
2931ACEITE ,
14281420 bytesOh bien. Pensé que podría intentarlo, y al final lo logré. Solo hay un inconveniente: lleva casi tanto tiempo correr como escribir para escribir.
El programa está separado en varios archivos, que tienen todos los nombres de archivo de 1 byte (y cuentan para un byte adicional en el cálculo de mi byte). Algunos de los archivos son parte de los archivos de ejemplo del lenguaje OIL, pero no hay una forma real de llamarlos constantemente (todavía no hay una ruta de búsqueda ni nada parecido en OIL, por lo que no los considero una biblioteca estándar), pero eso también significa que (en el momento de la publicación) algunos de los archivos son más detallados que necesarios, pero generalmente solo por unos pocos bytes.
Los cálculos tienen una precisión de 4 dígitos de precisión, pero calcular incluso un recíproco simple (como la entrada
3
) lleva mucho tiempo (más de 5 minutos) en completarse. Para fines de prueba, también hice una variante menor que tiene una precisión de 2 dígitos, que solo demora unos segundos en ejecutarse, para demostrar que funciona.Lamento la gran respuesta, desearía poder usar algún tipo de etiqueta de spoiler. También podría poner la mayor parte en gist.github.com o algo similar, si lo desea.
Aquí vamos:
main
217 bytes (el nombre del archivo no cuenta para bytes):a
(comprueba si una cadena dada está en otra cadena dada), 74 + 1 = 75 bytes:b
(une dos cadenas dadas), 20 + 1 = 21 bytes:c
(dado un símbolo, divide la cadena dada en su primera aparición), 143 + 1 = 144 bytes (este obviamente todavía es golfable):d
(dada una cadena, obtiene los primeros 4 caracteres), 22 + 1 = 23 bytes:e
(división de alto nivel (pero con peligro de división cero)), 138 + 1 = 139 bytes:f
(mueve un punto 4 posiciones a la derecha; "divide" por 10000), 146 + 1 = 147 bytes:g
(comprueba si una cadena comienza con un carácter dado), 113 + 1 = 114 bytes:h
(devuelve todo menos el primer carácter de una cadena dada), 41 + 1 = 42 bytes:i
(resta dos números), 34 + 1 = 35 bytes:j
(división de bajo nivel que no funciona en todos los casos), 134 + 1 = 135 bytes:k
(multiplicación), 158 + 1 = 159 bytes:l
(valor absoluto de retorno), 58 + 1 = 59 bytes:m
(además), 109 + 1 = 110 bytes:fuente
J, 1 byte
%
es una función que da el recíproco de su entrada. Puedes ejecutarlo asífuente
Taxi , 467 bytes
Pruébalo en línea!
Sin golf:
fuente
Vim,
108 bytes / pulsaciones de teclasComo V es compatible con versiones anteriores, ¡puede probarlo en línea!
fuente
=
. Confiando exclusivamente en otras macros, registros para almacenar memoria y teclas para navegar y modificar datos. ¡Sería mucho más complejo pero creo que sería genial! Creof
que jugaría un papel muy importante como prueba condicional.6431.0
por lo que es tratado como un número de coma flotantex86_64 lenguaje máquina Linux, 5 bytes
Para probar esto, puede compilar y ejecutar el siguiente programa C
Pruébalo en línea!
fuente
rcpss
solo calcula un recíproco aproximado (precisión de aproximadamente 12 bits). +1C,
1512 bytesPruébalo en línea!
1613 bytes, si necesita manejar la entrada entera también:Entonces puedes llamarlo con en
f(3)
lugar def(3.0)
.Pruébalo en línea!
¡Gracias a @hvd por jugar al golf 3 bytes!
fuente
f(x)
con1/x
. Cuando se ejecuta la "función", lo que puede suceder tan tarde como el tiempo de ejecución o tan pronto como su compilador se siente (y puede ser correcto), técnicamente no es el paso del preprocesador.2
y-5
como entrada. Ambos2
y-5
son decimales, que contienen dígitos en el rango de 0 a 9.#define f 1./
también funciona.MATLAB / Octave, 4 bytes
Crea un identificador de función (denominado
ans
) para lainv
función incorporadaDemo en línea
fuente
05AB1E , 1 byte
Pruébalo en línea!
fuente
GNU sed ,
377+ 1 (r flag) = 363 bytesAdvertencia: ¡ el programa consumirá toda la memoria del sistema que intenta ejecutarse y requerirá más tiempo para terminar de lo que estaría dispuesto a esperar! Vea a continuación una explicación y una versión rápida, pero menos precisa.
Esto se basa en la respuesta de Retina de Martin Ender. Yo cuento
\t
desde la línea 2 como una pestaña literal (1 byte).Mi principal contribución es al método de conversión de decimal a unario simple (línea 2) y viceversa (línea 5). Logré reducir significativamente el tamaño del código necesario para hacer esto (en ~ 40 bytes combinados), en comparación con los métodos mostrados en un consejo anterior . Creé una respuesta de consejo por separado con los detalles, donde proporciono fragmentos listos para usar. Como 0 no está permitido como entrada, se guardaron algunos bytes más.
Explicación: para comprender mejor el algoritmo de división, lea primero la respuesta Retina
El programa es teóricamente correcto, la razón por la que consume tantos recursos computacionales es que el paso de división se ejecuta cientos de miles de veces, más o menos dependiendo de la entrada, y la expresión regular utilizada da lugar a una pesadilla de retroceso. La versión rápida reduce la precisión (de ahí el número de pasos de división) y cambia la expresión regular para reducir el retroceso.
Desafortunadamente, sed no tiene un método para contar directamente cuántas veces una referencia inversa se ajusta a un patrón, como en Retina.
Para una versión rápida y segura del programa, pero menos precisa, puede probar esto en línea .
fuente
Japt , 2 bytes
La solución obvia sería
que es, literalmente,
1 / input
. Sin embargo, podemos hacer uno mejor:Esto es equivalente a
input ** J
, yJ
se establece en -1 de forma predeterminada.Pruébalo en línea!
Dato curioso: como
p
es la función de potencia, también loq
es la función raíz (p2
=**2
,q2
=**(1/2)
); Esto significa queqJ
funcionará tan bien, ya que-1 == 1/-1
, por lo tantox**(-1) == x**(1/-1)
.fuente
Javascript ES6, 6 bytes
Pruébalo en línea!
El valor predeterminado de Javascript es la división de coma flotante.
fuente
APL, 1 byte
÷
Calcula recíproco cuando se usa como función monádica. Pruébalo en línea!Utiliza el conjunto de caracteres Dyalog Classic.
fuente
Cheddar , 5 bytes
Pruébalo en línea!
Esto utiliza
&
, que une un argumento a una función. En este caso,1
está vinculado al lado izquierdo de/
, lo que nos da1/x
, para una discusiónx
. Esto es más corto que el canónicox->1/x
en 1 byte.Alternativamente, en las versiones más nuevas:
fuente
(1:/)
en el mismo recuento de bytesJava 8, 6 bytes
Casi lo mismo que la respuesta de JavaScript .
fuente
MATL , 3 bytes
Pruébalo en MATL Online
Explicación
fuente
Python, 12 bytes
Uno para 13 bytes:
Uno para 14 bytes:
fuente
Mathematica, 4 bytes
Le proporciona un racional exacto si le da un racional exacto y un resultado de coma flotante si le da un resultado de coma flotante.
fuente
ZX Spectrum BASIC, 13 bytes
Notas:
SGN PI
lugar de literales1
.Versión ZX81 para 17 bytes:
fuente
LET A=17
y refactorizar su aplicación en una línea1 PRINT SGN PI/A
, sin embargo, deberá cambiar el valor de A con más tipeo cada vez que desee ejecutar su programa.Haskell , 4 bytes
Pruébalo en línea!
fuente
R, 8 bytes
Muy claro. Emite directamente el inverso de la entrada.
Otra solución, pero 1 byte más larga puede ser:,
scan()^-1
o inclusoscan()**-1
por un byte adicional. Ambos^
y**
el símbolo de poder.fuente
TI-Basic (TI-84 Plus CE),
652 bytes-1 byte gracias a Timtech .
-3 bytes con
Ans
agradecimiento a Григорий Перельман .Ans
y⁻¹
son tokens de un byte .TI-Basic devuelve implícitamente el último valor evaluado (
Ans⁻¹
).fuente
Ans
, por lo que puede reemplazar esto conAns⁻¹
Gelatina , 1 byte
Pruébalo en línea!
fuente
Jelly programs consist of up to 257 different Unicode characters
.¶
y el carácter de salto de línea se pueden usar indistintamente , por lo que mientras el modo Unicode "comprende" 257 caracteres diferentes, se asignan a 256 fichas.C, 30 bytes
fuente
0
para guardar un byte. Con1.
él todavía se compilará como un doble.1.
todavía se trata como un número entero.echo -e "#include <stdio.h>\nfloat f(x){return 1./x;}main(){printf(\"%f\\\\n\",f(5));}" | gcc -o test -xc -
Output of./test
is0.200000
float f(float x){return 1/x;}
funcionaría correctamente.
- C estará feliz de convertir implícitamente(int)1
a(float)1
causa del tipo dex
.