Помножте на обмежені операції


44

Існує 500 репресій неофіційних виграшів за побиття поточної найкращої відповіді .

Мета

Ваша мета - перемножити два числа, використовуючи лише обмежений набір арифметичних операцій та призначення змінних.

  1. Доповнення x,y -> x+y
  2. Взаємність x -> 1/x( не поділ x,y -> x/y)
  3. Заперечення x -> -x( не віднімання x,y -> x-y, хоча це можна зробити як дві операції x + (-y))
  4. Постійна 1(не допускаються інші константи, крім випадків, отриманих в результаті операцій з 1)
  5. Змінне призначення [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)і порахувати його як дві операції або визначити макроси для стислості.

(Було попереднє запитання Множити без множення , але це дозволило набагато втратити набір операцій.)


4
Це навіть можливо?
Ypnypn

1
@Ypnypn Так, і я написав приклад, щоб переконатися.
xnor

2
Це відчувається як виклик, коли, ймовірно, знайдеться оптимальне рішення (як тільки знайдеться якесь рішення). То який же краватка для краватки у такому випадку?
Мартін Ендер

1
@ MartinBüttner Tiebreak найчастіше публікує в цьому випадку. Я думаю, що є достатньо місця для оптимізацій, тому я не думаю, що це буде просто гонка знайти той, хто працює, і написати це чисто. Принаймні, саме це я знайшов, намагаючись це зробити; можливо, хтось знайде чітко мінімальне рішення.
xnor

2
Добре, оскільки не всі вважали, що моя відповідь така ж смішна, як я, я видалив її та прокоментував тут: Правило про нульовий набір міри вибрано не дуже розумно, оскільки раціональні числа - це міра нульова, що стосується міри лебега, я б запропонував використовуючи певний відсоток замість цього. (Або інший вид) Але мені цілком подобається ідея цього виклику!
flawr

Відповіді:


34

22 операції

itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(itx + itx + 1/(1+nx)) + 1/(1/(a+nx) + 1/(b+nx)) ) #14

Спробуйте в Інтернеті!

Оп - 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їх парних сум.

 p = x+y
-p = z+w
 q = x+z
-q = y+w
 r = x+w
-r = y+z

і ми маємо c=-q*r/p. Сума pрозрізняється як така, що знаходиться в знаменнику за допомогою відповідних пар (x,y)і (z,w)змінних, що знаходяться в одному дробі.

Цей вислів добре для cдюйма p,q,r, але двоповерхові фракція в x,y,z,wтакий спосіб , ми повинні висловити перший з точки зору останнього:

x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2

Тепер ми хочемо вибрати p,q,rтак, щоб c=-q*r/pдорівнювати a*b. Один вибір:

p = -4
q = 2*a
r = 2*b

Потім подвоєні значення для qі rзручно вдвічі зменшити у:

x = -2 + a + b
y = -2 - a - b
z =  2 + a - b
w =  2 - a + b

Збереження 2як змінної tта включення їх до рівняння для cдає рішення з 24 опцій.

#24 ops
t = 1+1   #2
c = 1/(1/(-t+a+b) + 1/-(t+a+b))  +  1/(1/(-b+t+a) + 1/(-a+b+t)) #1, 10, 1, 10

Є 12 доповнень, 6 обертів, 4 заперечення та 2 завдання.

Дуже багато операцій витрачається на вираження x,y,z,wв термінах 1,a,b. Щоб зберегти ops, замість цього висловіть xу p,q,r(і таким чином a,b,1) і запишіть y,z,wу термінах x.

y = -x + p
z = -x + q
w = -x + r

Вибір

p = 1
q = a
r = b

і виражаючи cзапереченням як c=-q*r/p, ми отримуємо

x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b

На жаль, навпіл xкоштує дорого. Це потрібно зробити, перевернувши, додавши результат до себе і перевернувши знову. Ми також NEGATE виробляти nxдля -x, так це те, що y,z,wвикористання. Це дає нам 23-опціонне рішення:

#23 ops
itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(1/(-nx) + 1/(1+nx))  +  1/(1/(a+nx) + 1/(b+nx)) ) #15

itxдорівнює 1 / (2 * х) і nxє -x. Остаточна оптимізація вираження, 1/xоскільки itx+itxзамість шаблону 1/(-nx)скорочує персонаж і зводить рішення до 22 ops.


Існує проста оптимізація до 21 операції. 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))
Пітер Тейлор

