Soustrayez les nombres suivants

27

La description

Soustrayez les nombres P suivants d'un nombre N. Le nombre suivant de N est N + 1.

Regardez les exemples pour comprendre ce que je veux dire.

Exemples:

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

Contribution:

N : Entier, positif, négatif ou 0

P : Entier, positif ou 0, non négatif

Sortie:

Entier ou chaîne, 0 en tête autorisé, retour à la ligne autorisé

Règles:

  • Pas de failles
  • C'est le code-golf, donc le code le plus court en octets gagne
  • L'entrée et la sortie doivent être conformes à la description
Paul Schmitz
la source
1
Le défi essentiel ici est de calculer les nombres triangulaires.
Peter Taylor
4
Il y a plus que des nombres triangulaires; le point de départ est arbitraire ainsi que le nombre de soustractions, qui peut être nul.
JDL
En outre, pour les nombres triangulaires, il est possible que la somme réelle soit plus courte que l'utilisation du formulaire fermé, alors que vous ne pouvez pas simplement calculer des nombres polygonaux arbitraires en additionnant une plage de 0 à N. (Je serais d'accord avec le vote serré si le un autre défi vient de demander des nombres triangulaires.)
Martin Ender
1
pour l' Input: N=0,P=3exemple, votre expansion comporte des doubles négatifs superflus
turbulencetoo
1
@JDL, la partie qui est « plus que des chiffres seulement triangle » est une simple multiplication: N * (P-1). C'est pratiquement la définition de trivial .
Peter Taylor

Réponses:

15

05AB1E , 5 3 octets

Enregistré 2 octets grâce à Adnan

Ý+Æ

Explication

Prend P puis N comme entrée.

       # 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
la source
4
Ahhh, je voulais presque publier ma solution haha. Aussi, pour trois octets: Ý+Æ:).
Adnan
Il ne fait que commuter l'entrée ( Pva en premier)
Adnan
@Adnan: Je ne savais même pas que 05AB1E avait Ý... Je pensais qu'il n'existait qu'une gamme basée sur 1.
Emigna
Dans quel codage de caractères est-ce seulement 3 octets? ;-)
yankee
1
@yankee: CP-1252
Emigna
16

Python 2, 26 24 23 octets

-2 octets grâce à @Adnan (remplacer p*(p+1)/2par p*-~p/2)
-1 octets grâce à @MartinEnder (remplacer -p*-~p/2par+p*~p/2

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

Les tests sont sur idéone

Jonathan Allan
la source
11

CJam, 8 octets

{),f+:-}

Suite de tests.

Dommage que la solution sous forme fermée soit plus longue. : |

Explication

),  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
la source
11

Haskell, 21 octets

a#b=foldl1(-)[a..a+b]
ThreeFx
la source
10

Javascript (ES6), 20 19 18 octets

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

1 octet enregistré par curry, comme suggéré par Zwei
1 octet enregistré grâce à user81655

Tester

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
la source
Vous pouvez enregistrer un octet en curry la fonction. n=>p=>...et appeler la fonction avecf(n)(p)
Zwei
(n,p)=>n-p*(++p/2+n)fonctionnera également en C #.
aloisdg dit Reinstate Monica
1
n-p*(++p/2+n)est équivalent à n+p*(~p/2-n).
user81655
8

Gelée , 4 octets

r+_/

Essayez-le en ligne!

Comment ça marche

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

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

Haskell, 19 18 octets

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

Solutions précédentes de 19 octets

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

C #, 21 20 octets

Edit: sauvé un octet grâce à TheLethalCoder

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

Essayez-le en ligne!

Source complète, y compris les cas de test:

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
la source
1
utiliser le curry N=>P=>au lieu d' (N,P)=>enregistrer 1 octet
TheLethalCoder
5

Mathematica, 15 octets

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

Une fonction sans nom qui reçoit Pet ncomme ses paramètres dans cet ordre.

Utilise la solution de formulaire fermé n - n*p - p(p+1)/2.

Martin Ender
la source
5

Perl, 23 22 octets

Comprend +1 pour -p

Donnez n et p (dans cet ordre) sur des lignes distinctes de STDIN:

subtract.pl
2
3
^D

subtract.pl:

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

(utiliser des ''guillemets pour enregistrer l' \invoque une pénalité de 2 octets car il ne peut pas être combiné avec -e)

Même idée et même durée:

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

Étonnamment, faire le calcul réel est plus court que d'utiliser la formule directe (c'est $vraiment mal pour l'arithmétique)

Ton Hospel
la source
5

C ++, 54 51 octets

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

Tester:

#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
la source
2
Bienvenue chez PPCG! Malheureusement, toutes les soumissions doivent être des programmes ou des fonctions appelables , alors que ce n'est qu'un extrait de code qui suppose que l'entrée est stockée dans des variables prédéfinies et stocke la sortie dans une autre.
Martin Ender
1
@MartinEnder J'ai changé pour C ++ avec lambda. Est ce acceptable?
VolAnd
1
Oui, les lambdas vont bien . :)
Martin Ender
Vous pouvez le faire en C avec 40 octets en f;g(n,p){f=n;while(p--)f-=++n;return f;}utilisant votre algorithme
cleblanc
@cleblanc Merci pour le conseil - la variable globale et la déclaration sans type explicite sont vraiment utiles. Quel dommage que la norme C99 ait été supprimée implicitementint
VolAnd
4

Pyke, 6 octets

m+mhs-

Essayez-le ici!

m+     -    map(range(input_2), +input_1)
  mh   -   map(^, +1)
    s  -  sum(^)
     - - input_1 - ^
Bleu
la source
4

