Додайте та помножте непрості числа


16

У спліт-комплексні числа , також відомий як «спантеличити чисел» подібні комплексних чисел. Замість цього i^2 = -1, проте, маємо j^2 = 1; j != +/-1. Кожне число має форму z = x + j*y.

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

Ось кілька прикладів для задоволення від перегляду:

6 * 9 = 54            // real numbers still act normally
5 + -7 = -2
j*1 + j*1 = j*2           // two `j`s added together make a j*2
7 * j*1 = j*7           // multiplication is commutative & associative
j*1 + 2 = 2+j*1           // like oil and water, "combine" to form a split-complex number
j*1 + j*-3 = j*-2          // seems okay so far
j*j*1 = j*-1*j*-1 = 1     // kinda sketchy, but such is its inherent nature
j*j*-1 = j*-1*j*1 = -1  
(2+j*3)+(4+j*7) = 6+j*10  // combine like terms
7 * (2+j*3) = 14+j*21 // distributive property
j * (2+j*3) = (j*2) + (j*j*3) = 3+j*2   // since j^2 = 1, multiplying my j "swaps" the coefficients
(2+j*3)*(4+j*7) = (2*4)+(2*j*7)+(j*3*4)+(j*3*j*7) = 8+j*14+j*12+21 = 29+j*26 // a complete multiplication

Виклик

Мета цього завдання - оцінити вираз із розділеними складними числами.

Це кодовий гольф, виграє найменше байтів.

Вхідні дані

Введенням буде один рядок, що містить лише символи +*()-, цифри 0123456789та букву jз необов’язковим новим рядком. Цей рядок представляє вираз, використовуючи позначення інфіксу та пріоритет оператора (множення до додавання, з угрупованням у дужках).

  • Символ -завжди буде представляти заперечення, ніколи не віднімання. Якщо ви так бажаєте, ви можете замінити -або _або~ для зручності вводу / виводу.
  • Парентез можна вкласти до трьох разів, щоб позначити групування: (1+(1+(1)))
  • Лист jніколи не буде прямим префіксом із запереченням, і завжди його буде дотримуватися* .
  • Дужкам не передуватиме заперечення -(7) , а навпаки-1*(j*5+2)
  • Ніколи не буде неявних операцій. Все множення буде виражено як (7)*7замість (7)7, так і як j*5замістьj5 .
  • Немає провідних нулів.

Вихідні дані

Вихід буде у формі X+j*Y, де X і Y можуть бути будь-якими цілими числами. Якщо ціле число від’ємне, воно має бути встановлено знаком заперечення.

Додаткові обмеження

Хоча я не знаю жодної мови з підтримкою рідної мови, вбудовані модулі, які мають справу з розбитими складними числами, заборонені. Регулярні комплексні числа - це чесна гра.

Випробування

Подібно до наведених вище прикладів, але прибрано. Введіть один рядок і виведіть рядок під ним.

(2+j*3)+(4+j*7)
6+j*10

(2+j*3)*(4+j*7)
29+j*26

(-5+j*1+j*2+2)*(4+j*7)
9+j*-9

(1+j*-1)*(1+j*1)
0+j*0 // this is why division does not exist.

j*((j*-1)+2)
-1+j*2

(2+(5+-1*(j*1))+2)
9+j*-1

Відповіді:


13

Python 2, 62 байти

def f(s):b,a=[eval(s)/2.for j in-1,1];print'%d+j*%d'%(a+b,a-b)

Ми просто оцінюємо вираз за sдопомогою j=1та j=-1і виводимо половину їх суми та половину їх різниці як коефіцієнти 1іj .

Це працює тому, що і те j=1й інше j=-1задовольняє визначальне рівняння, що визначає рівняння j*j==1. Отже, оригінальні та спрощені вирази повинні бути однаковими для обох цих значень. Спрощений вираз є лінійним, тому це дає два лінійних рівняння у двох невідомих:

x + 1*y  = s(1)  = 2*a
x - 1*y  = s(-1) = 2*b

що вирішується x=a+b, y=a-b.


Мова з матричними операціями також може оцінити вираз із j=[0 1; 1 0]коефіцієнтами зчитування з верхнього рядка.
xnor

2

Пітон 2, 258

