Sottrai i numeri successivi


27

Descrizione

Sottrai i numeri P successivi da un numero N. Il prossimo numero di N è N + 1.

Guarda gli esempi per capire cosa intendo.

Esempi:

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

Ingresso:

N : intero, positivo, negativo o 0

P : intero, positivo o 0, non negativo

Produzione:

Numero intero o stringa, iniziale 0 consentita, trascinamento della nuova riga consentita

Regole:

  • Nessuna scappatoia
  • Questo è code-golf, quindi vince il codice più breve in byte
  • Input e Output devono essere come descritti

1
La sfida essenziale qui è il calcolo dei numeri dei triangoli.
Peter Taylor,

4
C'è di più in questo oltre ai soli numeri triangolari; il punto iniziale è arbitrario così come il numero di sottrazioni, che può essere zero.
JDL,

Inoltre, per i numeri triangolari è possibile che fare la somma effettiva sia più breve dell'uso della forma chiusa, mentre non si può semplicemente calcolare numeri poligonali arbitrari sommando un intervallo da 0 a N. (Concordo con il voto vicino se il l'altra sfida ha richiesto solo numeri triangolari.)
Martin Ender,

1
per Input: N=0,P=3esempio, la tua espansione ha alcuni doppi negativi estranei
turbulencetoo

1
@JDL, la parte che è "più numeri triangolo soli" è una semplice moltiplicazione: N * (P-1). Questa è praticamente la definizione di banale .
Peter Taylor,

Risposte:


15

05AB1E , 5 3 byte

Salvato 2 byte grazie ad Adnan

Ý+Æ

Spiegazione

Prende P quindi N come input.

       # 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, volevo quasi pubblicare la mia soluzione ahah. Inoltre, per tre byte: Ý+Æ:).
Adnan,

Commuta solo l'ingresso ( Pva per primo)
Adnan,

@Adnan: non sapevo nemmeno che 05AB1E avesse Ý... Pensavo esistesse solo un intervallo basato su 1.
Emigna,

In quale codifica dei caratteri sono solo 3 byte? ;-)
yankee

1
@Yankee: CP-1252
Emigna

16

Python 2, 26 24 23 byte

-2 byte grazie a @Adnan (sostituisci p*(p+1)/2con p*-~p/2)
-1 byte grazie a @MartinEnder (sostituisci -p*-~p/2con+p*~p/2

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

I test sono su ideone


11

CJam, 8 byte

{),f+:-}

Suite di test.

Peccato che la soluzione in forma chiusa sia più lunga. : |

Spiegazione

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

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

Salvato 1 byte dal curry, come suggerito da Zwei
Salvato 1 byte grazie a user81655

Test

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


È possibile salvare un byte valutando la funzione. n=>p=>...e chiamando la funzione conf(n)(p)
Zwei

(n,p)=>n-p*(++p/2+n)funzionerà anche in C #.
aloisdg dice Reinstate Monica,

1
n-p*(++p/2+n)è equivalente a n+p*(~p/2-n).
user81655


7

Haskell, 19 18 byte

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

Soluzioni precedenti a 19 byte

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

7

C #, 21 20 byte

Modifica: salvato un byte grazie a TheLethalCoder

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

Provalo online!

Fonte completa, compresi i casi di 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
usa il curry N=>P=>invece di (N,P)=>salvare 1 byte
TheLethalCoder

5

Mathematica, 15 byte

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

Una funzione senza nome che riceve Pe ncome parametri in quell'ordine.

Utilizza la soluzione a forma chiusa n - n*p - p(p+1)/2.


5

Perl, 23 22 byte

Include +1 per -p

Dare n e p (in questo ordine) su righe separate di STDIN:

subtract.pl
2
3
^D

subtract.pl:

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

(usare le ''virgolette per salvare gli \invoca una penalità di 2 byte perché non può essere combinato con -e)

Stessa idea e lunghezza:

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

Sorprendentemente, il calcolo effettivo è più breve rispetto all'utilizzo della formula diretta (questi $sono davvero dolorosi per l'aritmetica)


5

C ++, 54 51 byte

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

Test:

#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
Benvenuti in PPCG! Sfortunatamente, tutti gli invii devono essere programmi o funzioni richiamabili , mentre questo è solo uno snippet che presuppone che l'input sia archiviato in variabili predefinite e memorizza l'output in un altro.
Martin Ender,

1
@MartinEnder Ho cambiato in C ++ con lambda. È accettabile?
Vol


Puoi farlo in C con 40 byte f;g(n,p){f=n;while(p--)f-=++n;return f;}usando il tuo algoritmo
cleblanc

