C-shell: Как создать несколько массивов из одной строки стандартного ввода?

76
5

Мне нужно найти способ выполнить следующую задачу с помощью C-shell (я не могу использовать другую оболочку):

Существует программа, которая выводит полиномиальные коэффициенты из более крупного многочлена, используя вычисления поля Галуа. Вывод представляет собой одну строку и выглядит примерно так (не обращайте внимания на фактическое значение чисел, я случайно выбрал их, и они не математически работают):

(0 1 4 6 7 8 11 12 13) = (0 1)^3 * (0 4 5) * (0 2 4 6)^4 * (0 2 3)^2

Как работает полиномиальная математика, если фактор поднят до четного числа, то этот фактор является излишним по отношению к значению многочлена. Вид вроде умножения на 1. Что мне нужно сделать, это извлечь полиномиальные факторы и устранить лишние факторы.

Используя sed, я смог изменить приведенное выше выражение в форме

(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2

но я не уверен, как действовать дальше.

Я хочу взять выше, ввести его в сценарий C-оболочки и выполнить следующие назначения массива:

Array A = (0 1)
Array B = (0 4 5)

Я думаю, что лучшим способом было бы сначала разделить полиномиальные факторы на отдельные строки, например:

(0 1) ^ 3
(0 4 5)
(0 2 4 6) ^ 4
(0 2 3) ^ 2

но я не уверен, как это сделать.

Может ли кто-нибудь предоставить какую-либо полезную помощь или подсказки? Имейте в виду, что число полиномиальных факторов изменится, но я не ожидаю, что когда-либо будет больше 8. Значения экспоненциальности не значительны; Мне нужно только определить, четные или нечетные. Я легко могу это сделать, если они назначены переменной или массиву. Максимально возможный размер одного фактора, вероятно, составляет около 50 человек в круглых скобках.

спросил(а) 2021-01-25T13:48:09+03:00 4 месяца, 4 недели назад
1
Решение
63

Вероятно, вы хотите что-то вроде следующего:

#!/bin/tcsh

set str="(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2"

echo "My string: ===$str==="
set arrnum = 0
foreach line ( "'echo '$str' | grep -oP '\([^)]*\)''" )
@ arrnum++
set eval_line = "set array$arrnum = $line"
eval "$eval_line"
end

echo "created $arrnum arrays (array1 .. array$arrnum)"
foreach i ('seq $arrnum')
set arrname = "array$i"
echo "The content of $arrname"
set temp = 'eval echo '$'$arrname'
foreach item ( $temp )
echo $item
end
end

Он создает array1.. arrayN для каждой (xxxxx) группы. Для вашей строки:

(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2

печать

My string: ===(0 1) ^ 3 * (0 4 5) * (0 2 4 6) ^ 4 * (0 2 3) ^ 2===
created 4 arrays (array1 .. array4)
The content of array1
0
1
The content of array2
0
4
5
The content of array3
0
2
4
6
The content of array4
0
2
3

ответил(а) 2021-01-25T13:48:09+03:00 4 месяца, 4 недели назад
44

Предполагая, что у вас есть полином в файле с именем abc, вы можете использовать следующую команду, чтобы получить результат, который вы ищете.

cat abc | tr '\052' '\n'

Если вы имеете то же самое в переменной say res, то вы можете использовать следующую команду:

echo $res | tr '\052' '\n'

ответил(а) 2021-01-25T13:48:09+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема