Kurangi angka berikutnya


27

Deskripsi

Kurangi angka P berikutnya dari angka N. Angka N berikutnya adalah N +1.

Lihatlah contoh-contoh untuk mendapatkan apa yang saya maksud.

Contoh:

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

Memasukkan:

N : Integer, positif, negatif atau 0

P : Integer, positif atau 0, tidak negatif

Keluaran:

Integer atau String, memimpin 0 diizinkan, mengikuti baris baru diizinkan

Aturan:

  • Tidak ada celah
  • Ini adalah kode-golf, jadi kode terpendek dalam byte menang
  • Input dan Output harus seperti yang dijelaskan

1
Tantangan penting di sini adalah menghitung angka segitiga.
Peter Taylor

4
Ada lebih dari ini hanya angka segitiga; titik awal adalah arbitrer serta jumlah pengurangan, yang mungkin nol.
JDL

Juga, untuk bilangan segitiga ada kemungkinan bahwa melakukan penjumlahan aktual lebih pendek daripada menggunakan formulir tertutup, sedangkan Anda tidak bisa hanya menghitung bilangan poligon sewenang-wenang dengan menjumlahkan rentang dari 0 hingga N. (Saya akan setuju dengan suara dekat jika tantangan lain hanya meminta angka segitiga.)
Martin Ender

1
sebagai Input: N=0,P=3contoh, ekspansi Anda memiliki beberapa negatif ganda
turbulencetoo

1
@JDL, bagian yang "lebih dari angka segitiga hanya" adalah perkalian sederhana: N * (P-1). Itu hampir definisi dari sepele .
Peter Taylor

Jawaban:


15

05AB1E , 5 3 byte

Disimpan 2 byte berkat Adnan

Ý+Æ

Penjelasan

Mengambil P lalu N sebagai input.

       # 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, saya hampir ingin memposting solusi saya haha. Juga, selama tiga byte: Ý+Æ:).
Adnan

Ini hanya mengalihkan input ( Pmasuk dulu)
Adnan

@ Adnan: Aku bahkan tidak tahu 05AB1E punya Ý... Saya pikir hanya ada rentang 1 berbasis.
Emigna

Di mana pengkodean karakter yang hanya 3 Bytes? ;-)
yankee

1
@Yankee: CP-1252
Emigna

16

Python 2, 26 24 23 byte

-2 byte terima kasih kepada @Adnan (ganti p*(p+1)/2dengan p*-~p/2)
-1 byte terima kasih ke @MartinEnder (ganti -p*-~p/2dengan+p*~p/2

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

Tes ada di ideone


11

CJam, 8 byte

{),f+:-}

Suite uji.

Sayang sekali bahwa solusi bentuk tertutup lebih lama. : |

Penjelasan

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

Disimpan 1 byte oleh currying, seperti yang disarankan oleh Zwei
1 byte Disimpan berkat pengguna81655

Uji

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


Anda dapat menyimpan byte dengan menjelajah fungsi. n=>p=>...dan memanggil fungsi denganf(n)(p)
Zwei

(n,p)=>n-p*(++p/2+n)juga akan bekerja di C #.
aloisdg berkata Reinstate Monica

1
n-p*(++p/2+n)setara dengan n+p*(~p/2-n).
user81655

8

Jelly , 4 byte

r+_/

Cobalah online!

Bagaimana itu bekerja

r+_/  Main link. Arguments: n, p

 +    Yield n+p.
r     Range; yield [n, ..., n+p].
  _/  Reduce by subtraction.

7

Haskell, 19 18 byte

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

Solusi 19 byte sebelumnya

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

7

C #, 21 20 byte

Sunting: Disimpan satu byte berkat TheLethalCoder

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

Cobalah online!

Sumber lengkap, termasuk uji kasus:

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
gunakan currying N=>P=>alih-alih (N,P)=>menyimpan 1 byte
TheLethalCoder

5

Mathematica, 15 byte

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

Fungsi tanpa nama yang menerima Pdan nsebagai parameternya dalam urutan itu.

Menggunakan solusi bentuk tertutup n - n*p - p(p+1)/2.


5

Perl, 23 22 byte

Termasuk +1 untuk -p

Berikan n dan p (dalam urutan itu) pada baris STDIN yang terpisah:

subtract.pl
2
3
^D

subtract.pl:

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

(menggunakan ''tanda kutip untuk menyimpan \faktur penalti 2 byte karena tidak dapat digabungkan dengan -e)

Ide dan panjang yang sama:

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

Anehnya melakukan perhitungan sebenarnya lebih pendek daripada menggunakan rumus langsung (ini $benar-benar menyakitkan untuk aritmatika)


5

C ++, 54 51 byte

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

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

Uji:

#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
Selamat datang di PPCG! Sayangnya, semua pengiriman harus berupa program atau fungsi yang dapat dipanggil , sedangkan ini hanya potongan yang mengasumsikan input disimpan dalam variabel yang telah ditentukan dan menyimpan output di yang lain.
Martin Ender

1
@ MartinEnder Saya telah berubah menjadi C ++ dengan lambda. Apakah ini dapat diterima?
VolAnd


Anda dapat melakukan ini dalam C dengan 40 byte f;g(n,p){f=n;while(p--)f-=++n;return f;}menggunakan algoritme Anda
cleblanc

@cleblanc Terima kasih atas tipnya - variabel global dan deklarasi tanpa tipe eksplisit sangat berguna. Sayang sekali bahwa standar C99 dihapus implisitint
VolAnd

