Gęstość cyfr liczby kwadratowej (SNDD) pewnej liczby - wynalezionej przeze mnie - jest stosunkiem liczby liczb kwadratowych znalezionych w kolejnych cyfrach do długości liczby. Na przykład 169 jest trzycyfrową liczbą zawierającą 4 liczby kwadratowe - 1, 9, 16, 169 - a zatem ma gęstość cyfr liczby kwadratowej 4/3 lub 1,33. 4-cyfrowy numer 1444 ma 6 kwadratów - 1, 4, 4, 4, 144, 1444 - a zatem stosunek 6/4 lub 1,5. Zwróć uwagę w poprzednim przykładzie, że kwadraty mogą się powtarzać. Również 441 nie jest dozwolone, ponieważ nie można go znaleźć kolejno pod numerem 1444.
Twoim zadaniem jest napisanie programu, który będzie wyszukiwał w danym zakresie od A do B (włącznie) liczbę o największej gęstości cyfr kwadratowych. Twój program powinien być zgodny z następującymi specyfikacjami:
- Weź dane wejściowe A, B w zakresie od 1 do 1 000 000 000 (1 miliard). Przykład:
sndd 50 1000
- W rezultacie zwróć liczbę o największym SNDD. W przypadku remisu zwróć najmniejszą liczbę.
- 0 nie jest liczone jako kwadrat w żadnej formie, 0, 00, 000 itd. Nie należy również kwadratów rozpoczynających się od 0, takich jak 049 lub 0049.
- Zauważ, że cały numer nie musi być liczbą kwadratową.
Przykłady:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Premia: jaka jest liczba przy największym SNDD od 1 do 1 000 000 000? Czy możesz udowodnić, czy jest to największy możliwy, czy może być większy w wyższym zakresie?
Aktualne wyniki:
- Rubin: 142
- Windows PowerShell: 153
- Scala: 222
- Python: 245
Teraz, gdy wybrano odpowiedź, oto moja (nie golfowa) referencyjna implementacja w JavaScript: http://jsfiddle.net/ywc25/2/
źródło
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
sprawdza kwadraty zaczynające się od 0.ruby sndd.rb 14000 15000
Windowsa, dostaję 14000.?0
jest to Fixnum, podczas gdy w Ruby 1.8 to ciąg znaków, więc porównanie, o którym wspomniałem, ma inne znaczenie w zależności od wersji Ruby (w rzeczywistości powinno rzucać wyjątek w 1.8). Właśnie dlatego w tytule wyraźnie wspomniałem o wersji 1.9.Odpowiadając na bonus: najlepszy wynik dla liczb <1e9 to 5/3 = 1,666 ..., wygenerowany przez 144411449 (a może inne?).
Ale możesz zrobić lepiej z większymi liczbami. Ogólnie, jeśli n ma wynik x, możesz połączyć dwie kopie n i uzyskać taki sam wynik x. Jeśli masz szczęście, a n ma tę samą pierwszą i ostatnią cyfrę, możesz upuścić jedną z tych cyfr w konkatenacji i nieznacznie poprawić swój wynik (jeden mniej niż dwukrotność liczby kwadratów i jeden mniej niż dwukrotność liczby cyfr) .
n = 11449441 ma wynik 1,625 i ma tę samą pierwszą i ostatnią cyfrę. Korzystając z tego faktu, otrzymujemy następującą sekwencję wyników:
co daje nieskończoną sekwencję liczb, które są ściśle (choć malejąco) lepsze niż poprzednie liczby, a wszystkie z wyjątkiem pierwszych 2 są lepsze niż najlepszy wynik dla liczb <1e9.
Ta sekwencja może jednak nie być najlepsza. Jest zbieżny do wyniku skończonego (12/7 = 1,714) i mogą istnieć inne liczby z lepszymi wynikami niż limit.
Edycja : lepsza sekwencja, zbieżna do 1,75
źródło
Windows PowerShell, 153
154155164174Dzięki Ventero za redukcję o jeden bajt byłem zbyt głupi, żeby się znaleźć.
Wyjaśnienie wersji 154-bajtowej:
źródło
Python, 245
256Może to być o wiele krótsze, jeśli odczytano by zakres
stdin
w przeciwieństwie do argumentów wiersza poleceń.Edytować:
W odniesieniu do premii moje eksperymenty sugerują, co następuje:
Domysł 1 . Dla każdego n ∈ ℕ liczba w ℕ ≤ n przy największym SNDD musi zawierać wyłącznie cyfry 1, 4 i 9.
Przypuszczenie 2. ∃ n ∈ ℕ ∀ i ∈ ℕ ≥ n : SNDD ( n ) ≥ SNDD ( i ).
Szkic dowodowy . Zbiór kwadratów z cyframi 1, 4 i 9 jest prawdopodobnie skończony . ∎
źródło
range(*map(int,sys.argv[1:]))
Scala, 222
(Wymagany Scala 2.9.)
źródło
Biorąc pod uwagę dodatkowe pytanie: poza zakresem najwyższy możliwy SNDD jest nieskończony.
Przynajmniej, jeśli poprawnie przeczytam pytanie, kwadrat taki jak 100 (10 * 10) się liczy.
Jeśli weźmiesz pod uwagę liczbę 275625, wynik to 5/6, ponieważ 25, 625, 5625, 75625 i 275625 są kwadratowe.
Dodanie 2 zer daje 27562500, który ma wynik 10/8. Granica tej sekwencji wynosi 5/2 = 2,5
Wzdłuż tych samych linii można znaleźć kwadraty, które kończą się dowolną liczbą mniejszych kwadratów. Mogę to udowodnić, ale prawdopodobnie masz pomysł.
Wprawdzie nie jest to bardzo miłe rozwiązanie, ale dowodzi, że nie ma górnej granicy dla SNDD.
źródło
Clojure - 185 znaków
Prawdopodobnie można go jeszcze zoptymalizować, ale oto:
Używany jako funkcja z dwoma parametrami:
źródło
Galaretka , 21 bajtów, wyzwanie dla postdate języka
Wypróbuj online!
Wyjaśnienie
Funkcja pomocnicza (oblicza gęstość cyfr na wejściu):
Główny program:
Program jest prawdopodobnie bardziej interesujący bez
Ḣ
- w ten sposób zwraca wszystkie liczby o maksymalnej gęstości zamiast tylko jednej - ale dodałem go, aby był zgodny ze specyfikacją.źródło