class c(complex):__mul__=lambda s,o:c(s.real*o.real+s.imag*o.imag,s.real*o.imag+s.imag*o.real);__add__=lambda s,o:c(sum(map(complex,[s,o])))
import re
r=eval(re.sub("j","c(0,1)",re.sub(r"(-?\d+)",r"c(\1)",raw_input())))
print`int(r.real)`+"+j*"+`int(r.imag)`

Це, мабуть, не найкращий підхід, але вперше OOP схожий на прохідну ідею в Python для кодового гольфу, так чому б і ні?

Створює клас, cякий успадковує складний, але має іншу mulоперацію. addОперація також змінюється таким чином , що він повертає об'єкт типу cі не complexтака поведінка необхідно запобігти випадок (a + b) * (c + d)робити комплексне множення замість цього спеціального виду.

Потім вхідний рядок перетворюється на рядок, який може бути оцінений природним чином пітоном. Це робиться, змінюючи кожне число на, c(number)а потім кожне jв c(0,1).

Спробуйте в Інтернеті або запустіть тестовий набір


1

GAP , 38 байт

j:=X(Integers,"j");f:=t->t mod(j^2-1);

Перший jвизначається як невизначений, тому ми можемо створювати в ньому многочлени j. Щоб отримати відповідне переплутане число, ми скорочуємо (тобто беремо залишок ділення полінома) наj^2-1 . Це дає лінійний (або постійний) термін, і ми можемо розраховувати на здатність GAP виводити поліноми.

Приклади:

gap> f((2+j*3)+(4+j*7));
10*j+6
gap> f((1+j*-1)*(1+j*1));
0

Caveat: 1. Це сприймає не рядок як вхід, а справжній термін мовою GAP. Для виправлення я міг би скористатися EvalString. 2. Вихід є приємним і зрозумілим, але не точно так, як зазначено: Порядок змінено, а непотрібні нулі придушуються. Я думаю і сподіваюся, що це все ще в дусі виклику, інакше я думаю, що мені буде краще використовувати матричний підхід @ xnor.


1
Математика PolynomialMod[#,j^2-1]&має подібні властивості. Дійсно, якщо ми ніколи не множимо більше двох переплетених чисел разом (як це не мають тестові випадки), то цього Expand@#/.j^2->1достатньо.
Грег Мартін

Аналогічно t->t%(j^2-1)в Пари / GP.
алефальфа

1

Аксіома, 20 42 байти

f(x,n)==x^(n rem 2);m:=rule('j^n==f('j,n))

попереднє рішення має проблему, якщо n<0 в, j^n але це здається більш твердим, і радимо добре, де щось не так, навіть якщо досконалість буде повернутим приклад j ^ 1.2 або j ^ sqrt (-1) того ж виразу не оцінювати

(9) -> f(x,n)==x^(n rem 2);m:=rule('j^n==f('j,n))
         n
   (9)  j  == 'f(j,n)
                    Type: RewriteRule(Integer,Integer,Expression Integer)
(10) -> [m((2+j*3)+(4+j*7)), m((2+j*3)*(4+j*7)), m((-5+j*1+j*2+2)*(4+j*7))]
   (10)  [10j + 6,26j + 29,- 9j + 9]
                                            Type: List Expression Integer
(11) -> [m((1+j*-1)*(1+j*1)), m(j*((j*-1)+2)), m(2+(5+-1*(j*1))+2)]
   (11)  [0,2j - 1,- j + 9]
                                            Type: List Expression Integer
(12) -> [m(j*j*j*j),m(j*j*j),m(j^200)]
   (12)  [1,j,1]
                                            Type: List Expression Integer
(13) -> [m(j^0),m(j^-1),m(j^-2), m(j^-3)]
            1   1
   (13)  [1,-,1,-]
            j   j
                                            Type: List Expression Integer
(14) -> m(j^(3.4))
   There are no library operations named m
      Use HyperDoc Browse or issue

якщо я не дотримуюсь певного закону питання: скажи мені це, і я додаю "не конкурентоспроможний". Я маю на увазі це як одна аксіома для спрощення формули


0

Пакет, 52 байти

@set/aj=1,a=%1,j=-1,a-=b=(a-(%1))/2
@echo %a%+j*%b%

Побачивши відмінну номінацію на відповідь @ xnor, я змушений був її надіслати.

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