Implemente una función fuertemente Darboux

13

Según Wikipedia , una función fuertemente Darboux es

uno para el cual la imagen de cada intervalo abierto (no vacío) es toda la línea real

En otras palabras, una función f es fuertemente Darboux si se les da 3 números reales arbitrarios a , b , y y , siempre es posible encontrar un x entre (distintos) a y b tal que f(x)=y .

Para los propósitos de este desafío, consideraremos fuertemente las funciones de Darboux sobre los racionales.

Su desafío es escribir un programa o función que:

  • da un número racional como salida para cada entrada de número racional,
  • siempre da la misma salida para una entrada dada, y
  • tiene la propiedad fuertemente Darboux.

La entrada y salida pueden ser cualquiera de los siguientes:

  • un tipo de número de precisión arbitraria, si su idioma tiene uno (o tiene una biblioteca para uno, por ejemplo, GMP).
  • una representación en cadena del número, que puede suponer que siempre contendrá un punto decimal y al menos un dígito a cada lado. Puede estar en cualquier base b2 , pero la entrada y la salida deben estar en la misma base. Puede usar cualquier conjunto de caracteres para los dígitos y el punto decimal (pero nuevamente, deben ser consistentes entre la entrada y la salida).

La entrada siempre tendrá una expansión de base b terminación . En cuanto a la salida, que puede tener una expansión de base b teóricamente no terminada según su elección de función, puede elegir cualquiera de los siguientes:

  • dígitos de salida para siempre.
  • tome un entero adicional como entrada y salida al menos esa cantidad de dígitos.
  • generar al menos tantos dígitos como los de la entrada (que puede contener ceros finales).

Tenga en cuenta que, por la naturaleza de este desafío, la convención de que se puede suponer que los números son representables por tipos de números estándar no se aplica, excepto por la segunda entrada descrita en la opción 2 anterior.

Para evitar lagunas con funciones que solo se definen en racionales no terminados, su envío debe ser capaz de producir resultados arbitrariamente cercanos al valor deseado en la práctica . Formalmente, dados los números racionales a , b , y , y ε , debe haber un número racional x que termine en la base elegida de modo que a<x<b y |f(x)y|<ε .


Para darle algunas ideas, aquí hay una descripción de la función base 13 de Conway :

  • Convierta x a base 13 y elimine el punto decimal.
  • Si el resultado es de la forma [x]A[y]C[z]13 , donde [y] y [z] consisten solo en dígitos del 0 al 9, entonces f(x)=[y].[z] .
  • Si el resultado es de la forma [x]B[y]C[z]13 , donde [y] y [z] consisten solo en dígitos del 0 al 9, entonces f(x)=[y].[z] .
  • De lo contrario, f(x)=0 .

Esta función es fuertemente Darboux. Digamos, por ejemplo, que queremos encontrar algo de x entre 123.45613 y 123.45713 modo que f(x)=7.89 . El valor base 13 123.456A7C8913 satisfaría este requisito.

Su envío puede ser una implementación de esta función, aunque sospecho que hay otras funciones fuertemente Darboux que son mucho más cortas de implementar. :)

Pomo de la puerta
fuente
¿Se supone que los números tienen una expansión de base terminada ? b
Nitrodon
enlace math.stackexchange y también la pregunta original de la que es una trampa para algunos ejemplos
Giuseppe
Si implementamos el algoritmo de base 13 de Conway, podríamos tomar la entrada en la base 13 pero también tendríamos que generar la salida en la base 13. Dado que la salida de la función generalmente está en decimal, terminaremos con un número tridecimal recurrente. ¿Cómo debería ser esto? ¿Generamos los primeros dígitos, donde x se especifica en la pregunta (aunque todavía no)? ¿O debemos indicar que es recurrente? xx
Nick Kennedy
@ NickKennedy Gracias, pasé por alto eso: he editado la pregunta para aclararla.
Pomo de la puerta
1
Hmm, estoy bastante seguro de que puedo definir una función Darboux que sea constante o la identidad en todas las entradas de terminación ...
Christian Sievers

Respuestas:

4

