Сигмафы выражения

20

Для тех, кто не знал, Сигма - это греческая буква, которая широко используется в математике как знак суммирования. Учитывая строку, представляющую выражение, зависящее от которое мы будем обозначать , вычисляем сумму результатов для для каждого . Вкратце, вы должны найти такой, что:kE(k)E(k)k{1,2,3,4,5}S

S=k=15E(k)

Пример выражения:E(k)=k2+k2


Спекуляции

  • Вам гарантировано:
    • что выражение допустимо, поэтому оно не содержит ошибок и зависит от выбранного синтаксиса (например, если вы поддерживаете 2*k, не будет 2k)
    • иметь только определенные значения среди ваших результатов, поэтому никакие значения, такие как 1/0, infили nanне появятся
  • Вы можете предположить, что приведенное выше выражение соответствует ограничениям языка программирования по вашему выбору, поэтому оно не приведет к переполнению или другим ошибкам, связанным с ограничением.
  • Любой другой непробельный символ ASCII вместо kможет быть выбран
  • Ваша программа должна поддерживать следующие операции:
    • сложение ( +, plus(), add(), sum())
    • вычитание ( -, minus(), subtract())
    • экспоненцирование ( **, ^, pow()или другие, должны быть определены), с поддержкой отрицательных оснований и показателей
    • квадратный корень в виде sqrt(k), k^0.5, k**0.5, или как еще вы хотите
    • умножение и деление
  • Представление может быть либо полной программой, либо функцией, с упоминанием ее использования.
  • Любые конечные / ведущие пробелы допускаются при выводе
  • Минимальная точность: 2 знака после запятой

Тестовые случаи (с 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           |
+---------------+--------------+

Счет будет количеством байтов (флагов источника + компилятора). Побеждает валидная подача с наименьшей оценкой, принимая во внимание, что эти лазейки строго запрещены. Вот псевдокод Python, чтобы прояснить ситуацию.

Мистер Xcoder
источник
Можем ли мы взять plus()вместо +? (Те же вопросы ко всем остальным операторам тоже)
Стьюи Гриффин
@StewieGriffin Да plus(), add(), sum()и эквиваленты допускаются. Смотрите редактирование.
Мистер Кскодер
Нет, вы можете взять это выражение только один раз, @ComradeSparklePony
Mr. Xcoder,
Можем ли мы использовать постфиксную нотацию? Например, тест 3 из верхней части будет что - то вроде: N N2/+N2**+.
Товарищ SparklePony
Это очень странно, но это разрешено, если вы четко E(x)указали «формат» @ComradeSparklePony
Mr. Xcoder

Ответы:

3

Желе , 5 байт

vЀ5S

Попробуйте онлайн!

Введите действительную монадическую цепочку Jelly (я добавил их в свою ссылку).

Как это устроено

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
Дрянная Монахиня
источник
9

Mathematica, 17 14 13 байт

Спасибо Яну Миллеру за сохранение 3 байта.

Спасибо LegionMammal978 за сохранение 1 байта.

#~NSum~{k,5}&

Входные данные должны быть фактическим выражением, содержащим k, например:

#~NSum~{k,5}&[Sqrt[k]^3+4]
Мартин Эндер
источник
2
Я должен был догадаться, что Mathematica имеет встроенные модули для этого
г-н Xcoder
2
Mathematica всегда имеет встроенные функции для ситуаций. : P
полностью человек
Вам не нужно 1,в этом для Sum.
Ян Миллер
На самом деле это может сократить доN@#~Sum~{k,5}&
Ian Miller
@IanMiller Да, конечно. Спасибо!
Мартин Эндер
8

Python 3 , 40 37 байт

3 байта благодаря Арно.

Eval scope tricks \ o /

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

Попробуйте онлайн!

Использует k**0.5вместо sqrt(k).

Дрянная Монахиня
источник
Можно ли так быстро ответить на вопрос? о_О
г-н Xcoder
7

JavaScript (ES7), 31 30 байт

Использует k**0.5для 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"))

Попробуйте онлайн!

Arnauld
источник
Снова ниндзяед! Красиво сделано.
Лохматый
3

05AB1E , 8 7 6 байт

6G¹.VO

Попробуйте онлайн!

Ввод в постфиксной записи и использует переменную N . 05AB1E - это стековый язык, поэтому работает только постфиксная нотация.

Формат E(N): запишите число, с которым вы хотите выполнить операцию, а затем напишите знак операции. Например, 3+4будет 3 4+, 3*4+2*3будет 3 4* 2 3* +. Также обратите внимание, что это использует tвместо sqrt, и mвместо **, так sqrt(N)будет Nt.

Объяснение:

6G¹.VO
6G     For N in range(1,6). This includes [1,2,3,4,5].
  ¹.V  Read and eval input.
     O Sum results.
Товарищ Спаркл Пони
источник
3

Октава , 50 46 31 29 байт

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

Попробуйте онлайн!

Экспонирование обозначается кареткой, .^а умножение - .*.

Это объявляет анонимную функцию, которая принимает в качестве аргумента d. Он устанавливается kравным диапазону, 1:5суммирует оцененное значение dи возвращает его.

Kritixi Lithos
источник
3

Japt , 10 байт

6ÆK=XOxUÃx

Входная строка должна иметь переменную в верхнем регистре K. sqrt(K)должен быть введен как K**0.5.

Попробуйте онлайн!

объяснение

evalсфера не работала в мою пользу; пришлось пересмотреть счетную переменную Xкак глобальную 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
Джастин Маринер
источник
Хм, интересно, поможет ли в этом Oxпрямая трансляция eval(...
ETHproductions
2

APL (Дьялог) , 9 байт

+/⍎⎕⊣k←⍳5

Попробуйте онлайн!

Дополнение есть +, вычитание есть -, умножение есть ×, деление есть ÷возведение в степень, *а выполнение справа налево, поэтому используйте ()для группировки выражений.

Вклад в терминах k.

объяснение

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)

А вот решение , которое принимает поезда в качестве входных данных (например , ответ Jelly) +/(⍎⎕)¨⍳5.

Kritixi Lithos
источник
2

Common Lisp, 55 байт

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

Попробуйте онлайн

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

другая, более длинная (58 байт) версия - становится короче, если вы делаете суммирование от 1 до 7.

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

еще один и более длинный метод ( 65 64 байта) - не определяет функцию - просто вставляет ваше выражение в цикл. Должен стать короче для больших сумм.

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

источник
2

Swift, 202 184 байта

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,+))}

