Фридман Число является положительным целым числом, которое равно нетривиальной выражение , которое использует свои собственные цифры в сочетании с операциями +, -, *, /, ^, круглые скобки и конкатенации.
Хорошее число Фридмана - это положительное целое число, равное нетривиальному выражению, которое использует свои собственные цифры в сочетании с теми же операциями, причем цифры находятся в их первоначальном порядке.
Очень хороший номер Фридмана (VNFN), который я здесь придумываю, - это хороший номер Фридмана, который можно записать без менее симпатичных (на мой взгляд) частей такого выражения. Круглые скобки, конкатенация и унарное отрицание запрещены.
Для этой задачи есть три возможных способа написания выражения без скобок.
Префикс: это эквивалентно левой ассоциативности. Этот тип выражения пишется со всеми операторами слева от цифр. Каждый оператор применяется к следующим двум выражениям. Например:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
VNFN, который можно записать так: 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Постфикс: это эквивалентно правой ассоциативности. Это похоже на префиксную запись, за исключением того, что операция идет справа от цифр. Каждый оператор применяется к двум предыдущим выражениям. Например:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
VNFN, который можно записать так: 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: для обозначения Infix используется стандартный порядок операций для пяти операций. Для целей задачи этот порядок операций будет определен следующим образом: ^
сначала поставьте скобки , ассоциативно справа. Затем заключите в скобки *
и /
одновременно оставьте ассоциативно. Наконец, заключите в скобки +
и -
одновременно оставьте ассоциативно.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
VNFN, который можно записать так: 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Задача: если задано положительное целое число, если оно может быть выражено как нетривиальное выражение своих собственных цифр в префиксной, инфиксной или постфиксной нотации, выведите это выражение. Если нет, ничего не выводить.
Пояснения: если возможно несколько представлений, вы можете вывести любое непустое их подмножество. Например, 736 является VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
Или оба все были бы приемлемые выходы.
«Тривиальное» выражение означает выражение, которое не использует никаких операторов. Это относится только к однозначным числам и означает, что однозначные числа не могут быть номерами VNFN. Это унаследовано от определения числа Фридмана.
Ответы должны запускаться в секундах или минутах на входах менее миллиона.
IO: Стандартные правила IO. Полная программа, функция, глагол или подобное. STDIN, командная строка, аргумент функции или аналогичный. Для вывода «Nothing» подойдет пустая строка, пустая строка null
или аналогичная и пустая коллекция. Вывод может быть строкой, разделенной символом, который не может быть в представлении, или может быть набором строк.
Примеры:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Подсчет очков: это код гольф. Побеждает несколько байтов.
Также, если вы найдете такой номер, укажите в своем ответе новый номер Very Nice Friedman.
источник
*(+(*(1,2),3,4)
отсутствует один близкий парень, после,3
Parentheses, concatenation and unary negation are disallowed.
Ответы:
Perl,
345334318293263245BПозвонить с
perl -M5.10.0 scratch.pl 736
Результаты
Первые несколько результатов, которые я нашел:
объяснение
Полностью безгольфированный
Я старался повторять как можно больше, чтобы облегчить дальнейшую игру в гольф.
Как это в гольф
$_=q! ... !;eval
Это дает что-то вроде этого, из которого вы можете удалить разрывы строк для результата:
источник
}glob
и сохранить несколько байтов.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :)Только Ruby 2.1.5 -
213220238 + 9 = 247Не уверен, как Руби побеждает Perl, но здесь вы идете ...
Запустите это с флагом -rtimeout (и либо -W0, либо отправьте ваш stderr в другое место).
Для того, чтобы сделать это немного более надежным, замените
send([].methods[81],z-1)
сrepeated_permutation(z-1)
и набрать дополнительный характер (так, 248 ).По сути, пройдите все перестановки операторов и попробуйте infix, postfix и prefix в указанном порядке.
d
методе используетсяeval
на второй параметр для выполнения вычислений, ловить каких - либо исключений DivideByZero или переполнения.Вам нужно отправить stderr в / dev / null, иначе
eval
иногда будут выводиться предупреждения(eval):1: warning: in a**b, b may be too big
.В то время как я придумал это безрассудство, я нашел способ спасти три символа!
Ungolfed (устаревшие, но похожие принципы):
Изменения
247 сделали эту работу для больших чисел, а не для тайм-аута.
220 сбрил три символа, объявив парные массивы, и исправил ошибку, когда однозначные числа считались VNFN
213 начальный коммит
источник
a.zip(b,c)
возвращает массив массивов вроде[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
и['hi', 'there']*''
просто объединяет строковое представление значений массива.[a,b]*3
дает[a,b,a,b,a,b]
MATLAB (435 б)
попробуйте здесь
http://octave-online.net/
источник
Python 2, 303 байта
Попробуйте онлайн
Вывод инфикса будет содержать
**
вместо^
. Если это не разрешено,.replace('**','^')
произойдет и добавит еще 18 байтовОбъяснение:
источник