次の数字を引く


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
これには、単なる三角形の数以上のものがあります。開始点は任意であり、減算の数もゼロである場合があります。
JDL

また、三角形の数については、実際の合計を行うことは閉じた形式を使用するよりも短い可能性がありますが、0からNの範囲を合計するだけで任意の多角形の数を計算することはできません(他の課題は、三角形の数値を要求しただけです。)
マーティンエンダー

1
以下のためにInput: N=0,P=3たとえば、あなたの拡大は、いくつかの余分な二重のネガがある
turbulencetoo

1
@JDL、「単なる三角形の数以上」の部分は単純な乗算ですN * (P-1)。それが事実上、些細なことの定義です。
ピーターテイラー

回答:


15

05AB1E5 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バイトの場合:Ý+Æ:)。
アドナン

入力のみを切り替えます(P最初に行きます)
Adnan

@Adnan:05AB1Eの存在すら知らなかったÝ... 1ベースの範囲しか存在しないと思った。
エミグナ

どの文字エンコードで3バイトだけですか?;-)
ヤンキー

1
@ヤンキー:CP-1252
エミグナ

16

Python 2、26 24 23バイト

-2 @Adnanおかげ(置き換えるバイトp*(p+1)/2p*-~p/2
-1 @MartinEnderにバイトおかげ(置き換える-p*-~p/2+p*~p/2

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

テストはideoneで行われています


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

Javascript(ES6)、20 19 18バイト

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

Zweiが示唆するように、カリー化によって
1バイトを保存しましたuser81655のおかげで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)
ツヴァイ

(n,p)=>n-p*(++p/2+n)C#でも動作します。
aloisdgは回復モニカ言う

1
n-p*(++p/2+n)はと同等n+p*(~p/2-n)です。
user81655


7

Haskell、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&

パラメーターをその順序で受け取りPnその順序で受け取る名前のない関数。

閉じた形式のソリューションを使用しますn - n*p - p(p+1)/2


5

Perl、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へようこそ!残念ながら、すべてのサブミッションはプログラムまたは呼び出し可能関数である必要がありますが、これは入力が事前定義された変数に保存され、出力が別の変数に保存されることを前提とする単なるスニペットです。
マーティンエンダー

1
@MartinEnder私はラムダ付きのC ++に変更しました。受け入れられますか?
VolAnd


f;g(n,p){f=n;while(p--)f-=++n;return f;}アルゴリズムを使用して40バイトでCでこれを行うことができます
-cleblanc

@cleblancヒントをありがとう-明示的な型のないグローバル変数と宣言は本当に便利です。C99標準では、暗黙的な削除されたことを残念int
Volandの


4

Brachylog19 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
特に指定がない限り、提出物はスニペットだけでなく、完全なプログラムまたは呼び出し可能な関数である必要があります。変数がすでに定義されていると仮定する他の答えはどれですか?
マーティンエンダー

私はJavaScriptの専門家ではありませんが、JavaScriptソリューションは既に定義されている変数を使用しているようです。しかし、それは私自身の誤解かもしれません。NとPは問題の中でそのように名付けられたので、私はそれを「別の方法で指定された」と考えました。そうでない場合は、ラッパーfunction(N,P){...}またはN=scan();P=scan();...
JDL

@JDL javascriptエントリは事前定義された変数を取りません
Blue

3

PHP、33バイト

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

私はあなたが使用する必要があると思う<?phpか短い<?PHP-コードのために。回答を編集してください。
ポールシュミッツ


申し訳ありませんが、言ったことは忘れてください。私はこれについて多くの答えを見てきました。したがって、そのためのルールがあると考えましたが、そうではありません。このような議論を避けるために、あるべきです。
ポールシュミッツ

3

ゼリー、7 バイト

RS+×_×-

引数はP, N
テストする TryItOnlineでます

どうやって?

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バイト

ゴルフ:

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、式のallを処理します。次に、線形に増加する整数セット(算術級数)を合計するという非常に楽しいプロパティを使用しました。最初と最後の整数の合計を使用し、それを乗算しますset.length / 2(パリティもチェックして適切に処理します)。

試してください:https : //ideone.com/DEd85A


間のスペースを削除してint n,int p、バイトを保存できます。また、p%2==0to p%2<1を変更して別のバイトを保存できます。-for-loopを使用した短いバージョンを投稿したとき、Javaの回答を既に投稿していたことを知りませんでした。私はあなたの数式が好きなので、私から+1。:)
ケビンクルーイッセン16

素晴らしいフォーミュラ!p%2>03進数の順序を使用して切り替えると、キャラクターを保存できます。
Frozn

ああ、またp/2 *(p+2)等しいp*p/2+p
-Frozn

Heheの大きな改善:)実際、この式は面白い逸話から来ています:) @KevinCruijssenいい答え、間違いなく私のものよりも良いです:) +1
peech

3

Java 7、43 40バイト

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

Java 8、19バイト

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

@JonathanAllanの驚くべきPython 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/219バイト
ケビンCruijssen

次に、それらのバイトを保存するためにそれを行います。
mbomb007




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

メープル、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

Perl 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.