젤리 , 28 바이트
ṣ”+ṣ”xV$€)p/ZPSƭ€j⁾x^Ʋ€j“ +
온라인으로 사용해보십시오!
전체 프로그램. 두 개의 다항식을 두 개의 문자열 목록으로 사용합니다.
설명 (확장 양식)
ṣ”+ṣ”xV$€µ€p/ZPSƭ€j⁾x^Ʋ€j“ + ” Arguments: x
µ Monadic chain.
€ Map the monadic link over the argument.
Note that this will "pop" the previous chain, so
it will really act as a link rather than a
sub-chain.
ṣ”+ ṣ, right = '+'.
Split the left argument on each occurrence of
the right.
Note that strings in Jelly are lists of
single-character Python strings.
€ Map the monadic link over the argument.
$ Make a non-niladic monadic chain of at least
two links.
ṣ”x ṣ, right = 'x'.
Split the left argument on each occurrence of
the right.
V Evaluate the argument as a niladic link.
/ Reduce the dyadic link over the argument.
p Cartesian product of left and right arguments.
€ Map the monadic link over the argument.
Ʋ Make a non-niladic monadic chain of at least
four links.
Z Transpose the argument.
€ Map the monadic link over the argument.
ƭ At the first call, call the first link. At the
second call, call the second link. Rinse and
repeat.
P Product: ;1×/$
S Sum: ;0+/$
j⁾x^ j, right = "x^".
Put the right argument between the left one's
elements and concatenate the result.
j“ + ” j, right = " + ".
Put the right argument between the left one's
elements and concatenate the result.
앨리어싱
)
와 동일합니다 µ€
.
후행 ”
은 내포되어 있으며 생략 할 수 있습니다.
연산
이 입력이 있다고 가정 해 봅시다.
["6x^2 + 7x^1 + -2x^0", "1x^2 + -2x^3"]
첫 번째 절차는 두 다항식 각각에 적용되는 구문 분석입니다. 첫 번째를 다루 자 "6x^2 + 7x^1 + -2x^0"
:
첫 번째 단계는 '+'
용어를 분리하기 위해 문자열을로 나누는 것 입니다. 결과는 다음과 같습니다.
["6x^2 ", " 7x^1 ", " -2x^0"]
다음 단계는 'x'
지수에서 계수를 분리하기 위해 각 문자열을로 나눕니다 . 결과는 다음과 같습니다.
[["6", "^2 "], [" 7", "^1 "], [" -2", "^0"]]
현재이 문자열에는 많은 쓰레기가있는 것처럼 보이지만 실제로는 그 쓰레기는 중요하지 않습니다. 이 문자열은 모두 닐 라드 젤리 링크로 평가됩니다. 사소하게, 공백은 숫자의 숫자 사이에 있지 않기 때문에 중요하지 않습니다. 따라서 아래를 평가해도 여전히 같은 결과를 얻을 수 있습니다.
[["6", "^2"], ["7", "^1"], ["-2", "^0"]]
^
s는 좀 더 방해 보이지만 실제로 중 아무것도하지 마! 글쎄, ^
비트 XOR 원자이지만, 닐라 딕 사슬은 모나 딕 링크처럼 행동합니다. 단, 첫 번째 링크는 나일 경우 인수를 취하는 대신 실제로 인수가됩니다. 그렇지 않은 경우 링크의 인수는 0
입니다. 지수는 ^
s를 첫 번째 문자로 사용하며 ^
나쁘지 않으므로 인수는로 간주됩니다 0
. 문자열의 나머지 부분, 즉 숫자는의 올바른 인수입니다 ^
. 따라서, 예를 들어, ^2
이다0 XOR 2 = 2. 명백하게,0 XOR n = n. 모든 지수는 정수이므로 우리는 괜찮습니다. 따라서 위의 값 대신이를 평가해도 결과가 변경되지 않습니다.
[["6", "2"], ["7", "1"], ["-2", "0"]]
여기 우리는 간다 :
[[6, 2], [7, 1], [-2, 0]]
이 단계는로 변환 "-0"
됩니다 0
.
두 입력을 모두 파싱하기 때문에 파싱 후의 결과는 다음과 같습니다.
[[[6, 2], [7, 1], [-2, 0]], [[1, 2], [-2, 3]]]
구문 분석이 완료되었습니다. 다음 절차는 곱셈입니다.
먼저 다음 두 목록의 데카르트 곱을 가져옵니다.
[[[6, 2], [1, 2]], [[6, 2], [-2, 3]], [[7, 1], [1, 2]], [[7, 1], [-2, 3]], [[-2, 0], [1, 2]], [[-2, 0], [-2, 3]]]
왼쪽 목록에서 하나의 요소와 오른쪽에서 하나의 요소로 순서대로 여러 쌍이 만들어집니다. 이것은 또한 의도 된 출력 순서입니다. 이 도전은 우리가 그 이후 결과를 더 이상 처리하지 않기를 요청하면서 곱셈 분포를 적용하도록 요구합니다.
각 쌍의 쌍은 곱하고자하는 항을 나타내며, 첫 번째 요소는 계수이고 두 번째 요소는 지수입니다. 항을 곱하기 위해 계수를 곱하고 지수를 함께 더합니다 (X씨b x디= a b x씨엑스디= a b ( x씨엑스디) = ( a b ) xc + d). 우리는 어떻게합니까? 두 번째 쌍을 처리합시다 [[6, 2], [-2, 3]]
.
먼저 쌍을 바꿉니다.
[[6, -2], [2, 3]]
그런 다음 첫 번째 쌍의 곱과 두 번째 합을 취합니다.
[-12, 5]
코드의 관련 부분은 PSƭ€
실제로 각 용어 쌍에 대한 카운터를 재설정하지 않지만, 쌍이기 때문에 필요하지 않습니다.
모든 용어 쌍을 처리 할 때 다음이 있습니다.
[[6, 4], [-12, 5], [7, 3], [-14, 4], [-2, 2], [4, 3]]
여기서 곱셈은 같은 용어를 결합 할 필요가 없으므로 수행됩니다. 마지막 절차는 Prettyfying입니다.
먼저 각 쌍을 "x^"
다음 과 결합합니다 .
[[6, 'x', '^', 4], [-12, 'x', '^', 5], [7, 'x', '^', 3], [-14, 'x', '^', 4], [-2, 'x', '^', 2], [4, 'x', '^', 3]]
그런 다음 목록으로 다음을 결합합니다 " + "
.
[6, 'x', '^', 4, ' ', '+', ' ', -12, 'x', '^', 5, ' ', '+', ' ', 7, 'x', '^', 3, ' ', '+', ' ', -14, 'x', '^', 4, ' ', '+', ' ', -2, 'x', '^', 2, ' ', '+', ' ', 4, 'x', '^', 3]
리스트에 숫자가 어떻게 남아 있는지 확인하십시오. 그래서 실제로 문자열이 아닙니다. 그러나 Jelly에는 "stringification"이라는 프로세스가 있으며 프로그램 실행이 끝날 때 바로 실행되어 결과를 인쇄합니다. 깊이 1 목록의 경우 실제로 각 요소를 문자열 표현으로 변환하고 문자열을 연결하므로 원하는 출력을 얻습니다.
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3