Implementar uma função fortemente Darboux

12

Segundo a Wikipedia , uma função fortemente Darboux é

um para o qual a imagem de cada intervalo aberto (não vazio) é toda a linha real

Em outras palavras, uma função é fortemente Darboux se dado 3 números reais arbitrárias , , e , que é sempre possível encontrar um entre (distinta) e tal que .fabyxabf(x)=y

Para os propósitos deste desafio, consideraremos fortemente as funções de Darboux sobre os racionais.

Seu desafio é escrever um programa ou função que:

  • fornece um número racional como saída para cada entrada de número racional,
  • sempre fornece a mesma saída para uma determinada entrada e
  • possui a propriedade fortemente Darboux.

Entrada e saída podem ser uma das seguintes:

  • um tipo de número de precisão arbitrária, se o seu idioma tiver um (ou uma biblioteca para um, por exemplo, GMP).
  • uma representação de string do número, que você pode assumir sempre conterá um ponto decimal e pelo menos um dígito de cada lado. Pode estar em qualquer base , mas a entrada e a saída devem estar na mesma base. Você pode usar qualquer conjunto de caracteres para os dígitos e ponto decimal (mas, novamente, eles devem ser consistentes entre entrada e saída).b2

A entrada sempre terá uma expansão de base final . Quanto à saída, que pode ter uma expansão da base teoricamente não terminal, dependendo da sua opção de função, você pode escolher uma das seguintes opções:bb

  • dígitos de saída para sempre.
  • tome um número inteiro adicional como entrada e saída, pelo menos, com tantos dígitos.
  • produz pelo menos quantos dígitos há na entrada (que podem conter zeros à direita).

Observe que, pela natureza desse desafio, a convenção de que números podem ser considerados representáveis ​​por tipos de número padrão não se aplica, exceto pela segunda entrada descrita na opção 2 acima.

Para evitar brechas com funções definidas apenas em racionais não termináveis, sua submissão deve ser capaz de produzir uma saída arbitrariamente próxima a um valor desejado na prática . Formalmente, dado números racionais , , , e , deve haver um número racional que termina em sua base escolhida de tal forma que e .abyεxa<x<b|f(x)y|<ε


Para lhe dar algumas idéias, aqui está uma descrição da função base 13 do Conway :

  • Converta na base 13 e remova o ponto decimal.x
  • Se o resultado for do formato , onde e consistem apenas em dígitos de 0 a 9, então .[x]A[y]C[z]13[y][z]f(x)=[y].[z]
  • Se o resultado for do formato , onde e consistem apenas em dígitos de 0 a 9, então .[x]B[y]C[z]13[y][z]f(x)=[y].[z]
  • Caso contrário, .f(x)=0

Esta função é fortemente Darboux. Digamos, por exemplo, que queremos encontrar entre e modo que . O valor base-13 atenderia a esse requisito.x123.45613123.45713f(x)=7.89123.456A7C8913

Seu envio pode ser uma implementação dessa função, embora eu suspeite que haja outras funções do Darboux fortemente muito mais curtas de implementar. :)

Maçaneta da porta
fonte
Presume-se que os números possuam uma expansão de base final ? b
Nitrodon
math.stackexchange ligação e também a pergunta original é um joguete de alguns exemplos
Giuseppe
Se implementarmos o algoritmo Conway base 13, poderíamos receber entrada na base 13, mas também teríamos que produzir na base 13. Como a saída da função geralmente é decimal, terminaremos com um número tridecimal recorrente. Como isso deve ser produzido? Nós produzimos os primeiros dígitos, onde é especificado na pergunta (ainda não)? Ou precisamos indicar que é recorrente? xxx
Nick Kennedy
@ NickKennedy Obrigado, eu esqueci isso - editei a pergunta para esclarecer.
Maçaneta
1
Hmm, eu tenho certeza que eu posso definir uma função fortemente Darboux que é constante ou a identidade em todas as entradas de terminação ...
Christian Sievers

Respostas:

4

Retina 0.8.2 , 43 50 bytes

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

Experimente online! E / S é como uma sequência binária. Codifique um número binário ypróximo a outro número binário da aseguinte maneira:

  1. Se anão contiver um ., sufixo um.
  2. Se acontiver um número ímpar de dígitos após o ., sufixo a 0.
  3. Se yfor negativo, sufixo; 11caso contrário, sufixo 10.
  4. Para cada dígito em y, sufixo 0seguido por esse dígito.
  5. Se ycontiver um .sufixo 11nesse ponto, coloque-o depois de todos os dígitos y.

Explicação:

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

Emparelhe os dígitos começando no ponto binário. Se o número for uma codificação válida, decodifique o último 1xpar de dígitos para ae .o segundo último para um -sinal opcional . Os dígitos anteriores são ignorados.

0(.)
$1

Isso deve deixar apenas os pares que começam com 0, então exclua os 0s.

Neil
fonte
Às vezes recebo saídas como -.. Isso implica zeros ou eles não deveriam ser produzidos?
Erik the Outgolfer
@EriktheOutgolfer Acho que poderia mudar os *s para +s, isso garantiria pelo menos um dígito antes e depois do .?
Neil
Na verdade, não posso garantir dígitos após o .. Acho que ainda posso garantir um dígito antes do pensamento ..
Neil
Um terminal 0 adicional em um número com .não altera seu valor, mas essa alteração na entrada da sua função altera a saída. Talvez você tenha permissão para corrigir isso assumindo que a entrada não possua 0s. Além disso, se você agrupar pares da direita, como isso "teoricamente funciona para qualquer entrada real"?
Christian Sievers
@ChristianSievers (Desculpe, mas não percebi minha caixa de entrada anteriormente) Baseei minha resposta na descrição da função base 13 da pergunta, que também parece exigir uma representação final. Você também está certo de que eu estava assumindo que não haveria zeros à direita. (Então inteiros sempre tem que ter 11anexado no passo 2.)
Neil
1

Geléia , 71 bytes

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

Experimente online!

Um programa completo que usa um número de base 10 como entrada e saída e implementa a função base 13 do Conway, mas usando as bases 7 e 10 em vez de 10 e 13. Tanto a entrada quanto a saída usam vírgula como separador decimal. A saída terá um líder - para números negativos.

Nick Kennedy
fonte
O exemplo no link TIO tem o dígito 9 na entrada e na saída. Então, como estão esses números 7 base?
Christian Sievers
@ChristianSievers desculpe significava a base 10 para entrada e saída. Base 7 é usado no código, mas está de volta convertido para base 10.
Nick Kennedy
Tudo bem, agora posso mudar a entrada e entender como isso afeta a saída!
Christian Sievers
1

Retina ,28. 25 26 28 bytes

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

Experimente online!

Explicação

.*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

Pode gerar zeros à esquerda e à direita e números sem uma parte inteira.

Poderia ser jogado 2 ou 3 bytes a mais se eu pudesse usar 4+. Mas não tenho certeza de como definir o resultado teórico se a entrada tiver um fluxo interminável de 4s.

jimmy23013
fonte
1
Fui amaldiçoado por uma coisa em forma de T postando esta resposta.
21419 jimmy23013 17/07/19