Sonraki numaraları çıkar


27

Açıklama

Bir sonraki P numaralarını bir N numarasından çıkarın. Bir sonraki N sayısı N + 1'dir.

Ne demek istediğimi elde etmek için örneklere bakın.

Örnekler:

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

Giriş:

N : Tam sayı, pozitif, negatif veya 0

P : Tamsayı, pozitif veya 0, negatif değil

Çıktı:

Tamsayı veya Dize, önde gelen 0 izin verilir, izlenen satırsonuna izin verilir

Kurallar:

  • Boşluk yok
  • Bu kod golf, bayt cinsinden en kısa kod kazanır
  • Giriş ve Çıkış açıklandığı gibi olmalıdır

1
Buradaki asıl zorluk üçgen sayılarını hesaplamak.
Peter Taylor

4
Bunun sadece üçgen sayılardan daha fazlası var; başlangıç ​​noktası, sıfır olabilen çıkarma sayısının yanı sıra keyfidir.
JDL

Ayrıca, üçgensel sayılar için gerçek toplamı kapalı formunu kullanmaktan daha kısa yapmak mümkündür, oysa 0'dan N'ye kadar bir aralığı toplayarak yalnızca rastgele çokgen sayıları hesaplayamazsınız. diğer meydan okuma sadece üçgen sayılar istedi.)
Martin Ender

1
için Input: N=0,P=3örneğin, genişletme bazı yabancı çift negatif vardır
turbulencetoo

1
@JDL, "daha adil üçgen sayılar daha" dir kısmı basit bir çarpma geçerli: N * (P-1). Bu neredeyse var tanım içinde önemsiz .
Peter Taylor

Yanıtlar:


15

05AB1E , 5 3 bayt

Adnan sayesinde 2 bayt kaydedildi

Ý+Æ

açıklama

Giriş olarak P sonra N değerini alır.

       # 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, neredeyse çözüm hahamı göndermek istedim. Ayrıca, üç bayt için: Ý+Æ:).
Adnan

Sadece girişi değiştirir ( Pönce gider)
Adnan

@Adnan: 05AB1E'nin sahip olduğunu bile bilmiyordum Ý... Sadece 1 tabanlı bir aralığın var olduğunu düşündüm.
Emigna 11

Hangi karakter kodlamasında sadece 3 Bayt? ;-)
yankee

1
@yankee: CP-1252
Emigna,

16

Python 2, 26 24 23 bayt

-2 @Adnan sayesinde (yerine bayt p*(p+1)/2ile p*-~p/2)
-1 @MartinEnder byte sayesinde (yerine -p*-~p/2ile+p*~p/2

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

Testler ideone üzerinde


11

CJam, 8 bayt

{),f+:-}

Test odası.

Kapalı form çözümünün daha uzun olması çok kötü. : |

açıklama

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

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

Zwei tarafından önerilen
şekilde, körleyerek 1 byte kurtarıldı user81655 ile 1 byte kaydedildi

Ölçek

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


İşlevi körleyerek bir bayt kaydedebilirsiniz. n=>p=>...ve fonksiyonu çağırarakf(n)(p)
Zwei

(n,p)=>n-p*(++p/2+n)C # da çalışacak.
aloisdg diyor Reinstate Monica

1
n-p*(++p/2+n)eşittir n+p*(~p/2-n).
user81655


7

Haskell, 19 18 bayt

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

Önceki 19 baytlık çözümler

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

7

C #, 21 20 bayt

Düzenleme: TheLethalCoder sayesinde bir bayt kaydedildi

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

Çevrimiçi deneyin!

Test vakaları dahil tam kaynak:

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 bayt kaydetmek N=>P=>yerine, kıvrılma özelliğini kullanın(N,P)=>
TheLethalCoder

5

Mathematica, 15 bayt

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

Alan Pve adlandırılmamış bir işlevn bu sırayla onun parametreleri olarak.

Kapalı form çözümünü kullanır n - n*p - p(p+1)/2.


5

Perl, 23 22 bayt

İçin +1 içerir -p

STDIN'in ayrı satırlarına n ve p (bu sırayla) verin:

subtract.pl
2
3
^D

subtract.pl:

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

( Çağrıları ''kaydetmek için tırnak kullanmakla \2 baytlık bir ceza; çünkü birleştirilemez -e)

Aynı fikir ve uzunluk:

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

Şaşırtıcı bir şekilde gerçek hesaplamayı yapmak, doğrudan formülü kullanmaktan daha kısadır (bunlar $gerçekten aritmetik için zararlıdır)


5

C ++, 54 51 bayt

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

[] (int N, int P) {int F; (F = N; P; F - = ++ N, P -); geri dönüş F;}

Ölçek:

#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'ye Hoşgeldiniz! Maalesef, tüm başvuruların programlar veya çağrılabilir işlevler olması gerekir , oysa bu, girişin önceden tanımlanmış değişkenlerde saklandığını ve çıktıyı başka bir yerde sakladığını gösteren bir pasajdır.
Martin Ender

1
@MartinEnder C ++ 'a lambda ile değiştim. Kabul edilebilir mi?
VolAnd

