Biorąc pod uwagę niepustą listę nieujemnych liczb całkowitych, rozważ przepisanie jej jako problemu arytmetycznego, gdy:
- Znak plus (
+
) jest wstawiany między parami liczb, które zwiększają się od lewej do prawej (czyli od początku listy do końca). - Znak minus (
-
) jest wstawiany między pary liczb, które maleją od lewej do prawej. *
Pomiędzy parami liczb, które są równe, wstawiany jest znak mnożenia ( ).
Powiedziane w inny sposób: każda podlista a,b
staje się a+b
jeśli a<b
, a-b
jeśli a>b
i a*b
jeśli a==b
.
Na przykład lista
[12, 0, 7, 7, 29, 10, 2, 2, 1]
stałby się wyrazem
12 - 0 + 7*7 + 29 - 10 - 2*2 - 1
co ocenia na 75
.
Napisz program lub funkcję, która pobiera taką listę i ocenia ją, drukując lub zwracając wynik.
- Kolejność operacji ma znaczenie. Przed dodaniem lub odjęciem należy wykonać pomnożenie.
- Jeśli lista wejściowa ma jeden numer, powinno to być to, co ocenia. np.
[64]
powinien dać64
. - Użycie
eval
lubexec
dopuszcza lub podobnej konstrukcji.
Oto kilka dodatkowych przykładów:
[list]
expression
value
[0]
0
0
[1]
1
1
[78557]
78557
78557
[0,0]
0*0
0
[1,1]
1*1
1
[2,2]
2*2
4
[0,1]
0+1
1
[1,0]
1-0
1
[1,2]
1+2
3
[2,1]
2-1
1
[15,4,4]
15-4*4
-1
[9,8,1]
9-8-1
0
[4,2,2,4]
4-2*2+4
4
[10,9,9,12]
10-9*9+12
-59
[1,1,2,2,3,3]
1*1+2*2+3*3
14
[5,5,4,4,3,3]
5*5-4*4-3*3
0
[3,1,4,1,5,9,2,6,5,3,5,9]
3-1+4-1+5+9-2+6-5-3+5+9
29
[7637,388,389,388,387,12,0,0,34,35,35,27,27,2]
7637-388+389-388-387-12-0*0+34+35*35-27*27-2
7379
Najkrótszy kod w bajtach wygrywa. Tiebreaker to wcześniejsza odpowiedź.
code-golf
math
number
arithmetic
Hobby Calvina
źródło
źródło
Odpowiedzi:
Python 2, 63 bajty
Konstruuje i
eval
s ciąg wyrażeń. Symbol arytmetyczny wybiera się przez porównanie poprzedniego numerup
z bieżącymx
. Do symbolu dołącza się bieżący numer.Pierwszy numer jest obsługiwany za pomocą sprytnej sztuczki ze Sp3000. Wartość początkowa parametru
p
jest ustawiona na ciąg znaków, który jest większy niż dowolna liczba, a zatem powoduje, że występuje-
przed pierwszą liczbą. Ales
inicjowana jestprint-
w tym samym czasie, co powoduje, że wynik zaczyna się odprint--
(dzięki xsot za zapisanie 2 bajtów przez inicjalizację za pomocąprint
.)źródło
print
do łańcucha i użyćexec
zamiast niegoeval
.Pyth,
312619171615 bajtówWyrażenia z
*
nie będą oceniać online, ale teoretycznie będą działać.2 bajty dzięki Maltysen.
Zestaw testowy (z oceną).
Pozostałe przypadki (bez oceny).
Historia
M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e
M+G@"*-+"->GH<GHv+sgVQtQ\x60e
vtssVm@"*-+"->Zd<~Z
vtssVm@"*-+"._-~Z
vssVm@"*-+"._-~k
vsm+@"*-+"._-~k
źródło
+
i-
online)--safe
przełącznika, który zastępujeeval
sięast.literal_eval
.Galaretka ,
18161514 bajtówNie używa wbudowanego eval. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
eval
jako atom ...MATL , 12 bajtów
Wykorzystuje to bardzo fajny pomysł @ aditsu na kodowanie w czasie rzeczywistym.
Wypróbuj online!
Wyjaśnienie
źródło
CJam, 20
Wypróbuj online
Wyjaśnienie:
źródło
JavaScript (ES6), 54
eval
otrzymuje listę wyrażeń oddzieloną przecinkami i zwraca wartość ostatniego.Test
źródło
Julia,
7657 bajtówMój pierwszy raz grałem w golfa Julię, więc może są oczywiste ulepszenia. Wypróbuj online!
Dennis zaoszczędził mnóstwo bajtów.
źródło
!
.Pyth -
232220 bajtówPodobnie jak w przypadku Kenny'ego, mnożenie nie działa online.
Test Suite bez przeprowadzania oceny .
źródło
R, 92 bajty
Prawdopodobnie nadal można tu grać w golfa.
Nie golfowany:
źródło
Brachylog ,
3432 bajtyWypróbuj online!
źródło
TI-BASIC, 146 bajtów
Ładnie go sformatuję, gdy nie będzie mobilny. Sen mi ucieka, więc rozumiesz. Cieszyć się.
źródło
JavaScript ES6,
6462 znakówźródło
a
parametr?a[i+1]...a[i+1]
=>a[++i]...a[i]
- 2 znaki krótsza, ale przez pomyłkę zastąpiłem cały upuszczany koda=>
).Java, 384 bajty
Ungolfed spróbuj online
źródło
int a=l.length
,&&
=>&
, umieścićint i=0
na tej samej linii „jak”int n=l[0],m
.if(i<l.length-2&&l[i+1]!=l[i+2])n+=l[i+1];else{m=l[i+1];while(i<l.length-2&&l[i+1]==l[i+2])m*=l[(i++)+1];n+=m;
możesz po prostu zastąpić to zawartością wewnątrzelse
bloku.JavaScript ES6, 79 znaków
źródło
Perl, 49 bajtów
Kod 48 bajtów + 1 dla
-p
Stosowanie
Notatki
Nauczyłem się tutaj, że możesz uchwycić spojrzenie w PCRE, chociaż jest to trochę nieintuicyjne (
(?=(\d+))
zamiast((?=\d+))
). Ma to jednak sens po przeczytaniu, ponieważ przechwytujesz dopasowanie o zerowej długości (z wyprzedzeniem) z tym drugim, a zamiast tego przechwytujesz dopasowanie z pierwszym.Dzięki @ninjalj za uratowanie 8 bajtów!
źródło
-e
za darmo, dodającp
co-pe
było +1 ? Zaktualizuje się na razie, ale jeśli możesz znaleźć źródło, które mógłbym zacytować / link do dalszych działań, byłoby świetnie!$&.qw(* - +)[$&<=>$1]
w zastępczej częścis///
operatora.Właściwie 30 bajtów
Niestety, ponieważ
≡
komenda eval ( ) ocenia tylko literały na TIO, ten program nie działa na TIO.Wyjaśnienie:
źródło
R ,
12044 bajtówWypróbuj online!
Algorytm jest podobny do tej odpowiedzi , ale zdałem sobie z tego sprawę dopiero po zakodowaniu mojej odpowiedzi. Znacznie lepiej niż moja pierwotna odpowiedź, która była używana
eval(parse)
.W pełni wykorzystuje wektoryzowane operacje R - czy
*
operacja najpierw używarle(x)$values ^ rle(x)$lenghts
i kropkuje iloczyny tego wektorasign( diff( rle(x)$values ) )
(poprzedza je1
).źródło
05AB1E (starsza wersja) ,
171615 bajtów-2 bajty dzięki @Emigna .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
>
, przechodząc+
na koniec ciągu.Ć
i¨
, jeśli używasz‚ζ
zamiastø
‚ζ
jest idealną alternatywą do obejścia, ponieważ przestrzeń jest ignorowana w ewaluacji. Dzięki jeszcze raz. :)PHP, 103 bajty
Zgrabne wyzwanie. Trwało to dłużej niż oczekiwano. Myślę, że użycie
array_map
lub podobne nie poprawi liczby bajtów, ponieważ anonimowe funkcje są wciąż drogie w PHP.Działa z wiersza poleceń, wyświetli monit o listę oddzieloną przecinkami, na przykład:
źródło
PowerShell v2 +, 62 bajty
Pobiera dane wejściowe jako rozdzielone spacjami argumenty wiersza polecenia, które są konwertowane na tablicę automatyczną
$args
. Iterujemy przez każdy element, używając zmiennej pomocniczej$o
każdej iteracji, aby zapamiętać, jaki był nasz poprzedni wpis. Używamy indeksowane ciąg wyciągnąć właściwego operatora, sporządzonej wykonując matematyki na niejawnie konwertowane wartości logicznych (na przykład wtedy, gdy poprzedni wpis jest mniejsze,[]
ma wartość1+2*0
tak'*+-'[1]
oznacza, że+
jest zaznaczone).Połączone łańcuchy pozostawia się w rurociągu. My zbierać wszystkie te fragmenty ze sobą (na przykład
3-
,1+
,4-
, itd.) Z-join
eksploatacji, należy uszeregować w ostatecznej liczby (który ostatecznie przekształca się w ciągu) i rury ITiex
(alias dlaInvoke-Expression
i podobne doeval
).źródło
Japt , 25 bajtów
Chciałbym skrócić go, ale nie mogłem sprawić, by wersja bez wersji działała.
Wypróbuj online!
źródło
Japt
-x
,2119 bajtówSpróbuj
Wyjaśnienie
źródło