간단한 정수 연산 계산기


28

간단한 정수 연산 스크립트 가능 계산기를 구현하십시오.

개념

누산기는 0에서 시작하여 연산이 수행됩니다. 프로그램이 끝나면 누산기의 값이 출력됩니다.

운영 :

  • +1누산기에 추가
  • -1누산기에서 빼기
  • * 누산기에 2
  • / 누산기를 다음과 같이 나눕니다. 2

샘플 스크립트

입력 ++**--/은 출력을 제공해야합니다 3.

구현 예

def calc(s)
    i = 0
    s.chars.each do |o|
        case o
            when '+'
                i += 1
            when '-'
                i -= 1
            when '*'
                i *= 2
            when '/'
                i /= 2
        end
    end
    return i
end

규칙

  • 이것은 이므로 바이트 단위의 최저 응답이이기는하지만 선택되지는 않습니다.
  • 창의적인 구현이 권장됩니다.
  • 표준 허점은 금지되어 있습니다.
  • stdin 또는 arguments를 통해 프로그램을 가져오고 리턴 값 또는 stdout을 통해 응답을 출력 할 수 있습니다.
  • 즐기세요
  • 정수 나누기이므로 나누기가 잘립니다.
  • 프로그램이를 -/반환합니다 -1.

테스트 사례

*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17 
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342

2
그래서 ... 정수가 아닌 것은 정수가 아닙니다 /.
코너 오브라이언

2
그런 다음이를 명시 적으로 지정해야합니다.
코너 오브라이언

5
무엇을 -/반환 해야 합니까?
Dennis

4
rust-lang의 홈 페이지에 소개 된 코드 스 니펫이이 문제를 해결한다는 것을 알 수는 없습니다.
Zwei

4
더 많은 테스트 사례를 추가하십시오.
Martin Ender

답변:


28

파이썬 2, 48 바이트

i=0
for c in input():exec"i=i%s2&-2"%c
print i/2

합니까 +2, -2, *2, 또는 /2. 이렇게함으로써 +2-2보다는 +1-1최종 출력 요구가 절반으로 할 수 있도록, 우리는 두 배 단위로 노력하고 있습니다. 단, 바닥 구분은 /이제 2로 배수를 내림해야합니다 &-2.


훌륭합니다! 당신이 스스로를 게시 할 경우이의 CJam 포트가 현재 도전 선도 할 것 : 0q{2\~-2&}/2/( 2\~두 번째 피연산자와 evals 연산자를 2, -2&비트 단위 인 AND, 2/되어 최종 부문은 2로. q{...}/입력을 통해 foreach 문이며, 0단지 초기입니다 값).
마틴 청산

당신은 그것을 게시 할 수 있습니다, 나는 CJam을 모른다.
xnor

정말 영리합니다! ES6에 이식이 쉽게 내 대답 능가 할 것
edc65

파이썬을 훌륭하게 사용합니다. 이것으로부터 새로운 것을 배웠습니다.
Jacobr365

12

하스켈, 51 바이트

