Resta los siguientes números

27

Descripción

Resta los siguientes números P de un número N. El siguiente número de N es N + 1.

Mira los ejemplos para entender lo que quiero decir.

Ejemplos:

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

Entrada:

N : entero, positivo, negativo o 0

P : entero, positivo o 0, no negativo

Salida:

Entero o cadena, 0 inicial permitido, nueva línea final permitida

Reglas:

  • Sin lagunas
  • Este es el código de golf, por lo que gana el código más corto en bytes
  • La entrada y la salida deben ser como se describe
Paul Schmitz
fuente
1
El desafío esencial aquí es calcular números de triángulos.
Peter Taylor
44
Hay más en esto que solo números triangulares; el punto de inicio es arbitrario, así como el número de sustracciones, que puede ser cero.
JDL
Además, para los números triangulares es posible que hacer la suma real sea más corto que usar la forma cerrada, mientras que no se puede calcular números poligonales arbitrarios sumando un rango de 0 a N. (Estoy de acuerdo con el voto cerrado si el otro desafío solo pidió números triangulares.)
Martin Ender
1
por Input: N=0,P=3ejemplo, su expansión tiene algunos negativos dobles extraños
turbulencetoo
1
@JDL, la parte que es "más que números triangulares sólo" es una simple multiplicación: N * (P-1). Esa es prácticamente la definición de trivial .
Peter Taylor

Respuestas:

15

05AB1E , 5 3 bytes

Guardado 2 bytes gracias a Adnan

Ý+Æ

Explicación

Toma P y luego N como entrada.

       # 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
fuente
44
Ahhh, casi quería publicar mi solución jaja. Además, para tres bytes: Ý+Æ:).
Adnan
Solo cambia la entrada ( Pva primero)
Adnan
@Adnan: Ni siquiera sabía que 05AB1E tenía Ý... pensé que solo existía un rango basado en 1.
Emigna
¿En qué codificación de caracteres son solo 3 bytes? ;-)
yankee
1
@yankee: CP-1252
Emigna
16

Python 2, 26 24 23 bytes

-2 bytes gracias a @Adnan (reemplazar p*(p+1)/2con p*-~p/2)
-1 byte gracias a @MartinEnder (reemplazar -p*-~p/2con+p*~p/2

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

Las pruebas están en ideone

Jonathan Allan
fuente
11

CJam, 8 bytes

{),f+:-}

Banco de pruebas.

Lástima que la solución de forma cerrada sea más larga. : |

Explicación

),  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
fuente
11

Haskell, 21 bytes

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

Javascript (ES6), 20 19 18 bytes

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

Guardado 1 byte al curry, como sugiere Zwei
Guardado 1 byte gracias al usuario 81655

Prueba

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
fuente
Puede guardar un byte al cursar la función. n=>p=>...y llamando a la función conf(n)(p)
Zwei
(n,p)=>n-p*(++p/2+n)También funcionará en C #.
aloisdg dice Reinstate Monica
1
n-p*(++p/2+n)es equivalente a n+p*(~p/2-n).
user81655
8

Jalea , 4 bytes

r+_/

Pruébalo en línea!

Cómo funciona

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

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

Haskell, 19 18 bytes

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

Soluciones anteriores de 19 bytes

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

C #, 21 20 bytes

Editar: guardado un byte gracias a TheLethalCoder

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

Pruébalo en línea!

Fuente completa, incluidos los casos de prueba:

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
fuente
1
usar curry en N=>P=>lugar de (N,P)=>guardar 1 byte
TheLethalCoder
5

Mathematica, 15 bytes

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

Una función sin nombre que recibe P y ncomo sus parámetros en ese orden.

Utiliza la solución de forma cerrada n - n*p - p(p+1)/2.

Martin Ender
fuente
5

Perl, 23 22 bytes

Incluye +1 para -p

Dé nyp (en ese orden) en líneas separadas de STDIN:

subtract.pl
2
3
^D

subtract.pl:

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

(usando ''comillas para guardar los \invoca una penalización de 2 bytes porque no se puede combinar con -e)

Misma idea y longitud:

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

Sorprendentemente, hacer el cálculo real es más corto que usar la fórmula directa (estos son $realmente perjudiciales para la aritmética)

Ton Hospel
fuente
5

C ++, 54 51 bytes

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

Prueba:

#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
fuente
2
Bienvenido a PPCG! Desafortunadamente, todas las presentaciones deben ser programas o funciones invocables , mientras que esto es solo un fragmento que asume que la entrada se almacena en variables predefinidas y almacena la salida en otra.
Martin Ender
1
@ MartinEnder He cambiado a C ++ con lambda. Es aceptable?
VolAnd
1
Sí, las lambdas están bien . :)
Martin Ender
Puede hacer esto en C con 40 bytes f;g(n,p){f=n;while(p--)f-=++n;return f;}usando su algoritmo
cleblanc
@cleblanc Gracias por la sugerencia: la variable global y la declaración sin un tipo explícito son realmente útiles. Qué lástima que el estándar C99 eliminó implícitoint
VolAnd
4

Pyke, 6 bytes

m+mhs-

Pruébalo aquí!

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

Brachylog , 19 17 bytes

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

Explicación

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
Fatalizar
fuente
4

MATL , 5 bytes

:y+s-

Las entradas son Py luego N.

¡Pruébalo en MATL Online!

Explicación

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