4

Pyke, 6 byte

m+mhs-

Coba di sini!

m+     -    map(range(input_2), +input_1)
  mh   -   map(^, +1)
    s  -  sum(^)
     - - input_1 - ^

4

Brachylog , 19 17 byte

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

Penjelasan

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-

Inputnya Plalu N.

Cobalah di MATL Online!

Penjelasan

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

Batch, 30 byte

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

Mengambil ndan psebagai parameter baris perintah dan mencetak hasilnya tanpa baris baru.



3

R, 17 14 byte

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

Terima kasih kepada billywob untuk bermain golf 3 byte. Jawaban sebelumnya:

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

Perhatikan bahwa 1: 0 meluas ke vektor (1,0) sehingga kita memerlukan kondisi if (P) (atau menggunakan seq_len, tetapi itu lebih banyak byte). Tanpa syarat, kita akan mendapatkan output yang salah jika P = 0.

Jika P adalah nol, maka penjumlahannya menjadi sum(N+NULL), kemudian ke sum(numeric(0)), yaitu nol.


3
Tidak yakin apakah ini memenuhi syarat sebagai program lengkap karena mengharuskan N dan P sudah ditentukan. Either way menggunakan n-n*p-sum(0:p)akan lebih pendek lagi :)
Billywob

Interpretasi saya tentang masalahnya adalah bahwa N dan P sudah didefinisikan (jawaban lain tampaknya mengambil garis ini juga). Poin golf diambil.
JDL

3
Kecuali ditentukan sebaliknya, pengiriman harus berupa program lengkap atau fungsi yang dapat dipanggil, bukan hanya cuplikan. Jawaban lain mana yang membuat asumsi bahwa variabel sudah ditentukan?
Martin Ender

Saya bukan ahli javascript, tetapi sepertinya solusi javascript mengambil variabel seperti yang sudah ditentukan. Itu bisa jadi kesalahpahaman saya sendiri. Karena N dan P dinamai demikian dalam masalah, saya menganggapnya "ditentukan sebaliknya". Jika tidak, maka kita perlu pembungkus function(N,P){...}atauN=scan();P=scan();...
JDL

@JDL entri javascript tidak mengambil variabel yang telah ditentukan
Biru

3

PHP, 33 Bytes

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

Saya pikir Anda perlu menggunakan <?phpatau kependekan <?dari PHP-Code. Harap edit jawaban Anda.
Paul Schmitz


Maaf, lupakan apa yang dikatakan. Saya telah melihat banyak jawaban dengan ini, dan karena itu berpikir, bahwa ada aturan untuk itu, yang tidak demikian. Harus ada satu, untuk menghindari diskusi seperti ini.
Paul Schmitz

3

Jelly , 7 byte

RS+×_×-

Argumen mengujinyaP, N
di TryItOnline

Bagaimana?

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

Golf:

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

Tidak Disatukan:

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

Pada dasarnya saya melakukan beberapa matematika pada formula. Bagian n - p*nmenangani semua ndalam formula. Kemudian saya menggunakan properti super menyenangkan untuk menjumlahkan secara bersamaan peningkatan himpunan bilangan bulat (seri aritmatika): Saya menggunakan jumlah bilangan bulat pertama dan terakhir dan kemudian mengalikannya dengan set.length / 2(saya juga memeriksa paritas dan menanganinya dengan tepat).

Cobalah: https://ideone.com/DEd85A


Anda dapat menghapus spasi di antara int n,int puntuk menyimpan byte. Anda juga dapat mengubah p%2==0ke p%2<1untuk menyimpan byte lain. - Saya tidak tahu Anda sudah memposting jawaban Java ketika saya memposting varian pendek saya dengan for-loop . Saya suka rumus matematika Anda, jadi +1 dari saya. :)
Kevin Cruijssen

Formula hebat! Menggunakan p%2>0dan mengubah urutan di ternary Anda dapat menyimpan karakter.
Frozn

Oh dan juga p/2 *(p+2)sama denganp*p/2+p
Frozn

Hehe perbaikan hebat :) sebenarnya rumus ini berasal dari anekdot lucu :) @KevinCruijssen jawaban yang bagus, pasti lebih baik daripada milik saya :) +1
peech

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

Tanpa malu-malu dicuri dari formula Python 2 @JonathanAllan yang menakjubkan .

Jawaban asli ( 61 60 byte):

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

Kasus yang tidak disatukan & uji:

Coba di sini.

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

Keluaran:

-10
-415
42
-6
0

Bagaimana dengan ini membutuhkan Java 7?
mbomb007

@ mbomb007 int c(int n,int p){...}. Jika itu adalah Java 8 (atau 9) itu bisa saja (n,p)->n-p*n+p*~p/2( 19 byte )
Kevin Cruijssen

Kemudian lakukan itu untuk menyimpan byte tersebut.
mbomb007


2

Labirin , 15 byte

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

atau

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

Menggunakan solusi bentuk tertutup n - n*P - P*(P+1)/2.



1

Pyth, 11 byte

Ms+Gm_+GdSH

Fungsi gyang mengambil input dari ndan pmelalui argumen dan mencetak hasilnya. Itu bisa disebut dalam bentuk gn p.

Cobalah online

Bagaimana itu bekerja

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

Uji di Coliru .


1

Maple, 19 byte

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

Pemakaian:

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

Penjelasan:

# 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)
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.