x#'+'=x+1
x#'-'=x-1
x#'*'=x*2
x#_=div x 2 
foldl(#)0

사용 예 : foldl(#)0 $ "++**--/"-> 3.


12

젤리 , 18 17 바이트

‘

’

:2
Ḥ
O0;ṛĿ/

온라인으로 사용해보십시오!

작동 원리

처음 6 줄은 1 에서 6 까지의 인덱스를 가진 도우미 링크를 정의합니다 . 그들은 증가하고, 아무것도하지 않고, 감소하고, 아무것도하지 않으며, 반으로 (바닥), 두 배로합니다.

주 링크 – O0;ṛĿ/– 입력 문자를 코드 포인트 ( O) 로 변환하고 0 (초기 값)을 코드 포인트 배열 앞에 추가 한 0;다음 생성 된 배열을 다음과 같이 줄입니다.

초기 값은 배열의 첫 번째 요소, 즉 앞에 0 이 붙습니다 . 빠른 ṛĿ반환 값은 배열의 모든 다음 요소에 대해 호출되며 마지막 반환 값은 왼쪽 인수이고 현재 요소는 오른쪽입니다. 올바른 인수 ( )를 검사하고 해당 인덱스와의 링크를 단정적으로 ( Ŀ) 평가 하여 원하는 작업을 적용합니다.


10
이것은 가장 새로운 줄을 가진 젤리 답변처럼 보입니다
Conor O'Brien

10

파이썬 2, 54 바이트

i=0
for c in input():exec"i=i"+c+`~ord(c)%5%3`
print i

입력은 문자열 리터럴로 사용됩니다. ~ord(c)%5%3연산자를 해당하는 오른쪽 피연산자에 매핑합니다.

이전에는 hash(c)%55%3다른 버전의 Python간에 일관된 결과를 얻지 못한 것을 사용했습니다 . 이것은 다른 공식을 탐구하도록 장려했습니다.


작동하지 않는 것 같습니다 ...
파괴 가능한 레몬

55, 3, 65, 4는 파이썬 2에서 가장 짧은 두 번의 해시 모드입니다.
Jonathan Allan

@DestructibleWatermelon가 나를 위해 일합니다 : ideone
Jonathan Allan

필자 hash는 파이썬 버전에 따라 다르다고 생각한다. -ideone은 2.7.10을 사용 [1, 1, 2, 2]하여 4 개의 매핑 을 제공 하는 반면 2.7.12에서는 로컬로 제공 된다[2, 0, 1, 0]
Sp3000

1
그것은 ideone에서는 작동하지만 내 컴퓨터에서는 작동하지 않습니다. 아마도 버전에 따라 다를 수 있으며,이 경우 버전에 주목해야합니다. 편집 : ninja'd : /
Destructible Lemon

10

사일로 , 133 211 바이트

:s
def : lbl G GOTO
readIO
i-46
if i a
i+2
if i b
i+2
if i c
i+1
if i d
G e
:a
G v
:p
a-1
a/2
G o
:v
a+1
if a p
a-1
j=a
j/2
k=j
k*2
k-a
a/2
if k t
G o
:t
a-1
:o
G s
:b
a-1
G s
:c
a+1
G s
:d
a*2
G s
:e
printInt a

연산자의 ASCII 코드를 사용합니다.

테스트 사례와 함께 온라인으로 사용해보십시오 :
-/
++**--/
*///*-*+-+


loadLine 골퍼는 무엇입니까?
Rohan Jhunjhunwala

OP는 명확했다; 0이 아닌 -1-/ 을 반환해야합니다 .
Dennis

@ 데니스 수정. 그래도 많은 바이트를 추가했습니다 : /
betseg

9

튜링 머신-23 개 상태 (684 바이트)

여기에서 시도하십시오 -permalink

0 * * r 0
0 _ . l 1
1 * * l 1
1 _ * l 2
2 * 0 r 3
3 _ * r 3
3 + _ l +
3 - _ l -
3 x _ l x
3 / _ l /
+ _ * l +
+ * * * 4
4 - * l 5
4 _ 1 r 6
4 0 1 l 7
4 1 0 l 4
- _ * l -
- * * * 5
5 - * l 4
5 _ * r 8
5 0 1 l 5
5 1 0 l 7
x * * l x
x 1 0 l 9
x 0 0 l a
9 _ 1 r 6
9 1 1 l 9
9 0 1 l a
a _ _ r 6
a 1 0 l 9
a 0 0 l a
/ _ * l /
/ * * l b
b * * l b
b _ * r c
c 0 0 r d
c 1 0 r e
d * * l 7 
d 0 0 r d
d 1 0 r e
e _ * l 7
e - * l 4
e 0 1 r d
e 1 1 r e
8 * * r 8
8 - _ r 3
8 _ - r 3
7 * * l 7
7 _ * r f
f 0 _ r f
f 1 * r 6
f * _ l g
g * 0 r 6
6 * * r 6
6 _ * r 3
3 . _ l h
h _ * l h
h - _ l i
h * * l halt
i * * l i
i _ - r halt

입력은 Turing 기계 코드의 특수 문자이므로 '*'를 포함하지 않아야합니다. 대신 'x'를 사용하십시오. 답을 이진수로 출력합니다.

명확하지 않은 코드

init2 * * r init2
init2 _ . l init0
init0 * * l init0
init0 _ * l init1
init1 * 0 r readop
readop _ * r readop
readop + _ l +
readop - _ l -
readop x _ l x
readop / _ l /
+ _ * l +
+ * * * inc
inc - * l dec
inc _ 1 r return
inc 0 1 l zero
inc 1 0 l inc
- _ * l -
- * * * dec
dec - * l inc
dec _ * r neg
dec 0 1 l dec
dec 1 0 l zero
x * * l x
x 1 0 l x1
x 0 0 l x0
x1 _ 1 r return
x1 1 1 l x1
x1 0 1 l x0
x0 _ _ r return
x0 1 0 l x1
x0 0 0 l x0
/ _ * l /
/ * * l //
// * * l //
// _ * r div
div 0 0 r div0
div 1 0 r div1
div0 * * l zero 
div0 0 0 r div0
div0 1 0 r div1
div1 _ * l zero
div1 - * l inc
div1 0 1 r div0
div1 1 1 r div1
neg * * r neg
neg - _ r readop
neg _ - r readop
zero * * l zero
zero _ * r zero1
zero1 0 _ r zero1
zero1 1 * r return
zero1 * _ l zero2
zero2 * 0 r return
return * * r return
return _ * r readop
readop . _ l fin
fin _ * l fin
fin - _ l min
fin * * l halt
min * * l min
min _ - r halt

상태 설명 :

초기화 :
이 상태는 각 실행이 시작될 때마다 init2부터 시작하여 한 번 방문됩니다.

  • init2 : 오른쪽 끝까지 이동하여 '.'를 입력하십시오. 그렇게하면 TM이 언제 중지해야하는지 알 수 있습니다. 'init0'으로 변경하십시오.
  • init0 : 헤드가 공백을 읽을 때까지 모든 것을 왼쪽으로 다시 이동하십시오. 그런 다음 하나의 셀을 왼쪽으로 이동하십시오. 'init1'로 변경하십시오.
  • init1 : 0을 넣고 하나의 셀을 오른쪽으로 이동하고 'readop'으로 변경하십시오.

읽기 지침 :
이 상태는 프로그램 전체에서 여러 번 방문됩니다.

  • readop : 연산자 또는 '.'를 읽을 때까지 오른쪽으로 끝까지 이동합니다. 연산자에 부딪 치면 해당 상태 (+,-, x, /)로 변경하십시오. '.'에 도달하면 'fin'상태로 변경하십시오.

  • return : 누적 합계와 연산자 사이의 빈 공간으로 헤드를 반환합니다. 그런 다음 'readop'으로 변경하십시오.

작업 :
이 작업은 실제 더러운 작업을 수행합니다.

  • + : 머리가 공백이 아닌 문자를 읽을 때까지 왼쪽으로 이동하십시오. 이 문자가 '-'이면 왼쪽으로 이동하여 'dec'로 변경하십시오. 그렇지 않으면 'inc'로 변경하십시오.

  • -: '-'가 있으면 'inc'로 변경하고 그렇지 않으면 'dec'로 변경 한 것을 제외하고는 '+'와 유사합니다.

  • inc : 머리 아래의 숫자가 0 (또는 공백)이면 1로 변경하고 '0'으로 변경하십시오. 숫자가 1이면 0으로 변경 한 후 다음 숫자에서 반복하십시오.

  • dec : inc와 비슷하지만 1은 0으로, 0은 1로, 헤드가 공백을 읽는 경우 'neg'로 변경합니다.

  • x, x0, x1 : 숫자 1을 왼쪽으로 비트 시프트합니다. '반품'으로 변경하십시오.

  • /, //, div, div0, div1 : 숫자의 오른쪽 끝까지 이동 한 다음 오른쪽으로 비트 이동합니다. '-'가 있으면 'inc'로 변경하십시오. 음수 반올림을 시뮬레이션합니다. 그렇지 않으면 '0'으로 변경하십시오.

  • neg : 숫자 뒤에 '-'를 놓고 'readop'으로 변경하십시오.

  • zero, zero1, zero2 : 선행 0을 제거하고 'readop'으로 변경

정리 : 출력을 표시 가능하게 만듭니다.

  • 핀, 최소 : 필요한 경우 숫자 앞에 '-'를 이동하십시오. 정지.

1
이 코드를 읽는 것이 매우 멋 졌다고 생각했습니다. 하루를 밝게 해주셔서 감사합니다.
Jacobr365

8

펄 6 , 53  52 바이트

{([Ro] %(<+ - * />Z=>*+1,*-1,* *2,*div 2){.comb})(0)}

{[Ro](%(<+ - * />Z=>*+1,*-1,*×2,*div 2){.comb})(0)}

설명:

# bare block lambda that has one implicit parameter 「$_」
{
  (
    # reduce the code refs using ring operator 「∘」 in reverse 「R」
    [R[o]]

      # produce a hash from:
      %(

        # list of pairs of "operator" to code ref
        # ( similar to 「'+' => { $^a + 1 }」 )

          # keys
          < + - * / >

        # keys and values joined using infix zip operator 「Z」
        # combined with the infix Pair constructor operator 「=>」
        Z[=>]

          # values (Whatever lambdas)
          * + 1,
          * - 1,
          * × 2, # same as 「* * 2」
          * div 2,

      ){

        # split the block's argument into chars
        # and use them as keys to the hash
        # which will result in a list of code refs
        .comb

      }

  # call composed code ref with 0
  )(0)
}

용법:

my $input = '++**--/'
my $output = {[Ro](%(<+ - * />Z=>*+1,*-1,*×2,*div 2){.comb})(0)}.( $input );
say $output; # 3
say $output.^name; # Int


6

05AB1E , 20 바이트

-bug 를 수정 한 Enigma 에게 감사드립니다 -/!

정수 나누기가 아닌 경우 16 바이트의 경우 : Î"+-*/""><·;"‡.V.

Î…+-*"><·"‡'/"2÷":.V

설명:

Î                      # Push 0, which is our starting variable, and input
 …+-*                  # Push the string "+-*"
     "><·"             # Push the string "><·"
          ‡            # Transliterate. The following changes:
                           "+" -> ">"
                           "-" -> "<"
                           "*" -> "·"
           '/"2÷":     # Replace "/" by "2÷"
                  .V   # Evaluate the code as 05AB1E code...
                           '>' is increment by 1
                           '<' is decrement by 1
                           '·' is multiply by 2
                           '2÷' is integer divide by two
                       # Implicitly output the result

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


OP는 명확했다; 0이 아닌 -1-/ 을 반환해야합니다 .
Dennis

음수 나누기 문제 Î…+-*"><·"‡'/"2÷":.V는 동일한 바이트 수로 해결할 수 있습니다 .
Emigna

@Dennis 문제를 해결했습니다.
Adnan

@Emigna Thanks :)
Adnan

5

자바 스크립트 ES6, 80 68 바이트

k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}‌​[o],0)