@cleblanc Grazie per il suggerimento: la variabile globale e la dichiarazione senza un tipo esplicito sono davvero utili. Peccato che lo standard C99 abbia rimosso implicitamenteint
VolAnd

4

Pyke, 6 byte

m+mhs-

Provalo qui!

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

4

Brachylog , 19 17 byte

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

Spiegazione

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 byte

:y+s-

Gli input sono Pe quindi N.

Provalo su MATL Online!

Spiegazione

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

Lotto, 30 byte

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

Prende ne pcome parametri da riga di comando e stampa il risultato senza una nuova riga finale.



3

R, 17 14 byte

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

Grazie a billywob per giocare a golf a 3 byte. Risposta precedente:

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

Nota che 1: 0 si espande nel vettore (1,0), quindi abbiamo bisogno della condizione if (P) (o da usare seq_len, ma che è più byte). Senza la condizione, otterremmo un output errato se P = 0.

Se P è zero, la somma si espande in sum(N+NULL), quindi in sum(numeric(0)), che è zero.


3
Non sono sicuro se questo si qualifica come un programma completo perché richiede che N e P siano già definiti. Ad ogni modo l'uso n-n*p-sum(0:p)sarebbe più breve :)
Billywob,

La mia interpretazione del problema è che N e P sono già definiti (anche altre risposte sembrano prendere questa linea). Punto da golf preso però.
JDL

3
Se non diversamente specificato, gli invii devono essere programmi completi o funzioni richiamabili non solo frammenti. Quali altre risposte danno per scontato che le variabili siano già definite?
Martin Ender,

Non sono un esperto di JavaScript, ma sembra che la soluzione JavaScript stia prendendo le variabili come già definite. Questo potrebbe essere il mio malinteso però. Dato che N e P sono stati nominati come tali nel problema, l'ho preso come "specificato diversamente". In caso contrario, abbiamo bisogno di un wrapper function(N,P){...}oN=scan();P=scan();...
JDL

@JDL la voce javascript non accetta variabili predefinite
Blue

3

PHP, 33 byte

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

Penso che sia necessario utilizzare <?phpo abbreviazione <?di PHP-Code. Modifica la tua risposta
Paul Schmitz,


Scusa, dimentica quello che ha detto. Ho visto molte risposte con questo, e quindi ho pensato, che esiste una regola per questo, che non è il caso. Dovrebbe essercene uno, per evitare discussioni come questa.
Paul Schmitz,

3

Gelatina , 7 byte

RS+×_×-

Gli argomenti vengono testatiP, N
su TryItOnline

Come?

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 byte

golfed:

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

Ungolfed:

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

Fondamentalmente ho fatto un po 'di matematica sulla formula. La n - p*nparte si occupa di tutto nnella formula. Quindi ho usato una proprietà super divertente di sommare insieme in modo lineare un insieme di numeri interi (serie aritmetiche): ho usato la somma del primo e dell'ultimo numero intero e poi lo moltiplico per set.length / 2(controllo anche la parità e la gestisco in modo appropriato).

Provalo: https://ideone.com/DEd85A


È possibile rimuovere lo spazio tra int n,int pper salvare un byte. Inoltre, è possibile modificare p%2==0in p%2<1per salvare un altro byte. - Non sapevo che tu avessi già pubblicato una risposta Java quando ho pubblicato la mia variante più breve con for-loop . Mi piace la tua formula matematica, quindi +1 da me. :)
Kevin Cruijssen,

Ottima formula! Usando p%2>0e cambiando l'ordine nel ternario puoi salvare un personaggio.
Frozn,

Oh, e anche p/2 *(p+2)uguale ap*p/2+p
Frozn

Hehe grandi miglioramenti :) in realtà questa formula viene da un aneddoto divertente :) @KevinCruijssen bella risposta, sicuramente migliore della mia :) +1
peech

3

Java 7, 43 40 byte

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

Java 8, 19 byte

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

Spudoratamente rubato dalla straordinaria formula Python 2 di @JonathanAllan .

Risposta originale ( 61 60 byte):

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

Casi non testati e test:

Provalo qui.

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

Produzione:

-10
-415
42
-6
0

Che dire di questo richiede Java 7?
mbomb007,

@ mbomb007 int c(int n,int p){...}. Se fosse stato Java 8 (o 9) avrebbe potuto essere (n,p)->n-p*n+p*~p/2( 19 byte )
Kevin Cruijssen,

Quindi farlo per salvare quei byte.
mbomb007,




1

Pyth, 11 byte

Ms+Gm_+GdSH

Una funzione gche accetta input ne ptramite argomento e stampa il risultato. Può essere chiamato nel modulo gn p.

Provalo online

Come funziona

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

Acero, 19 byte

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 byte

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

Spiegazione:

# 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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.