맨해튼의 수학


12

다음 연산자를 정의합니다.

한 자리 숫자의 경우 Manhattan Addition a + M b는 b를 a에 연결 한 결과입니다. 따라서 a + M b = 10a + b입니다. 따라서 일반 연산자 + M 은 다음과 같이 정의됩니다.

a + M b = 10a + b

한 자리 숫자의 경우 맨해튼 빼기 a – M b는 a에서 마지막 b를 제거한 결과입니다. 따라서 연산자 – M 은 의사 코드로 정의됩니다.

a – M b = a 마지막 b 제거

Manhattan 곱셈 a × M b는 b의 모든 b를 b의 b로 대체 한 결과입니다. Ergo, × M 은 의사 코드에서 다음과 같이 정의됩니다.

a × M b = a- > s / b / <b 사본 b> / g

Manhattan Division a ÷ M b는 × M으로 정의됩니다 .

1 ÷ M b = b의 첫 문자
a ÷ M b = a × M (1 ÷ M b)

마음에있는 모든이와 함께, 다음 연산자를 (즉, 사용 중위 식을 평가합니다 통역사를 생성 a + b하지 a b +또는 + a b)

+    Addition
-    Subtraction
/    Division
*    Multiplication
*M   Manhattan Multiplication
/M   Manhattan Division
+M   Manhattan Addition
-M   Manhattan Subtraction

맨하탄의 각 운영자는 일반적인 상대방보다 우선 순위가 높습니다.

테스트 사례 :

> 5 +M 10 + 3
63      // 5*10 + 10 + 3 => 60 + 3
> 10 *M 2
10      // no 2s in 10
> 10 *M 1
10      // one 1 in 10 replaced once
> 23 *M 3
2333    // 23 has one 3, which is replaced with three 3s
> 23 *M 2
223     // 23 has one 2, which is replaced with two 2s
> 232 *M 2
22322   // 232 has two 2s, which are replaced with two 2s
> 232 *M 23
23...(23 times)...232   // ...
> 123 *M 2 * 3
3669    // 1223 * 3 => 3669
> 5 + 3 +M 2
37      // 5 + (3 +M 2) => 5 + 32 => 37
> 150 /M 3
150     // 150 ÷M 3 => 150 ×M 3 => 150
> 150 /M 53
1555550 // 150 ÷M 53 => 150 ×M 5 => 1555550
> 50 -M 0
5
> 500 -M 0
50
> 5234 -M 5
234
> 12 +M 633 *M 3
6333453 // = 12 +M 6333333 = 120 + 6333333 = 6333453

이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


13
왜 유니 코드 기호를 사용 ×하고 ÷대신 ASCII의 *과를 /?
ASCIIThenANSI

1
232 ×M 23같은 23232가요? 23 부 23뒤에 2?가 붙지 않아야 합니까?
senshin

1
@ASCIIThenANSI 왜 그런지 물어볼 수 있습니다. 선택은 임의적입니다. 내 선택에 몇 가지 긴급한 문제가 없다면, 나는 그것을 바꿀 것이라고 생각하지 않습니다.
Conor O'Brien

4
그것은 문제가 아닌 경우, 아주 재미하지 않은, 참여할 수있는 좋은 유니 코드를 지원하지 않는 언어에 대한 임의을 어렵게 에 대한 유니 코드.
Lynn

2
이 질문은 구체적으로 명시되지 않았기 때문에 충분한 관심을받지 못했습니다. sngle 숫자의 추가를 정의한 다음 첫 번째 예에는 2 자리 숫자가 있습니다. 나는 포기 ...
edc65

답변:


5

Dyalog APL , 104 81 79 93 75 바이트

편집 : 이제 핸들 4342343 -M 3443423올바르게.

