Jeśli jeszcze nie wiesz, czwartorzęd jest w zasadzie liczbą 4-częściową. Na potrzeby tego wyzwania ma prawdziwy komponent i trzy fikcyjne komponenty. Wyimaginowanych części są reprezentowane przez sufiks i
, j
, k
. Na przykład, 1-2i+3j-4k
jest kwaternion z 1
czym składowa rzeczywista i -2
, 3
i -4
jest z urojonych.
W tym wyzwaniu musisz przeanalizować ciąg znaków czwartorzędu (np. "1+2i-3j-4k"
) Na listę / tablicę współczynników (np. [1 2 -3 -4]
). Ciąg czwartorzędu można jednak sformatować na wiele różnych sposobów ...
- To może być normalne:
1+2i-3j-4k
- To może mieć brakujące warunki:
1-3k
,2i-4k
(Jeśli masz brakujące warunki, wyjście0
dla tych kategoriach) - Może to być brak współczynników:
i+j-k
(W tym przypadku, jest to równoznaczne z1i+1j-1k
Innymi słowy,.i
,j
Lubk
bez numeru przed zakłada się mieć1
przed domyślnie) - Może nie być w odpowiedniej kolejności:
2i-1+3k-4j
- Współczynniki mogą być po prostu liczbami całkowitymi lub dziesiętnymi:
7-2.4i+3.75j-4.0k
Podczas analizowania należy zwrócić uwagę na kilka rzeczy:
- Zawsze będą warunki
+
lub-
pomiędzy warunkami - Zawsze otrzymasz prawidłowe dane wejściowe z co najmniej 1 terminem i bez powtarzających się liter (bez liter
j-j
) - Wszystkie liczby można przyjąć za prawidłowe
- Można zmienić numery w inną formę po parsowania jeśli chcesz (np.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Wbudowane parsowanie / quaternion i standardowe luki są niedozwolone. Dotyczy to eval
słów kluczowych i funkcji. Dane wejściowe będą stanowić pojedynczy ciąg, a dane wyjściowe będą listą, tablicą, wartościami oddzielonymi spacjami itp.
Ponieważ jest to golfowy kod, wygrywa najkrótszy kod w bajtach.
Mnóstwo przypadków testowych
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]
źródło
+
na wejściu będą kiedyś niepotrzebne znaki? Jak:+1k
?+
.-0
część legalnych wyników dla dwóch ostatnich przykładów?eval
ograniczenie, które ma być ciągiem, interpretowane jako kod i / lub dane wejściowe. Wszelkie konwersje nie liczą się do tego, ponieważ nie można przekazać, na przykład, ciągu"test"
do funkcji konwersji na liczbę całkowitą, aby otrzymać liczbę całkowitą, aletest
byłby interpretowany jako kod w normalnejeval
funkcji. TLDR: eval: nie, konwersje typu: tak.Odpowiedzi:
Pyth, 48 bajtów
Pakiet testowy demonstracji
Format wyjściowy jest oddzielony znakiem nowej linii. Kod zestawu testów używa separacji spacji dla ułatwienia odczytu, ale poza tym jest taki sam.
Wyprowadza a
-0
w ostatnich 2 przypadkach, które, mam nadzieję, są w porządku.Wyjaśnienie do naśladowania.
źródło
Retina, 115
Wypróbuj online!
1 bajt zapisany dzięki @Chris Jester-Young .
Naprawiono błąd i zapisano 6 bajtów dzięki @Martin Büttner
Znaleziono kilka błędów związanych z niektórymi przypadkami na krawędziach, dość mocno zwiększona liczba bajtów.
Zwraca liczby oddzielone nową linią. Tak czy inaczej, to ma w większości eleganckie rozwiązanie, które w pewnym sensie jest niszczone przez skrzynki, ale hej, muszę użyć trybu sortowania, co oznacza, że użyłem odpowiedniego narzędzia do pracy, prawda?
Wyjaśnienie:
Krok po kroku, jak zwykle.
Jedynymi znakami na wejściu, które mogą tworzyć granice słów, są
-+.
. Oznacza to, że jeśli znajdziemy granicę, po której następuje litera, mamy domniemanie,1
które dodajemy wraz z zamiennikiem.$&
jest synonimem$0
.Ogromne podziękowania dla Martina za ten, ten dodaje domyślną
0
prawdziwą część, jeśli jej brakowało w danych wejściowych. Upewniamy się, że nie możemy znaleźć liczby, po której następuje znak plus lub minus lub koniec łańcucha. Wszystkie liczby zespolone będą miały literę po nich.Kolejne 3 etapy są prawie takie same, z wyjątkiem tego, na którą literę wpływają. Wszyscy sprawdzają, czy nie możemy dopasować litery, a jeśli nie, możemy dodać do niej
0
termin. Jedynym powodemi
jest to,+
że nie można odczytać rzeczywistej wartości zei
współczynnikiem s, pozostałe liczby są oddzielone ich zmienną zespoloną.Ach, zabawna część. Wykorzystuje to nowy etap sortowania, oznaczony przez backstick
O
przed separatorem opcji. Sztuką jest złapanie całej liczby, po której opcjonalnie występuje znak słowny, który w tym przypadku będzie pasował tylko do jednegoijk
. Inną zastosowaną opcją jest$
zamiana wartości użytej do sortowania tych dopasowań. W tym przypadku używamy opcjonalnej litery, która pozostała jako nasza wartość sortowania. Ponieważ Retina domyślnie sortuje leksykograficznie, wartości są sortowane tak, jakby były w słowniku, co oznacza, że dopasowujemy"", "i", "j", "k"
kolejność.Ten etap umieszcza
+
znak przed wszystkimi znakami minusowymi, jest to potrzebne, jeślii
później będziemy mieli wartość ujemną dla etapu podziału.Usuwamy wiodące,
+
aby upewnić się, że nie mamy dodatkowych wiodących nowych linii.Podziel pozostałe linie na przebiegach zmiennych zespolonych lub znaku plus. To ładnie daje nam jedną wartość na linię.
źródło
Perl 5, 125 bajtów
źródło
\a
dopasowuje „alarm”, a nie alfabetycznie. Dostępne są\w
znaki słowne (alfanumeryczne i podkreślniki), ale to tutaj nie zadziała; potrzebujemy, aby nie pasowała do numeru.Lua ,
185187195183166 bajtów ( wypróbuj online ) [używane wyrażenie regularne]Dzięki @Chris Jester-Young za ulepszony regex.
Dzięki @Katenkyo za sprowadzenie go do 166 bajtów.
Gra w golfa:
Nie golfowany:
źródło
n
w tym przypadku), dlatego należy dodać kod, aby odczytać dane wejściowe.io.read()
użycia(...)
. Będzie wskazywał na pierwszy argument wiersza poleceń i pozwoli ci zaoszczędzić 4 kolejne bajty :)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 bajtów
(W przypadku wartości takich jak -0 lub -0,0 znak wyjściowy jest również drukowany na wyjściu,
ale ponieważ wyzwanie mówi, że „możesz zmienić liczby na inną formę po parsowaniu, jeśli chcesz”, a jeśli na wejściu pojawi się -0, wynika z tego, że jest to również dopuszczalne w danych wyjściowych.@GamrCorps wyjaśnił teraz, że jest to w porządku.)źródło
JavaScript (ES6),
103100 bajtówEdycja: Zapisałem 3 bajty, przełączając się z
parseInt
nacharCodeAt
, który wygodnie wystarczy,&3
aby uzyskać poprawny indeks tablicy.źródło
JavaScript (ES6) 106
Test
źródło
PowerShell, 178 bajtów
Niegolfowany z wyjaśnieniem
Nie jestem pod wrażeniem, ale mimo wszystko jest to wynik.
źródło
PHP, 179 bajtów
Wypróbuj zestaw testowy .
źródło
Python 3.5 - 496 bajtów [przy użyciu wyrażeń regularnych]:
To może być długie, ale w mojej obronie działa idealnie, robiąc to, czego chce OP, ponieważ wszystkie podane przypadki testowe zakończyły się powodzeniem przy użyciu mojego kodu.
Wersja bez golfa z wyjaśnieniem zawiera:
Jeśli powyższe jest trochę zbyt trudne do odczytania, w zasadzie dzieje się tak:
Jeśli występują, wszystkie znaki + lub - NIE, po których następuje liczba, są zastępowane odpowiednio przez „+1” / „- 1”.
lambda
Funkcja jest zdefiniowana, który, gdy jest stosowany wsorted
funkcji jako klucza, sortuje listę według oddanie cały numer, a potem zamawianie resztę w zwiększaniu wartości się ( „I”, a następnie „j”, a następnie „k” W tym przypadku).Czwórnik, w razie potrzeby zastępując teraz wszystkie znaki +/- 1, przeszukuje się za pomocą wyrażeń regularnych WSZYSTKIE litery NIE poprzedzone co najmniej jedną liczbą, a pasujące litery zastępuje się „+1”, po którym następuje ten list.
Instrukcja „if” następnie zastępuje WSZYSTKIE znaki +/- spacją, a następnie zmodyfikowany Quaternion jest teraz „dzielony” w tych spacjach i zwracany na liście. Następnie lista jest sortowana zgodnie z wyjaśnioną wcześniej funkcją lambda. Na koniec sprawdzany jest pierwszy element na tej liście, aby upewnić się, że jest liczbą, ponieważ powinien to być, a jeśli nie, to do czwartorzędu dodaje się „+0”.
Druga pętla „for” znajduje WSZYSTKIE litery NIE w ćwiartce, znajdując symetryczną różnicę między zbiorem liter znajdujących się w wyrażeniu, a następnie zestaw zawierający wszystkie wymagane litery. Jeśli jakieś zostaną znalezione, wówczas „+0”, a następnie brakująca litera i spacja są dodawane do czwartorzędu.
Na koniec, w ostatnim kroku, pomiędzy każdym znakiem dodaje się znak „,”, po którym następuje symbol +/-, a następnie kwatermistrz jest dzielony na te spacje, a następnie zwracana lista jest sortowana, po raz ostatni, zgodnie z funkcja lambda zdefiniowana wcześniej jako „q”. Przecinki w wypowiedzi oddzielić każda część kwaterniony (w przeciwnym razie można byłoby się coś podobnego
14i+5j+6k
z4i+5j+6k+1
). Na koniec ta posortowana lista jest następnie łączona w ciąg, a tylko liczby dowolnego typu (dzięki wyrażeniom regularnym) są wyodrębniane i ostatecznie zwracane w postaci listy we właściwej kolejności za każdym razem.źródło