Neil 덕분에 무려 12 바이트를 절약했습니다!


를 제거 "c"+하고 쓴 경우 두 번째 대답은 더 읽기 "c+1 c-1 c*2 c/2|0".split
Neil

첫 번째 대답은 왜 쓰지 않습니까? 아니면 o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]을 사용하여 추가 바이트를 절약 할 수 있다고 생각합니다 o=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o].
Neil

k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)아직도 더 짧은 운동을 할 수 있지만, 나는 카운트를 잃었습니다 ...
Neil

@ 닐 아, 그래, 나는 이것에 대해 잊었다
코너 오브라이언

1
}와 사이의 너비가 0 인 문자 [o]이므로 실제로는 길이가 66 바이트에 불과합니다. 또한, OP는 명확했다; 0이 아닌 -1-/ 을 반환해야합니다 .
Dennis

5

루비, 48 44 42 + 1 = 43 바이트

-n플래그의 경우 +1 바이트 STDIN에서 입력을받습니다.

i=0
gsub(/./){i=i.send$&,"+-"[$&]?1:2}
p i

ideone에서 참조하십시오 ( $_ideone은 명령 줄 플래그를 사용 하지 않기 때문에 사용 ) : http://ideone.com/3udQ3H



4

파이썬 2, 58 56 바이트

