두 숫자의 합계, 곱 및 차이를 결합하는 연산자


28

도전:

소셜 네트워크에는 다음과 같은 바보 같은 퍼즐이 있습니다.

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

함수 나 연산자 구현 개의 양의 정수 번호를 부여 할 때, 그 xy같은 즉 x > y > 0, int로서 정답을 산출 정수 응답의 자릿수의 숫자이다 x * y의 숫자 다음 x + y의 숫자 하였다 x - y. 매우 간단합니다.

규칙 :

  • 표준 허점은 허용되지 않습니다.
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.
  • 입력 데이터 검증이 필요 하지 않습니다. 이 프로그램은 유효하지 않은 입력이 주어지면 충돌하거나 쓰레기를 반환 할 수 있습니다.
  • 숫자 함수 및 연산자 (정수 및 부동 소수점, 수학 라이브러리 함수 및 숫자를 받아들이고 리턴하는 기타 함수 포함)를 사용할 수 있습니다.
  • 해당되는 경우 숫자의 자릿수를 반환하는 함수를 사용할 수 있습니다.
  • 당신이있어 하지 문자열이나 코드의 연결의 어느 곳의 어떤 종류를 사용하는 것을 허용했다.
  • 결과는 언어로 적용되거나 스택에 푸시되거나 푸시 될 수 있습니다. 결과는 문자열이 아닌 정수 여야합니다.

샘플 코드 :

Dyalog APL :

다음 코드는이라는 이진 연산자를 만듭니다 X.

X ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}

설명:

  • APL에서는 오른쪽에서 왼쪽으로 평가합니다.

  • ⍺ and ⍵ 각각 왼쪽과 오른쪽 피연산자

  • ⌊10⍟⍺-⍵읽는다 : floor of log10(⍺-⍵). 먼저 감산을 수행 한 다음 로그를 기록한 다음 바닥을 수행합니다. 오른쪽에서 왼쪽으로. log10은 자릿수를 계산하기 위해 수행됩니다 ⍺-⍵(나중에 1을 합산해야 함).

  • ⍺×⍵×10*(...) 읽는다 : 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • 따라서 ⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵합계의 자릿수와 차이의 합계로 왼쪽으로 이동 한 곱입니다. 10의 거듭 제곱을 곱하면 정수가 왼쪽으로 이동합니다.

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) 차이의 자릿수만큼 왼쪽으로 이동 한 합계입니다.

  • (⍺-⍵)차이점입니다. 여기에는 변속이 필요하지 않습니다.

  • X←{...} APL에서 연산자를 정의하는 방법입니다.

예 :

      8 X 2
16106
      5 X 4
2091
      9 X 6
54153

GNU DC :

다음 코드는 매크로라는 이름을 만듭니다 a.

