В сплит-комплексные числа , также известный как «озадачить чисел» подобны комплексных чисел. Но вместо этого 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
источник
j=[0 1; 1 0]
коэффициентами из верхней строки и считывать их.Python 2, 258
Вероятно, это не лучший подход, но это был первый раз, когда ООП выглядело как сносная идея в Python для кода гольф, так почему бы и нет?
Создает класс,
c
который наследуется от сложного, но выполняет другуюmul
операцию.add
Операция также изменяется таким образом , что он возвращает объект типаc
и неcomplex
такое поведение необходимо предотвратить случай(a + b) * (c + d)
делать комплексное умножение вместо этого специального вида.Входная строка затем преобразуется в строку, которая может быть оценена естественным образом с помощью Python. Это делается путем изменения каждого числа в,
c(number)
а затем каждыйj
вc(0,1)
.Попробуйте онлайн или запустите Test Suite
источник
GAP , 38 байт
Первый
j
определяется как неопределенный, поэтому мы можем создавать многочлены вj
. Чтобы получить соответствующее запутанное число, мы уменьшаем (т.е. берем остаток от полиномиального деления) наj^2-1
. Это дает линейный (или постоянный) член, и мы можем положиться на способность GAP выводить полиномы.Примеры:
Предостережение: 1. Это не принимает строку как ввод, но реальный термин на языке GAP. Чтобы исправить, я мог бы использовать
EvalString
. 2. Вывод хороший и четкий, но не совсем такой, как указано: порядок изменен, а ненужные нули подавлены. Я думаю и надеюсь, что это все еще в духе задачи, в противном случае, я думаю, мне было бы лучше использовать матричный подход @ xnor.источник
PolynomialMod[#,j^2-1]&
имеет схожие свойства. В самом деле, если мы никогда не умножаем больше двух ошибочных чисел (как в тестовых случаях), тоExpand@#/.j^2->1
достаточно.t->t%(j^2-1)
в пари / гп.Аксиома,
2042 байтапредыдущее решение имеет проблему, если
n<0
в,j^n
но это кажется более солидным, и хорошо посоветуйте, где что-то не так, даже если совершенство будет возвращать пример j ^ 1.2 или j ^ sqrt (-1) то же выражение не оцениватьесли я не следую некоторому закону вопроса: скажи мне это, и я добавлю «неконкурентоспособен». Я имею в виду как одну аксиому для упрощения формулы
источник
Пакет, 52 байта
Увидев замечательный ответ @ xnor, я почувствовал необходимость перенести его.
источник