Retina 0.8.2 , 43 50 bytes

^.*\.(..)*1(.)((..)+)1.((..)*)$
$2$*-$3.$5
0(.)
$1

Pruébalo en línea! I / O es como una cadena binaria. Codifique un número binario ycerca de otro número binario de la asiguiente manera:

  1. Si ano contiene un ., sufijo uno.
  2. Si acontiene un número impar de dígitos después del ., sufijo a 0.
  3. Si yes negativo, sufijo, de lo 11contrario sufijo 10.
  4. Para cada dígito en y, sufijo 0seguido de ese dígito.
  5. Si ycontiene un .sufijo 11en ese punto, de lo contrario sufrígalo después de todos los dígitos y.

Explicación:

^.*\.(..)*1(.)((..)+)1.((..)*)$
$2$*-$3.$5

Empareje los dígitos comenzando en el punto binario. Si el número es una codificación válida, decodifique el último 1xpar de dígitos en ay .el segundo último en un -signo opcional . Los dígitos anteriores se ignoran.

0(.)
$1

Esto debería dejar solo pares que comiencen 0, así que elimine el 0s.

Neil
fuente
A veces obtengo salidas como -.. ¿Eso implica ceros o no se supone que se produzcan?
Erik the Outgolfer
@EriktheOutgolfer Supongo que podría cambiar los *s a +s, eso garantizaría al menos un dígito antes y después del .?
Neil
En realidad no puedo garantizar dígitos después del .. Sin embargo, creo que aún puedo garantizar un dígito antes ..
Neil
Un terminal 0 adicional en un número con .no cambia su valor, pero dicho cambio en la entrada de su función cambia la salida. Tal vez se le permita arreglar esto suponiendo que la entrada no tenga tales 0s. Además, si agrupa pares desde la derecha, ¿cómo funciona "teóricamente para una entrada real"?
Christian Sievers
@ChristianSievers (Lo siento, no noté mi bandeja de entrada antes) Basé mi respuesta en la descripción de la función base 13 en la pregunta, que también parece requerir una representación final. También tienes razón en que estaba asumiendo que no habría ceros finales. (Por lo tanto, los números enteros siempre deben haberse 11agregado en el paso 2.)
Neil
1

Jalea , 71 bytes

L7*©ṛḅ7WµṪ×⁵d®µ⁴‘¤Ð¡ḊṖ
DF7,8ṣṪ¥ƒṣ9ḅ7×ɗÇƭ€j”,
DFf7r9¤ṫ-Ḍ⁼Ɱ“OY‘TịØ+³çƲ0Ẹ?

Pruébalo en línea!

Un programa completo que toma un número de base 10 como entrada y salida e implementa la función base 13 de Conway, pero usa las bases 7 y 10 en lugar de 10 y 13. Tanto la entrada como la salida usan una coma como separador decimal. La salida tendrá un líder - para números negativos.

Nick Kennedy
fuente
El ejemplo en el enlace TIO tiene el dígito 9 en la entrada y la salida, entonces, ¿cómo son estos números base 7?
Christian Sievers
@ChristianSievers lo siento significaba la base 10 para entrada y salida. La base 7 se usa en el código, pero se convierte de nuevo a la base 10.
Nick Kennedy
Bien, ahora puedo cambiar la entrada y entender cómo eso afecta la salida.
Christian Sievers
1

retina ,28 25 26 28 bytes

.*11|22
.
D^`\.
^3
-
4(.)
$1

Pruébalo en línea!

Explicación

.*11|22     Delete up to the last 11 and prepend a dot. Also change 22 to a dot.
.
D^`\.       Keep only the last dot, if there is one.
^3          Change 3 at the beginning to a minus sign.
-
4(.)        4 is the escape character.
$1

Puede generar ceros iniciales y finales, y números sin una parte entera.

Se podría jugar golf 2 o 3 bytes más si pudiera usar 4+. Pero no estoy seguro de cómo definir el resultado teórico si la entrada tiene un flujo interminable de 4s.

jimmy23013
fuente
1
Me maldijo una cosa en forma de T al publicar esta respuesta.
jimmy23013