[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa

설명:

  • sxsy스택에서 팝 요소 및 레지스터에 저장 x하고 y, 각각.

  • lxly레지스터에서 요소를로드 x하고 y, 각각 스택으로 푸시.

  • d 스택의 마지막 요소를 복제합니다.

  • ^ 두 숫자의 거듭 제곱을 계산합니다.

  • Z숫자를 팝하고 자릿수를 반환합니다. 이것은 dc로그 함수가 없기 때문에 수행됩니다 .

  • [...]sa레지스터에 매크로를 저장합니다 a. la그것을로드합니다. x스택 맨 위에서 매크로를 실행합니다.

예 :

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

정수에서 문자열로의 변환이 유효하지 않다고 가정합니까?
Anthony Pham

2
나는 우리가 이와 같은 도전을 겪었다 고 생각하지만 어떤 용어가 속임수를 찾을 지 모른다.
xnor

2
@AnthonyPham "코드의 어느 곳에서나 문자열이나 모든 종류의 연결을 사용할 수 없습니다."
ASCII 전용

1
입력으로 정수 쌍을 취할 수 있습니까?
Conor O'Brien

1
함수 대신 전체 프로그램을 만들 수 있습니까?
Outgolfer Erik

답변:


10

자바 스크립트 (ES7), 63 61 59 바이트

Neil 덕분에 4 바이트를 절약했습니다 .

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


를 사용하여 몇 바이트를 저장하십시오 10**-~Math.log10(c). ( reduce물론 을 사용하는 데 +1 )
Neil

"ES7"아, 코딩에 대한 사랑으로 ... 다른 것을 만들고 있습니까?
Feathercrown

@Feathercrown 네,하지만 "자바 9"를 듣는 것보다 정말로 나쁩니 까? 게다가 그것은 유용한 같은 것들을 가지고 async/ await과 지수 연산자**
ASCII 전용

@ASCII 전용 **은 정말 유용합니다. ES6에 있었을 것입니다.
Feathercrown


6

배쉬, 66

  • @chepner 덕분에 2 바이트가 절약되었습니다.
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

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


변수 (들, d 및 정의하지 않은 곱셈을위한 다른 하나)를 나란히 놓고 산술 표현식으로 평가하면이를 두 배 더 짧게 만들 수 있습니다.
Maxim Mikhaylov

3
@MaxLawnboy 네, 금지 된 문자열 연결과 비슷하게 들립니다.
디지털 외상

1
내부의 식별자 이름 $[...]은 명시 적으로 $(예 : d대신 $d) 매개 변수 확장을 거쳐 두 문자를 저장합니다.
chepner

@ chepner yep-고맙습니다-나는 그것들을 놓쳤습니다.
Digital Trauma

다른 두 개를 찾았습니다. ((s=$1+$2,d=$1-$2))두 변수를 초기화하는 데 사용 합니다.
chepner

5

엑셀, 61 바이트

=A1-B1+(A1+B1)*10^LEN(A1-B1)+A1*B1*10^(LEN(A1-B1)+LEN(A1+B1))

Excel, 18 바이트가 유효하지 않습니다

=A1*B1&A1+B1&A1-B1

5

스택 형 , 36 바이트

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

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

이전 : ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum

설명을 작성하기 전에 1 ~ 2 바이트를 짜려고합니다. ( #'= "여기에 첨부 된 문자열이없는 "각각의 크기 "입니다.)

26 바이트에서의 비경쟁 : $(*+-)#!!:{%y#'10\^x*y+}#\.




3

펄 6 ,  81 61  58 바이트

->\x,\y{($/=($/=x- y)+(x+y)*({10**$++}...*>$/).tail)+x*y*({10**$++}...*>$/).tail}

시도 해봐

->\x,\y{(x*y,x+y,x- y).reduce:{$^a*10**Int(1+log10($^b))+$b}}

시도 해봐

->\x,\y{[[&({$^a*10**Int(1+$^b.log10)+$b})]] x*y,x+y,x- y}

시도 해봐


Perl 6을 모르면서, 그것이 x-y유효한 식별자 라는 것을 알게되어 약간 놀랐습니다 .
Neil

3

젤리 , 27 바이트

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

로 호출 할 수있는 2 진 링크 / 함수를 정의합니다 ç. 두 개의 정수를 입력으로 받아서 정수를 리턴합니다. 절대 차이를 사용하여 x <y 또는 x >y 를 취할 수 있다는 추가 보너스가 있습니다 .

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

설명:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

세부:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP, 79 75 바이트

두 가지 버전 :

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

명령 행 인수에서 입력을받습니다. 로 실행하십시오 -r.

숫자를 문자열로 사용하지만 strlen"자릿수를 반환하는 함수"로 자격이 있다고 생각
합니다. 그렇지 않다면 알려주십시오.


'코드의 어느 곳에서나 문자열이나 모든 종류의 연결을 사용할 수 없습니다.'라고 생각 strlen합니다.
numbermaniac

@numbermaniac OP가 결정하게하십시오. 이모의 제한은 솔루션이 서로 세 개의 결과 만 인쇄하는 대신 하나의 결과 를 생성하도록하는 것이 었습니다 . 그 이상의 모든 것은 nitpicking입니다.
Titus

2

C (gcc) , 70 바이트

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

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

Steadybox 답변을 기반으로 매크로의 모든 것을 골프에 조금 더 넣습니다.

(참고 : 예기치 않은 결과 d대신 a작업에 결과를 할당했습니다 . 생성 된 어셈블리 코드를 살펴 보았는데 문제가없는 것 같습니다.)


2

하스켈, 54 바이트

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

퍼즐은 #예를 들어, 삽입 기능을 통해 구현됩니다 8#2 = 16106. 다른 함수 %는 base-10 연결을 정의합니다 (RHS가 0보다 크다고 가정).



1

PHP, 87 바이트

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

37 바이트에 대한 유효하지 않은 솔루션

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

루비, 61 바이트

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

어떤 의심처럼 많이 보이는 자바 스크립트 대답하지만, 로그를 사용하지 않고.


1

파이썬, 92 91 문자

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

위저즈 제안 덕분에;)


사이트에 오신 것을 환영합니다! )와 사이에 공백이 필요하지 않습니다 if.
밀 마법사