M←{⍎(5|⌊⍺⍺2)⊃'⍺×M⍣(⍺≠1)⍎⊃b'(b⎕R(⍵⍴'&')⊢a)'10⊥⍺⍵'(('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)}

배경

이것은 APL을 확장하여 Manhattan 연산자를 포함시킵니다. APL 용어의 연산자는 기능의 수정 자입니다 (예 :) ÷. 연산자의 예는 인수를 교환하도록 함수를 수정하는 것 3 = 2 ÷⍨ 6입니다. 그래서도 M수정 기본 연산 기능은 맨하탄 친척이 될 수 있습니다. 결과 언어는 APL의 확장이므로 APL의 엄격한 오른쪽에서 왼쪽 우선 순위가 유지됩니다.

설명

무엇보다 중요한 구조이다 M←{⍎(5|⌊⍺⍺2)⊃... }(함수를 적용시킬 +또는 -또는 ×또는 ÷2)하고 평가할 수있는 문자열을 선택하는 결과를 사용한다. 문자열은 다음과 같습니다.

-M 3 : (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 정규식 제거 마지막에 나타나는 B (.. 문자열 담당자의 ARG 오른쪽)에서 (문자열 담당자 좌측의 ARG.).

+ M의 경우 2 : '10⊥⍺⍵'
 인수를 기본 10 자리로 평가

× M에 대한 1 : (b⎕R(⍵⍴'&')⊢a)
 의 발생 대신 B를 함께 에 대한 (앰퍼샌드 즉, 정규 표현식

÷ M의 경우 0 : b의'⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b 첫 번째 숫자는 ⍺ ≠ 1 인 경우 ⍺ × M을 적용합니다.
⍺×M⍣(⍺≠1)

위의 4 개 문자열 중에서 숫자를 선택하십시오.

(5|⌊⍺⍺2)2에 적용된 함수 바닥의 mod-5, 즉 :
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2때문에 × 2 ⇔ sgn (2) ⇔ 1
 0 = 5 | ⌊÷2때문에 ÷ 2 ⇔ 1 ÷ 2 ⇔ 0.5

놀라운 부스러기에 대한 나의 사랑하는 친구 ngn에게 많은 감사합니다.


1
이건 괜찮아. 내가 원하는 것에 맞습니다.
Conor O'Brien

좋아요, 글을 편집하겠습니다.
Adám

@ CᴏɴᴏʀO'Bʀɪᴇɴ 보너스를 잃어 버렸을 수도 있지만 지금은 가장 짧습니다.
Adám

이런, 잊어 버렸습니다.
코너 O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Forgot? 오늘 방금 편집하여 허용되는 것보다 짧았습니다.
Adám

12

펄, 100 99 98 바이트

97 바이트 코드 + 1 바이트 명령 줄

s/ |.*\K(\d)(\d*)-M\1|\+M/\2/g+s/(\d+)\*M(.)/$1=~s@$2@$&x$&@erg/e+s#/(M.)\d+#*\1#&&redo,$\=eval}{

사용 예 :

echo "123 *M 2 * 3 + 150 /M 53" | perl -p entry.pl

코드가 짧아지면 *Mfor xM/Mfor 만 사용해야 합니다 <div>M.
Conor O'Brien

현상금을 축하합니다!
Conor O'Brien

7

파이썬, 644 바이트

import operator as o,re
x,q,t,r,w='*/+-M';mm,md,ma,ms='*M /M +M -M'.split()
n=lambda x:x
a=lambda a,b:str(10*int(a)+int(b))
v=lambda a,b:a[::-1].replace(b,'',1)[::-1]
m=lambda a,b:a.replace(b,b*int(b))
d=lambda a,b:m(a,b[0])if a>0 else b[0]
def p(s):s=s.group();ss=s.split();l=s.split(ss[1]);h={mm:m,md:d,ma:a,ms:v,x:o.mul,q:o.div,t:o.add,r:o.sub}.get(ss[1],n);return str(h(*map(int if h in[o.mul,o.div,o.add,o.sub]else n,map(u,map(str.strip,l)))))
def u(s):z=r'\d+ (?:\{0}{2}|\{1}{2}) \d+';return re.sub(z.format(t,r,''),p,re.sub(z.format(t,r,w),p,re.sub(z.format(x,q,''),p,re.sub(z.format(x,q,w),p,re.sub(r'\((.*)\)',u,s)))))
print u(input())

STDIN (따옴표로 묶음)에 대한 입력을 승인합니다. 정규식을 사용하여 작업을 일치시키고 구문 분석합니다. 모든 작업은 문자열에서 수행되며 int 로의 캐스팅은 일반적인 수학 연산을 수행 할 때만 사용됩니다.

나는 이것이 더 골프화 될 수 있다고 확신하므로 앞으로 며칠 동안 그 일을 할 것입니다.


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