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

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

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


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


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


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


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]

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

        }
    }
}

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.


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)


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

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


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

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

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

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.



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.


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

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)



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


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

¿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




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


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

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)
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.