Implementieren Sie eine stark Darboux-Funktion

12

Laut Wikipedia ist eine stark Darboux-Funktion

eine, für die das Bild jedes (nicht leeren) offenen Intervalls die gesamte reale Linie ist

Mit anderen Worten, eine Funktion f ist stark Darboux, wenn 3 beliebige reelle Zahlen a , b und y sind. Es ist immer möglich, ein x zwischen (verschieden) a und b so dass f(x)=y .

Für die Zwecke dieser Herausforderung werden wir stattdessen stark Darboux-Funktionen über die Rationalitäten betrachten.

Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die:

  • gibt für jede Eingabe einer rationalen Zahl eine rationale Zahl als Ausgabe an,
  • Gibt für eine bestimmte Eingabe immer die gleiche Ausgabe aus, und
  • hat die stark Darboux-Eigenschaft.

Die Ein- und Ausgabe kann eine der folgenden sein:

  • ein Zahlentyp mit willkürlicher Genauigkeit, falls Ihre Sprache eine hat (oder eine Bibliothek für eine hat, z. B. GMP).
  • Eine Zeichenfolgendarstellung der Zahl, von der Sie annehmen können, enthält immer einen Dezimalpunkt und mindestens eine Ziffer auf beiden Seiten. Es kann in jeder Basis b2 , aber Eingang und Ausgang müssen sich in derselben Basis befinden. Sie können einen beliebigen Zeichensatz für die Ziffern und den Dezimalpunkt verwenden (auch hier müssen sie zwischen Eingabe und Ausgabe konsistent sein).

Der Eingang wird immer eine abschließende Erweiterung der Basis b . Für die Ausgabe, die abhängig von Ihrer Funktionsauswahl eine theoretisch nicht terminierende Erweiterung der Basis b aufweisen kann, können Sie eine der folgenden Optionen auswählen:

  • Ausgabestellen für immer.
  • Nehmen Sie eine zusätzliche Ganzzahl als Eingabe und geben Sie mindestens so viele Ziffern aus.
  • Geben Sie mindestens so viele Ziffern aus, wie in der Eingabe enthalten sind (die möglicherweise nachgestellte Nullen enthalten).

Beachten Sie, dass durch die Art der Herausforderung, dass die Konvention Nummern können darstellbare durch Standardnummerntypen angenommen werden wird nicht gelten, mit Ausnahme des zweiten Eingang in Option 2 oben beschrieben.

Um Schlupflöcher mit Funktionen zu vermeiden, die nur für nicht terminierende Rationen definiert sind, muss Ihre Einreichung in der Praxis in der Lage sein, eine Ausgabe zu erzeugen, die beliebig nahe an einem gewünschten Wert liegt . In Anbetracht der rationalen Zahlen a , b , y und ε muss es formal eine rationale Zahl x , die in der von Ihnen gewählten Basis endet, sodass a<x<b und |f(x)y|<ε .


Nachfolgend finden Sie eine Beschreibung der Funktion von Conway base 13, um Ihnen einige Anregungen zu geben :

  • Konvertiere x zu Basis 13 und entferne den Dezimalpunkt.
  • Wenn das Ergebnis die Form [x]A[y]C[z]13 , wobei [y] und [z] nur aus Ziffern von 0 bis 9 bestehen, dann ist f(x)=[y].[z] .
  • Wenn das Ergebnis die Form [x]B[y]C[z]13 , wobei [y] und [z] nur aus Ziffern von 0 bis 9 bestehen, ist f(x)=[y].[z] .
  • Andernfalls, f(x)=0 .

Diese Funktion ist stark Darboux. Nehmen wir zum Beispiel an, wir wollen ein x zwischen 123.45613 und 123.45713 so dass f(x)=7.89 . Der Basis-13-Wert123.456A7C8913 würde diese Anforderung erfüllen.

Ihre Übermittlung kann eine Implementierung dieser Funktion sein, obwohl ich vermute, dass es andere stark Darboux-Funktionen gibt, deren Implementierung viel kürzer ist. :)

Türknauf
quelle
Wird angenommen, dass die Zahlen eine terminierende Erweiterung der Basis ? b
Nitrodon
math.stackexchange-Link und auch die ursprüngliche Frage ist ein Betrug von für einige Beispiele
Giuseppe
Wenn wir den Conway Base 13-Algorithmus implementieren, könnten wir Eingaben in Base 13 übernehmen, müssten dann aber auch in Base 13 ausgeben. Da die Ausgabe der Funktion in der Regel dezimal erfolgt, erhalten wir eine wiederkehrende Tridezimalzahl. Wie soll das ausgegeben werden? Geben wir die ersten Ziffern aus, wobei x in der Frage angegeben ist (allerdings noch nicht)? Oder müssen wir darauf hinweisen, dass es wiederkehrend ist? xx
Nick Kennedy
@ NickKennedy Danke, ich habe das übersehen - ich habe die Frage bearbeitet, um zu klären.
Türknauf
1
Hmm, ich bin mir ziemlich sicher, dass ich eine stark konstante Darboux-Funktion oder die Identität aller abschließenden Eingaben definieren kann ...
Christian Sievers

