다음 숫자 빼기


27

기술

N 번호에서 다음 P 번호를 뺍니다. 다음 N은 N + 1입니다.

내가 의미하는 바를 얻기 위해 예제를보십시오.

예 :

Input: N=2,P=3
Calculate: n - (n+1) - (n+2) - (n+3)     //Ending with 3, because P=3
Calculate: 2 -  2+1  -  2+2  - 2+3       //Replacing N with 2 from Input
Calculate: 2 -  3    -  4    - 5
Output: -10


Input: N=100,P=5
Calculate: n - (n+1) - (n+2) - (n+3) - (n+4) - (n+5)
Calculate: 100-  101 -  102  -  103  -  104  - 105
Output: -415


Input: N=42,P=0
Calculate: n
Calculate: 42
Output: 42


Input: N=0,P=3
Calculate: n - (n+1) - (n+2) - (n+3)
Calculate: 0 -  1    -  2    -  3
Output: -6


Input: N=0,P=0
Calulate: n
Calculate: 0
Output: 0

입력:

N : 정수, 양수, 음수 또는 0

P : 정수, 양수 또는 0, 음수가 아님

산출:

정수 또는 문자열, 선행 0 허용, 후행 줄 바꿈 허용

규칙 :

  • 허점 없음
  • 이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 승리합니다.
  • 입력 및 출력은 설명과 같아야합니다

1
여기서 중요한 과제는 삼각형 숫자를 계산하는 것입니다.
피터 테일러

4
이것에는 삼각형 숫자보다 더 많은 것이 있습니다. 시작점은 임의의 수와 빼기의 수이며 0 일 수 있습니다.
JDL

또한 삼각 숫자의 경우 실제 합계를 수행하는 것이 닫힌 형식을 사용하는 것보다 짧을 수 있지만 0에서 N의 범위를 합산하여 임의의 다각형 숫자를 계산할 수는 없습니다. 다른 도전은 방금 삼각형 숫자를 요구했다.)
Martin Ender

1
에 대한 Input: N=0,P=3예를 들어, 당신의 확장은 일부 외부 더블 네거티브가
turbulencetoo

1
@JDL은 "삼각형 숫자 이상의 것"인 간단한 곱셈 N * (P-1)입니다. 그것은 사실상 사소한 정의 입니다 .
피터 테일러

답변:


15

05AB1E , 5 3 바이트

Adnan 덕분에 2 바이트 절약

Ý+Æ

설명

P를 입력 한 다음 N을 입력으로 사용합니다.

       # implicit input, ex 5, 100
Ý      # range(0,X): [0,1,2,3,4,5]
 +     # add: [100,101,102,103,104,105]
  Æ    # reduced subtraction: 100-101-102-103-104-105

4
아, 거의 내 솔루션을 게시하고 싶었습니다. 또한 3 바이트 : Ý+Æ:).
Adnan

입력 만 전환합니다 ( P먼저갑니다)
Adnan

@Adnan : 나는 05AB1E가 가지고있는 것을조차 알지 못했습니다 Ý... 나는 1 기반 범위 만 존재한다고 생각했습니다.
Emigna

어느 문자 인코딩이 3 바이트입니까? ;-)
yankee

1
@yankee : CP-1252
Emigna

16

파이썬 2, 26 24 23 바이트

-2 @Adnan 덕분 (대체 바이트 p*(p+1)/2p*-~p/2)
-1 @MartinEnder에 바이트 감사 (대체 -p*-~p/2하여+p*~p/2

lambda n,p:n-p*n+p*~p/2

테스트는 이데온에 있습니다


11

CJam, 8 바이트

{),f+:-}

테스트 스위트.

닫힌 양식 솔루션이 더 길어서 너무 나쁩니다. : |

설명

),  e# Get range [0 1 ... P].
f+  e# Add N to each value to get [N N+1 ... N+P].
:-  e# Fold subtraction over the list, computing N - (N+1) - (N+2) - ... - (N+P).


10

자바 스크립트 (ES6), 20 19 18 바이트

n=>p=>n+p*(~p/2-n)

Zwei가 제안한대로 카레를 사용하여
1 바이트를 절약했습니다. 사용자 덕분에 1 바이트를 절약했습니다.

테스트

let f =
n=>p=>n+p*(~p/2-n)