3
А, обидві ці оптимізації не вдається, оскільки підтримувана операція є взаємною, а не поділом.
Пітер Тейлор

Якщо aі bодин лише один, то будь-який a + nx = 0або b + nx = 0, що призводить до того, що ваше рішення ділиться на нуль.
MooseOnTheRocks

1
@MooseOnTheRocks Це добре, дивіться "надбавку" у виклику, що код може вийти з ладу для підмножини вимірювання-нуль. Я думаю, що виклик інакше неможливий.
xnor

26

23 операції

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z

доказ вибухом:

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
             1/(a+1)+1/(b+1)                            == (a+b+2) / (ab+a+b+1)
          1/(1/(a+1)+1/(b+1))                           == (ab+a+b+1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1                         == (ab - 1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1)             == ab / (a+b+2)
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))            == (a+b+2) / ab
                                              1/a+1/b   == (a+b) / ab
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)  == 2 / ab
    1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)) == ab / 2

z = ab / 2 and therefore z+z = ab

Я зловживав альфами Вольфрам, щоб отримати цей прекрасний образ (альфа Вольфрам намагався змусити мене підписатися на про, щоб зберегти його, але потім ctrl-c ctrl-v ;-)):

оцінка (з додаванням +на віднімання):

z = ////++/++-+/++++-/+/
res = +

Вітаю за найкоротше рішення!
xnor

@xnor спасибі за те, що ви дали мені свою першу прийняту відповідь та свою першу щедрість!
гордий haskeller

Не бути вибагливим, але не повинен ... (b + 1)) - 1 + 1 ... і ... 1)) - (1 / a + ... бути ... (b + 1 )) + - 1 + 1 ... і ... 1)) + - (1 / а + ... відповідно?
tfitzger

@tfitzger Я думаю, що так простіше. Питання говорить, що це не має значення. Примітка. Я рахую рахунок правильно (кожен мінус - два)
гордий haskeller

Wolfram Alpha має 7-денну безкоштовну пробну версію, фій.
ghosts_in_the_code

13

29 операцій

Не працює для множини {(a, b) ∈ R 2 | a + b = 0 або a + b = -1 або ab = 0 або ab = -1}. Це, мабуть, міра нуль?

sum = a+b
nb = -b
diff = a+nb
rfc = 1/(1/(1/sum + -1/(sum+1)) + -1/(1/diff + -1/(diff+1)) + nb + nb)  # rfc = 1/4c
c = 1/(rfc + rfc + rfc + rfc)

# sum  is  2: =+
# nb   is  2: =-
# diff is  2: =+
# rfc  is 18: =///+-/++-//+-/+++
# c    is  5: =/+++
# total = 29 operations

Структура rfc(Reciprocal-Four-C) є більш очевидною, якщо ми визначимо макрос:

s(x) = 1/(1/x + -1/(x+1))              # //+-/+ (no = in count, macros don't exist)
rfc = 1/(s(sum) + - s(diff) + nb + nb) # =/s+-s++ (6+2*s = 18)

Давайте зробимо математику:

  • 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.

2
+1, я опинився в середині закінчення цього ідентичного розрахунку
Ерік Тресслер

1
Це, безумовно, міри нуль; це об'єднання ліній.
xnor

Не збираюся коментувати об'єднання ліній ... @algorithmshark Чи можете ви розповісти більше про те, як ви придумали цю особу? Як ви сприйняли проблему?
недолік

1
@flawr Я нагадав, що властивості s(x)відповідають вимогам запитання, з обчислення, так що це означало, що я маю квадратну функцію. Після деяких факсів, я виявив, що можу отримати a*bтермін із різницею хитрощів. Після того, як у мене це було, було питання про те, які завдання зберегли операції.
алгоритм

Оскільки ви -1тричі використовуєте rfc, чи не вдалося ви розіграти персонажа, призначивши його змінній?
isaacg

9

27 операцій

tmp = 1/(1/(1+(-1/(1/(1+(-a))+1/(1+b))))+1/(1/(1/b+(-1/a))+1/(a+(-b))))
res = tmp+tmp+(-1)

# tmp is 23: =//+-//+-+/++///+-/+/+-
# res is 4: =++-

Теорії за цим немає. Я просто спробував отримати (const1+a*b)/const2та почав з (1/(1-a)+1/(1+b))і (-1/a+1/b).


Ваша tmpнасправді 23, а ваш рахунок 27. Хоча приємна знахідка.
Алгоритм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.