Lote, 30 bytes

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

Toma ny pcomo parámetros de línea de comandos e imprime el resultado sin una nueva línea final.

Neil
fuente
3

SILOS , 80 bytes

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

Pruébelo en línea con casos de prueba:
2,3
100,5
42,0
0,3
0,0

Betseg
fuente
3

R, 17 14 bytes

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

Gracias a billywob por jugar al golf 3 bytes. Respuesta anterior:

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

Tenga en cuenta que 1: 0 se expande al vector (1,0), por lo que necesitamos la condición if (P) (o para usar seq_len , pero eso es más bytes). Sin la condición, obtendríamos la salida incorrecta si P = 0.

Si P es cero, entonces la suma se expande a sum(N+NULL), entonces a sum(numeric(0)), que es cero.

JDL
fuente
3
No estoy seguro si esto califica como un programa completo porque requiere que N y P ya estén definidos. De cualquier manera, el uso n-n*p-sum(0:p)sería más corto de todos modos :)
Billywob
Mi interpretación del problema es que N y P ya están definidos (otras respuestas parecen tomar esta línea también). Punto de golf tomado sin embargo.
JDL
3
A menos que se especifique lo contrario, los envíos deben ser programas completos o funciones invocables, no solo fragmentos. ¿Qué otras respuestas suponen que las variables ya están definidas?
Martin Ender
No soy un experto en JavaScript, pero parece que la solución de JavaScript está tomando las variables como ya están definidas. Sin embargo, ese podría ser mi propio malentendido. Como N y P fueron nombrados como tales en el problema, lo tomé como "especificado de otra manera". Si no, entonces necesitamos un envoltorio function(N,P){...}oN=scan();P=scan();...
JDL
@JDL la entrada de JavaScript no toma una variable predefinida
Azul
3

PHP, 33 bytes

$n-=$n*$p+array_sum(range(0,$p));
Jörg Hülsermann
fuente
Creo que necesita usar <?phpo abreviar <?PHP-Code. Por favor edite su respuesta.
Paul Schmitz
php.net/manual/de/features.commandline.usage.php no desde la línea de comandos
Jörg Hülsermann
Lo siento, olvida lo que dijo. He visto muchas respuestas con esto, y por lo tanto pensé que hay una regla para eso, que no es el caso. Debería haber uno, para evitar discusiones como esta.
Paul Schmitz
3

Jalea , 7 bytes

RS+×_×-

Los argumentos son PruébeloP, N
en TryItOnline

¿Cómo?

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
fuente
3

Adelante, 36 bytes

Cálculo simple de n - (p*n + (p^2+p) / 2)

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

Pruébalo en línea

mbomb007
fuente
3

Java, 67 , 63 bytes

Golfizado:

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

Sin golf:

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

Básicamente hice algo de matemática en la fórmula. La n - p*nparte se encarga de todo nen la fórmula. Luego usé una propiedad súper divertida de sumar juntos un conjunto de números enteros que aumentan linealmente (series aritméticas): utilicé la suma del primer y último número entero y luego lo multipliqué porset.length / 2 (también verifico la paridad y la manejo adecuadamente).

Pruébelo: https://ideone.com/DEd85A

peech
fuente
Puede eliminar el espacio entre int n,int ppara guardar un byte. Además, puede cambiar p%2==0a p%2<1para guardar otro byte. - No sabía que ya había publicado una respuesta Java cuando publiqué mi variante más corta con for-loop . Sin embargo, me gusta tu fórmula matemática, así que +1 de mi parte. :)
Kevin Cruijssen
Gran formula! Usando p%2>0y cambiando el orden en el ternario puede guardar un carácter.
Frozn
Ah y también p/2 *(p+2)es igual ap*p/2+p
Frozn
Jeje grandes mejoras :) en realidad esta fórmula proviene de una anécdota divertida :) @KevinCruijssen buena respuesta, definitivamente mejor que la mía :) +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

Descaradamente robado de la increíble fórmula Python 2 de @JonathanAllan .

Respuesta original ( 61 60 bytes):

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

Sin golf y casos de prueba:

Pruébalo aquí

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

Salida:

-10
-415
42
-6
0
Kevin Cruijssen
fuente
¿Qué pasa con esto requiere Java 7?
mbomb007
@ mbomb007 int c(int n,int p){...}. Si hubiera sido Java 8 (o 9) podría haber sido (n,p)->n-p*n+p*~p/2( 19 bytes )
Kevin Cruijssen
Luego haz eso para guardar esos bytes.
mbomb007
2

Laberinto , 15 bytes

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

o

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

Utiliza la solución de forma cerrada n - n*P - P*(P+1)/2.

Martin Ender
fuente
2

php, 38 bytes

<?=$argv[1]*(1-$a=$argv[2])-$a++*$a/2;
usuario59178
fuente
1

Pyth, 11 bytes

Ms+Gm_+GdSH

Una función gque toma entrada de ny pvía argumento e imprime el resultado. Se puede llamar en el formulario gn p.

Pruébalo en línea

Cómo funciona

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
fuente
1

Arce, 19 bytes

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

Uso:

> f:=(n,p)->n-sum(i,i=n+1..n+p);
> f(2, 3);
  -10
> f(100,5);
  -415
> f(42,0);
  42
DSkoog
fuente
1

Perl 6 , 21 bytes

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

Explicación:

# 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
fuente