Sigmafy wyrażenie

20

Dla tych, którzy nie wiedzieli, Sigma jest grecką literą, która jest powszechnie używana w matematyce jako znak sumowania. Biorąc pod uwagę ciąg reprezentujący wyrażenie w zależności od , które oznaczymy , oblicz sumę wyników dla dla każdego . W skrócie, powinieneś znaleźć takie, że:E ( k ) E ( k ) k { 1 , 2 , 3 , 4 , 5 } SkE(k)E(k)k{1,2,3,4,5}S

S=k=15E(k)

Przykład wyrażenia:E(k)=k2+k2


Okular

  • Masz gwarancję:
    • że wyrażenie jest poprawne, więc nie zawiera błędów, i że zależy od wybranej składni (np .: jeśli tylko obsługujesz 2*k, nie będzie 2k)
    • tylko zdefiniowaniu wartości wśród wyników, więc nie ma wartości podoba 1/0, infczy nanpojawi się
  • Możesz założyć, że powyższe wyrażenie pasuje do ograniczeń wybranego języka programowania, więc nie spowoduje to przepełnienia ani żadnych innych błędów związanych z limitami
  • Zamiast tego kmożna wybrać dowolny inny znak ASCII niebiałej spacji
  • Twój program musi obsługiwać następujące operacje:
    • dodawanie ( +, plus(), add(), sum())
    • odejmowanie ( -, minus(), subtract())
    • potęgowanie ( **, ^, pow()lub inne, należy podać) o wsparcie dla negatywnej podstawy i wykładników
    • pierwiastek kwadratowy w formie sqrt(k), k^0.5, k**0.5, lub jakkolwiek inaczej chcesz
    • mnożenie i dzielenie
  • Zgłoszenie może być pełnym programem lub funkcją, jednocześnie wspominając o jego użyciu
  • Dowolne końcowe / białe spacje są dozwolone podczas wysyłania
  • Minimalna precyzja: 2 miejsca po przecinku

Przypadki testowe (z k)

+---------------+--------------+   
|  Input = E(k) |    Output    |
|---------------+--------------|
|2*k            | 30           |
|---------------+--------------|
|sqrt(k)        | 8.38         | (* with minimum decimal precision)
|---------------+--------------|
|k+k/2+k**2     | 77.5         |
|---------------+--------------|
|k**2           | 55           |
+---------------+--------------+

Wynik będzie liczbą bajtów (flag źródłowych + kompilatora). Zwycięskie zgłoszenie o najniższej wartości wygrywa, przy czym należy pamiętać, że te luki są surowo zabronione. Oto pseudo-kod Pythona, aby wszystko było bardziej zrozumiałe.

Pan Xcoder
źródło
Czy możemy wziąć plus()zamiast +? (Te same pytania również dla wszystkich innych operatorów)
Stewie Griffin
@StewieGriffin Tak plus(), add(), sum()i ich ekwiwalenty są dozwolone. Zobacz edycję.
Pan Xcoder,
Nie, możesz wziąć wyrażenie tylko raz, @ComradeSparklePony
Mr. Xcoder
Czy możemy korzystać z notacji postfiksowej? Na przykład, przypadek testowy 3 od góry byłoby coś takiego: N N2/+N2**+.
Towarzysz SparklePony,
To bardzo dziwne, ale jest dozwolone, o ile wyraźnie określisz „format” E(x)@ComradeSparklePony
Mr. Xcoder

Odpowiedzi:

3

Galaretka , 5 bajtów

vЀ5S

Wypróbuj online!

Wprowadź prawidłowy łańcuch monadyczny galaretki (grałem w golfa w swoim linku).

Jak to działa

vЀ5S
 Ѐ     for each of ...
   5        5 (implicitly converted to [1,2,3,4,5]), ...
v           evaluate the input with the above as argument
    S   and find the sum
Leaky Nun
źródło
9

Mathematica, 17 14 13 bajtów

Podziękowania dla Iana Millera za oszczędność 3 bajtów.

Dzięki LegionMammal978 za zapisanie 1 bajtu.

#~NSum~{k,5}&

Dane wejściowe powinny być rzeczywistym wyrażeniem zawierającym knp .:

