Уважаемые джаварашеры!
Вопрос задаю не по теме местных задач,но кому-то будет интересно
Многие наверно слышали про задачу Генри Форда,в которой под каждой буквой спрятана определенная цифра(от 0 до 9)
Загадка выглядит так:
DONALD+GERALD = ROBERT
Известно,что D=5, соответственно нужно найти скрытые остальные цифры
На бумаге задача решается за 5-10 минут
А как бы вы ее решили с помощью Java?
заставить компьютер перебрать цифры и найти такие, чтоб сошлось вышеуказанное равенство
Den
17 уровень
Интересный вопрос
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас ПасинковSoftware Developer в ZipyMaster
1 марта 2018, 11:16
можно создать мапу. где ключем будет буква, а значением - предполагаемое число для этой буквы.
сделать метод (например setNewNumbersForLetters()), который бы для каждой буквы устанавливал бы новое число (продумать порядок замены чисел)
сделать методы getDonald(), getGerald() и getRobert(), которые бы возвращали соответствующий инт исходя из значений чисел в мапе
потом проверять
и чтоб все это крутилось в цикле типа:
так код станет чуть более удобочитаем, хотя и делать будет то же самое :)
0
Стас ПасинковSoftware Developer в ZipyMaster
1 марта 2018, 11:46
а чтобы избавиться от этого ада с циклами - можете вообще использовать даже не мапу, а просто десятизначное число, где каждый разраяд числа будет одной из букв
например, число 3517964028
A = 3
B = 5
D = 1
E = 7
G = 9
L = 6
N = 4
O = 0
R = 2
T = 8
в таком случае, чтобы взять следующую комбинацию - вам достаточно будет сделать numbers++
но тогда надо будет реализовать метод, который будет получать это число и индекс цифры, которую надо вернуть. чтоб вы могли передать в него ваше число и позицию 3 например, а в ответ вам метод вернул бы 1 (число на 3й позиции). только не думайте делать это через строки! тогда это будет насилие над памятью вашего компьютера)) делайте это через * и /
и предусмотрите вариант, когда в числе нет ничего на такой позиции. например, пришло число 15 и просят достать цифру на 4й позиции
число 15 это по сути число 0000000015, и как видно, на четвертой позиции у него стоит 0
тогда ваш код изменится примерно так:
0
Den
1 марта 2018, 12:38
не понимаю зачем нам индекс цифры
мы можем каждую цифру получать из numbers с помощью остатка от деления:
T=numbers%10;
R=(numbers/10)%10;
O=(numbers/100)%10;
N=(numbers/1000)%10; и тд
и можно не париться какую цифру получаем по индексу, цикл пробежит по всем существующим вариантам
полученные числа подставляем в условие if, увеличиваем numbers если условие false
ну и запустить метод на сравнение чисел в массиве, чтоб исключал варианты с повторяющимися цифрами
вообще вариант достойный, спасибо:)
0
Стас ПасинковSoftware Developer в ZipyMaster
1 марта 2018, 16:01
можно и в ифе это делать)
но я люблю когда у меня ифы простые))
поэтому и предложил делать это в методах getDonald(), getGerald() и getRobert().
а чтобы не писать в каждом из них
T=numbers%10;
R=(numbers/10)%10;
O=(numbers/100)%10;
N=(numbers/1000)%10; и тд
сделать это один раз в одном методе, который и вызывать в тех getDonald(), getGerald() и getRobert()
0
Den
1 марта 2018, 17:39
у меня if вроде и несложный) переписал таким образом:
но в таком виде компьютер заметно медленней чем с циклами (наверно потому что для каждого numbers приходится дополнительно высчитывать цифры а, о, g и тд)
0
Den
1 марта 2018, 17:52
я понял твою идею по методам
писал на скорую руку, просто было интересно получится ли решить
вообще круто что с помощью java можно решать любые задачи
думаю на этом остановимся и вернемся к курсу)
всем спасибо
0
Den
1 марта 2018, 10:30решение
Всем хай
все-таки решил свою загадку с помощью компьютера. девять циклов конечно пугают, но из доступных мне знаний другого варианта не нашел. задача вся не помещается, разобью на два сообщения
+4
Den
1 марта 2018, 10:31
0
Den
24 февраля 2018, 12:48
Нет,не думаю что есть какая-то зависимость между буквой и цифрой, в принципе вместо букв могли быть Х1,Х2,Х3 и тд)
0
Ярослав Java Developer Master
24 февраля 2018, 08:43
Если я правильно понял, то это просто шифр Цезаря (d = 5 вместо 4), значит все символы просто сдвинуты вперёд на 1.
1) Надо все символы считать или ловеркейсом, или апкейсом (большими или маленькими буквами все), если большие, то от каждой считанной буквы отнимать 65 (ASCII), маленькими - 97.
2) Тогда у нас получается порядковые номера каждого английского символа от 0 до 24 включительно, до каждого просто прибавлять 2 (так как счет с 0 + 1 символ вперед сдвинулся), а будет 2, б будет 3, с будет 4, д будет 5 (как по условиям задачи).
3) У результата выше нужно еще mod 25 (остаток от деления) находить, чтобы та же z не сдвинулась на 26 место, а заняла свое почетное первое.
4) Сложить все цифры вместе в строку и преобразовать в int. После чего написать просто пример.
Если я нигде не ошибся, то вот весь алгоритм, а там уже детали реализации. Если же это не шифр Цезаря, то решение совершенно другое :)
Полистай немного про задачу, что-то я пошел вообще не в ту степь))
+1