전 방향 계산기 만들기


16

영감. 역.

주어진 옴니 픽스 표현식을 평가하십시오.

Omnifix는 일반적인 수학의 접두사 표기법과 비슷하지만 인수를 둘러싼 각 기호의 추가 사본이 있습니다. 외부 기호는 괄호 대신 사용되므로 추가 괄호가 필요하지 않습니다.

귀하 -0-n-의 언어에 알맞은 범위 내에서 덧셈, 뺄셈, 곱셈, 나눗셈 및 양의 실수 (쓰기 가능 )를 지원해야합니다.

플러스와 마이너스해야 +하고 -,하지만 당신은 사용할 수 있습니다 *또는 ×시간과 /또는 ÷분할에 대해. 요청시 다른 합리적인 기호도 허용됩니다.

설명 및 추가 기능 (추가 작업, 음수, 문자열 등)에 대한 브라우니 포인트 답변에 이러한 기능이없는 경우에도 가능한 방법을 보여주십시오.

가능한 경우 솔루션을 테스트 할 수있는 링크를 제공하십시오.

명확성을 위해 아래 설명에서는 ¯음수를 나타 내기 위해 높은 빼기 ( )를 사용 합니다. 합리적인 형식을 사용하여 음수를 반환 할 수 있습니다.

-5-2-3

+2+×3×2×+8 ( +2+×3×2×++2+6+8)

-14--3-1--12 ( -4--3-1---14-2-12)

+2.1+×3.5×2.2×+9.8 ( +2.1+×3.5×2.2×++2.1+7.7+9.8)

×3×÷-0-6-÷2÷×-9 ( ×3×÷-0-6-÷2÷××3×÷¯6÷2÷××3ׯ3ׯ9)

÷4÷-3-÷1÷2÷-÷1.6 ( ÷4÷-3-÷1÷2÷-÷÷4÷-3-0.5-÷÷4÷2.5÷1.6)


1
The explanations below use high minus (`¯`) to indicate negative numbers.당신은 확실히 APL을 좋아합니다.
Outgolfer Erik

@EriktheOutgolfer 당신은 더 나은 제안이 있습니까? 또한 TI-BASIC은 높은 마이너스를 사용합니다.
Adám

-s와 -s를 혼동 할 수있는 반면 ¯s 와 s를 혼동 할 수 없기 때문에 실제로는 아닙니다 -.
Outgolfer Erik

바, 난 진짜 숫자 요구 사항을 발견했습니다. 내 290 바이트 정수 산술 레티 나 솔루션을위한 많은 것들
Neil

@ 닐 왜 답으로 게시하지 않습니까?
Adám

답변:


4

C # (. NET 코어) , 198979788 바이트

float O(string s){try{return float.Parse(s);}catch{var f=s[0];int i=s.IndexOf(f,1);float a=O(s.Substring(1,i-1)),b=O(s.Substring(i+1,s.Length-i-2));return f<43?a*b:f<44?a+b:f<46?a-b:a/b;}}

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

사용 */.

재귀 함수 먼저 입력 문자열을로 해석합니다 float. 실패하면, 첫 번째와 두 번째 피연산자를 인수로 재귀 적으로 전달한 다음 결과에 대해 선택된 조작을 수행합니다.

  • Mr. Xcoder 덕분에 1 바이트가 절약되었습니다!
  • TheLethalCoder 덕분에 9 바이트가 절약되었습니다!

IndefOf(f, 1)할 수 있습니다IndexOf(f,1)
씨 Xcoder에게

1
사용 float당신이 그들 아마 그들을 단축 할 수있을 때의 대신, 숯불 코드를 사용 >하고 <장소의 몇.
TheLethalCoder

바이트를로 변경 i+1,s.Length-i-2하여 골프를 칠 수 있습니다 ++i,s.Length+~i.
Kevin Cruijssen

4

파이썬 3 159 158 152 144 136 135 132 바이트

def t(i,a=1):
 while'-'<l[i]!='/':i+=1;a=0
 if a:l[i]='(';i=t(t(i+1));l[i-1]=')'
 return-~i
*l,=input()
t(0)
print(eval(''.join(l)))

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

