Wprowadzenie
Ludzie są niezwykłym gatunkiem, ale czasami możemy być bardzo niezręczni, aby zrozumieć - szczególnie w przypadku komputerów. W szczególności lubimy pisać wielomiany w bardzo zawiły sposób z pozornie arbitralnymi regułami.
Jaki jest najkrótszy program, który możesz napisać, aby poprawnie sformatować wielomian przy użyciu tych reguł?
Wyzwanie
Wkład
Lista liczb całkowitych z zakresu od -1000 do 1000 (włącznie), reprezentujących współczynniki wielomianu, przy czym ostatni wpis jest współczynnikiem x ^ 0 (stała), a drugi ostatni jest współczynnikiem x ^ 1 itp.
Wydajność
Ciąg reprezentujący ten wielomian w poprawnie sformatowanym zapisie matematycznym ludzi.
Zasady:
- Znak na wiodącym współczynniku jest wyświetlany tylko wtedy, gdy jest ujemny.
Right: -x^2+3
Wrong: +x^2+3
- Składniki o współczynniku 0 nie są drukowane (z wyjątkiem przypadku w rogu, w którym wszystkie współczynniki mają wartość 0 *).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Współczynniki
-1
i+1
mają być wyświetlane bez 1, chyba że są stałe.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- Wykładnik jest wyświetlany tylko wtedy, gdy jest większy niż 1, a zmienna jest wyświetlana tylko wtedy, gdy wykładnik jest większy niż 0.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Przypadek narożny: podczas gdy wartości zerowe zwykle nie powodują drukowania tego elementu, jeśli wszystkie współczynniki są równe zero, należy wydrukować stałą 0.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- To jest golf golfowy, więc zwycięzcą zostanie program z najmniejszą liczbą bajtów.
Przykład wejścia i wyjścia
Input: Output:
[0] 0
[0,0] 0
[0,-1,35,0] -x^2+35x
[5,1,7,-9] 5x^3+x^2+7x-9
[100,0,0,-1] 100x^3-1
[931,21,-11,1] 931x^3+21x^2-11x+1
Czekam na Wasze rozwiązania. Baw się dobrze!
EDYTOWAĆ:
- Jeśli chcesz, możesz otaczać operacje białymi znakami. Więc
3x+5
i3x + 5
oba są w porządku.3x+ 5
i3x +5
nie są. - Jeśli chcesz tworzyć rzeczywiste znaki wykładnicze (powiedzmy w Tex), jest to dozwolone, ponieważ jest jeszcze bliżej pisania przez ludzi.
- Współczynniki muszą pojawiać się bez miejsc po przecinku, np. Są
9x^2
poprawne,9.0x^2
nie są.
źródło
3x^2 + 4
kontra3x^2+4
?1x
->x
zamiana nie zmieni się21x^2
w2x^2
.Odpowiedzi:
Retina 0.8.2 , 56 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Wstaw wszystkie uprawnienia
x
, w tym,x^1
ale niex^0
.Usuń wszystkie potęgi o
x
zerowych współczynnikach, ale nie kończących0
(jeszcze).Usuń mnożnik
1
(ale nie stałą1
).Usuń
^1
zx^1
.Usuń stałą 0, chyba że jest to jedyna rzecz, która pozostała.
Usuń spację przed a
-
.Zmień pozostałe spacje na
+
s.źródło
JavaScript (ES6),
107106 bajtówWypróbuj online!
W jaki sposób?
Dane wyjściowe są budowane przez zastosowanie następujących wzorów do każdego współczynnika c tablicy wejściowej a [], jednocześnie śledząc bieżący wykładnik e .
Pierwsza formuła: znak plus
Jeśli współczynnik jest ściśle dodatni i nie jest to pierwszy termin w wyrażeniu wyjściowym, dołączamy
+
. W przeciwnym razie nic nie dodamy.Drugi wzór: znak minus i współczynnik
Jeśli wykładnik wynosi zero lub wartość bezwzględna współczynnika nie jest równa 1, dodajemy współczynnik (który może obejmować interlinię
-
). W przeciwnym razie dołączamy albo-
(jeśli współczynnik jest ujemny), albo nic.Trzecia formuła: zmienna i wykładnik
Jeśli wykładnik wynosi 0, nic nie dodajemy. Jeśli wykładnik wynosi 1, dodajemy
x
. W przeciwnym razie dodajemyx^
wykładnik.źródło
Stax , 37 bajtów
Uruchom i debuguj online
Oto rozpakowana, nie golfowa wersja.
Uruchom ten
źródło
Python 3,
279277258251 bajtówPobiera dane wejściowe jako listę ciągów. To rozwiązanie nie jest jeszcze dobrze golfowane. Zasadniczo działa to poprzez zastąpienie rzeczy dopasowanych do formatu wyjściowego, co znacznie zwiększa liczbę bajtów.
Wypróbuj online!
Specjalne podziękowania dla ovs i NK1406 .
źródło
if'0'!=i
iif'-1'==i
.Pari / GP , 41 bajtów
Wypróbuj online!
Jeśli
*
dozwolony jest między współczynnikiem a zmienną:Pari / GP , 3 bajty
Wypróbuj online!
źródło
APL (Dyalog Classic) ,
114113109107106 bajtówWypróbuj online!
-4 bajty dzięki @dzaima!
Można to zdecydowanie pograć w golfa dalej. To wymaga
⎕IO←0
źródło
Pip , 78 bajtów
Przyjmuje współczynniki jako argumenty wiersza polecenia. Wypróbuj online!
Używa
ME
(map-enumerate) iJ
(join), aby wygenerować coś z formularza0x^3+-1x^2+35x^1+0x^0
, a następnie kilka zamienników wyrażeń regularnych, aby przekształcić to we właściwy format.źródło
APL (Dyalog Classic) ,
7976 bajtówWypróbuj online!
źródło
Python 3,
161162 bajtyNaprawiono błąd dzięki OV.
Rozszerzony:
źródło
C # , 237 bajtów
źródło
Czysty , 172 bajty
Wypróbuj online!
źródło
Wolfram Language / Mathematica, 39 bajtów
Wypróbuj online!
Okazuje się, że jest wbudowany, aby wejść w odpowiedniej kolejności.
Poprzednie rozwiązanie:
Wolfram Language / Mathematica, 93 bajty
Przynajmniej dla mnie jest to zadziwiająco długo jak na język przeznaczony do manipulacji matematycznych. Wygląda na to, żeExpand@FromDigits[#,x]&
powinno działać, ale domyślna kolejność wielomianów jest odwrotnością tego, czego wymaga pytanie, więc wymagane jest dodatkowe finansowanie.Wyjaśnienie
źródło
SringReplace
byćStringReplace
?Python3:
150146 bajtów(poprzednie wdrożenia):
Możesz spróbować online
Uznanie dla: @Benjamin
źródło
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Perl 5
-a
, 94 bajtówWypróbuj online!
źródło
Retina 0.8.2 , 113 bajtów
Wypróbuj online!
Jestem pewien, że jest tu wiele do golfa ...
źródło
Haskell ,
166163 bajtówWypróbuj online! Przykładowe użycie:
g [0,-1,35,0]
daje"-x^2+35x"
.Poprzednie 166 bajtowe rozwiązanie, które jest nieco lepiej czytelne:
Wypróbuj online!
źródło
Rubin , 111 bajtów
Wypróbuj online!
Rozwiązanie tego w Ruby okazało się nieco frustrujące, głównie dlatego, że w przeciwieństwie do większości języków, w Ruby (prawie) wszystko jest zgodne z prawdą, w tym zera i puste ciągi, tak więc nawet proste sprawdzenie zera nie zbliża się wcale tak krótki jak
x?
.Grałem różnymi metodami konstruowania struny i ostatecznie zdecydowałem się na połączenie kilku podejść:
+
a-
znaki są tworzone przez formatowanie składni ze znakiem wymuszonym:%+d
x^i
wybiera się za pomocą indeksowania operatora rakiet[...][i<=>1]
źródło
Łuska ,
44 43 4140 bajtówWypróbuj online!
To wydaje się trochę niezręczne; Łuska nie jest zoptymalizowana do manipulacji ciągami. Pożyczyłem kilka pomysłów od odpowiedzi Staxa .
Wyjaśnienie
źródło
Perl 6 , 97 bajtów
Wypróbuj online!
Wyjaśnienie:
$!
śledzi bieżący wykładnik potęgi.Dodaj
+
przed dodatnimi współczynnikami, chyba że jest to pierwszy niezerowy.$_&&
Zwarcie daje pewność, że zmienna stan anonimowy$
jest zwiększany tylko dla niezerowych współczynników.&
Skrzyżowanie jest zwinięty, gdy zmuszona do Bool z?
.Ubytek
$!
. Posiekaj współczynnik 1 lub -1, chyba że jest stały.Warunki liniowe i stałe w szczególnych przypadkach. Użycie
<< >>
konstruktu chroniącego cytaty jest o jeden bajt krótszy niż odpowiednik('','x')
lub2>$!??'x'x$!!!'x^'~$!
.Ukryj warunki zerowe, ale zawsze oceniaj poprzednie wyrażenie dla
--$!
efektu ubocznego.Zwróć,
0
jeśli wszystkie współczynniki są równe zero.źródło
Java 8,
202176174173 bajtówWyjaśnienie:
Wypróbuj online.
źródło
a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
(j^j--)
na0*j--
.Python, 165 bajtów
źródło
PHP, 213 bajtów
Argument wiersza poleceń zgodnie z żądaniem OP (pojedynczy argument z nawiasami i przecinkami).
Ładny druk i wyjaśnienie:
źródło
PowerShell, 295 bajtów
źródło