Задача 98 - Проект Эйлера - PullRequest
       2

Задача 98 - Проект Эйлера

3 голосов
/ 04 декабря 2010

Проблема заключается в следующем:

Заменяя каждую из букв в слове УХОД на 1, 2, 9 и 6 соответственно, мы формируем квадратное число: 1296 = 36 ^ (2).Примечательно, что при использовании тех же цифровых подстановок анаграмма RACE также образует квадратное число: 9216 = 96 ^ (2).Мы назовем CARE (и RACE) парой слов квадратной анаграммы и дополнительно укажем, что начальные нули недопустимы, и ни одна другая буква не может иметь то же цифровое значение, что и другая буква.и «Сохранить ссылку / Target As ...», текстовый файл 16K, содержащий почти две тысячи общих английских слов, найти все пары слов квадратной анаграммы (палиндромное слово НЕ считается самой анаграммой).

Какое наибольшее квадратное число образовано любым членом такой пары?

ПРИМЕЧАНИЕ. Все сформированные анаграммы должны содержаться в данном текстовом файле.

Я не понимаюотображение CARE на 1296?Как это работает?или все сопоставления перестановок предназначены для проверки, т.е. все буквы 1-9?

Ответы [ 4 ]

5 голосов
/ 04 декабря 2010

Все присвоения цифр буквам разрешены.Так что C = 1, A = 2, R = 3, E = 4 было бы возможным присваиванием ... за исключением того, что 1234 не является квадратом, так что это было бы бесполезно.

Может быть, поможет другой примеруточни?Если мы назначим A = 6, E = 5, T = 2, то TEA = 256 = 16² и EAT = 625 = 25².Таким образом, (TEA = 256, EAT = 625) - это пара слов квадратной анаграммы.

(То, что разрешены все присвоения цифр буквам, не означает, что на самом деле проверка всех таких назначений является лучшимрешить проблему. Может быть какой-то другой, более умный способ сделать это.)

3 голосов
/ 04 декабря 2010

Короче говоря: да, все перестановки нужно попробовать.

1 голос
/ 08 ноября 2011

Хм. Как это поставить. Люди, которые составляют Project Euler, обещают, что для каждой проблемы есть решение, которое длится менее одной минуты, и есть только одна проблема, которая, я думаю, может не выполнить это обещание, но это не так.

Да, вы могли бы переставлять цифры и пробовать все перестановки для всех квадратов, но это было бы очень большим пространством поиска, которое вряд ли было бы правильным для TM. В общем, когда вы видите, что ваш «взгляд» на проблему приведет к поиску, который займет слишком много времени, вам нужно искать что-то еще.

Например, предположим, вас попросили определить, какие числа будут результатом умножения двух простых чисел между 1 и 1. Вы можете вычислить каждое число от 1 до 1, но может быть быстрее взять все комбинации двух простых чисел и умножить их. Поскольку вы смотрите на комбинации, вы можете начать с двух и идти до тех пор, пока ваши результаты не станут слишком большими, затем сделать то же самое с тремя и т. Д. Для сравнения, это должно быть намного быстрее - и вам не нужно умножать все числа Вы можете взять журналы всех простых чисел, а затем просто добавить их и найти предел для каждого простого числа, давая вам список чисел, которые вы можете сложить.

Существует множество инновационных решений, но первое, о котором вы думаете, особенно то, о котором вы думаете, когда Project Euler описывает проблему, скорее всего, будет неверным.

Итак, как вы можете подойти к этой проблеме? Вероятно, слишком много перестановок для просмотра, но, может быть, вы можете что-то выяснить с помощью сопоставлений и сопоставлений сопоставлений?

(Стараясь не отдавать все это.)

1 голос
/ 05 декабря 2010

Если вы проверяете все буквы подстановок на цифры, то вы ищете пары квадратов со свойствами:

  • имеют одинаковую длину
  • имеют те же цифры с количеством вхождений, что и во входной строке.

Быстрее найти все эти пары квадратов. Есть 68 квадратов длиной 4, 216 квадратов длиной 5, ... Фильтрация всех квадратов одинаковой длины по верхним свойствам создаст «небольшое» количество пар, которые являются решениями, которые вы ищете.

Эти данные являются «статическими» и не зависят от входных строк. Его можно рассчитать один раз и использовать для всех входных строк.

...