숫자와 연산자의 목록으로 계산기 언어에서 의미에 해당합니다. 0에서 시작하는

당신의 작업은 정수 또는 연산자 인 인수 목록을 가져 와서 다음과 같이 구문 분석합니다.

  1. 현재 연산자가 +로 시작합니다.

  2. 운영자를 찾을 때마다 현재 운영자가 운영자로 변경됩니다.

  3. 가능한 연산자는 “+”, “-“, “*”, “/”및 “%”이며 C와 대부분의 언어에서 의미에 해당합니다.

  4. 0에서 시작하는 실행중인 솔루션이 있습니다.

  5. 정수가 발견 될 때마다 솔루션은 연산자에 따라 숫자로 수정됩니다. 예를 들어 연산자가 “/”이면 솔루션은 숫자로 나뉩니다.

  6. 연산 결과 혼합 된 숫자 (즉, 10 진수)가 나오면 정수로 다시 바닥되어야합니다 (즉, 10 진수는 잘 려야합니다).

  7. 최종 솔루션을 출력하십시오.

예를 들면 다음과 같습니다.

인수 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14결과는 다음과 같습니다.

  5 8  25 * 9   6    2    - 104  / 4    7      + 6 % 14
0 5 13 38   342 2052 4104   4000   1000 142   148    8  -> 8

입력은 명령 행 또는 함수 인수 또는 해당 언어에 해당합니다.

최단 코드 승리!



답변

Pyth- 24 23 22 20 바이트

@issacg 덕분에 2 바이트가 절약되고 @orlp 덕분에 1 바이트가 절약되었습니다!

문자열 대 int를 감지하기 위해 recase에 0있는지 점검 하고 base case와 함께 reduce를 사용합니다 '.

u.xsv++GbH&=bHG+\+QZ

보안상의 이유로 온라인으로 비활성화 된 전체 평가를 사용하기 때문에 온라인으로 작동하지 않습니다. stdin에서 다음과 같은 목록으로 입력을받습니다 5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6.


답변

자바 스크립트 (ES6) 53

배열을 입력으로받는 함수입니다.

Firefox에서 스 니펫을 실행하여 테스트하십시오.

f=a=>a.map(t=>t<'0'?o=t:v=eval(v+o+t)|0,v=0,o='+')&&v

// TEST
out=x=>O.innerHTML=x;

input = [5,8,25,"*",9,6,2,"-",104,"/",4,7,"+",6,"%",14];
out(input.join(' ')+' -> '+f(input));

function go() {
  i=I.value.split(/ +/),out(I.value+' -> '+f(i))
}  
<pre id=O></pre>
Your test:<input id=I><button onclick='go()'>GO</button>


답변

줄리아, 85 83 바이트

s->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):(p=i)end;o)

이것은 문자열을 입력으로 받아들이고 정수를 반환하는 명명되지 않은 함수를 만듭니다.

언 골프 드 :

function f(s::String)
    # Assign the starting output value o and operator p
    o = 0
    p = "+"

    # Split the input string into an array on spaces
    for i = split(s)
        if isdigit(i)
            # Assign o using string interpolation
            o = eval(parse("ifloor($o $p $i)"))
        else
            # Assign p to the new operator
            p = i
        end
    end
end

Glen O 덕분에 문제가 해결되고 2 바이트가 절약되었습니다.


답변

elisp, 101 바이트

인용 된 목록으로 인수가 전달 된 경우 : 예 (c '(5 5 * 10))

    (defun c(a)(let((f 0)(o '+))(dolist(x a)(if(not(integerp x))(setf o x)(setq f (eval(list o f x)))))f))

줄 바꿈이있는 버전 :

    (defun c (a)
      (let ((f 0)
            (o '+))
        (dolist (x a)
          (if (not (integerp x))
              (setf o x)
            (setq f (eval (list o f x)))))
        f))


답변

CJam, 24 바이트

0'+ea+{_A,s&O{:O;}?S}%s~

입력을 명령 줄 인수로 읽는 전체 프로그램입니다.

온라인 코드를 시도하기 CJam 인터프리터 (명령 줄 인수를 지원하지 않음), 대체 ealS/시뮬레이션 STDIN에서 읽을 수 있습니다.

작동 원리

0'+                       Push a 0 and the character '+'.
   ea                     Push the array of command-line arguments.
     +                    Prepend the character to the array.
      {             }%    For each element:
       _                    Push a copy.
        A,s                 Push "0123456789".
           &                Intersect the copy with the string of digits.
             {   }?         If the intersection is non-empty:
            O                 The element is a number. Push O.
              :O;             The element is an operator. Save it in O.
                   S        Push a space.
                      s~  Flatten the array of strings and evaluate it.


답변

자바 스크립트, 85 바이트

r=0;o="+";prompt().split(" ").forEach(t=>+t+1?r=parseInt(eval(r+o+ +t)):o=t);alert(r)


답변

루아, 142 바이트

function f(s)o="+"r=0 for c in s:gmatch"%S+" do if tonumber(c)~=nil then loadstring("r=r"..o..c)() else o=c end r=math.floor(r)end print(r)end

언 골프 드 :

function f(s)
    o="+" --original operator
    r=0 --return value
    for c in s:gmatch"%S+" do --split by spaces
        if tonumber(c)~=nil then --check if the current character is a number
            loadstring("r=r"..o..c)() --appends the current operator and current character ex "r=r+5" and then evaluates as another Lua script
        else
            o=c --if the character is not a number, it is the new operator
        end
        r=math.floor(r) --floor after each operation
    end
    print(r) --print the result
end