Фридман число это число , которое может быть выражено путем применения основных математических операций (^, /, *, +, -) для всех его цифр. Операции не должны применяться к каждой отдельной цифре, но все цифры должны быть включены. То есть 121 = 11 ^ 2 -> все цифры задействованы, но 1 и 1 были объединены, чтобы получить 11.
Использование скобок разрешено, но тривиальное решение x= (x)
не является допустимым. Также не действует x= +x
.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Напишите программу, которая будет принимать положительные два целых числа и печатать число чисел Фридмана в этом диапазоне (включительно) и числа с выражениями в последующих строках.
Вход -
n m | n, m integers, n>=0, m>n
Вывод -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
Самый короткий код, опубликованный в воскресенье 29 июля 00:00 по Гринвичу, станет победителем.
/
работает? Например, что это1/3
?-5
?Ответы:
Рубин,
456 438 408 390 370 349 344334 [исправлено]Вывод:
Также это работает относительно быстро для больших чисел:
источник
5 40
и получил результат:[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. Никаких признаков25
там нет, и я думаю, что правильного решения (например, для21
)2*1
нет,21**1
'+-*/'.chars.to_a+['','**']
на["+","-","*","/","","**"]
Python 2,7 -
380 378 372 371 367 363 357 354 352 348336 символовПросто простой перебор.
Пример выполнения:
Объяснение:
s(x)
является функцией, которая принимает строку, содержащую последовательность цифр, и возвращает все выражения, использующие эти цифры в указанном порядке.[x]['1'>x>'0':]
вычисляет список, содержащий x, если x равен '0' или последовательность цифр не начинается с '0'; в противном случае он оценивается как пустой список. В основном это обрабатывает случай, когда я соединяю все цифры вместе.['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
в основном разбивает x на две части (обе имеют ненулевую длину), вызывает s () для каждой части и объединяет все результаты вместе с некоторым оператором между ними, используя product ().E(e)
в основном безопасный eval. Возвращает значение e, если e допустимо, и None в противном случае.По сути, этот код пробует все числа в диапазоне, переставляет их цифры и проверяет каждое выражение, сгенерированное s () для этой перестановки, игнорируя первое выражение, если x не начинается с «0», потому что если x не начинается с « 0 'тогда первое выражение будет просто х.
Альтернативная версия - 397 символов
Вот мой код, если вам необходимо использовать дроби:
источник
if len(x)<2
что когда-нибудь будет правдой в функцииs
. Кроме того , можно заменитьformat
с ,"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
чтобы сохранить 4 символов.except:0
умный .. очень умный. Я буду помнитьPython3
(436)(434)(443)Это было сложно. Я могу сэкономить некоторые символы, если я сделаю вывод более родным.
Вывод
источник
"("+i+c+j+")"
и заменивlen(n)>1
,1<len(n)
после которого вы можете удалить пробел после этого выражения.for j in r:print(r[j],j)
чтобы сохранить 7 символов.Mathematica
456416402404400396 символовПример :
Выход :
источник