1

R (3.3.1), 104 바이트

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

익명 함수를 반환합니다.

이것은 나의 첫 번째 골프 시도이므로 모든 의견을 부탁드립니다.


1
예약어 'function'을 통해 함수를 정의하지 말고 가능한 한 많은 바이트를 사용한다고 말하고 싶습니다. 계산 만하면됩니다.
user11599

0

REXX, 70 바이트

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

물론 기본 방법은 훨씬 짧습니다.

f:arg a b
return a*b||a+b||a-b

0

PowerShell, 88 바이트

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

PowerShell에는 도움이되지 않는 전원 운영자가 없습니다. 또한 우리가 할 수없는 문자열로 계산하지 않으면 정수의 길이를 계산할 수 없으므로 -gt길이를 알기 위해 9인지 확인합니다. 더 간결 할 수도 있지만 일을 다시해야합니다.


0

파이썬 2.7, 109 96 바이트

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

대회 규칙에 따라 수정되었습니다. 코드를 109 바이트에서 96 바이트낮추는 데 대한 mbomb007의 공로


1
이 도전의 규칙에서 –•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork

a람다 를 만들어 일부 바이트를 절약 할 수 있습니다 . a=lambda n:10**int(.... b,c=input()을 사용하여 두 입력을 쉼표로 구분하여 제공 할 수도 있습니다 .
mbomb007

@ mbomb007 b, c = input ()은 TypeError를줍니다 : 'int'객체는 반복 할 수 없습니다. 나는 그것을 시도했다. 람다 함수는 코드에서 함수를 두 번 호출하기 때문에 바이트를 저장하지 않습니다. 그것도 시도했다. :(
Koishore Roy

@KoishoreRoy 나는 당신이 무슨 뜻인지 알지 못합니다. 96 바이트
mbomb007

0

J , 25 바이트

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- 각 작업의 결과를 박스에 기입하십시오.
  2. 10#.inv&.>각 결과를 10 자리 숫자의 배열로 변환하십시오. ( inv입니다 ^:_1)
  3. [:; 어레이를 개봉하고 결합합니다.
  4. 10#. 10 진수의 자릿수를 정수로 변환합니다.
  5. X=.위의 연산자로 정의하십시오 X.

결과 :

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

당신은 필요하지 않습니다X=.
Cyoce

@Cyoce-챌린지의 샘플 APL 코드는 연산자를 정의합니다. 이 과제에 재사용 가능한 연산자를 정의해야합니다.
Dane

"3. [:; 배열을 개봉하고 조인하십시오." - "코드의 어느 곳에서나 문자열이나 모든 종류의 연결을 사용할 수 없습니다."
ngn

@ngn-의견을 확장하십시오. 문자열은 사용되지 않습니다.
Dane

J에 익숙하지는 않지만 "join"( "link"?)이 "종류의 연결"을 구성 할 수 있다는 점을 지적하고 싶었지만이 경우 문제 설명을 해석하는 방법을 잘 모르겠습니다. . 내 자신의 솔루션은 비슷한 질문을 제기합니다-J의 "링크"와 같을 수도 있지만 글리프가없는 가닥 (APL의 명사 병렬화가 벡터를 형성 함)을 사용합니다.
ngn

0

수학, 67 바이트

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

소요 x-y , 다음의 LOG10 소요x-y 그 전력 10을 계산하고 곱으로하여,이를 라운드 업 x+y. 그러나 우리는 또한 log10(x-y)0 인 것을 고려해야합니다 . 그래서 우리는 0을 1로 대체 2x합니다 을 곱한 다음 xy더하십시오.


0

05AB1E , 23 22 16 바이트

-Dg°¹²+*Dg°¹²**O

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

"-+*"각 연산에 ​​대해 수행되는 코드가 동일하기 때문에 연산을 포함하는 문자열을 반복하여 프로그램에서 문자열을 사용할 수 있다면 (계산이 아닌) 몇 바이트를 절약 할 수 있습니다 .
물론, 우리가 연결을 사용할 수 있다면 더 많이 절약 할 수있었습니다.


0

R, 64 바이트

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

용법:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.