console.log(f(2)(3))
console.log(f(100)(5))
console.log(f(42)(0))
console.log(f(0)(3))
console.log(f(0)(0))


함수를 카레하여 바이트를 저장할 수 있습니다. n=>p=>...와 함께 함수 호출f(n)(p)
Zwei

(n,p)=>n-p*(++p/2+n)C #에서도 작동합니다.
aloisdg는 Reinstate Monica

1
n-p*(++p/2+n)와 같습니다 n+p*(~p/2-n).
user81655


7

하스켈, 19 18 바이트

n#p=n+sum[-n-p..n]

이전 19 바이트 솔루션

n#p=n-n*p-(p*p+p)/2
n#p=n-sum[n+1..n+p]

7

C #, 21 20 바이트

편집 : TheLethalCoder 덕분에 1 바이트를 절약했습니다.

N=>P=>N-P++*(N+P/2);

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

테스트 사례를 포함한 전체 소스 :

using System;

namespace substract
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,Func<int,int>>s=N=>P=>N-P++*(N+P/2);
            Console.WriteLine(s(2)(3));     //-10
            Console.WriteLine(s(100)(5));   //-415
            Console.WriteLine(s(42)(0));    //42
            Console.WriteLine(s(0)(3));     //-6
            Console.WriteLine(s(0)(0));     //0

        }
    }
}

1
1 바이트를 절약하는 N=>P=>대신 카레 를 사용하십시오(N,P)=>
TheLethalCoder

5

Mathematica, 15 바이트

#2-##-#(#+1)/2&

수신하는 기능 이름 Pn그 순서에서의 매개 변수로.

닫힌 양식 솔루션을 사용합니다 n - n*p - p(p+1)/2.


5

펄, 23 22 바이트

에 +1 포함 -p

STDIN의 별도 행에 n과 p를 (순서대로) 제공하십시오.

subtract.pl
2
3
^D

subtract.pl:

#!/usr/bin/perl -p
$_-=eval"+2+\$_++"x<>

(사용하여 ''저장하는 따옴표 \가 결합 될 수 없기 때문에 호출하는 2 바이트 벌금 -e)

같은 생각과 길이 :

#!/usr/bin/perl -p
$_+=eval"-1-++\$_"x<>

놀랍게도 실제 계산을 수행하는 단계 (이 직접 수식을 사용하여보다 짧은 $정말로 산술 상처습니다)


5

C ++, 54 51 바이트

  [](int N,int P){int F=N;while(P--)F-=++N;return F;}

[] (int N, int P) {int F; for (F = N; P; F-= ++ N, P-); return F;}

테스트:

#include <iostream>
int main(void)
{
    int N, P;
    std::cin >> N >> P;
    auto f = [](int N,int P){int F=N;while(P--)F-=++N;return F;};
    std::cout << f(N,P) << std::endl;
    return 0;
}

2
PPCG에 오신 것을 환영합니다! 불행히도, 모든 제출물은 프로그램 또는 호출 가능한 함수 여야 하지만, 이것은 입력이 사전 정의 된 변수에 저장되고 출력을 다른 것으로 저장하는 스니 펫일뿐입니다.
Martin Ender

1
@ MartinEnder 람다를 사용하여 C ++로 변경했습니다. 괜찮습니까?
VolAnd


f;g(n,p){f=n;while(p--)f-=++n;return f;}알고리즘을 사용하여 C에서 40
바이트로이

@cleblanc 팁 주셔서 감사합니다-전역 변수와 명시 적 유형이없는 선언이 실제로 유용합니다. C99 표준이 암시 적으로 제거 된 것이 얼마나 int
안타까운가


4

Brachylog , 19 17 바이트

hHyL,?+y:Lx+$_:H+

설명

hH                  Input = [H, whatever]
 HyL,               L = [0, …, H]
     ?+             Sum the two elements in the Input
       y            Yield the range from 0 to the result of the sum
        :Lx         Remove all elements of L from that range
           +        Sum the remaining elements
            $_      Negate the result
              :H+   Add H

4

MATL , 5 바이트

:y+s-

입력은 P다음과 N.

MATL Online에서 사용해보십시오!

설명

:     % Take P implicitly. Range [1 2 ... P]
      %     Stack: [1 2 ... P]
y     % Take N implicitly at the bottom of the stack, and push another copy
      %     Stack: N, [1 2 ... P], N