음수는 허용하지 않지만 (물론 -0-5-작동 하지만 ) 파이썬 연산자가 필요합니다.


TIO 링크를 추가 할 수 있습니까?
Adám

1
while~-(l[i]in'+-*/'):i+=1;a=1그리고 *l,=input()152 바이트
Felipe Nardi Batista

1
모든 테스트 사례 : link
Felipe Nardi Batista


1
if a:l[i]='(';i=t(t(i+1));l[i-1]=')'와 함께 return-~i135 바이트 : P
Felipe Nardi Batista

3

망막 , 290 (287) 286 바이트

\d+
¦$&$*
¯¦
¯
{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-
-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-
(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3
צ×[¯¦]1*×|¯¯¦?
¦
¯¦|¦¯
¯
+`-((¯|¦)1*)(1*)-\2\3-
$1
-([¯¦]1*)-[¯¦](1*)-
$1$2
צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+
}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*
((¯)|¦)(1*)
$2$.3

온라인으로 사용해보십시오! 참고 : 정수 산술 만 가능하므로 일부 테스트 사례가 제거되었습니다. ¯접두사를 사용하여 음수를 허용하고 반환 합니다. 편집 : @Cowsquack 덕분에 3 4 바이트가 절약되었습니다. 설명:

\d+
¦$&$*

0을 처리하는 방법이 필요했기 때문에 ¦양수 접두사로 사용 합니다. 그런 다음 숫자는 단항으로 변환됩니다.

¯¦
¯

그러나 음수는 ¯ 접두사 합니다.

{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-

인용 + 은 못 생겨서 덧셈을 뺄셈으로 바꿉니다.

-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-

빼기의 LHS의 절대 값이 RHS보다 작 으면, 그것들을 바꾸고 양쪽을 부정하십시오.

(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3

또한 곱셈이나 나눗셈의 LHS가 음수이면 양변을 모두 부정합니다.

צ×[¯¦]1*×|¯¯¦?
¦

또한 곱셈의 LHS가 0이면 결과는 0입니다. 또한 두 개의 마이너스가 더해집니다.

¯¦|¦¯
¯

그러나 빼기와 더하기 (또는 그 반대로)는 빼기를 만듭니다.

+`-((¯|¦)1*)(1*)-\2\3-
$1

같은 부호의 두 숫자를 뺍니다. 그러한 뺄셈이 남지 않을 때까지 이것을 반복하십시오.

-([¯¦]1*)-[¯¦](1*)-
$1$2

여전히 빼기가있는 경우 부호가 달라야하므로 숫자를 더합니다. (그러나 이것은 동일한 부호의 두 숫자를 다시 빼는 것을 나타낼 수 있으므로 한 번만 수행하십시오.)

צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+

덧셈을 반복하여 곱셈을 수행합니다.

}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*

정수 나누기를 수행하십시오. 위 단계 중 하나가 표현식을 단순화 했으므로 작업이 없을 때까지 루프백합니다.

((¯)|¦)(1*)
$2$.3

십진수로 다시 변환합니다.


와우, 그것은 – 서사시입니다. PPCG에서 가장 큰 Retina 포스트? 그러나 일반적으로 QuadR과 Retina 솔루션은 서로 비슷합니다. 영감을 줄 수 있습니까?
Adám

이 줄 +`-(([¯¦])1*)(1*)-\2\3-에서 다음과 같이 [¯¦]될 수 있습니다¯|¦
Kritixi Lithos

@Cowsquack는 실제로 세 번 발생합니다. 감사합니다!
Neil

당신이 놓친 것이 있습니다 ([×÷]);)
Kritixi Lithos

1
... 그렇지 않으면 내가 4를 통과해야합니다, 더 나은 다른 하나를 찾을 거라고 @Cowsquack

2

PHP , 116 (114) 109 바이트

마틴 엔더 덕분에 -5

for($s=$argv[$o=1];$o!=$s;)$s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);eval("echo$s;");

용도 *곱셈과 /나눗셈합니다. 음수는 그 경우에 대한 구체적인 시도를하지 않았음에도 불구하고 작동합니다.

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

언 골프 및 설명

for($s=$argv[$o=1];   # Initialize with $s = input and $o = 1;
    $o!=$s;)          # While $o != $s
    # Set $o to $s and set $s to be $s after this regex replacement:
    $s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);
    # i.e., continue to do this replacement until the result is the same on two consecutive
    # steps (no replacement was made)
# Once $o == $s (i.e. no more replacement can be made), eval the result and print
eval("echo$s;"); 

나는 약간 마법이기 때문에 정규 표현식을 설명 할 것이다.

([*+/-])(([\d.]+|(?R))\1(?3))\1


([*+/-])

먼저, 네 개의 연산자 중 하나를 일치 시키려고합니다. *+/-

([\d.]+|(?R))

그런 다음 숫자 [\d.]+또는 다른 유효한 옴니 픽스 식과 일치해야합니다 (?R).

\1

그런 다음 처음에 있었던 것과 동일한 연산자를 찾습니다.

(?3)

그런 다음 그룹 3에서 수행 한 것과 동일한 작업을 수행합니다. 숫자 또는 전 방향 표현식과 일치합니다.

\1

마지막으로 초기 연산자를 다시 일치시킵니다.

일치하는 것이 무엇이든로 바뀝니다 ($2). 이것은 주변 연산자 내부의 부분을 가져 와서 괄호 안에 넣으므로 일반적인 접두사 표기법처럼 보입니다.


2

쿼드 R , 33 32 27 바이트

Cows Quack 에게 -1 감사합니다 . -5 Outgolfer Erik에게 감사합니다 .

((.)[\d¯\.]+){2}\2
⍎¯11↓⍵M

인수 / 플래그

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

이것은 40 바이트 Dyalog APL 솔루션과 같습니다.

'((.)[\d¯\.]+){2}\2'R{⍕⍎1↓¯1↓⍵.Match}⍣≡

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

설명

(괄호 안의 텍스트는 QuadR 대신 Dyalog APL을 나타냅니다)

(... ){2}\2 두 번 다음 패턴, 두 번 역시 전체 경기 :
  (.) 모든 문자
  [... ]+ 하나 이상의 문자의 다음 세트의 다음 :
   \dD igits,
   ¯ 높은 마이너스 (음)
   \. 기간

( ⎕R 는 R 함께 eplaced :)

( {} 네임 스페이스 ⍵에 적용된 다음 익명 함수의 결과 :)

⍵M ( ⍵.Match) M atch 의 텍스트
¯1↓ 는 마지막 문자 (기호 + - ×또는 ÷)를
1↓ 첫 번째 문자 (기호)
 에서 APL 코드
 (  캐릭터 라인 화)

 ( ⍣≡) 더 이상 변경이 없을 때까지 교체를 반복하십시오.


당신이 떨어질 수 있다고 생각합니다
Kritixi Lithos

@Cowsquack 당신은 QuadR에 대해 옳습니다. ⎕R숫자 데이터에서는 작동 할 수 없습니다. 감사.
Adám


1

하스켈 , 132 자

(134 바이트 때문에 ×÷UTF-8에서 2 바이트를 가지고)

f y|(n@(_:_),r)<-span(`elem`['.'..'9'])y=(read n,r)
f(c:d)|(l,_:s)<-f d,(m,_:r)<-f s=(o[c]l m,r)
o"+"=(+)
o"-"=(-)
o"×"=(*)
o"÷"=(/)

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

f가능한 많은 입력을 구문 분석하고 결과와 나머지 문자열 (테스트 경우에는 비어 있음)을 산출합니다. 규칙에 맞지 않으면 구문 분석 할 수없는 나머지 문자열을

하스켈 , 139 자

...
g=fst.f

0

펄, 64 53 바이트

포함 +1을 위해-p

perl -pe 's%([*-/])(([\d.]+|(?0))\1(?3))\1%($2)%&&redo;$_=eval' <<< "/4/-3-/1/2/-/"

또한 실수로 ,(첫 번째 인수를 버림) 구현 하고 때로는 .(인수를 함께 추가) 구현합니다. .구문 분석 수준과 평가 수준에서 소수점을 방해하기 때문에 매우 안정적으로 작동하지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.