@Lynn 덕분에 -2 바이트

r=0
for c in input():exec'r=r'+c+`2-ord(c)%11%3`
print r

문자의 서수는 +-*/있습니다 43,45,42,47이이 모듈 (11) 10,1,9,3모듈로 사람들은 3 1,1,0,0, 2 적은 사람들은되는 1,1,2,2(가) 우리가 각 작업에 필요한 금액을 제공 : r=r+1, r=r-1, r=r*2, 및r=r/2


너무 이른:

r=0
for c in input():exec'r=r'+c+`(ord(c)%5==2)+1`
print r

어때요 2-ord(c)%11%3?
Lynn

@Lynn 글쎄 당신과 함께라면 괜찮을까요? (그러나 실제로 게시 할 수있는 변경으로 충분하다고 생각합니다)
Jonathan Allan

2
:) ----
Lynn

4

Mathematica, 83 73 70 바이트

@MartinEnder 로 인해 10 바이트가 저장되었습니다 .

(#/*##2&@@#/.Thread[{"+","-","*","/"}->{#+1&,#-1&,2#&,⌊#/2⌋&}])@0&

익명의 기능. 문자 목록을 입력으로 취하고 숫자를 출력으로 리턴합니다. 골프 제안을 환영합니다.


4

사일로 , 175 164 바이트

loadLine
a=256
o=get a
lbla
a+1
o-42
p=o
p-1
p/p
p-1
r-p
s=o
s-3
s/s
s-1
r+s
m=o
m/m
m-2
m|
r*m
t=r
t%2
d=o
d-5
d/d
d-1
t*d
d-1
d|
r-t
r/d
o=get a
if o a
printInt r

온라인으로 사용해보십시오!

Sane 입력 방법. 올바른 정수 나누기 (-무한 방향으로 반올림)


4

C #, 87 81 바이트

int f(string s){int i=0;foreach(var c in s)i=c<43?i*2:c<46?i+44-c:i>>1;return i;}

언 골프 드 :

int f(string s)
{
    int i = 0;

    foreach (var c in s)
        i = c < 43 ? i * 2
          : c < 46 ? i + 44 - c
          : i >> 1;

    return i;
}

입력이 유효한 것으로 가정합니다. 정규 분할은 항상 0으로 반올림되고 비트 이동은 항상 반올림하기 때문에 2로 나누기는 1 비트 오른쪽으로 이동하여 수행됩니다. 증가 및 감소를위한 ASCII 코드의 한 거리의 편리한 사용을 +하고 -.


Linq의 새로운 C # 6 구문 및 집계 방법에 대한 사랑이 있습니까? int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);(65 bytes)
Cyril Gandon

@CyrilGandon은 "using System.Linq;"을 포함해야한다는 것을 알고있는 한 19보다 길어지고 84 바이트에 넣습니다. 내가하지 않은 이유입니다.
Scepheo

4

자바 스크립트 (ES6), 57 바이트 (배열) / 60 바이트 (정수)

모든 중간 결과의 배열을 반환합니다.

o=>[...o].map(c=>x=[x>>1,x+1,x*2,x-1][eval(2+c+3)&3],x=0)

예를 들어에 대한 출력 "++**--/"[1, 2, 4, 8, 7, 6, 3] .

최종 결과 만 반환 :

o=>[...o].reduce((x,c)=>[x>>1,x+1,x*2,x-1][eval(2+c+3)&3],0)

작동 원리

두 솔루션은 동일한 아이디어에 기반을두고있다 : 완벽한 해시 함수를 사용하여 eval(2+c+3)&3다른 운전자 문자 매핑 c에를 [0, 3].

 operator | eval(2+c+3)  | eval(2+c+3)&3
----------+--------------+---------------
    +     |  2+3 = 5     |    5 & 3 = 1
    -     |  2-3 = -1    |   -1 & 3 = 3
    *     |  2*3 = 6     |    6 & 3 = 2
    /     |  2/3 ~= 0.67 | 0.67 & 3 = 0

3

자바 스크립트 (ES6), 57

a=>[...a].map(c=>a=c<'+'?a<<1:c<'-'?-~a:c<'/'?~-a:a>>1)|a

참고 : 누산기의 초기 값은 프로그램 문자열이며 비트 연산 (~, >>, <<, |)을 사용하여 처음 사용시 0으로 변환됩니다.

참고로 @xnor의 영리한 답변은 40 점을 자바 스크립트로 포팅했습니다.

a=>[...a].map(c=>a=eval(~~a+c+2))&&a>>1

(이것이 마음에 드시면 투표하십시오)

테스트

f=a=>[...a].map(c=>a=c<'+'?a<<1:c<'-'?-~a:c<'/'?~-a:a>>1)|a

function update() {
  O.textContent = f(I.value);
}

update()
<input value='++**--/' id=I oninput='update()'><pre id=O></pre>


3

자바, 77 바이트

int f(String s){return s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);}

