Квадратная плотность числа чисел (SNDD) числа, изобретенного мной, - это отношение числа квадратов чисел, найденных в последовательных цифрах, к длине числа. Например, 169 представляет собой трехзначное число, содержащее 4 квадратных числа - 1, 9, 16, 169 - и, таким образом, имеет плотность четырехзначного числа 4/3 или 1,33. Четырехзначное число 1444 имеет 6 квадратов - 1, 4, 4, 4, 144, 1444 - и, следовательно, соотношение 6/4 или 1,5. Обратите внимание, что в предыдущем примере квадраты можно повторять. Кроме того, 441 не допускается, потому что он не может быть найден последовательно внутри номера 1444.
Ваша задача - написать программу, которая ищет в заданном диапазоне A - B (включительно) число с наибольшей квадратной плотностью числа. Ваша программа должна соответствовать следующим спецификациям:
- Возьмите вход A, B в диапазоне от 1 до 1 000 000 000 (1 миллиард). Пример:
sndd 50 1000
- В результате верните число с наибольшим SNDD. В случае ничьей верните наименьшее число.
- 0 не считается квадратом в любой форме, 0, 00, 000 и т. Д. Также не учитываются квадраты, начинающиеся с 0, например 049 или 0049.
- Обратите внимание, что все число не должно быть квадратным числом.
Примеры:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Бонус: Какое число с наибольшим SNDD между 1 и 1 000 000 000? Можете ли вы доказать, является ли это наибольшим из возможных, или может быть большее в более высоком диапазоне?
Текущие результаты:
- Рубин: 142
- Windows PowerShell: 153
- Скала: 222
- Python: 245
Теперь, когда ответ был выбран, вот моя (невнятная) справочная реализация в JavaScript: http://jsfiddle.net/ywc25/2/
источник
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
проверяет квадраты, начинающиеся с 0.ruby sndd.rb 14000 15000
из Windows, я получаю 14000.?0
это Fixnum, тогда как в Ruby 1.8 это строка, поэтому упомянутое мной сравнение имеет различное значение в зависимости от версии Ruby (на самом деле в 1.8 должно быть исключение). Вот почему я явно упомянул версию 1.9 в заголовке.Отвечая на бонус: лучший результат для чисел <1e9 равен 5/3 = 1,666 ..., сгенерированный 144411449 (и, возможно, другие?).
Но вы можете сделать лучше с большими числами. Как правило, если n имеет оценку x, то вы можете объединить две копии n и получить ту же оценку x. Если вам повезло, и n имеет одну и ту же первую и последнюю цифры, то вы можете отбросить одну из этих цифр в конкатенации и немного улучшить свой счет (один менее чем в два раза больше квадратов и один менее чем в два раза больше цифр) ,
n = 11449441 имеет оценку 1,625 и имеет ту же первую и последнюю цифры. Используя этот факт, мы получаем следующую последовательность баллов:
который дает бесконечную последовательность чисел, которые строго (хотя и убывающие) лучше, чем предыдущие числа, и все, кроме первых 2, лучше, чем лучший результат для чисел <1e9.
Эта последовательность, возможно, не самая лучшая в целом. Он сходится к конечному баллу (12/7 = 1,714), и могут быть другие числа с лучшими баллами, чем предел.
Изменить : лучшая последовательность, сходится к 1,75
источник
Windows PowerShell, 153
154155164174Спасибо Ventero за однобайтовое сокращение, я был слишком глуп, чтобы найти себя.
154-байтовая версия пояснила:
источник
Python, 245
256Это могло бы быть намного короче, если бы диапазон считывался
stdin
в отличие от аргументов командной строки.Редактировать:
Что касается бонуса, мои эксперименты показывают следующее:
Гипотеза 1 . Для каждого n ∈ the число в ℕ ≤ n с наибольшим SNDD должно содержать только цифры 1, 4 и 9.
Гипотеза 2. ∃ п ∈ ℕ ∀ я ℕ ∈ ≥ п : SNDD ( п ) ≥ SNDD ( я ).
Эскиз доказательства . Набор квадратов с цифрами 1, 4 и 9, скорее всего, конечен . ∎
источник
range(*map(int,sys.argv[1:]))
Скала, 222
(Требуется Scala 2.9.)
источник
С учетом вопроса о бонусе: вне диапазона максимально возможный SNDD бесконечен.
По крайней мере, если я правильно прочитал вопрос, квадрат типа 100 (10 * 10) считается.
Если вы считаете число 275625, счет 5/6, так как 25, 625, 5625, 75625 и 275625 все квадратные.
Добавление 2 нулей дает: 27562500, который имеет оценку 10/8. Предел этой последовательности составляет 5/2 = 2,5
Вдоль тех же линий, вы можете найти квадраты, которые заканчиваются на любом количестве меньших квадратов. Я могу доказать это, но вы, вероятно, поняли идею.
По общему признанию, это не очень хорошее решение, но оно доказывает, что нет никакого верхнего предела SNDD.
источник
Clojure - 185 символов
Вероятно, можно было бы оптимизировать дальше, но здесь идет:
Используется как функция с двумя параметрами:
источник
Желе , 21 байт, языковые проблемы
Попробуйте онлайн!
объяснение
Вспомогательная функция (рассчитывает плотность ввода цифр):
Основная программа:
Программа, возможно, более интересна без
Ḣ
- таким образом, она возвращает все числа максимальной плотности, а не только одно - но я добавил ее, чтобы соответствовать спецификации.источник