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

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

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


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


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


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


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]

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

        }
    }
}

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.


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)


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

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

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

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

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.



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.


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

Je pense que vous devez utiliser <?phpou abréger <?du code PHP. Veuillez modifier votre réponse.
Paul Schmitz


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)



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


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

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




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

1

C89, 38 , 35 , 33 octets

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

Testez-le sur Coliru .


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

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)
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.