Trừ các số tiếp theo


27

Sự miêu tả

Trừ các số P tiếp theo từ một số N. Số tiếp theo của N là N + 1.

Nhìn vào các ví dụ để có được những gì tôi muốn nói.

Ví dụ:

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

Đầu vào:

N : Số nguyên, dương, âm hoặc 0

P : Số nguyên, dương hoặc 0, không âm

Đầu ra:

Số nguyên hoặc Chuỗi, dẫn đầu 0 được phép, theo dõi dòng mới được phép

Quy tắc:

  • Không sơ hở
  • Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte thắng
  • Đầu vào và đầu ra phải được mô tả

1
Thách thức thiết yếu ở đây là tính toán số tam giác.
Peter Taylor

4
Có nhiều thứ hơn là số tam giác; điểm bắt đầu là tùy ý cũng như số phép trừ, có thể bằng không.
JDL

Ngoài ra, đối với các số tam giác, có thể thực hiện tổng thực tế ngắn hơn so với sử dụng dạng đóng, trong khi bạn không thể tính các số đa giác tùy ý bằng cách tính tổng từ 0 đến N. (Tôi đồng ý với phiếu bầu gần nếu thử thách khác chỉ yêu cầu số tam giác.)
Martin Ender

1
cho Input: N=0,P=3ví dụ, mở rộng bạn có một số không liên quan đúp âm
turbulencetoo

1
@JDL, phần "không chỉ là số tam giác" là một phép nhân đơn giản : N * (P-1). Đó gần như là định nghĩa của tầm thường .
Peter Taylor

Câu trả lời:


15

05AB1E , 5 3 byte

Đã lưu 2 byte nhờ Adnan

Ý+Æ

Giải trình

Lấy P rồi N làm đầu vào.

       # 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
Ahhh, tôi gần như muốn đăng giải pháp của mình haha. Ngoài ra, đối với ba byte: Ý+Æ:).
Ad Nam

Nó chỉ chuyển đổi đầu vào ( Pđi trước)
Adnan

@Adnan: Tôi thậm chí còn không biết 05AB1E đã có Ý... Tôi nghĩ chỉ tồn tại phạm vi 1 dựa trên.
Emigna

Trong đó mã hóa ký tự chỉ có 3 byte? ;-)
yankee

1
@yankee: CP-1252
Emigna

16

Python 2, 26 24 23 byte

-2 byte nhờ @Adnan (thay thế p*(p+1)/2bằng p*-~p/2)
-1 byte nhờ @MartinEnder (thay thế -p*-~p/2bằng+p*~p/2

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

Các bài kiểm tra là trên ideone


11

CJam, 8 byte

{),f+:-}

Bộ thử nghiệm.

Quá tệ là giải pháp dạng đóng dài hơn. : |

Giải trình

),  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

Javascript (ES6), 20 19 18 byte

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

Đã lưu 1 byte bằng cách currying, như được đề xuất bởi Zwei
Đã lưu 1 byte nhờ người dùng81655

Kiểm tra

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))


Bạn có thể lưu một byte bằng cách xáo trộn chức năng. n=>p=>...và gọi hàm vớif(n)(p)
Zwei

(n,p)=>n-p*(++p/2+n)cũng sẽ hoạt động trong C #.
aloisdg nói Phục hồi lại

1
n-p*(++p/2+n)tương đương với n+p*(~p/2-n).
dùng81655


7

Haskell, 19 18 byte

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

Các giải pháp 19 byte trước đó

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

7

C #, 21 20 byte

Chỉnh sửa: Đã lưu một byte nhờ TheLethalCoder

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

Hãy thử trực tuyến!

Nguồn đầy đủ, bao gồm các trường hợp thử nghiệm:

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
sử dụng currying N=>P=>thay vì (N,P)=>để tiết kiệm 1 byte
TheLethalCoder

5

Toán học, 15 byte

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

Một hàm không tên nhận Pnlà tham số của nó theo thứ tự đó.

Sử dụng giải pháp dạng đóng n - n*p - p(p+1)/2.


5

Perl, 23 22 byte

Bao gồm +1 cho -p

Cho n và p (theo thứ tự đó) trên các dòng STDIN riêng biệt:

subtract.pl
2
3
^D

subtract.pl:

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

(sử dụng ''dấu ngoặc kép để lưu \hình phạt 2 byte vì không thể kết hợp với -e)

Cùng một ý tưởng và độ dài:

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

Đáng ngạc nhiên khi thực hiện tính toán thực tế ngắn hơn so với sử dụng công thức trực tiếp (những điều này $thực sự gây tổn hại cho số học)


5

C ++, 54 51 byte

  [](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;}

Kiểm tra:

#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
Chào mừng đến với PPCG! Thật không may, tất cả các đệ trình cần phải là chương trình hoặc các hàm có thể gọi được , trong khi đây chỉ là một đoạn mã giả định đầu vào được lưu trữ trong các biến được xác định trước và lưu trữ đầu ra trong một biến khác.
Martin Ender

1
@MartinEnder Tôi đã đổi thành C ++ với lambda. Có chấp nhận được không?
VolAnd


Bạn có thể thực hiện điều này bằng C với 40 byte f;g(n,p){f=n;while(p--)f-=++n;return f;}bằng thuật toán của mình
cleblanc

@cleblanc Cảm ơn vì tiền boa - biến toàn cục và khai báo không có loại rõ ràng thực sự hữu ích. Thật đáng tiếc khi tiêu chuẩn C99 bị loại bỏ ngầmint
VolAnd


4

Brachylog , 19 17 byte

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

Giải trình

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 byte