Java 8 스트림을 사용합니다.


1
좋은 답변, 사이트에 오신 것을 환영합니다! Java에 대해 아무것도 모르지만 2 바이트로 변경 r >> 1하여 r>>1저장할 수 있습니까?
DJMcMayhem

당신은 절대적으로 맞습니다, @DJMcMayhem
primodemus

1
굉장하고 기쁘다. 참고로 77 바이트를 세고 있습니다. 바이트 수에 개행 문자를 포함 시켰습니까? 필요하지 않기 때문에 한 바이트를 더 가져올 수 있습니다.
DJMcMayhem

@DJMcMayhem 다시 수정, 분명히 wc는 널 종료 바이트 또는 무언가를 계산합니다 ...
primodemus

1
java8을 사용할 때 람다를 사용하여 함수를 정의하지 않는 이유는 s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);56 바이트입니다.
user902383

3

GNU sed, 65 59 57 바이트

편집 : Toby Speight 의 의견 덕분에 2 바이트 단축

s/[+-]/1&/g
s/*/2&/g
s:/:d0>@2&:g
s/.*/dc -e"0[1-]s@&p"/e

운영:

sed -f simple_calculator.sed <<< "*///*-*+-+"

산출:

-1

sed스크립트의 입력 준비 dc후자의 입력 받아, 마지막에 쉘 호출을 역 폴란드어 표기법을 . 나누기에서 숫자가 음수 ( d0>)이면 [1-]레지스터에 저장된 감소 명령 @이 호출됩니다. 변환 예 : + - * /-> 1+ 1- 2* d0>@2/.