+     % Add the top two arrays in the stack , element-wise
      %     Stack: N, [N+1 N+2 ... N+P]
s     % Sum of array
      %     Stack: N, N+1+N+2+...+N+P
-     % Subtract the top two numbers
      %     Stack: N-(N+1+N+2+...+N+P)
      % Implicitly display

3

배치, 30 바이트

@cmd/cset/a%1-(%1*2+%2+1)*%2/2

소요 np명령 줄 매개 변수로 및 후행 줄 바꿈하지 않고 결과를 출력합니다.


3

SILOS , 80 바이트

GOTO b
lbla
n+1
m-n
i-1
GOTO d
lblb
readIO
n=i
m=n
readIO
lbld
if i a
printInt m

테스트 사례로 온라인으로 시험해보십시오 :
2,3
100,5
42,0
0,3
0,0


3

R, 17 14 바이트

N-N*P-sum(0:P)

3 바이트를 골라 낸 billywob에게 감사합니다. 이전 답변 :

N-sum(N+if(P)1:P)

1 : 0은 벡터 (1,0)로 확장되므로 if (P) 조건이 필요합니다 (또는를 사용해야 seq_len하지만 더 많은 바이트입니다). 조건이 없으면 P = 0이면 잘못된 출력을 얻게됩니다.

P가 제로이면 합에 팽창 sum(N+NULL)에이어서, sum(numeric(0))제로이다.


3
N 및 P가 이미 정의되어 있어야하므로 이것이 전체 프로그램으로 규정되어 있는지 확실하지 않습니다. 어쨌든 사용하는 방법 n-n*p-sum(0:p)은 짧아 질 것입니다 :)
Billywob

문제에 대한 나의 해석은 N과 P가 이미 정의되어 있다는 것입니다 (다른 답변 도이 ​​라인을 취하는 것 같습니다). 그래도 골프 포인트.
JDL

3
달리 명시하지 않는 한 제출은 스 니펫뿐만 아니라 전체 프로그램 또는 호출 가능한 기능이어야 합니다. 다른 답변은 변수가 이미 정의되어 있다고 가정합니까?
Martin Ender

나는 자바 스크립트 전문가가 아니지만 자바 스크립트 솔루션이 이미 정의 된대로 변수를 취하는 것처럼 보입니다. 그래도 내 자신의 오해가 될 수 있습니다. 문제에서 N과 P라는 이름이 붙여 졌기 때문에 "지정하지 않았다"고 생각했습니다. 그렇지 않으면, 우리는 래퍼 필요 function(N,P){...}또는N=scan();P=scan();...
JDL

@JDL 자바 스크립트 항목은 사전 정의 된 변수를 사용하지 않습니다
Blue

3

PHP, 33 바이트

$n-=$n*$p+array_sum(range(0,$p));

PHP 코드 를 사용 <?php하거나 짧게 사용해야한다고 생각합니다 <?. 답을 수정하십시오.
Paul Schmitz


미안, 말을 잊어 버려 나는 이것으로 많은 대답을 보았으므로 그에 대한 규칙이 있다고 생각했습니다. 이와 같은 토론을 피하려면 하나가 있어야합니다.
Paul Schmitz

3

젤리 , 7 바이트

RS+×_×-

인수는 TryItOnline에서P, N
테스트됩니다

방법?

RS+×_×-  - takes two arguments: P, N
R        - range(P): [1,2,3, ... ,P]
 S       - sum: 1+2+3+ ... +P
   ×     - multiply: P*N
  +      - add: 1+2+3+ ... +P + P*N
    _    - subtract: 1+2+3+ ... +P + P*N - N
      -  - -1
     ×   - multiply: (1+2+3+ ... +P + P*N - N)*-1
                   = -1-2-3- ... -P - P*N + N
                   = N - (N+1) - (N+2) - (N+3) - ... - (N+P)



3

자바, 67 , 63 바이트

골프 :

int x(int n,int p){return-((p%2<1)?p*p/2+p:p/2*(p+2)+1)+n-p*n;}

언 골프 드 :

int x(int n, int p)
{
    return -((p%2<1) ? p*p/2+p : p/2 * (p+2) + 1) + n - p*n;
}

