Есть 500 представителей неофициальной награды за лучший текущий ответ .
Цель
Ваша цель - умножить два числа, используя только очень ограниченный набор арифметических операций и присваивание переменных.
- прибавление
x,y -> x+y
- Взаимный
x -> 1/x
( не делениеx,y -> x/y
) - Отрицание
x -> -x
( не вычитаниеx,y -> x-y
, хотя вы можете сделать это как две операцииx + (-y)
) - Константа
1
(никакие другие константы не допускаются, кроме тех, которые получены операциями из1
) - Переменная присваивание
[variable] = [expression]
Оценка: значения начинаются с переменных a
и b
. Ваша цель - сохранить их продукт a*b
в переменной, c
используя как можно меньше операций. Каждая операция и присвоение +, -, /, =
стоит балл (эквивалентно каждому использованию (1), (2), (3) или (4)). Константы 1
свободны. Решение с наименьшим количеством очков выигрывает. Tiebreak - самый ранний пост.
Допуск: Ваше выражение должно быть арифметически правильным для «случайных» реалов a
и b
. Он может не на меру нуль подмножества R 2 , то есть набор , который не имеет области , если график в a
- b
декартовой плоскости. (Это, вероятно, понадобится из-за обратных выражений, которые могут быть 0
похожи 1/a
.)
Грамматика:
Это атомный код-гольф . Никакие другие операции не могут быть использованы. В частности, это означает отсутствие функций, условий, циклов или нечисловых типов данных. Вот грамматика для разрешенных операций (возможности разделены |
). Программа представляет собой последовательность <statement>
s, где a <statement>
задается следующим образом.
<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr>
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1
На самом деле вам не нужно публиковать код в этой точной грамматике, если ясно, что вы делаете, и ваш счет операций верен. Например, вы можете написать a-b
для a+(-b)
и считать это как две операции, или определить макросы для краткости.
(Был предыдущий вопрос « Умножение без умножения» , но он позволял значительно более свободный набор операций.)
Ответы:
22 операции
Попробуйте онлайн!
Операции: 10 сложений, 7 инверсий, 2 отрицания и 3 задания.
Итак, как я получил это? Я начал с многообещающего шаблона суммы двух двухэтажных фракций, мотив, который появлялся во многих предыдущих попытках.
c = 1/(1/x + 1/y) + 1/(1/z + 1/w)
Когда мы ограничиваем сумму
x+y+z+w=0
, происходят прекрасные отмены, давая:c = (x+z)*(y+z)/(x+y)
,который содержит продукт. (Часто легче получить
t*u/v
, чемt*u
потому, что первый имеет степень 1.)Есть более симметричный способ думать об этом выражении. С ограничением
x+y+z+w=0
их значения задаются тремя параметрамиp,q,r
их попарных сумм.и у нас есть
c=-q*r/p
. Суммаp
выделяется в знаменателе как соответствующая парам(x,y)
и(z,w)
переменным, которые находятся в одной и той же дроби.Это хорошее выражение для
c
inp,q,r
, но двойная дробь в,x,y,z,w
так что мы должны выразить первое в терминах последнего:Теперь мы хотим выбрать
p,q,r
так, чтобыc=-q*r/p
равнялисьa*b
. Один выбор:Затем удвоенные значения
q
иr
удобно делить пополам на:Сохранение
2
в виде переменнойt
и включение их в уравнение дляc
дает решение с 24 операциями.Там 12 дополнений, 6 инверсий, 4 отрицания и 2 задания.
Много операций тратится на выражение
x,y,z,w
в терминах1,a,b
. Чтобы сохранить операции, вместо этого выражайтеx
вp,q,r
(и, таким образомa,b,1
), а затем пишитеy,z,w
в терминахx
.Выбор
и выражая
c
с отрицанием какc=-q*r/p
, мы получаемК сожалению, вдвое
x
дороже. Это нужно сделать путем инвертирования, добавления результата к себе и повторного инвертирования. Мы также NEGATE производитьnx
для-x
, так это то, чтоy,z,w
использование. Это дает нам 23-операционное решение:itx
1 / (2 * х) иnx
есть-x
. Окончательная оптимизация выражения,1/x
посколькуitx+itx
вместо шаблонного,1/(-nx)
вырезает символ и доводит решение до 22 операций.источник
itx + itx
происходит дважды, ноitx
не встречается ни в каком другом контексте. Вместо этого определите,ix = (1+1)/(1+a+b)
и вы замените два дополнения одним.m = -1
, можно получить 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
a
иb
только один, то либо,a + nx = 0
либоb + nx = 0
, в результате чего ваше решение делится на ноль.23 операции
доказательство взрывом:
Я использовал wolfram alpha, чтобы получить это красивое изображение (wolfram alpha пытался заставить меня подписаться на pro, чтобы сохранить его, но затем ctrl-c ctrl-v ;-)):
оценка (с добавлением
+
вычитания):источник
29 операций
Не работает для множества {(a, b) ∈ R 2 | a + b = 0 или a + b = -1 или ab = 0 или ab = -1}. Это наверное мера ноль?
Структура
rfc
(Reciprocal-Four-C) становится более очевидной, если мы определим макрос:Давайте посчитаем:
s(x)
математически, это то,1/(1/x - 1/(x+1))
что после немного алгебры этоx*(x+1)
илиx*x + x
.rfc
, это действительно1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))
просто1/((a+b)^2 - (a-b)^2)
.rfc
есть1/(4*a*b)
.c
является обратной 4 разаrfc
, так1/(4/(4*a*b))
становитсяa*b
.источник
s(x)
соответствуют требованиям вопроса из исчисления, так что это означало, что у меня была квадратная функция. После некоторого недоразумения я обнаружил, что могу получитьa*b
термин с разницей в квадратные трюки. Как только я это понял, нужно было попытаться определить, какие назначения сохранили операции.-1
три разаrfc
, не могли бы вы вывести персонажа из игры, присвоив его переменной?27 операций
За этим нет теории. Я просто попытался получить
(const1+a*b)/const2
и начал с(1/(1-a)+1/(1+b))
и(-1/a+1/b)
.источник
tmp
на самом деле 23, и ты набрал 27 баллов.