공백이없고 [1-]패턴 과 일치하는 파일이없는 경우 dc에 대한 인수 주위에 따옴표가 필요하지 않습니다 .
Toby Speight

내 마음 속에서 @TobySpeight 나는의 의미 전환 s과를 S. 레지스트리의 스택을 대체하지 않고 잊어 버렸습니다 /. 매번 사용했기 때문에 원하는 것과 반대되는 효과가 있습니다. 따옴표는 /문자열이 파일 경로로 해석되도록 기호가 있기 때문에 여전히 필요 합니다 -e. :. 뒤에 공백을 제거하여 1 바이트 더 면도했습니다 .
seshoumara

1
dc는 -e파일 이름으로 인수를 /해석 하지 않으므로 따옴표가 필요하지 않습니다 -시도하십시오! 코드 골프가 현재 작업 디렉토리에 01s@또는로 시작하는 파일을 포함하지 않아야한다고 생각하는 것이 합리적이라고 생각합니다 0-s@.
Toby Speight

@TobySpeight 당신에 대한 권리했다 -e관한 /, 내가 지금보고 그러나 따옴표는 여전히 필요합니다. 은 >내가이 오류를 가지고 있기 때문에, 내가 생각 리디렉션 연산자로 쉘에 의해 직접 해석된다 :cannot create @2/d0: Directory nonexistent
seshoumara

아, 그렇습니다 >. 결국 따옴표가 필요합니다. 오도 ​​한 것에 대한 사과! 백 슬래시를 추가하는 것은 하나의 문자처럼 보이지만 s///대체 문자를 두 배로
늘려야

3

PHP, 75 바이트

이것은 수정 된 버전의 Jörg Hülsermann의 답변을 사용합니다.

eval(preg_replace('~.~','$s=($s\0(2-ord("\0")%11%3))|0;',$argv[1]));echo$s;

간단한 정규 표현식 ( ~.~)을 사용하여 문자열 대체에 크게 의존합니다 .

변수 $s는 각 문자에 대한 새로운 값으로 재 할당됩니다. 결국 결과를 출력합니다.


참고 : 이것은 -r플래그를 사용하여 실행됩니다 .


여기에서보십시오 :

또는 http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa에서 시도 하십시오.