1
Evet, kuzu eti iyi . :)
Martin Ender

Bunu f;g(n,p){f=n;while(p--)f-=++n;return f;}algoritmanızı kullanarak 40 bayt ile C'de yapabilirsiniz
cleblanc

@cleblanc Tip için teşekkürler - global değişken ve açık bir tür olmadan bildirimi gerçekten yararlıdır. Ne yazık ki C99 standardının üstü kapalı kaldıint
VolAnd

4

Pyke, 6 bayt

m+mhs-

Burada dene!

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

4

Brachylog , 19 17 bayt

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

açıklama

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 bayt

:y+s-

Girişler Pve sonra N.

MATL Online'da deneyin!

açıklama

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

Toplu iş, 30 bayt

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

Alır nve pkomut satırı parametreleri olarak ve bir sondaki yeni satır olmadan sonucunu yazdırır.



3

R, 17 14 bayt

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

3 baytlık golf oynadığı için billywob'a teşekkürler. Önceki cevap:

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

1: 0'ın vektöre (1,0) genişlediğini, bu nedenle if (P) koşuluna (veya kullanmak seq_len, ancak daha fazla bayt) ihtiyacımız olduğunu unutmayın. Koşulsuz, P = 0 ise yanlış çıktı alırız.

P sıfır ise, toplam, sıfır olana sum(N+NULL), sonra sum(numeric(0))sıfır olur.


3
Bunun tam bir program olarak nitelendirildiğinden emin değil, çünkü N ve P'nin önceden tanımlanmış olmasını gerektiriyor. Her iki şekilde de kullanmak n-n*p-sum(0:p)daha kısa sürede olur :)
Billywob

Problemi yorumlamam N ve P'nin zaten tanımlanmış olduğu (diğer cevaplar da bu çizgiyi alıyor gibi görünüyor). Golf noktası olsa aldı.
JDL

3
Aksi belirtilmedikçe, başvuruların sadece snippet'lerde değil, tam program veya çağrılabilir işlevlerde olması gerekir . Başka hangi cevaplar değişkenlerin önceden tanımlanmış olduğu varsayımına dayanır?
Martin Ender

Ben bir javascript uzmanı değilim, fakat javascript çözümü değişkenleri önceden tanımlandığı gibi alıyor gibi görünüyor. Bu benim kendi yanlış anlaşmam olabilir. N ve P problemde olduğu gibi seçildiğinden, “aksi belirtildi” olarak aldım. function(N,P){...}N=scan();P=scan();...
sarıcıya

@JDL javascript girişi önceden tanımlanmış değişken almaz
Blue

3

PHP, 33 Bayt

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

PHP Kodu kullanmanız <?phpveya kısa kullanmanız gerektiğini düşünüyorum <?. Lütfen cevabınızı düzenleyin.
Paul Schmitz


Üzgünüm, ne dediğini unut. Bununla ilgili pek çok cevap gördüm ve bu nedenle bunun için bir kural olmadığını ve bunun böyle olmadığını düşündüm. Bunun gibi tartışmalardan kaçınmak için bir tane olmalı.
Paul Schmitz

3

Jöle , 7 bayt

RS+×_×-

Bağımsız Değişkenler TryItOnline'daP, N
Test Ediyor

Nasıl?

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 bytes

Golfed:

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

Ungolfed:

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

Basically I did some math on the formula. The n - p*n part takes care of the all n's in the formula. Then I used a super fun property of summing together linearly increasing set of integers (arithmetic series): I used the sum of first and last integer and then multiply it by set.length / 2 (I also check for the parity and handle it appropriately).

Try it: https://ideone.com/DEd85A


You can remove the space between int n,int p to save a byte. Also, you can change the p%2==0 to p%2<1 to save another byte. -- I wasn't aware you had already posted a Java answer when I posted my shorter variant with for-loop. I like your mathematical formula, though, so +1 from me. :)
Kevin Cruijssen

Great formula! Using p%2>0 and switching the order in the ternary you can save a character.
Frozn

Oh and also p/2 *(p+2) is equal to p*p/2+p
Frozn

Hehe great improvements :) actually this formula comes from a funny anecdote :) @KevinCruijssen nice answer, definitely better than mine :) +1
peech

3

Java 7, 43 40 bytes

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

Java 8, 19 bytes

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

Shamelessly stolen from @JonathanAllan's amazing Python 2 formula.

Original answer (61 60 bytes):

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

Ungolfed & test cases:

Try it here.

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

Output:

-10
-415
42
-6
0

What about this requires Java 7?
mbomb007

@mbomb007 int c(int n,int p){...}. If it would have been Java 8 (or 9) it could have been (n,p)->n-p*n+p*~p/2 (19 bytes)
Kevin Cruijssen

Then do that to save those bytes.
mbomb007




1

Pyth, 11 bytes

Ms+Gm_+GdSH

A function g that takes input of n and p via argument and prints the result. It can be called in the form gn p.

Try it online

How it works

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 bytes

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

Test it on Coliru.


1

Maple, 19 bytes

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

Usage:

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

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

Explanation:

# 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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.