Antworten:

4

Retina 0.8.2 , 43 50 Bytes

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

Probieren Sie es online! E / A ist eine binäre Zeichenfolge. Kodieren Sie eine Binärzahl in der yNähe einer anderen Binärzahl awie folgt:

  1. Wenn akein enthalten ist ., Suffix eins.
  2. Wenn aeine ungerade Anzahl von Ziffern nach dem steht ., wird das Suffix a 0.
  3. Wenn y negativ, dann Suffix, 11sonst Suffix 10.
  4. Für jede Ziffer in y wird das Suffix 0gefolgt von dieser Ziffer verwendet.
  5. Wenn a yenthalten ist ., wird 11an dieser Stelle ein Suffix eingefügt, andernfalls wird es nach allen Ziffern in das Suffix eingefügty .

Erläuterung:

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

Koppeln Sie die Ziffern ab dem Binärpunkt. Wenn die Zahl eine gültige Kodierung ist, dekodieren Sie das letzte 1xZiffernpaar in ein .und das vorletzte in ein optionales -Zeichen. Vorhergehende Ziffern werden ignoriert.

0(.)
$1

Dies sollte nur Paare, die mit beginnen 0, so löschen Sie die 0s.

Neil
quelle
Ich bekomme manchmal Ausgaben wie -.. Bedeuten diese Nullen oder sollen sie nicht produziert werden?
Erik der Outgolfer
@EriktheOutgolfer Ich schätze ich könnte das *s in +s ändern , das würde mindestens eine Ziffer vor und nach dem garantieren .?
Neil
Eigentlich kann ich keine Nachkommastellen garantieren .. Ich denke, ich kann vor dem .allerdings noch eine Ziffer garantieren .
Neil
Eine zusätzliche Klemme 0 in einer Zahl mit .ändert ihren Wert nicht, aber eine solche Änderung des Eingangs Ihrer Funktion ändert den Ausgang. Möglicherweise können Sie dies beheben, indem Sie davon ausgehen, dass der Eingang keine solchen Nullen hat. Wenn Sie Paare von rechts gruppieren, wie funktioniert dies "theoretisch für jede echte Eingabe"?
Christian Sievers
@ChristianSievers (Entschuldigung, ich habe meinen Posteingang früher nicht bemerkt) Ich habe meine Antwort auf die Beschreibung der Basis 13-Funktion in der Frage gestützt, die ebenfalls eine abschließende Darstellung zu erfordern scheint. Auch Sie haben Recht, dass ich davon ausgegangen bin, dass es keine nachgestellten Nullen geben würde. (Ganzzahlen müssen also immer 11in Schritt 2 angehängt werden.)
Neil,
1

Jelly , 71 Bytes

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

Probieren Sie es online!

Ein vollständiges Programm, das eine Zahl zur Basis 10 als Eingabe und Ausgabe verwendet und die Conway-Funktion zur Basis 13 implementiert, jedoch die Basis 7 und 10 anstelle von 10 und 13 verwendet. Sowohl für die Eingabe als auch für die Ausgabe wird ein Komma als Dezimaltrennzeichen verwendet. Die Ausgabe hat eine führende - für negative Zahlen.

Nick Kennedy
quelle
Das Beispiel am TIO-Link hat die Ziffer 9 in der Eingabe und der Ausgabe. Wie sind diese Basis-7-Zahlen?
Christian Sievers
@ChristianSievers bedeutete leider Basis 10 für Ein- und Ausgabe. Base 7 wird im Code verwendet, wird aber wieder in Base 10 konvertiert.
Nick Kennedy
Gut, jetzt kann ich die Eingabe ändern und verstehen, wie sich das auf die Ausgabe auswirkt!
Christian Sievers
1

Netzhaut ,28 25 26 28 Bytes

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

Probieren Sie es online!

Erläuterung

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

Es kann führende und nachfolgende Nullen und Zahlen ohne einen ganzzahligen Teil ausgeben.

Es könnte 2 oder 3 Bytes mehr Golf gespielt werden, wenn ich verwenden könnte 4+. Ich bin mir jedoch nicht sicher, wie ich das theoretische Ergebnis definieren soll, wenn die Eingabe einen endlosen Strom von 4s enthält.

jimmy23013
quelle
1
Ich wurde von einem T-förmigen Ding verflucht, als ich diese Antwort veröffentlichte.
Jimmy23013