차이점 :

  • 대신 echo$s에을 사용하고 sprintf($s)있습니다. 둘 다 숫자에 대해 동일한 동작을 수행합니다. 이것은 단지 테스트를위한 것이므로 괜찮습니다.
  • 전달 된 인수가없는 경우 ++*+첫 번째 인수로 전달 된 것처럼 실행됩니다 5.

예이! e수정이 돌아왔다! : D
Titus

@Titus 나는 그것을 얻지 못한다. 조금 더 자세히 설명해 주시겠습니까?
Ismael Miguel

버전 7 이전의 PHP에는 패턴 수정자가e 있었는데,이 패턴 은 대체되어 preg_replace_callback악용 될 수 있습니다.
Titus

@Titus 그 patern 수정자는 출력이 실제 PHP 코드임을 알리고 구문을 올바르게 유지하기 위해 사용되었습니다. 여기서는 사용하지 않지만 구문에 관계없이 모든 단일 문자를 실행할 코드 조각으로 바꿉니다. 입력이 잘못되면 심각한 보안 문제가 발생합니다.
Ismael Miguel

알아. 그러나 그것은 비슷합니다.
Titus

2

배치, 61 바이트

@set n=
@for %%a in (%*)do @set/an=n%%a2^&-2
@cmd/cset/an/2

@ xnor의 xcellent Python 답변의 번역.



2

PHP, 104 (102) 82 바이트

eval이 포함 된 첫 번째 버전 :

$i=0;while($c<9999)eval('$i'.['+'=>'++','-'=>'--','*'=>'*=2','/'=>'>>=1'][$argv[1]{$c++}].';');echo$i;

삼항 연산자가있는 두 번째 버전 :

while($o=ord($argv[1]{$c++}))$i=$o<43?$i*2:($o<44?$i+1:($o<46?$i-1:$i>>1));echo$i;

명령 행에서 입력 문자열을 첫 번째 인수로 사용합니다.

이 "만"은 10,000 자보다 짧은 입력 문자열에 효과적입니다. 안타깝게도 모든 테스트 사례로 테스트했지만 처음에는 초기화를 저장할 수 없습니다.두 번째 버전은 모든 길이의 문자열과 초기화없이 작동합니다. :-)

주요 요소는 $i산술 연산 맵을 기반으로 조작하는 eval 함수이며 , 나누기를 제외하고는 매우 간단합니다. 사용하는 경우 PHP는 float를 반환 /하고 intdiv우리가 할 수 있도록, 너무 많은 바이트를하다 오른쪽 변화를 .

업데이트

  1. 정수 나누기 로 단축 $i=$i>>1하여 2 바이트를 절약했습니다 $i>>=1.
  2. 삼항 연산자에 찬성하여 평가를 계산하십시오.

2

파이썬 3, 98 66 60 바이트

감사합니다 Tukkax!

다른 답변만큼 골프는 아니지만 표절 없이는 경쟁 할 수 없습니다.

i=0
for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4]
print(i)

또한 재귀 람다 솔루션도 있습니다.

73 67 바이트 (개선!)

