Гауссовы целые числа являются комплексными числами вида, a+bi
где a
и b
оба являются целыми числами. В основании -1 + i все гауссовы целые числа могут быть уникально представлены с использованием цифр 0
и 1
без необходимости обозначения знака символом.
Например, 1100
в базе -1 + я представляет десятичное число 2, так как
1*(-1+i)^3 + 1*(-1+i)^2 + 0*(-1+i)^1 + 0*(-1+i)^0
= (2+2i) + (-2i) + 0 + 0
= 2
Входными данными будут два гауссовых целых числа в основании -1 + i, представленные с помощью цифр 01
. Это может принимать одну из следующих форм:
- Две отдельные строки цифр,
- Два десятичных целых числа, состоящие из
01
представления базовых чисел -1 + i (например,1100
для 2 в базовых -1 + i), - Два двоичных целых числа, представляющих базовые числа -1 + i (например, десятичные
12
или0b1100
2 в основании -1 + i) - Одна строка, разделяющая две строки из цифр / двоичные целые числа одним не алфавитно-цифровым разделителем (например,
1100 1100
или12,12
для 2 + 2)
Выведите сумму двух гауссовых целых чисел, также в базе -1 + i и представленных с использованием цифр 01
(в одном из форматов, разрешенных для ввода, не обязательно того же выбора). Вывод может содержать конечное число ведущих нулей.
Ваша функция или программа должны завершиться в течение 2 секунд для входов не более 30 цифр каждый.
Дополнительные разъяснения
- Вы можете предположить, что входные данные не содержат посторонних начальных нулей. Для особого случая 0 вы можете выбрать либо
0
пустую строку, либо как представление.
Контрольные примеры
0, 0 => 0 # 0 + 0 = 0
0, 1 => 1 # 0 + 1 = 1
1, 1 => 1100 # 1 + 1 = 2
1100, 1100 => 111010000 # 2 + 2 = 4
1101, 1101 => 111011100 # 3 + 3 = 6
110111001100, 1110011011100 => 0 # 42 + (-42) = 0
11, 111 => 0 # i + (-i) = 0
11, 110 => 11101 # i + (-1-i) = -1
10101, 11011 => 10010 # (-3-2i) + (-2+3i) = (-5+i)
1010100101, 111101 => 1110100000100 # (-19+2i) + (3-4i) = (-16-2i)
Более длинные тестовые случаи:
11011011010110101110010001001, 111100010100101001001010010101 => 0
111111111111111111111111111111, 111111111111111111111111111111 => 100100100100100100100100100100
101101110111011101110111011101, 101101110111011101110111011101 => 11101001010001000100010001000100011100
100100010101001101010110101010, 100010011101001011111110101000 => 110000110010101100001100111100010
-1+i
вi-1
в названии.Ответы:
Python 2,
98979184 байтаЭто делает ввод / вывод в десятичном формате. Целые числа должны быть разделены не алфавитно-цифровым символом
+
.Спасибо @xnor за 2 байта!
Попробуйте это на Ideone .
Как это устроено
В Арифметике в комплексных основаниях автор показывает, как сложить и умножить комплексные числа в базисах вида -n + i .
Для базы -1 + i сложение выполняется аналогично обычному двоичному сложению с переносом, с двумя отличиями:
Вместо того, чтобы переносить 1 на следующую более высокую позицию, мы переносим 110 на следующие три.
Переносимые цифры могут распространяться бесконечно. Однако без начальных нулей сумма a + b имеет максимум на восемь цифр больше, чем максимум a и b .
Мы действуем следующим образом.
Сначала мы добавляем a и b, как если бы их цифры были десятичными.
Для a = 10101 и b = 11011 это дает 21112 .
Затем мы формируем новое число, заменяя цифры больше 1 на 1 , другие на 0 . 1
На сумму 21112 это дает 10001 .
Для каждой цифры больше 1 мы должны вычесть 2 из этой цифры и перенести 110 в следующие три более высокие позиции. Поскольку 1098 = 10 * 110 - 2 , мы можем добиться этого, умножив результат шага 2 на 1098 , а затем добавив этот продукт к сумме. 2
Для суммы 21112 это дает 21112 + 1098 * 10001 = 21112 + 10981098 = 11002210 .
Мы повторяем шаги 2 и 3 всего d * 8 раз, где d - количество цифр a + b . 3
Для начальной суммы 21112 результаты
Мы берем окончательную сумму по модулю 10 d + 8 , отбрасывая все, кроме последних d + 8 цифр.
Для начальной суммы 21112 конечный результат равен 10010 .
1 Это достигается с помощью перевода . Повторение строки 0011 64 раза приводит к тому, что одна строка повторения совпадает с последовательностью символов ASCII 0123 , достигая желаемой замены.
2 Обратите внимание, что цифры этой суммы не могут превышать 3 (начальное значение 1 плюс два 1 от переносов).
3 Это работает для d = 1 , а d * 8> d + 8 в противном случае. Код может повторить шаги (D + 1) * 8 раз, так как с имеет косую L , если s является длиной целого числа.
источник
input()
ожидает? (Я получаю,21112
когда я10101, 11011
d+8
а не, скажемd+9
,? Как????Pyth, 34 байта
Попробуйте онлайн: демонстрация или тестовый набор (занимает довольно много времени). Он должен удовлетворять ограничению по времени, хотя и легко, поскольку онлайн-компилятор довольно медленный по сравнению с обычным (автономным) компилятором.
Объяснение:
Мой алгоритм в основном представляет собой реализацию сложения с переносом. Но вместо того
1
, чтобы нести, я должен нести110
(1100
в базе так-1+i
же, как2
в базе-1+i
). Это работает в основном нормально, но вы можете застрять в бесконечных циклах печати нулей. Например, если вы добавляете1
с11
и в настоящее время имеете перенос110
. Поэтому я в основном добавляю, пока не застряну в цикле, а затем остановлюсь. Я думаю, что цикл, который будет всегда печатать нули, и поэтому это должно быть хорошо.источник
Python 2,
6967 байтВвод / вывод выполняется с целыми числами из базы 2.
-2 спасибо @Dennis.
источник
a*a+b*b^58==0
когдаa
иb
обратные? Как это работает?a*a+b*b==58
когда одному из них 3, а другому 7(3,7)
это единственная пара, которая дает цикл и нуждается в специальном корпусе. Если это так, то вам нужно проверить только(a,b)==(3,7)
в этом порядке, так как(7,3)
рекурсивно(3,7)
, и, возможно, есть более короткое выражение для этого.^
это XOR, а не возведение в степень, или (б) XOR имеет более низкий приоритет, чем+
.Сетчатка , 100 байт
Это берет ввод, разделенный запятой. Выход всегда начинается с трех ведущих нулей.
Попробуйте онлайн!
Мне действительно интересно, есть ли более короткое решение для первого этапа ...
источник
Желе,
292826242120 байтЭто делает ввод / вывод в десятичном формате. Целые числа должны быть разделены не алфавитно-цифровым символом
+
.Попробуйте онлайн! или проверьте все контрольные примеры .
Фон
В Арифметике в комплексных основаниях автор показывает, как сложить и умножить комплексные числа в базисах вида -n + i .
Для базы -1 + i сложение выполняется аналогично обычному двоичному сложению с переносом, с двумя отличиями:
Вместо того, чтобы переносить 1 на следующую более высокую позицию, мы переносим 110 на следующие три.
Переносимые цифры могут распространяться бесконечно. Однако без начальных нулей сумма a + b имеет максимум на восемь цифр больше, чем максимум a и b .
Мы действуем следующим образом.
Сначала мы добавляем a и b, как если бы их цифры были десятичными.
Для a = 10101 и b = 11011 это дает 21112 .
Для каждой цифры больше 1 мы должны вычесть 2 из этой цифры и перенести 110 в следующие три более высокие позиции. Мы можем добиться этого, преобразовав каждую десятичную цифру в двоичную, получившиеся двоичные массивы из основания 1100 в целое число, и интерпретировать полученный список 0 , 1 , 1100 и 1101 как неканоническую основу 10 номер. 1
Для суммы 21112 это дает 21112 + 1098 * 10001 = 21112 + 10981098 = 11002210 .
Мы повторяем шаги 2 всего d + 8 раз, где d - количество цифр a + b .
Для начальной суммы 21112 результаты
Мы отбрасываем все, кроме последних d + 8 цифр из конечного результата. Это достигается путем отказа от всего после последних 2 . 2
Для начальной суммы 21112 конечный результат равен 10010 .
Как это устроено
1 Обратите внимание, что цифры этой суммы не могут превышать 3 (начальное значение 1 плюс два 1 от переносов).
2 Это работает, потому что последняя цифра, которая будет отменять, не может быть 3 .
источник
Python 3, 289 байт
При этом выполняется сложение цифр от младшей к старшей значащей (иными словами, точно такой же алгоритм, которому вас учили в начальной школе). Различия в том, что (а) он в двоичном, а не в десятичном виде, поэтому вы носите, когда цифра составляет 2 или более, и (б)
1 + 1 = 1100
нет10
.На самом деле, также необходимо отметить, что в
11 + 111 = 0
противном случае суммы, которые должны стать нулевыми, никогда не прекратятся.Больше игры в гольф, безусловно, возможно.
источник
Сетчатка,
157151134133124123 байта1 байт благодаря Мартину Бюттнеру.
Попробуйте онлайн!
Преобразует в унарный, а затем повторите следующие замены (показано здесь в десятичном виде):
Обычно больше двух: убрать два, ничего не добавлять в предыдущую цифру, добавить одну к предыдущей, а затем добавить одну к предыдущей.
В псевдокоде:
Унарная реализация:
Каждая цифра (например
3
) отображается как числоx
s (напримерxxx
), а затем с префиксом0
.Например,
1234
будет выражено как0x0xx0xxx0xxxx
.Это оставляет
0
без изменений, как101
было бы выражено0x00x
.Поскольку изначально и, наконец, есть только
0
и1
, преобразование может быть легко сделано с помощью1->0x
и0x->1
.Нажмите здесь, чтобы увидеть каждый шаг .
источник
JavaScript (ES6),
146126 байтg
преобразует гауссово целое число (действительные и мнимые части) в основаниеi-1
, аr
иi
преобразует базовоеi-1
целое число в гауссово число (действительные и мнимые части соответственно). Как только преобразования будут сделаны, я просто должен сделать арифметику.Изменить: 20 байтов сохранены путем вычисления реальной и мнимой частей отдельно.
источник
C ++ 416 байт, плюс
#include <vector>\n#include <algorithm>\n
(еще 40)или с большим количеством пробелов:
Еле гольф. Он принимает входные данные как вектор целых и возвращает вектор целых.
Живой пример .
источник