:y+s-

Đầu vào là Pvà sau đó N.

Hãy thử nó tại MATL Online!

Giải trình

:     % 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

Hàng loạt, 30 byte

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

Lấy nplàm tham số dòng lệnh và in kết quả mà không có dòng mới.



3

R, 17 14 byte

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

Cảm ơn billywob vì đã chơi golf 3 byte. Câu trả lời trước:

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

Lưu ý rằng 1: 0 mở rộng đến vectơ (1,0) vì vậy chúng ta cần điều kiện if (P) (hoặc để sử dụng seq_len, nhưng đó là nhiều byte hơn). Nếu không có điều kiện, chúng ta sẽ nhận được đầu ra sai nếu P = 0.

Nếu P bằng 0, thì tổng mở rộng thành sum(N+NULL), sau đó sum(numeric(0)), bằng không.


3
Không chắc chắn nếu điều này đủ điều kiện là một chương trình đầy đủ bởi vì nó yêu cầu N và P đã được xác định. Dù bằng cách nào đi nữa n-n*p-sum(0:p)cũng sẽ ngắn hơn :)
Billywob

Giải thích của tôi về vấn đề này là N và P đã được xác định (các câu trả lời khác dường như cũng có dòng này). Điểm golf mặc dù.
JDL

3
Trừ khi được quy định khác, các bài nộp cần phải là chương trình đầy đủ hoặc các chức năng có thể gọi được, không chỉ là đoạn trích. Những câu trả lời khác làm cho giả định rằng các biến đã được xác định?
Martin Ender

Tôi không phải là chuyên gia javascript, nhưng có vẻ như giải pháp javascript đang lấy các biến như đã được xác định. Đó có thể là sự hiểu lầm của riêng tôi mặc dù. Vì N và P được đặt tên như vậy trong bài toán, tôi đã coi đó là "chỉ định khác". Nếu không, thì chúng ta cần một trình bao bọc function(N,P){...}hoặcN=scan();P=scan();...
JDL

@JDL mục nhập javascript không được xác định trước bị biến dạng
Blue

3

PHP, 33 byte

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

Tôi nghĩ bạn cần sử dụng <?phphoặc viết tắt <?của PHP-Code. Vui lòng chỉnh sửa câu trả lời của bạn.
Paul Schmitz


Xin lỗi, quên những gì đã nói. Tôi đã thấy nhiều câu trả lời với điều này, và do đó nghĩ rằng, có một quy tắc cho điều đó, đó không phải là trường hợp. Cần có một, để tránh các cuộc thảo luận như thế này.
Paul Schmitz

3

Thạch , 7 byte

RS+×_×-

Các đối số đang P, N
kiểm tra nó trên TryItOnline

Làm sao?

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

Java, 67 , 63 byte

Chơi gôn

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

Ung dung:

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

Về cơ bản tôi đã làm một số toán về công thức. Phần n - p*nnày chăm sóc tất cả ncác công thức. Sau đó, tôi đã sử dụng một thuộc tính siêu thú vị để tổng hợp các số nguyên tăng tuyến tính (chuỗi số học): Tôi đã sử dụng tổng của số nguyên đầu tiên và cuối cùng và sau đó nhân nó với set.length / 2(Tôi cũng kiểm tra tính chẵn lẻ và xử lý nó một cách thích hợp).

Hãy dùng thử: https://ideone.com/DEd85A


Bạn có thể loại bỏ khoảng trống giữa int n,int pđể lưu một byte. Ngoài ra, bạn có thể thay đổi p%2==0để p%2<1tiết kiệm byte khác. - Tôi không biết bạn đã đăng câu trả lời Java khi tôi đăng biến thể ngắn hơn của tôi với vòng lặp for . Tôi thích công thức toán học của bạn, mặc dù vậy, +1 từ tôi. :)
Kevin Cruijssen

Công thức tuyệt vời! Sử dụng p%2>0và chuyển đổi thứ tự trong ternary bạn có thể lưu một ký tự.
Frozn

Ồ và cũng p/2 *(p+2)tương đương vớip*p/2+p
Frozn

Hehe cải tiến tuyệt vời :) thực sự công thức này xuất phát từ một giai thoại vui nhộn :) @KevinCruijssen câu trả lời hay, chắc chắn tốt hơn của tôi :) +1
p336

3

Java 7, 43 40 byte

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

Java 8, 19 byte

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

Bị đánh cắp một cách đáng xấu hổ từ công thức Python 2 tuyệt vời của @Jonathan ALLan .

Câu trả lời gốc ( 61 60 byte):

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

Các trường hợp bất ngờ & thử nghiệm:

Hãy thử nó ở đây.

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));
  }
}

Đầu ra:

-10
-415
42
-6
0

Điều gì về điều này đòi hỏi Java 7?
mbomb007

@ mbomb007 int c(int n,int p){...}. Nếu nó là Java 8 (hoặc 9) thì nó có thể là (n,p)->n-p*n+p*~p/2( 19 byte )
Kevin Cruijssen

Sau đó làm điều đó để lưu các byte đó.
mbomb007


2

Mê cung , 15 byte

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

hoặc là

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

Sử dụng giải pháp dạng đóng n - n*P - P*(P+1)/2.



1

Bình thường, 11 byte

Ms+Gm_+GdSH

Một hàm glấy đầu vào npthông qua đối số và in kết quả. Nó có thể được gọi trong mẫu gn p.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

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 byte

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

Kiểm tra nó trên Coliru .


1

Maple, 19 byte

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

Sử dụng:

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

1

Perl 6 , 21 byte

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

Giải trình:

# 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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.