Brachylog , 19 17 octets

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

Explication

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
Fatalize
la source
4

MATL , 5 octets

:y+s-

Les entrées sont Pet puis N.

Essayez-le sur MATL Online!

Explication

:     % 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
la source
3

Lot, 30 octets

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

Prend net pcomme paramètres de ligne de commande et imprime le résultat sans retour à la ligne.

Neil
la source
3

SILOS , 80 octets

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

Essayez-le en ligne avec des cas de test:
2,3
100,5
42,0
0,3
0,0

betseg
la source
3

R, 17 14 octets

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

Merci à billywob pour avoir joué au golf 3 octets. Réponse précédente:

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

Notez que 1: 0 s'étend au vecteur (1,0), nous avons donc besoin de la condition if (P) (ou à utiliser seq_len, mais c'est plus d'octets). Sans la condition, nous obtiendrions la mauvaise sortie si P = 0.

Si P est nul, alors la somme se développe en sum(N+NULL), puis en sum(numeric(0)), qui est zéro.

JDL
la source
3
Je ne sais pas si cela peut être considéré comme un programme complet car il nécessite que N et P soient déjà définis. Dans tous les cas, l'utilisation n-n*p-sum(0:p)serait de toute façon plus courte :)
Billywob
Mon interprétation du problème est que N et P sont déjà définis (d'autres réponses semblent également suivre cette ligne). Point de golf pris cependant.
JDL
3
Sauf indication contraire, les soumissions doivent être des programmes complets ou des fonctions appelables, pas seulement des extraits. Quelles autres réponses supposent que les variables sont déjà définies?
Martin Ender
Je ne suis pas un expert en javascript, mais il semble que la solution javascript prenne les variables comme déjà définies. Cela pourrait être mon propre malentendu cependant. Puisque N et P ont été nommés comme tels dans le problème, j'ai pris cela comme "spécifié autrement". Sinon, nous avons besoin d'un wrapper function(N,P){...}ouN=scan();P=scan();...
JDL
@JDL l'entrée javascript ne prend pas variable prédéfinie
Blue
3

PHP, 33 octets

$n-=$n*$p+array_sum(range(0,$p));
Jörg Hülsermann
la source
Je pense que vous devez utiliser <?phpou abréger <?du code PHP. Veuillez modifier votre réponse.
Paul Schmitz
php.net/manual/de/features.commandline.usage.php ne provient pas de la ligne de commande
Jörg Hülsermann
Désolé, oublie ce qui a été dit. J'ai vu de nombreuses réponses à cela, et j'ai donc pensé qu'il y avait une règle pour cela, ce qui n'est pas le cas. Il devrait y en avoir un, pour éviter des discussions comme celle-ci.
Paul Schmitz du
3

Gelée , 7 octets

RS+×_×-

Les arguments sont le P, N
tester sur TryItOnline

Comment?

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
la source
3

Java, 67 , 63 octets

Golfé:

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

Non golfé:

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

Fondamentalement, j'ai fait quelques calculs sur la formule. La n - p*npièce s'occupe de tout ndans la formule. Ensuite, j'ai utilisé une propriété super amusante de sommer ensemble un ensemble croissant linéairement d'entiers (séries arithmétiques): j'ai utilisé la somme du premier et du dernier entier, puis set.length / 2je l'ai multipliée par (je vérifie également la parité et la gère de manière appropriée).

Essayez-le: https://ideone.com/DEd85A

peech
la source
Vous pouvez supprimer l'espace entre int n,int ppour enregistrer un octet. En outre, vous pouvez changer la p%2==0pour p%2<1sauver un autre octet. - Je ne savais pas que vous aviez déjà posté une réponse Java lorsque j'ai posté ma variante plus courte avec for-loop . J'aime bien ta formule mathématique, alors +1 pour moi. :)
Kevin Cruijssen
Super formule! En utilisant p%2>0et en changeant l'ordre dans le ternaire, vous pouvez enregistrer un caractère.
Frozn
Oh et p/2 *(p+2)est également égal àp*p/2+p
Frozn
Hehe grandes améliorations :) en fait cette formule vient d'une anecdote drôle :) @KevinCruijssen belle réponse, certainement mieux que la mienne :) +1
peech
3

Java 7, 43 40 octets

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

Java 8, 19 octets

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

Sans vergogne volé de l'incroyable formule Python 2 de @JonathanAllan .

Réponse originale ( 61 60 octets):

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

Cas non testés et testés:

Essayez-le ici.

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

Sortie:

-10
-415
42
-6
0
Kevin Cruijssen
la source
Qu'en est-il de cela nécessite Java 7?
mbomb007
@ mbomb007 int c(int n,int p){...}. S'il s'agissait de Java 8 (ou 9), il aurait pu l'être (n,p)->n-p*n+p*~p/2( 19 octets )
Kevin Cruijssen
Faites ensuite cela pour enregistrer ces octets.
mbomb007
2

Labyrinthe , 15 octets

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

ou

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

Utilise la solution de formulaire fermé n - n*P - P*(P+1)/2.

Martin Ender
la source
2

php, 38 octets

<?=$argv[1]*(1-$a=$argv[2])-$a++*$a/2;
user59178
la source
1

Pyth, 11 octets

Ms+Gm_+GdSH

Une fonction gqui prend en entrée net pvia un argument et imprime le résultat. Il peut être appelé sous la formegn p .

Essayez-le en ligne

Comment ça marche

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
la source
1

C89, 38 , 35 , 33 octets

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

Testez-le sur Coliru .

YSC
la source
1

Érable, 19 octets

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
DSkoog
la source
1

Perl 6 , 21 octets

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

Explication:

# 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
la source