Давайте создадим простое сюръективное отображение из положительных целых чисел в гауссовы целые числа , которые являются комплексными числами, где действительная и мнимая части являются целыми числами.
Например 4538
, если задано положительное целое число, выразите его в двоичном формате без начальных 0
символов:
4538 base 10 = 1000110111010 base 2
Удалить любые трейлинг 0
-ы:
100011011101
Замените любые прогоны одного или нескольких 0
с одним +
:
1+11+111+1
Заменить все 1
на i
s:
i+ii+iii+i
Оцените полученное комплексное выражение и выведите упрощенное гауссовское целое число:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
Выходные данные могут быть выражены традиционным математическим способом или заданы как два отдельных целых числа для действительной и сложной частей. Для 4538
примера, любой из них будет хорошо:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Для входов , таких как 29
, Mathy отформатированы выходы , такие как 0
, 0i
или 0+0i
все хорошо.
Использование j
(или что-то еще) вместо этого i
хорошо, если это более естественно для вашего языка.
Самый короткий код в байтах побеждает.
источник
4+2j
->100+10j
...Ответы:
MATL , 7 байт
Попробуйте онлайн!
Как это работает
Рассмотрим ввод,
4538
например.источник
Желе , 8 байт
Попробуйте онлайн!
Как это работает
источник
Python 2, 53 байта
Я пытался сыграть в гольф, и это кажется играбельным, но у меня нет идей ...
источник
(k or 1)
не кажется оптимальным, но единственное, о чем я могу думать, это(k+0**k)
...0**k
, не работает для сложныхk
...Mathematica,
4438 байтобъяснение
Преобразовать вход в базу 2. (
4538
становится{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Умножить на
I
({1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
становится{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Разделить по пробегам (
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
становится{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Найти товар на уровне 2. (
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
становится{I, 0, -1, 0, -I, 0, I, 0}
)Подведите итог. (
{I, 0, -1, 0, -I, 0, I, 0}
становится-1 + I
)источник
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
, но вIntegerDigits
итоге стал короче.Python 2 ,
777671 байтСпасибо @ZacharyT за удаление 1 байта!
Попробуйте онлайн!
источник
JavaScript (ES6),
6764 байтаВыходы в виде 2-элементного массива.
объяснение
Поскольку в JavaScript нет мнимых чисел, мы должны отслеживать действительные и мнимые части в отдельных переменных. Самый простой способ сделать это - в одном массиве, сначала с реальной частью. i представлен как [0,1] , i 2 (или -1 ) как [-1,0] , i 3 (или -i ) как [0, -1] и i 4 (или 1 ) как [1 , 0] .
Сначала мы многократно делим число на 2, собирая каждую серию единиц в двоичном представлении. Каждый прогон n соответствует i n . Это соответствует добавлению 1 - (n & 2) к элементу с индексом n & 1 в массиве из двух элементов. Так что мы делаем.
Возможно, мне следует добавить больше объяснений, но я не могу придумать, что еще нужно объяснить. Не стесняйтесь комментировать любые ваши вопросы.
источник
Python,
1991291241169490716361 байтВвод - это просто само число.
Вывод в формате
(a+bj)
, гдеj
находится мнимая единица.0j
будет выводиться вместо(0+0j)
Сначала преобразуйте в двоичный файл. Усечь
'0b'
выкл. Убить конечные нули. Разделить, используя блок с нулями в качестве разделителя. Сопоставьте каждый блок с1j ** len
. Затем возьмите сумму всего.-70 байт , не преобразуя в плюсы.
Регулярное выражение на 5 байт короче.
-8 байт , избавившись от двух ненужных переменных, которые вызывались только один раз.
-22 байта , используя комплексные числа вместо моей странной вещи. Спасибо ответу @Dennis за информацию о комплексных числах!
-4 байта , понимая, что
map
это всего лишь причудливый способ сделать списки, кроме более длинных.-19 байт , переключившись на слегка загадочный способ избежать ошибок
j ** 0
и избежать регулярных выражений. Вдохновленный комментарием @ Griffin. Благодарность! :)-8 байт , перемещая
if
часть до конца.-2 байта Спасибо @Griffin за сохранение 2 байтов за счет удаления квадратных скобок, чтобы вместо этого сделать его генератором выражений!
источник
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
блоков и не использует регулярные выражения, как мой. Кроме того, я не хочу украсть код у вас, так как он намного лучше моей версии. :)1
s, а не длину,0x
сначала часть снимается с передней части. Спасибо за идею продвинутьсяif
до конца; Я никогда бы не узнал, что работает иначе!MATLAB, 58 байт
Давайте использовать
285
для иллюстрации процесса:К счастью ,
1+++1
ведет себя так же , как1+1
в MATLAB, так что приведенные выше имеет значение:1+111+1
.Теперь этот
strrep
звонок - настоящая жемчужина! Вставивi*1
для1
нас получить что - то действительно хорошее. Если есть только один1
, мы просто получаем,i*1
что естьi
. Если есть больше чем один , тоi*1
получает повторяется и объединено в последовательности:i*1i*1i*1i*1
. Посколькуi==1i
в среде MATLAB и1i*1==i
это просто:i*i*i*i
.Добавление
.0
кажется здесь ненужным, но это необходимо, если последний символtemp3
-+
. Мы не можем добавить только ноль, так как это дастi*10
в случае выше и, следовательно, неправильный результат.И наконец:
Это не работает в Октаве по нескольким причинам.
strrep
не может принимать ASCII-значения в качестве входных данных, ему нужны реальные символы ('0'
вместо48
). Кроме того,+++
не оценивается только+
в октаве, так как это сломает ярлыки увеличения / уменьшенияx++
иx--
.источник
eval
:-P Вы не можете использовать1i
вместо1*i
?i*1
частью ...Pyth - 15 байт
Удручающе долго.
Тестовый пакет .
источник
Mathematica, 84 байта
Анонимная функция. Принимает число в качестве ввода и возвращает комплексное число в качестве вывода.
источник
Mathematica, 75 байтов
Самостоятельно придумал почти то же решение, которое LegionMammal978 опубликовал 23 минуты назад! Замена
1
наI
(который является внутренним символом Mathematica для квадратного корня из -1) работает, потому что пробелы рассматриваются как умножение соседних выражений. Место, которое я сохранил в другом решении, а именно, избегая необходимостиStringTrim
, всегда добавляется-0
: если двоичное число заканчивается1
, тогда заканчивается это выражение,...I-0
которое не влияет на его значение; тогда как если двоичное число оканчивается на «0», то это выражение заканчивается на том,...+-0
что анализируется как «добавить отрицательный 0» и, таким образом, избавляется от завершающего знака плюс.источник
Matlab, 99 байт
Тестовые случаи:
источник
Haskell,
102918987 байтНеоднократно делится на два и проверяет бит. Хранит аккумулятор,
i^(number of odds)
гдеa+b*i
кодируется как[a,b]
и*i
есть[a,b]↦[-b,a]
(вращение на 90 градусов). Начальный(*2)
- избежать поиска первого бита.Использование (спасибо @OwenMorgan за примеры):
источник
Java, 172 байта
источник
Clojure, 183 байта
Могу ли я сделать это?
Используйте функцию так:
источник
На самом деле 35 байт
Попробуйте онлайн!
Объяснение:
Примерно эквивалентный код Python 3:
Попробуйте онлайн!
источник
'0@s
помощью и использование``░
для обрезания любых завершающих пустых строк должно сэкономить вам четыре байта.Желе , 10 байт
Это не лучше, чем ответ Желе Денниса, но я все равно хотел попробовать свои силы в ответе Желе. Предложения по игре в гольф приветствуются! Попробуйте онлайн!
Ungolfing
источник
1 => 1 => 1j
это эквивалентно2 => 10 => 1 => 1j
.На самом деле , 15 байтов
Предложения по игре в гольф приветствуются! Попробуйте онлайн!
Ungolfing:
источник
Аксиома,
140, 131, 118108 байт% я - воображаемая стоимость.
полученные результаты
источник
Perl 6 ,
4046 байтЯ придумал это довольно быстро
К сожалению, в настоящее время неточность в реализации Rakudo на MoarVM .
say i ** 3; # -1.83697019872103e-16-1i
Поэтому я должен был сделать следующую лучшую вещь:
Expanded:
Тест:
источник
PHP, 87 байт
Почти так же, как решение ETHproductions; только итеративный, а не рекурсивный.
Принимает ввод из командной строки, устанавливает переменные
${0}
и${1}
.источник
TI-Basic (TI-84 Plus CE), 70 байт
Нет встроенной функции для преобразования в двоичную строку (и при этом нет необходимости анализировать строку), поэтому эта программа вручную делит на 2, увеличивая N каждый раз, когда видит 1, добавляя i ^ N к S (N> 0) и сбрасывая N, если он видит ноль.
источник
Java , 100 байт
Попробуйте онлайн!
источник
R , 54 байта
Попробуйте онлайн!
n%/%2^(0:log2(n))%%2
вычисляет вектор двоичных цифр. Используя кодирование длин серий, мы используемcomplex
тип R для вычисления соответствующей суммы, умножая наx$values
чтобы удалить нули.Возвращает
complex
вектор одного элемента.источник