Если вы еще не знаете, кватернион в основном состоит из 4-х частей. Для целей этой задачи он имеет реальный компонент и три мнимых компонента. Мнимые компоненты представлены суффиксом i
, j
, k
. Например, 1-2i+3j-4k
это кватернион с 1
быть реальным компонентом и -2
, 3
и -4
будучи мнимые компоненты.
В этом задании вы должны разобрать строковую форму кватерниона (например "1+2i-3j-4k"
) в список / массив коэффициентов (например [1 2 -3 -4]
). Тем не менее, строка кватерниона может быть отформатирована разными способами ...
- Это может быть нормально:
1+2i-3j-4k
- Он может иметь недостающие условия:
1-3k
,2i-4k
(если у вас есть недостающие условия, выход0
для этих терминов) - Это , возможно, отсутствуют коэффициенты:
i+j-k
(В данном случае, это эквивалентно1i+1j-1k
Другими словами,.i
,j
Илиk
без номера перед предполагается иметь1
перед по умолчанию) - Это может быть не в правильном порядке:
2i-1+3k-4j
- Коэффициенты могут быть просто целыми или десятичными:
7-2.4i+3.75j-4.0k
Есть некоторые вещи, которые нужно отметить при разборе:
- Всегда будет
+
или-
между терминами - Вам всегда будут переданы правильные данные, по крайней мере, с 1 термином и без повторяющихся букв (без
j-j
s) - Все числа можно считать действительными
- Вы можете изменить номера в другую форму после разбора , если вы хотите (напр.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Встроенные синтаксические / кватернионные и стандартные лазейки запрещены. Это включает в себя eval
ключевые слова и функции. На входе будет одна строка, а на выходе будет список, массив, значения, разделенные пробелами и т. Д.
Поскольку это код-гольф , выигрывает самый короткий код в байтах.
Тонны тестовых случаев
1+2i+3j+4k => [1 2 3 4]
-1+3i-3j+7k => [-1 3 -3 7]
-1-4i-9j-2k => [-1 -4 -9 -2]
17-16i-15j-14k => [17 -16 -15 -14]
7+2i => [7 2 0 0]
2i-6k => [0 2 0 -6]
1-5j+2k => [1 0 -5 2]
3+4i-9k => [3 4 0 -9]
42i+j-k => [0 42 1 -1]
6-2i+j-3k => [6 -2 1 -3]
1+i+j+k => [1 1 1 1]
-1-i-j-k => [-1 -1 -1 -1]
16k-20j+2i-7 => [-7 2 -20 16]
i+4k-3j+2 => [2 1 -3 4]
5k-2i+9+3j => [9 -2 3 5]
5k-2j+3 => [3 0 -2 5]
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13 => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i => [5.6 -3 0 0]
k-7.6i => [0 -7.6 0 1]
0 => [0 0 0 0]
0j+0k => [0 0 0 0]
-0j => [0 0 0 0] or [0 0 -0 0]
1-0k => [1 0 0 0] or [1 0 0 -0]
источник
+
знаки на входе? Нравится+1k
:?+
.-0
ли частью легальной продукции для последних двух примеров?eval
ограничение, которое будет принимать строку, интерпретируется как код и / или ввод. Любые преобразования не учитываются при этом, потому что вы не можете передать, например, строку"test"
в целочисленную функцию преобразования, чтобы получить целое число, ноtest
это будет интерпретироваться как код в нормальнойeval
функции. TLDR: eval: нет, преобразования типов: да.Ответы:
Pyth, 48 байтов
Демонстрационный набор тестов
Выходной формат разделен символом новой строки. Код набора тестов использует разделение пробелов для простоты чтения, но в остальном тот же.
Выводы a
-0
в последних 2 случаях, которые, я надеюсь, в порядке.Объяснение, чтобы следовать.
источник
Сетчатка, 115
Попробуйте онлайн!
1 байт сохранен благодаря @Chris Jester-Young .
Исправлена ошибка и 6 байтов сохранено благодаря @Martin Büttner
Нашел пару ошибок, связанных с некоторыми крайними случаями, увеличил количество байтов.
Возвращает разделенные числами новую строку. В любом случае, у этого есть в основном элегантное решение, которое в некотором роде разрушается крайними случаями, но эй, я должен был использовать режим сортировки, это означает, что я использовал правильный инструмент для работы, верно?
Объяснение:
Поэтапно, как обычно.
Единственными символами на входе, которые могут создавать границы слов, являются
-+.
. Это означает, что если мы находим границу, за которой следует буква, у нас есть неявное значение,1
которое мы добавляем при замене.$&
это синоним для$0
.Большое спасибо Мартину за этот, этот добавляет к неявной
0
для реальной части, если он отсутствовал во входных данных. Мы уверены, что не можем найти число, за которым следует знак плюс или минус или конец строки. Все комплексные числа будут иметь после них букву.Следующие 3 этапа практически одинаковы, за исключением того, на какую букву они влияют. Все они смотрят, чтобы увидеть, не можем ли мы сопоставить букву, и если мы не можем, мы добавим
0
термин для него. Единственная причина, поi
которой+
перед этим стоит дополнительная функция, состоит в том, чтобы предотвратить невозможность прочтения действительного значения с помощьюi
коэффициента s, все остальные числа разделены их комплексной переменной.Ах, самое интересное. При этом используется новый этап сортировки, обозначаемый обратным символом
O
разделителя перед параметром. Хитрость здесь заключается в том, чтобы получить целое число, за которым необязательно следует символ слова, который в этом случае будет совпадать только с одним из символовijk
. Другая используемая опция - то,$
что заставляет значение, используемое для сортировки этих совпадений, быть заменой. Здесь мы просто используем необязательную букву, оставленную в качестве значения сортировки. Поскольку Retina сортирует лексикографически по умолчанию, значения сортируются так, как если бы они были в словаре, что означает, что мы получаем соответствия по"", "i", "j", "k"
порядку.Эта стадия ставит
+
знак перед всеми знаками минус, это необходимо, еслиi
позже мы получим отрицательное значение для на стадии разделения.Мы убираем ведущие,
+
чтобы убедиться, что у нас нет лишних ведущих символов новой строки.Разделите оставшиеся строки на серии сложных переменных или знак плюс. Это хорошо дает нам одно значение на строку.
источник
Perl 5, 125 байт
источник
\a
соответствует «тревоге», а не алфавиту. Есть\w
для слова-символа (буквенно-цифровой и подчеркивание), но это не сработает здесь; нам нужно, чтобы это не совпадало по числу.Lua ,
185187195183166 байт ( попробуйте онлайн ) [используется регулярное выражение]Спасибо @Chris Jester-Young за улучшенное регулярное выражение.
Спасибо @Katenkyo за сокращение до 166 байтов.
Golfed:
Ungolfed:
источник
n
в этом случае), поэтому вы должны добавить код для чтения ввода.io.read()
использования(...)
. Он будет указывать на первый аргумент командной строки и позволит вам сохранить еще 4 байта :)r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
C 236 байт
(Для значений, таких как -0 или -0.0, знак минус также печатается в выходных данных,
но, поскольку задача заявляет, что «вы можете преобразовать числа в другую форму после анализа, если хотите», и если -0 появляется во входных данных, из этого следует, что это также приемлемо в выводе.@GamrCorps теперь уточнил, что это нормально.)источник
JavaScript (ES6),
103100 байтИзменить: 3 байта сохранены путем переключения с
parseInt
наcharCodeAt
, что удобно просто&3
получить мне правильный индекс массива.источник
JavaScript (ES6) 106
Тест
источник
PowerShell, 178 байт
Неуправляемый с объяснением
Не супер впечатлен, но, тем не менее, это результат.
источник
PHP, 179 байт
Попробуйте набор тестов .
источник
Python 3,5 - 496 байт [с использованием регулярных выражений]:
Это может быть долго, но в мою защиту, он прекрасно работает, выполняя то, что хочет OP, так как все приведенные тесты были успешными с использованием моего кода.
Неуправляемая версия с пояснениями:
Если вышеприведенный текст слишком сложен для чтения, в основном происходит следующее:
Если они есть, все знаки + или - НЕ, за которыми следует число, заменяются на «+1» / «- 1» соответственно.
lambda
Функция определена, которая, при использовании вsorted
функции в качестве ключа, сортирует список согласно положить весь номер первый, а затем приказывать остальное в увеличении письма значения ( «я», а затем «J», то «к» в этом случае).В кватернионе, который теперь заменяет все знаки +/- на 1, если это необходимо, выполняется поиск с использованием регулярных выражений всех букв, которым НЕ предшествует хотя бы одно число, и те буквы, которые совпадают, заменяются на «+1», за которым следует это письмо.
Затем оператор «if» заменяет ВСЕ знаки +/- пробелом, а затем модифицированный кватернион теперь «разделяется» на эти пробелы и возвращается в списке. Затем список сортируется в соответствии с лямбда-функцией, описанной ранее. Наконец, первый элемент в этом списке проверяется, чтобы убедиться, что это число, поскольку оно должно быть, а если нет, то в кватернионе добавляется «+0».
Второй цикл for находит ВСЕ буквы НЕ в кватернионе, находя симметричное различие между набором этих букв, найденных в выражении, и набором, включающим все требуемые буквы. Если они найдены, то в кватернионе добавляется «+0», за которым следует пропущенная буква и пробел.
Наконец, на этом последнем шаге между каждым символом добавляется «,», за которым следует символ +/-, а затем кватернион разделяется на эти пробелы, а затем возвращаемый список сортируется в последний раз в соответствии с лямбда-функция, определенная как «q» ранее. Запятые в выражении отдельно каждую часть кватернион ( в противном случае, вы бы получить что - то подобное
14i+5j+6k
с4i+5j+6k+1
). Наконец, этот теперь отсортированный список объединяется в строку, и только числа любого типа (из регулярных выражений) извлекаются и, наконец, возвращаются в списке в правильном порядке, каждый раз.источник