По какой-то причине это будет работать только локально :(.

Вот объяснение того, что я делаю:

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
    )
}

Благодаря @Mr. Xcoder для экономии 15 байт!

Калеб Клеветер
источник
2

TI-Basic, 12 байтов

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

Позвоните "string":prgmNAME, где stringлюбое допустимое выражение TI-Basic K.

pizzapants184
источник
Интересное решение такой же длины:Ans->u:sum(u(1,5
lirtosiast
1

С накоплением , 16 байтов

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

Попробуйте онлайн!

5~>это диапазон от 1 до 5 включительно. 2/делает func диадическим, "парным и !исполняемым. Таким образом, это сопоставляет диапазон [1, 5]с входным значением, которое затем оценивается после определения элемента диапазона k. Затем результаты суммируются.

Конор О'Брайен
источник
1

постоянный ток , 31 24 байта

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

Ввод должен быть представлен в обратной польской записи (также известной как постфиксная запись) и заключен в квадратные скобки ( []) с:

  • Kзамена kв качестве параметра;
  • + представляя сложение;
  • -представляет вычитание и _сопровождается любым числом, представляющим отрицательное число;
  • * представляя умножение;
  • / представляющий отдел;
  • ^ представление возведения в степень;
  • v представляющий квадратный корень.

Например, -2*k+k+3*k**2+k**0.5-k/2будет введен как [_2K*K+K2^3*+Kv+K2/-]. Это использует должное преимущество того факта, что Kэто dcкоманда, которая возвращает текущую точность (изначально установлена ​​в 1). Следовательно, к концу возвращается результат с точностью до 6.

Попробуйте онлайн!

Р. Кап
источник
1

Tcl , 58 байт

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

Попробуйте онлайн!

Если бы это работало только с целыми числами, я мог бы играть в гольф больше!

sergiol
источник