Te numery Split-kompleks , znany również jako „numerów perplex” są podobne do liczb zespolonych. Zamiast tego i^2 = -1
mamy j^2 = 1; j != +/-1
. Każda liczba ma postać z = x + j*y
.
W jednej próbie ograniczenia złożoności tego wyzwania użyję tego symbolu -
do przedstawienia negacji, ponieważ nie będzie żadnego odejmowania.
Oto kilka przykładów przyjemności oglądania:
6 * 9 = 54 // real numbers still act normally
5 + -7 = -2
j*1 + j*1 = j*2 // two `j`s added together make a j*2
7 * j*1 = j*7 // multiplication is commutative & associative
j*1 + 2 = 2+j*1 // like oil and water, "combine" to form a split-complex number
j*1 + j*-3 = j*-2 // seems okay so far
j*j*1 = j*-1*j*-1 = 1 // kinda sketchy, but such is its inherent nature
j*j*-1 = j*-1*j*1 = -1
(2+j*3)+(4+j*7) = 6+j*10 // combine like terms
7 * (2+j*3) = 14+j*21 // distributive property
j * (2+j*3) = (j*2) + (j*j*3) = 3+j*2 // since j^2 = 1, multiplying my j "swaps" the coefficients
(2+j*3)*(4+j*7) = (2*4)+(2*j*7)+(j*3*4)+(j*3*j*7) = 8+j*14+j*12+21 = 29+j*26 // a complete multiplication
Wyzwanie
Celem tego wyzwania jest ocena wyrażenia o liczbach zespolonych.
To jest golf golfowy, wygrywa najmniej bajtów.
Wejście
Wprowadzony zostanie pojedynczy wiersz zawierający tylko symbole +*()-
, cyfry 0123456789
i literę j
, z opcjonalnym znakiem nowej linii. Ten ciąg reprezentuje wyrażenie, używając notacji infiksowej i pierwszeństwa operatora (mnożenie przed dodaniem, z grupowaniem w nawiasach).
- Symbol
-
zawsze będzie reprezentował negację, nigdy odejmowanie. Jeśli chcesz, możesz zastąpić-
jedną z nich_
lub~
dla łatwości we / wy. - Nawiasy można zagnieżdżać maksymalnie trzy razy, aby wskazać grupowanie:
(1+(1+(1)))
- List
j
nigdy nie będzie poprzedzony zaprzeczeniem i zawsze będzie po nim następował*
. - Nawiasy nie będą poprzedzone zaprzeczeniem
-(7)
, ale zamiast tego-1*(j*5+2)
- Nigdy nie będzie operacji niejawnych. Wszelkie pomnożenie będzie wyrażone jako
(7)*7
zamiast(7)7
i jakoj*5
zamiastj5
. - Brak wiodących zer.
Wynik
Dane wyjściowe będą miały postać X+j*Y
, gdzie X i Y mogą być dowolną liczbą całkowitą. Jeśli liczba całkowita jest ujemna, powinna być poprzedzona znakiem negacji.
Dodatkowe ograniczenia
Chociaż nie znam żadnego języka z natywną obsługą, wbudowane funkcje dotyczące liczb zespolonych są zabronione. Regularne liczby zespolone są uczciwą grą.
Przypadki testowe
Podobne do powyższych przykładów, ale uporządkowane. Wprowadź jedną linię i wyślij linię poniżej.
(2+j*3)+(4+j*7)
6+j*10
(2+j*3)*(4+j*7)
29+j*26
(-5+j*1+j*2+2)*(4+j*7)
9+j*-9
(1+j*-1)*(1+j*1)
0+j*0 // this is why division does not exist.
j*((j*-1)+2)
-1+j*2
(2+(5+-1*(j*1))+2)
9+j*-1
źródło
j=[0 1; 1 0]
i odczytywać współczynniki z górnego rzędu.Python 2, 258
Prawdopodobnie nie jest to najlepsze podejście, ale po raz pierwszy OOP wyglądał jak zadowalający pomysł w Pythonie na golfa kodu, więc dlaczego nie?
Tworzy klasę,
c
która dziedziczy ze złożonego, ale ma innąmul
operację.add
Operacja jest również zmieniona tak, że zwraca obiekt typuc
i niecomplex
, to zachowanie jest niezbędne, aby zapobiec przypadek(a + b) * (c + d)
robi złożonego mnożenia zamiast tego szczególnego rodzaju.Łańcuch wejściowy jest następnie konwertowany na łańcuch, który może być oceniany naturalnie przez python. Robi to, zmieniając każdą liczbę na,
c(number)
a następnie każdąj
nac(0,1)
.Wypróbuj online lub uruchom pakiet testowy
źródło
GAP , 38 bajtów
Pierwszy
j
jest zdefiniowany jako nieokreślony, więc możemy tworzyć wielomiany wj
. Aby uzyskać odpowiednią liczbę kłopotliwą, zmniejszamy (tj. Przyjmujemy pozostałą część podziału wielomianowego) oj^2-1
. Daje to termin liniowy (lub stały) i możemy polegać na zdolności GAP do generowania wielomianów.Przykłady:
Zastrzeżenie: 1. To nie przyjmuje ciągu jako danych wejściowych, ale prawdziwy termin w języku GAP. Aby to naprawić, mogę użyć
EvalString
. 2. Dane wyjściowe są ładne i wyraźne, ale nie dokładnie takie, jak podano: Kolejność jest zmieniana, a zbędne zera są pomijane. Myślę i mam nadzieję, że nadal jest to zgodne z duchem wyzwania, w przeciwnym razie myślę, że lepiej byłoby użyć macierzy @ xnor.źródło
PolynomialMod[#,j^2-1]&
ma podobne właściwości. Rzeczywiście, jeśli nigdy nie pomnożyliśmy więcej niż dwóch liczb zakłopotanych (tak jak w przypadkach testowych nie), toExpand@#/.j^2->1
wystarczy.t->t%(j^2-1)
w Pari / GP.Aksjomat,
2042 bajtówpoprzednie rozwiązanie ma problem, jeśli jest
n<0
w,j^n
ale wydaje się bardziej solidne i dobrze doradza tam, gdzie coś jest nie tak, nawet jeśli doskonałością byłby zwracany przykład j ^ 1.2 lub j ^ sqrt (-1) to samo wyrażenie nie oceniajeśli nie przestrzegam jakiegoś prawa pytania: powiedz mi to i dodaję „niekonkurencyjny”. Mam na myśli to jako jeden aksjomat dla uproszczenia formuły
źródło
Partia, 52 bajty
Po zobaczeniu doskonałej nominacji @ xnor poczułem się zmuszony do przeniesienia jej.
źródło