s=lambda x,z=0:s(x[1:],z+[1,-z//2,-1,z][ord(x[0])%23%4])if x else z

재귀 솔루션의 일부를 절차 버전에 적용하여 : 60 바이트 : i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i). (물론 올바르게 포맷되지 않았습니다). 또한 Python3을 사용하고 있다고 언급해야한다고 생각합니다. Python2에서는로 input()평가됩니다 int(raw_input()).
Yytsi

@TuukkaX는 z = 0에서 작동하지 않습니다 ( +-1 을 수행함 )
Destructible Lemon

오 그래, 내 실수
Yytsi

1
Python3 please라는 제목을 추가하십시오.
Yytsi

2

R, 201 바이트

골프

p=.Primitive;"-"="+"=function(x)p("+")(x,1);body(`-`)[[1]]=p("-");"*"="/"=function(x)p("*")(x,2);body(`/`)[[1]]=p("%/%");Reduce(function(f, ...)f(...),rev(mget(strsplit(scan(stdin(),""),"")[[1]])),0,T)

댓글

p = .Primitive                       # Redefine
"-" = "+" = function(x)p("+")(x,1)   # Define - and +
body(`-`)[[1]] = p("-")              # Change the body, what we do to save a byte
"*" = "/" = function(x)p("*")(x,2)   # Same as above
body(`/`)[[1]] = p("%/%")            # Same as above
Reduce(function(f, ...)f(...),       # Function wrapper to evaluate list of func.  
  rev(mget(strsplit(scan(stdin(),""),"")[[1]])), # Strsplit input into list of functions
  init = 0,                                      # Starting Arg = 1
  right = T)                                     # Right to left = True 

전략은 +, -, %운영자 를 개선하는 것 입니다. 문자열을 분할 한 다음 문자열을 긴 함수 목록으로 구문 분석하여 Reduce()'s누적 기에 공급 합니다.

더 이상 골프를 칠 수 없었습니다. 누군가 b=body<-가 일할 수 있다면 몇 바이트가 절약 될 수 있습니다 (모든 기능을 bafter로 재정의하십시오 "-"="+"="/"="*"). 처음에는 평가를 대체하고 구문 분석하려고 시도했지만 연산 순서와 괄호는 무서웠습니다.


이 년 후,하지만 난 당신을 약간을 교환하여 10 바이트 아래를 얻을 수 있었다 - 당신 사이의 공간을 제거하여 8 바이트를 놓을 수 f, ...의 정의에 Reduce기능을 제거하기 stdin()scan난 그냥 순진 시도 함수를 조금 다르게 정의하여 두 바이트를 더 줄였습니다. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/…
Giuseppe

1

Lex + C, 78 , 74 , 73 바이트

첫 번째 문자는 공백입니다.

 c;F(){yylex(c=0);return c;}
%%
\+ c++;
- c--;
\* c*=2;
\/ c=floor(c/2.);

에서 읽고 stdin결과를 반환합니다.

로 컴파일하고 lex golfed.l && cc lex.yy.c main.c -lm -lfl메인 테스트를 수행하십시오.

int main() { printf("%d\n", F()); }

1

자바 스크립트 (ES5), 127 바이트

function(b){for(a=c=0;a<b.length;++a)switch(b[a]){case"+":++c;break;case"-":--c;break;case"*":c*=2;break;case"/":c/=2}return c}

언 골프 드 :

function c(a){
  c=0;
  for(var i=0;i<a.length;++i){
    switch(a[i]){
      case "+":++c;break;
      case "-":--c;break;
      case "*":c*=2;break;
      case "/":c/=2;break;
    }
  }
  return c;
}

1

Pyth, 23 바이트

FNQ=Z.v%".&%sZ2_2"N;/Z2

문자열로 입력을 받아 결과를 인쇄하는 전체 프로그램입니다.

이것은 @xnor의 Python answer 포트입니다 .

온라인으로 사용해보십시오

작동 원리

FNQ=Z.v%".&%sZ2_2"N;/Z2   Program. Input: Q. Z initialised as 0
FNQ                       For. For N in Q:
        ".&%sZ2_2"         String. Literal string ".&%sZ2_2"
       %          N        String format. Replace %s with the current operator N
           %sZ2            Operator. Yield Z*2, Z//2, Z+2, Z-2 as appropriate
         .&    _2          Bitwise and. Result of above & -2
     .v                    Evaluate. Yield the result of the expression
   =Z                      Assignment. Assign result of above to Z
                   ;      End. End for loop
                    /Z2   Integer division. Yield Z//2
                          Print. Print the above implicitly 

1
파이썬을 Pyth로 변환하는 것은 대부분 나쁜 생각입니다. u@[yGhG0tG0/G2)CHQ019 바이트
Jakube

@Jakube Thanks-Pyth를 처음 접했으므로 조언을 부탁드립니다. 다른 접근법이므로 별도의 답변으로 자유롭게 게시하십시오.
TheBikingViking

1

PHP, 79 바이트

<?$i=0;switch($_POST['a']){case"+":$i+1;case"-":$i-1;case"/":$i/2;case"*":$i*2}

2
헤더에 바이트 수를 포함시키고, 공백을 제거하고 1 글자 변수 이름을 사용하십시오.
TuxCrafting

이것도 골프입니까?! :-D
YetiCGN

@ TùxCräftîñg 내가 해냈어.
위니 푸우

당신은 나누고 1; 당신은 나누고 곱해야합니다2
TuxCrafting

@ TùxCräftîñg 내가 해냈어.
위니 더 푸우
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.