다음 숫자 빼기


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)/2로 p*-~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&

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

닫힌 양식 솔루션을 사용합니다 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

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


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==0할 p%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의 입력을 받아, n및 p인수를 통해 그 결과를 출력한다. 형식으로 호출 할 수 있습니다 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.