Implementa una funzione fortemente Darboux


12

Secondo Wikipedia , una funzione fortemente di Darboux è

uno per il quale l'immagine di ogni intervallo aperto (non vuoto) è l'intera linea reale

In altre parole, una funzione è fortemente Darboux se dato 3 numeri reali arbitrari , , e , è sempre possibile trovare una tra (distinti) e tali che .fabyxabf(x)=y

Ai fini di questa sfida, considereremo invece fortemente le funzioni di Darboux rispetto ai razionali.

La tua sfida è scrivere un programma o una funzione che:

  • fornisce un numero razionale come output per ogni input di numero razionale,
  • fornisce sempre lo stesso output per un determinato input e
  • ha la proprietà fortemente Darboux.

L'input e l'output possono essere uno dei seguenti:

  • un tipo di numero a precisione arbitraria, se la tua lingua ne ha uno (o ha una libreria per uno, ad esempio GMP).
  • una rappresentazione in stringa del numero, che si può presumere, conterrà sempre un punto decimale e almeno una cifra su entrambi i lati. Può trovarsi in qualsiasi base , ma input e output devono trovarsi nella stessa base. È possibile utilizzare qualsiasi set di caratteri per le cifre e il punto decimale (ma, di nuovo, devono essere coerenti tra input e output).b2

L'ingresso avrà sempre un'espansione di base terminazione . Per quanto riguarda l'output, che può avere un'espansione di base teoricamente non terminante a seconda della scelta della funzione, è possibile scegliere una delle seguenti opzioni:bb

  • cifre di uscita per sempre.
  • accetta un numero intero aggiuntivo come input e output almeno di tante cifre.
  • produce almeno tutte le cifre che ci sono nell'input (che può contenere zero finali).

Si noti che per la natura di questa sfida, non si applica la convenzione secondo cui i numeri possono essere considerati rappresentabili da tipi di numeri standard , ad eccezione del secondo input descritto nell'opzione 2 sopra.

Per evitare scappatoie con funzioni definite solo su razionali non terminanti, la tua presentazione deve essere in grado di produrre output arbitrariamente vicino al valore desiderato nella pratica . Formalmente, data numeri razionali , , , e , ci deve essere un numero razionale che termina con la vostra base scelti in modo che e .abyεxa<x<b|f(x)y|<ε


Per darvi alcune idee, ecco una descrizione della funzione di base 13 di Conway :

  • Converti in base 13 e rimuovi il punto decimale.x
  • Se il risultato è nella forma , dove e sono costituiti solo da cifre da 0 a 9, allora .[x]A[y]C[z]13[y][z]f(x)=[y].[z]
  • Se il risultato è nella forma , dove e sono composti solo da cifre da 0 a 9, allora .[x]B[y]C[z]13[y][z]f(x)=[y].[z]
  • Altrimenti, .f(x)=0

Questa funzione è fortemente Darboux. Supponiamo, ad esempio, che vogliamo trovare una tra e tale che . Il valore base-13 soddisferebbe questo requisito.x123.45613123.45713f(x)=7.89123.456A7C8913

La tua richiesta potrebbe essere un'implementazione di questa funzione, anche se sospetto che ci siano altre funzioni fortemente di Darboux che sono molto più brevi da implementare. :)


b

math.stackexchange link e anche la domanda originale di cui è un duplicato per alcuni esempi
Giuseppe

xx

@NickKennedy Grazie, l'ho trascurato: ho modificato la domanda per chiarire.
Maniglia della porta

1
Hmm, sono abbastanza sicuro di poter definire una funzione fortemente darboux che è costante o l'identità su tutti gli input terminanti ...
Christian Sievers,

Risposte:


4

Retina 0.8.2 , 43 50 byte

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

Provalo online! L'I / O è una stringa binaria. Codificare un numero binario yvicino a un altro numero binario acome segue:

  1. Se anon contiene un ., suffisso uno.
  2. Se acontiene un numero dispari di cifre dopo il ., suffisso a 0.
  3. Se yè negativo, allora suffisso 11altrimenti suffisso 10.
  4. Per ogni cifra in y, suffisso 0seguito da quella cifra.
  5. Se ycontiene a ., suffisso 11a quel punto, altrimenti suffisso dopo tutte le cifre y.

Spiegazione:

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

Associare le cifre a partire dal punto binario. Se il numero è una codifica valida, decodifica l'ultima 1xcoppia di cifre in a .e la seconda ultima in un -segno opzionale . Le cifre precedenti vengono ignorate.

0(.)
$1

Questo dovrebbe lasciare solo le coppie che iniziano con 0, quindi eliminare la 0s.


A volte ricevo output come -.. Questi implicano zero o non dovrebbero essere prodotti?
Erik the Outgolfer,

@EriktheOutgolfer Immagino di poter cambiare la *s in +s, che garantirebbe almeno una cifra prima e dopo il .?
Neil,

In realtà non posso garantire cifre dopo il .. Penso di poter ancora garantire una cifra prima del pensiero ..
Neil,

Un ulteriore terminale 0 in un numero con .non cambia il suo valore, ma una tale modifica nell'input della tua funzione cambia l'output. Forse ti è consentito risolvere questo problema supponendo che l'input non abbia tali 0. Inoltre, se raggruppate le coppie da destra, come funziona "in teoria per qualsiasi input reale"?
Christian Sievers,

@ChristianSievers (Mi dispiace non aver notato prima la mia casella di posta) Ho basato la mia risposta sulla descrizione della funzione base 13 nella domanda, che sembra richiedere anche una rappresentazione di chiusura. Inoltre hai ragione nel pensare che non ci sarebbero stati zero finali. (Quindi i numeri interi devono sempre essere stati 11aggiunti nel passaggio 2.)
Neil

1

Gelatina , 71 byte

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

Provalo online!

Un programma completo che accetta un numero di base 10 come input e output e implementa la funzione di base 13 di Conway ma che utilizza le basi 7 e 10 anziché 10 e 13. Sia l'input che l'output utilizzano la virgola come separatore decimale. L'output avrà un vantaggio - per i numeri negativi.


L'esempio sul collegamento TIO ha la cifra 9 nell'ingresso e nell'uscita, quindi come sono questi numeri di base 7?
Christian Sievers,

Scusate @ChristianSievers significava base 10 per input e output. La base 7 viene utilizzata nel codice, ma viene riconvertita nella base 10.
Nick Kennedy,

Bene, ora posso cambiare l'input e capire come ciò influisce sull'output!
Christian Sievers,

1

Retina ,28 25 26 28 byte

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

Provalo online!

Spiegazione

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

Può generare zeri iniziali e finali e numeri senza una parte intera.

Potrebbe essere golfato 2 o 3 byte in più se potessi usare 4+. Ma non sono sicuro di come definire il risultato teorico se l'input ha un flusso infinito di 4s.


1
Sono stato maledetto da una cosa a forma di T inviando questa risposta.
jimmy23013,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.