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
Paul Schmitz
sumber
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
Emigna
sumber
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

Jonathan Allan
sumber
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).
Martin Ender
sumber
11

Haskell, 21 byte

a#b=foldl1(-)[a..a+b]
ThreeFx
sumber
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))

Arnauld
sumber
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.
Dennis
sumber
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]
Damien
sumber
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

        }
    }
}
adrianmp
sumber
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.

Martin Ender
sumber
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)

Ton Hospel
sumber
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;
}
VolAnd
sumber
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
1
Ya, lambda baik-baik saja . :)
Martin Ender
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 - ^
Biru
sumber
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
Fatalisasi
sumber
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
Luis Mendo
sumber
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.

Neil
sumber
3

SILOS , 80 byte

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

Cobalah secara online dengan test case:
2,3
100,5
42,0
0,3
0,0

betseg
sumber
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.

JDL
sumber
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));
Jörg Hülsermann
sumber
Saya pikir Anda perlu menggunakan <?phpatau kependekan <?dari PHP-Code. Harap edit jawaban Anda.
Paul Schmitz
php.net/manual/de/features.commandline.usage.php bukan dari baris perintah
Jörg Hülsermann
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)
Jonathan Allan
sumber
3

Pyth - 6 byte

-F}Q+E

Test Suite .

Maltysen
sumber
3

Keempat, 36 byte

Perhitungan sederhana n - (p*n + (p^2+p) / 2)

: f 2dup dup dup * + 2/ -rot * + - ;

Cobalah online

mbomb007
sumber
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

Peech
sumber
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
Kevin Cruijssen
sumber
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.

Martin Ender
sumber
2

php, 38 byte

<?=$argv[1]*(1-$a=$argv[2])-$a++*$a/2;
pengguna59178
sumber
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
TheBikingViking
sumber
1

C89, 38 , 35 , 33 byte

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

Uji di Coliru .

YSC
sumber
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
DSkoog
sumber
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)
}
Brad Gilbert b2gills
sumber