#~NSum~{k,5}&[Sqrt[k]^3+4]
Martin Ender
źródło
2
Powinienem był zgadywać, że Mathematica ma do tego wbudowane
Xcoder
2
Mathematica zawsze ma wbudowane opcje na sytuacje. : P
całkowicieludzki
Nie potrzebujesz do 1,tego Sum.
Ian Miller
W rzeczywistości można go skrócić doN@#~Sum~{k,5}&
Ian Miller
@IanMiller No jasne, oczywiście. Dziękuję Ci!
Martin Ender
8

Python 3 , 40 37 bajtów

3 bajty dzięki Arnauldowi.

Sztuczki z zakresu Eval \ o /

f=lambda s,k=5:k and eval(s)+f(s,k-1)

Wypróbuj online!

Używa k**0.5zamiast sqrt(k).

Leaky Nun
źródło
Czy można tak szybko odpowiedzieć na pytanie? o_O
Mr. Xcoder
7

JavaScript (ES7), 31 30 bajtów

Wykorzystuje k**0.5do sqrt(k).

f=(e,k=6)=>--k&&f(e,k)+eval(e)

console.log(f("2*k"))
console.log(f("k**0.5"))
console.log(f("k+k/2+k**2"))
console.log(f("k**2"))

Wypróbuj online!

Arnauld
źródło
Znowu ninja! Ładnie wykonane.
Kudłaty
3

05AB1E , 8 7 6 bajtów

6G¹.VO

Wypróbuj online!

Wejście jest w notacji postfix i używa zmiennej n . 05AB1E jest językiem stosowym, więc działa tylko notacja postfiksowa.

Format E(N): wpisz liczby, z którymi chcesz wykonać operację, a następnie napisz znak operacji. Na przykład 3+4byłoby 3 4+, 3*4+2*3byłoby 3 4* 2 3* +. Zauważ też, że to używa tzamiast sqrt, a mzamiast tego **, tak sqrt(N)byłoby Nt.

Wyjaśnienie:

6G¹.VO
6G     For N in range(1,6). This includes [1,2,3,4,5].
  ¹.V  Read and eval input.
     O Sum results.
Towarzyszu SparklePony
źródło
3

Oktawa , 50 46 31 29 bajtów

@(d)eval(["k=1:5;sum(" d 41])

Wypróbuj online!

Potęgowanie jest oznaczone karetką, .^a mnożenie jest oznaczone .*.

To deklaruje anonimową funkcję, która przyjmuje argument d. Ustawia się kna równy zakresowi 1:5i sumuje oszacowany di zwraca go.

Kritixi Lithos
źródło
3

Japt , 10 bajtów

6ÆK=XOxUÃx

Łańcuch wejściowy powinien mieć zmienną jako wielkie litery K. sqrt(K)należy wpisać jako K**0.5.

Wypróbuj online!

Wyjaśnienie

evalzakres nie działał na moją korzyść; musiał przedefiniować zmienną liczącą Xjako globalną K.

6ÆK=XOxUÃx      // implicit: U = input string
6oXYZ{K=XOxU} x // expanded

6oXYZ{      }   // create array [0, 6) and map to function:
      K=X       //   redefine the array value to global K
         OxU    //   eval the input string
              x // sum the resulting array