기본적으로 나는 수식에서 수학을했습니다. 이 n - p*n부분은 n수식 의 모든 부분을 처리 합니다. 그런 다음 선형 적으로 증가하는 정수 세트 (산술 시리즈)를 합산하는 슈퍼 재미있는 속성을 사용했습니다. 첫 번째 정수와 마지막 정수의 합을 사용한 다음 set.length / 2(나중에 패리티를 확인하고 적절하게 처리합니다) 를 곱했습니다 .

사용해보십시오 : https://ideone.com/DEd85A


int n,int p바이트를 저장하기 위해 사이의 공백을 제거 할 수 있습니다 . 또한, 당신은을 변경할 수 있습니다 p%2==0p%2<1또 다른 바이트를 저장합니다. - 짧은 변형을 for-loop로 게시했을 때 이미 Java 답변을 게시 한 것을 알지 못했습니다 . 나는 당신의 수학 공식을 좋아합니다. :)
Kevin Cruijssen

좋은 공식! p%2>0삼항에서 순서를 사용 하고 전환하면 문자를 저장할 수 있습니다.
Frozn

아, 그리고 또한 p/2 *(p+2)동일p*p/2+p
Frozn

Hehe 큰 개선 :) 실제로이 공식은 재미있는 일화 에서 비롯됩니다 :) @KevinCruijssen 좋은 대답, 확실히 내 것보다 낫습니다 :) +1
peech

3

자바 7, 43 40 바이트

int c(int n,int p){return n-p*n+p*~p/2;}

자바 8, 19 바이트

(n,p)->n-p*n+p*~p/2

뻔뻔에서 도난 @JonathanAllan 의 놀라운 파이썬 2 식 .

원래 답변 ( 61 60 바이트) :

int c(int n,int p){int r=n,i=1;for(;i<p;r-=n+++i);return r;}

언 골프 및 테스트 사례 :

여기에서 시도하십시오.

class M{
  static int c(int n, int p){
    return n - p*n + p*~p / 2;
  }

  public static void main(String[] a){
    System.out.println(c(2, 3));
    System.out.println(c(100, 5));
    System.out.println(c(42, 0));
    System.out.println(c(0, 3));
    System.out.println(c(0, 0));
  }
}

산출:

-10
-415
42
-6
0

Java 7이 필요합니까?
mbomb007

@ mbomb007 int c(int n,int p){...}. Java 8 (또는 9) 일 경우 (n,p)->n-p*n+p*~p/2( 19 바이트 )
Kevin Cruijssen

그런 다음 해당 바이트를 저장하십시오.
mbomb007


2

미로 , 15 바이트

?:?:}*-{:)*#/-!

또는

??:}`)*{:)*#/-!

닫힌 양식 솔루션을 사용합니다 n - n*P - P*(P+1)/2.



1

Pyth, 11 바이트

Ms+Gm_+GdSH

함수 g의 입력을 받아, np인수를 통해 그 결과를 출력한다. 형식으로 호출 할 수 있습니다 gn p.

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

작동 원리

Ms+Gm_+GdSH  Function g. Inputs: G, H
M            g=lambda G,H:
         SH   1-indexed range, yielding [1, 2, 3, ..., H]
    m_+Gd     Map lambda d:-(G+d) over the above, yielding [-(G+1), -(G+2), -(G+3),
              ..., -(G+H)]
  +G          Add G to the above, yielding [G, -(G+1), -(G+2), -(G+3), ..., -(G+H)]
 s            Reduce on addition with base case 0, yielding G-(G+1)-(G+2)-(G+3)...
              -(G+H)
              Implicitly print

1

C89, 38 , 35 , 33 바이트

h(n,p,r)int*r;{*r=n-p++*(n+p/2);}

Coliru에서 테스트하십시오 .


1

메이플, 19 바이트

n-sum(i,i=n+1..n+p)

용법:

> f:=(n,p)->n-sum(i,i=n+1..n+p);
> f(2, 3);
  -10
> f(100,5);
  -415
> f(42,0);
  42

1

펄 6 , 21 바이트

{$^n-[+] $n^..$n+$^p}

설명:

# bare block lambda with two placeholder parameters 「$n」 and 「$p」
{
  $^n -
      # reduce using 「&infix:<+>」
      [+]
          # a Range that excludes 「$n」 and has 「$p」 values after it
          $n ^.. ($n + $^p)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.