Die Square Number Digit Density (SNDD) einer von mir erfundenen Zahl ist das Verhältnis der Anzahl der in aufeinanderfolgenden Ziffern gefundenen Square Numbers zur Länge der Zahl. Beispielsweise ist 169 eine dreistellige Zahl mit 4 Quadratzahlen - 1, 9, 16, 169 - und hat somit eine Quadratzahlendichte von 4/3 oder 1,33. Die 4-stellige Zahl 1444 hat 6 Quadrate - 1, 4, 4, 4, 144, 1444 - und damit ein Verhältnis von 6/4 oder 1,5. Beachten Sie im vorherigen Beispiel, dass Quadrate wiederholt werden dürfen. Außerdem ist 441 nicht zulässig, da es nicht fortlaufend innerhalb der Nummer 1444 gefunden werden kann.
Ihre Aufgabe ist es, ein Programm zu schreiben, das einen bestimmten Bereich von A bis B (einschließlich) nach der Zahl mit der höchsten Dichte von Quadratziffern durchsucht. Ihr Programm sollte die folgenden Spezifikationen einhalten:
- Nehmen Sie Input A, B im Bereich von 1 bis 1.000.000.000 (1 Milliarde). Beispiel:
sndd 50 1000
- Geben Sie als Ergebnis die Nummer mit der größten SNDD zurück. Im Falle eines Unentschieden geben Sie die kleinste Zahl zurück.
- 0 zählt in keiner Form als Quadrat, 0, 00, 000 usw. Ebenso wenig wie Quadrate, die mit 0 beginnen, wie z. B. 049 oder 0049.
- Beachten Sie, dass die gesamte Zahl kein Quadrat sein muss.
Beispiele:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Bonus: Was ist die Nummer mit dem größten SNDD zwischen 1 und 1.000.000.000? Können Sie nachweisen, ob dies der größtmögliche Wert ist oder ob es einen größeren Wert in einem höheren Bereich gibt?
Aktuelle Ergebnisse:
- Rubin: 142
- Windows PowerShell: 153
- Scala: 222
- Python: 245
Nachdem eine Antwort ausgewählt wurde, ist hier meine (ungolfed) Referenzimplementierung in JavaScript: http://jsfiddle.net/ywc25/2/
quelle
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
Überprüft,ruby sndd.rb 14000 15000
starte ich mit Windows und erhalte 14000.?0
handelt es sich um ein Fixnum, während es sich in Ruby 1.8 um einen String handelt. Der Vergleich, den ich erwähnte, hat je nach Ruby-Version eine andere Bedeutung (eigentlich sollte er in 1.8 eine Ausnahme auslösen). Aus diesem Grund habe ich im Titel ausdrücklich die Version 1.9 erwähnt.Beantwortung des Bonus: Die beste Punktzahl für Zahlen <1e9 ist 5/3 = 1.666 ..., generiert von 144411449 (und vielleicht anderen?).
Aber mit größeren Zahlen kann man es besser machen. Wenn n eine Punktzahl von x hat, können Sie im Allgemeinen zwei Kopien von n verketten und die gleiche Punktzahl x erhalten. Wenn Sie Glück haben und n dieselbe erste und letzte Ziffer hat, können Sie eine dieser Ziffern in der Verkettung ablegen und Ihre Punktzahl geringfügig verbessern (eine weniger als die doppelte Anzahl von Quadraten und eine weniger als die doppelte Anzahl von Ziffern). .
n = 11449441 hat eine Punktzahl von 1,625 und hat die gleiche erste und letzte Ziffer. Unter Verwendung dieser Tatsache erhalten wir die folgende Reihenfolge von Bewertungen:
Dies ergibt eine unendliche Folge von Zahlen, die streng (wenn auch abnehmend) besser sind als vorherige Zahlen und alle bis auf die ersten 2 besser als die beste Punktzahl für Zahlen <1e9.
Diese Sequenz ist jedoch möglicherweise nicht die beste. Es konvergiert zu einer endlichen Punktzahl (12/7 = 1.714) und es kann andere Zahlen geben, deren Punktzahl besser ist als das Limit.
Edit : eine bessere Sequenz, konvergiert zu 1,75
quelle
Windows PowerShell, 153
154155164174Dank Ventero für eine Ein-Byte-Reduzierung war ich zu dumm, um mich selbst zu finden.
154-Byte-Version erklärt:
quelle
Python, 245
256Dies könnte viel kürzer sein, wenn der Bereich von
stdin
im Gegensatz zu den Befehlszeilenargumenten gelesen wird .Bearbeiten:
In Bezug auf den Bonus schlagen meine Experimente Folgendes vor:
Vermutung 1 . Für jedes n ∈ ℕ darf die Zahl in ℕ ≤ n mit der größten SNDD nur die Ziffern 1, 4 und 9 enthalten.
Vermutung 2. ∃ n ∈ ∈ i ∈ ≥ ≥ n : SNDD ( n ) ≥ SNDD ( i ).
Proof-Skizze . Die Menge der Quadrate mit den Ziffern 1, 4 und 9 ist wahrscheinlich endlich . ∎
quelle
range(*map(int,sys.argv[1:]))
Scala, 222
(Scala 2.9 erforderlich.)
quelle
In Anbetracht der Bonusfrage: Außerhalb des Bereichs ist die höchstmögliche SNDD unendlich.
Zumindest, wenn ich die Frage richtig lese, zählt ein Quadrat wie 100 (10 * 10).
Wenn Sie die Zahl 275625 berücksichtigen, ist die Punktzahl 5/6, da 25, 625, 5625, 75625 und 275625 alle quadratisch sind.
Das Addieren von 2 Nullen ergibt: 27562500, was eine Punktzahl von 10/8 ergibt. Die Grenze dieser Sequenz ist 5/2 = 2,5
Entlang der gleichen Linie finden Sie Quadrate, die in einer beliebigen Anzahl kleinerer Quadrate enden. Ich kann das beweisen, aber Sie haben wahrscheinlich die Idee.
Zugegeben, dies ist keine sehr gute Lösung, aber es beweist, dass es keine Obergrenze für die SNDD gibt.
quelle
Clojure - 185 Zeichen
Könnte wahrscheinlich weiter optimiert werden, aber hier geht:
Wird als Funktion mit zwei Parametern verwendet:
quelle
Jelly , 21 Bytes, Sprachnachstellung
Probieren Sie es online!
Erläuterung
Hilfsfunktion (berechnet die Stellendichte ihrer Eingabe):
Hauptprogramm:
Das Programm ist wohl interessanter,
Ḣ
wenn nicht nur eine, sondern alle Zahlen mit maximaler Dichte zurückgegeben werden, aber ich habe es hinzugefügt, um der Spezifikation zu entsprechen.quelle