Justin Mariner
źródło
Hmm, zastanawiam się, czy Oxbezpośrednia transpozycja eval(pomogłaby w tym ...
ETHprodukcje
2

Oktawa, 25 23 bajtów

@(f)sum(inline(f)(1:5))

Wypróbuj online!

Potęgowanie jest oznaczone jako .^

Кирилл Малышев
źródło
2

APL (Dyalog) , 9 bajtów

+/⍎⎕⊣k←⍳5

Wypróbuj online!

Dodawanie to +, odejmowanie -, mnożenie ×, dzielenie to ÷potęgowanie *i wykonywanie jest wykonywane od prawej do lewej, więc używaj ()do grupowania wyrażeń.

Dane wejściowe dotyczą k.

Wyjaśnienie

k←⍳5                    Set k to be equal to the vector 1 2 3 4 5
                       The left argument:
+/                      Sum of
⍎⎕                      The evaluated input (the eval returns an array because k is an array)

A oto rozwiązanie, które zajmuje pociągi jako wejście (jak odpowiedź Jelly) +/(⍎⎕)¨⍳5.

Kritixi Lithos
źródło
2

Common Lisp, 55 bajtów

(defun f(x)#.(read))(print(+(f 1)(f 2)(f 3)(f 4)(f 5)))

Wypróbuj online

Example input - output: 
(* x 2) - 30 
(sqrt x) - 8.382333 
(+ (/ x 2) x (expt x 2)) - 155/2 
(expt x 2) - 55

inna, dłuższa (58 bajtów) wersja - zaczyna się skracać, jeśli sumujesz od 1 do 7.

(print #.`(+,@(mapcar #'(lambda(x)#.(read))'(1 2 3 4 5))))

jeszcze inna i dłuższa metoda ( 65 64 bajtów) - nie definiuje funkcji - po prostu wstawia wyrażenie do pętli. Powinien być krótszy dla większych kwot.

(setf a(read)b 0)(loop as x from 1 to 5 do(incf b #.a))(print b)

źródło
2

Szybki, 202 184 bajtów

import Foundation;func s(i:String){print([1,2,3,4,5].map{NSExpression(format:i.replacingOccurrences(of:"k",with:"\($0).0")).expressionValue(with:nil,context:nil)as!Float}.reduce(0,+))}

Z jakiegoś powodu będzie to działać tylko lokalnie :(.

Oto wyjaśnienie tego, co robię:

import Foundation // Import the Foundation module

func s(i:String){ // Create a function that takes in a String and returns a Float

    print( // Print the result of the follow algorithm to strdout

        [1,2,3,4,5].map{ //Conduct the follow code on numbers 1 - 5

            NSExpression(format: // Create an expression with the following String and return it 

            i.replacingOccurrences(of:"k",with:"\($0).0")) // Create a string replacing all ocurrances of 'k' in `i` with the current Float from the map

           .expressionValue(with:nil,context:nil)as!Float // Get the resulting value of the expression

       }.reduce(0,+) // Add the result of all the expressions together
    )
}

Dzięki @Mr. Xcoder do zapisywania 15 bajtów!

Caleb Kleveter
źródło
2

TI-Basic, 12 bajtów

Σ(expr(Ans),K,1,5

Zadzwoń z "string":prgmNAME, gdzie stringjest dowolne prawidłowe wyrażenie TI-Basic dla K.

pizzapanty184
źródło
Ciekawe rozwiązanie o tej samej długości:Ans->u:sum(u(1,5
lirtosiast
1

Skumulowane , 16 bajtów

5~>[@k#~]2/"!sum

Wypróbuj online!

5~>jest w zakresie od 1 do 5 włącznie. 2/powoduje, że func jest dyadyczny, "jest parami i !jest wykonywany. W ten sposób mapuje się zakres [1, 5]za pomocą danych wejściowych, które są następnie oceniane po zdefiniowaniu elementu zakresu, który ma być k. Następnie wyniki są sumowane.

Conor O'Brien
źródło
1

dc , 31 24 bajtów

?sa1k[lax+Kd1+k5>p]dspxp

Dane wejściowe należy podać w odwrotnej notacji polskiej (znanej również jako notacja postfiksowa) i ująć w nawiasy kwadratowe ( []):

  • Kzastępując kjako parametr;
  • + reprezentujący dodatek;
  • -reprezentujący odejmowanie, _po którym następuje dowolna liczba reprezentująca liczbę ujemną;
  • * reprezentujący mnożenie;
  • / reprezentowanie podziału;
  • ^ reprezentujący potęgowanie;
  • v reprezentujący pierwiastek kwadratowy.

Na przykład -2*k+k+3*k**2+k**0.5-k/2można wprowadzić jako [_2K*K+K2^3*+Kv+K2/-]. Wykorzystuje to należycie fakt, że Kjest to dcpolecenie zwracające bieżącą precyzję (początkowo ustawione na 1). Dlatego do końca zwraca wynik z dokładnością do 6.

Wypróbuj online!

R. Kap
źródło
1

R , 35 bajtów

k=1:5;sum(eval(parse(t=scan(,""))))

Wypróbuj online!

Łącze TIO zawiera również rozwiązanie funkcyjne (38 bajtów)

JayCe
źródło
1

Tcl , 58 bajtów

proc S {f s\ 0} {time {incr k
set s [expr $s+$f]} 5
set s}

Wypróbuj online!

Gdyby działało tylko z liczbami całkowitymi, mógłbym grać w golfa więcej!

sergiol
źródło