Вступление
Это одна из моих любимых математических головоломок.
Учитывая цифру (скажем, 3) и количество раз, чтобы использовать эту цифру (скажем, 5), сгенерируйте 10 выражений, которые приводят к 1, 2, 3, 4, 5, 6, 7, 8, 9 и 10, используя просто +, -, ×, ÷, ^ и √ (корень) (в скобках разрешено группировать операции).
Например:
(3^3 + 3)/(3 + 3) = (33 - 3)/(3 + 3) = 3 + 3/3 + 3/3 = 5
Обратите внимание, что все вышеперечисленное использует пять 3 и математические операции и приводит к 5. Вы также можете использовать 3 перед √ для обозначения корня куба. То же самое касается использования 4 перед √ для обозначения четвертого корня.
Также обратите внимание, что два 3-х можно использовать для формирования 33, или три 3-х можно использовать для формирования 333 и так далее.
Вызов
- Вам будет дано два числа (оба в диапазоне от 1 до 5) в качестве аргумента функции, STDIN или аргумента командной строки.
- Первое число обозначает, какую цифру использовать, а второе число указывает, сколько раз эта цифра должна использоваться в выражении.
- Ваша программа должна вывести массив размером 10 (или 10 чисел, разделенных пробелами), где каждый элемент обозначает, возможно ли математическое выражение (используя только разрешенные операторы), приводящее к
(index + 1)
числу, или не использует значение truey / false.
Например, если вход
1 3
Тогда вывод должен быть
[1, 1, 1, 0, 0, 0, 0, 0, 0, 1]
потому что только 1, 2, 3 и 10 можно выразить с помощью трех 1.
Гол
- Это код-гольф, поэтому выигрывает минимальная длина кода в байтах.
бонус
Print-em-all [−50]
Вычтите 50 из вашей оценки, если элементы выходного массива равны общему количеству вероятных комбинаций, чтобы получить (index + 1)
значение вместо истинных или ложных значений.
Например, если есть только 3 возможные комбинации из пяти 3, что приводит к 5, то четвертая запись выходного массива должна быть 3.
Экстремальная математика [−100]
Вычтите 100 из вашей оценки, если элементы выходного массива содержат хотя бы одно из фактических выражений, которые приводят к (index + 1)
значению.
Например, если с помощью пяти 3 - х, 4 выходного массива го входа может быть либо (3^3 + 3)/(3 + 3)
, (33 - 3)/(3 + 3)
или3 + 3/3 + 3/3
Избыток [−200]
Вычтите 200 из вашей оценки, если элементы выходного массива содержат все возможные комбинации (разделенные |
). Этот бонус добавляется к бонусу Extreme Maths , поэтому вы получаете в сумме -300.
Например, если используется пять 3, 4- й элемент выходного массива должен быть(3^3 + 3)/(3 + 3)|(33 - 3)/(3 + 3)|3 + 3/3 + 3/3
Примечание. Любые два выражения для достижения одного и того же результата должны логически отличаться друг от друга с использованием разных подходов.
Например, чтобы получить 5 с использованием пяти 3, то 3 + 3/3 + 3/3
же самое, что 3/3 + 3 + 3/3
или 3/3 + 3/3 + 3
для каждого из них, используется тот же подход. (3^3 + 3)/(3 + 3)
и (33 - 3)/(3 + 3)
отличаются, так как 30 в числителе достигается с помощью различных подходов.
ОБНОВЛЕНИЕ : после просмотра всех ответов, было обнаружено, что все ответы имеют недостатки из-за крайних случаев унарных -
и √. Таким образом, пропуск этих крайних случаев считался нормальным, если речь идет о полноте ответов.
Это сложный вопрос, но довольно интересный.
Удачного игры в гольф!
источник
1
с?Ответы:
Python 3 (несовершенный), 449 - 300 = 149
Страдает от тех же недостатков, что и решение KSab : ни один унарный оператор, полностью заключенный в скобки, не содержит эквивалентных выражений, подобных
(1+1)+1
и1+(1+1)
. Я удалил точные дубликаты, передав результатыset()
. Вывод может быть немного уродливым, чтобы сохранить несколько байтов, но мне это нравится. Я также не делал nth root, потому что не похоже, что они много покупают в этой проблеме.Это займет несколько минут, если второй аргумент равен 5. Проверьте, вызвав
m(digit, number)
:источник
Питон (несовершенный)
493474 - 300 = 174Существует довольно много проблем с этим решением, во-первых, оно игнорирует любой показатель слишком большой (любой, в котором показатель больше 100). Я на самом деле не думаю, что это удаляет какие-либо возможности для входных данных, меньших или равных 5, но я не уверен на 100%.
Другое дело, что он не учитывает унарные квадратные корни, поскольку это усложняется (любое решение с любым членом, равным 0 или 1, приведет к бесконечному числу решений). Он также не учитывает унарное отрицание (символ «-») по той же причине, а также тот факт, что я на самом деле не уверен, задан ли вопрос для него.
Я также подумал, какие критерии должны решить, эквивалентны ли два выражения, но я не мог найти способ строго определить его так, как мне показалось, интуитивно понятным, поэтому (по крайней мере, пока) я не реализовал ничего подобного. Это означает, что он выводит довольно много результатов, а также использует круглые скобки довольно наивным способом.
С другой стороны, я думаю, что это может включать в себя самую длинную строку кода, которую я написал, особенно до того, как он был полностью обработан.
Пример: («v» представляет «√»)
источник
L
:L=lambda D,N:[(int(str(D)*N),str(D)*N)]+[(o(u,v),"(%s%s%s)"%(s,c,t))for p in R(1,N)for u,s in L(D,p)for v,t in L(D,N-p)for c,o in[('+',F('a+b')),('-',F('a-b')),('*',F('a*b')),('/',F("1.*a/b if b else''")),('^',F("''if(a<0 and int(b)!=b)|(a and b<0)or b>100 else a**b")),('v',F("''if a==0 or(b<0 and int(1./a)!=(1./a))or(b or a<0)or(1./a)>100 else b**(1./a)"))]if o(u,v)!='']
0
, я пытался опровергнуть утверждение, а затем поменять последствия. Я также нашел несколько мест для использования|
и&
вместоor
иand
. Оба эти трюки можно использовать для сокращения последнего вызова F, но для этого потребуются некоторые деморганы, и у меня не хватит времени клюва; peval
лямбд и - мне потребовалось много времени, чтобы понять вашу вторую строчку! Я думаю, что я заставил тебя победить на "самой длинной одиночной линии". ;) Я согласен игнорировать большие показатели; на самом деле, я думаю, что любой показатель больше 9 не будет полезен (за исключением случая, когда базовое значение равно 1).3 = 33 √ (3 ^ 33)
. На самом деле, когда я пишу это, я понимаю, что две (возможно, только две?) Комбинации, которые мой ответ пропускает, являются4 = (4^4) √ (4 ^ (4^4))
эквивалентным выражением с5
s. По общему признанию корни, кажется, не добавляют много к проблеме, поскольку подавляющее большинство из них или используются как no-ops на 0 или 1, no-ops, когда root равен 1, или просто для отмены мощности.Питон 3 -
349346Вот довольно нелепая версия:
Для тестирования я рекомендую изменить его
(9)
на что-то меньшее, так как это число множественных квадратных корней, которое имеет огромное значение для производительности.Наконец, это заставило меня задуматься, нужен ли в каком-то случае унарный минус ...
источник
1 = 3^3 * 3^(-3)
, но даже учитывая их, я сомневаюсь, что есть какие-то цифры, для которых это возможное решение, когда нет других.a**.5**%i
вместоa**(1/2**%i)
вычисления несколько квадратных корней.Mathematica - 246 символов (бонусы не требуются)
объяснение
Функция
j
объединяет два числа в цифровом виде.Функция
z
получает результатr
, числоn
и список функцийL
, каждая из которых работает с двумя аргументами. Затем он последовательно применяет список функций к аргументам[r,n]
с использованием рекурсии, пока список не станет пустым, после чего он возвращает результат.Функция
a
принимает количествоn
и количество копийt
. Он создает все кортежи длины (t-1) из списка функций{Plus, f, Times, g, Power, h, j}
и отправляет каждый кортеж через функцию z, затем возвращает список всех созданных чисел от 1 до 10.Пример выполнения
a[2,3]
возвращается{1, 2, 3, 6, 8}
.Ограничения
Поскольку список функций применяется последовательно, потребляя одну копию числа каждый раз, он может пропустить некоторые комбинации. Например, при работе с четырьмя двойками он пропустит 22/22 = 1 из-за невозможности оценить список функций не по порядку. Конечно, 2/2 * 2/2 = 1 охватывает этот случай.
источник