Odejmij kolejne liczby

27

Opis

Odejmij kolejne liczby P od liczby N. Następna liczba N to N + 1.

Spójrz na przykłady, aby zrozumieć, co mam na myśli.

Przykłady:

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

Wkład:

N : Liczba całkowita, dodatnia, ujemna lub 0

P : Liczba całkowita, dodatnia lub 0, nie ujemna

Wydajność:

Liczba całkowita lub ciąg, dozwolone 0 na początku, dozwolone znaki nowej linii

Zasady:

  • Bez luk
  • To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach
  • Dane wejściowe i wyjściowe muszą być zgodne z opisem
Paul Schmitz
źródło
1
Podstawowym wyzwaniem jest obliczanie liczb trójkątów.
Peter Taylor,
4
Jest w tym coś więcej niż tylko liczby trójkątne; punkt początkowy jest dowolny, podobnie jak liczba odejmowań, która może wynosić zero.
JDL
Ponadto w przypadku liczb trójkątnych możliwe jest, że wykonanie rzeczywistej sumy jest krótsze niż użycie formy zamkniętej, podczas gdy nie można po prostu obliczyć dowolnych liczb wielokątnych poprzez zsumowanie zakresu od 0 do N. inne wyzwanie właśnie poprosiło o liczby trójkątne.)
Martin Ender
1
na Input: N=0,P=3przykład, wasze rozszerzenie ma trochę obcych podwójnych negatywów
turbulencetoo
1
@JDL, część, która jest „więcej niż tylko liczby trójkątów” to proste mnożenie: N * (P-1). To praktycznie definicja z trywialne .
Peter Taylor

Odpowiedzi:

15

05AB1E , 5 3 bajty

Zaoszczędzono 2 bajty dzięki Adnan

Ý+Æ

Wyjaśnienie

Przyjmuje P, a następnie N jako wejście.

       # 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
źródło
4
Ahhh, prawie chciałem opublikować moje rozwiązanie haha. Również dla trzech bajtów: Ý+Æ:).
Adnan
Przełącza tylko wejście ( Pidzie pierwszy)
Adnan
@Adnan: Nawet nie wiedziałem, że 05AB1E miał Ý... Myślałem, że istnieje tylko zakres 1.
Emigna
W jakim kodowaniu znaków są to tylko 3 bajty? ;-)
yankee
1
@yankee: CP-1252
Emigna
16

Python 2, 26 24 23 bajtów

-2 bajty dzięki @Adnan (wymienić p*(p+1)/2z p*-~p/2)
-1 bajt dzięki @MartinEnder (wymienić -p*-~p/2z+p*~p/2

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

Testy są na ideone

Jonathan Allan
źródło
11

CJam, 8 bajtów

{),f+:-}

Zestaw testowy.

Szkoda, że ​​rozwiązanie w formie zamkniętej jest dłuższe. : |

Wyjaśnienie

),  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
źródło
11

Haskell, 21 bajtów

a#b=foldl1(-)[a..a+b]
ThreeFx
źródło
10

JavaScript (ES6), 20 19 18 bajtów

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

Zapisano 1 bajt przez curry, jak sugeruje Zwei
Zapisano 1 bajt dzięki 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))

Arnauld
źródło
Możesz zapisać bajt, curry funkcję. n=>p=>...i wywoływanie funkcji za pomocąf(n)(p)
Zwei
(n,p)=>n-p*(++p/2+n)działa również w języku C #.
aloisdg mówi Przywróć Monikę
1
n-p*(++p/2+n)jest równoważne z n+p*(~p/2-n).
user81655,
8

Galaretka , 4 bajty

r+_/

Wypróbuj online!

Jak to działa

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

 +    Yield n+p.
r     Range; yield [n, ..., n+p].
  _/  Reduce by subtraction.
Dennis
źródło
7

Haskell, 19 18 bajtów

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

Poprzednie 19 bajtów

n#p=n-n*p-(p*p+p)/2
n#p=n-sum[n+1..n+p]
Damien
źródło
7

C #, 21 20 bajtów

Edycja: Zapisano jeden bajt dzięki TheLethalCoder

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

Wypróbuj online!

Pełne źródło, w tym przypadki testowe:

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
źródło
1
użyj curry N=>P=>zamiast (N,P)=>zaoszczędzić 1 bajt
TheLethalCoder
5

Mathematica, 15 bajtów

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

Funkcja bez nazwy, która odbiera Pi njako jej parametry w tej kolejności.

Używa rozwiązania w formie zamkniętej n - n*p - p(p+1)/2.

Martin Ender
źródło
5

Perl, 23 22 bajtów

Obejmuje +1 dla -p

Podaj n i p (w tej kolejności) w osobnych wierszach STDIN:

subtract.pl
2
3
^D

subtract.pl:

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

(za pomocą ''cytatów, aby zapisać \wywołuje karę 2 bajtowy, ponieważ nie może być łączona z -e)

Ten sam pomysł i długość:

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

Zaskakujące jest, że faktyczne wykonanie obliczeń jest krótsze niż użycie formuły bezpośredniej (są $to bardzo bolesne dla arytmetyki)

Ton Hospel
źródło
5

C ++, 54 51 bajtów

  [](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;
}
VolAnd
źródło
2
Witamy w PPCG! Niestety wszystkie zgłoszenia muszą być programami lub funkcjami wywoływalnymi , podczas gdy jest to tylko fragment kodu, który zakłada, że ​​dane wejściowe są przechowywane w predefiniowanych zmiennych, a dane wyjściowe są przechowywane w innej.
Martin Ender
1
@MartinEnder Zmieniłem na C ++ z lambda. Czy jest to akceptowane?
VolAnd
1
Tak, lambdas są w porządku . :)
Martin Ender
Możesz to zrobić w C z 40 bajtami, f;g(n,p){f=n;while(p--)f-=++n;return f;}używając algorytmu
cleblanc
@cleblanc Dzięki za wskazówkę - zmienna globalna i deklaracja bez jawnego typu są naprawdę przydatne. Jaka szkoda, że ​​standard C99 usunął domyślnieint
VolAnd
4

Pyke, 6 bajtów

m+mhs-

Wypróbuj tutaj!

m+     -    map(range(input_2), +input_1)
  mh   -   map(^, +1)
    s  -  sum(^)
     - - input_1 - ^
niebieski
źródło
4

Brachylog , 19 17 bajtów

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

Wyjaśnienie

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
Fatalizować
źródło
4

MATL , 5 bajtów

:y+s-

Dane wejściowe są, Pa następnie N.

Wypróbuj w MATL Online!

Wyjaśnienie

:     % 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
źródło
3

Partia, 30 bajtów

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

Pobiera ni pjako parametry wiersza polecenia i drukuje wynik bez końcowego znaku nowej linii.

Neil
źródło
3

SILOS , 80 bajtów

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

Wypróbuj online z przypadkami testowymi:
2,3
100,5
42,0
0,3
0,0

betseg
źródło
3

R, 17 14 bajtów

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

Dzięki billywob za grę w golfa 3 bajty. Poprzednia odpowiedź:

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

Zauważ, że 1: 0 rozwija się do wektora (1,0), więc potrzebujemy warunku if (P) (lub użyć seq_len, ale to więcej bajtów). Bez warunku otrzymalibyśmy niewłaściwy wynik, gdyby P = 0.

Jeśli P jest równe zero, wówczas suma rozwija się do sum(N+NULL), a następnie do sum(numeric(0)), która wynosi zero.

JDL
źródło
3
Nie jestem pewien, czy kwalifikuje się jako pełny program, ponieważ wymaga już zdefiniowania N i P. Tak czy inaczej użycie n-n*p-sum(0:p)byłoby i tak krótsze :)
Billywob
Moją interpretacją problemu jest to, że N i P są już zdefiniowane (inne odpowiedzi również wydają się przyjmować tę linię). Punkt golfowy zajęty.
JDL
3
O ile nie określono inaczej, zgłoszenia muszą być pełnymi programami lub wywoływanymi funkcjami, a nie tylko fragmentami. Jakie inne odpowiedzi zakładają, że zmienne są już zdefiniowane?
Martin Ender
Nie jestem ekspertem od javascript, ale wygląda na to, że rozwiązanie javascript przyjmuje zmienne, jak już zdefiniowano. To może być moje nieporozumienie. Ponieważ N i P zostały nazwane w tym problemie, wziąłem to za „określone inaczej”. Jeśli nie, potrzebujemy opakowania function(N,P){...}lubN=scan();P=scan();...
JDL
@JDL pozycja javascript nie przyjmuje predefiniowanych zmiennych
Blue
3

PHP, 33 bajtów

$n-=$n*$p+array_sum(range(0,$p));
Jörg Hülsermann
źródło
Myślę, że musisz użyć <?phplub <?skrócić kod PHP. Edytuj swoją odpowiedź.
Paul Schmitz,
php.net/manual/de/features.commandline.usage.php nie z wiersza poleceń
Jörg Hülsermann
Przepraszam, zapomnij co powiedziałeś. Widziałem wiele odpowiedzi na ten temat i dlatego pomyślałem, że istnieje na to reguła, co nie jest prawdą. Powinien być jeden, aby uniknąć takich dyskusji.
Paul Schmitz
3

Galaretka , 7 bajtów

RS+×_×-

Argumenty są P, N
testowane na TryItOnline

W jaki sposób?

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
źródło
3

Dalej, 36 bajtów

Proste obliczenie n - (p*n + (p^2+p) / 2)

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

Wypróbuj online

mbomb007
źródło
3

Java, 67 , 63 bajty

Gra w golfa:

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

Nie golfowany:

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

Zasadniczo zrobiłem matematykę na formule. Ta n - p*nczęść zajmuje się wszystkim nwe wzorze. Następnie zastosowałem super zabawną właściwość sumowania razem liniowo rosnącego zbioru liczb całkowitych (szeregi arytmetyczne): użyłem sumy pierwszej i ostatniej liczby całkowitej, a następnie pomnożono ją set.length / 2(sprawdzam również parzystość i odpowiednio ją obsługuję).

Wypróbuj: https://ideone.com/DEd85A

brzoskwinia
źródło
Możesz usunąć odstęp pomiędzy, int n,int paby zapisać bajt. Ponadto, można zmienić p%2==0, aby p%2<1zapisać kolejny bajt. - Nie wiedziałem, że już opublikowałeś odpowiedź Java, kiedy opublikowałem mój krótszy wariant z for-loop . Podoba mi się twój wzór matematyczny, więc daj +1 ode mnie. :)
Kevin Cruijssen
Świetna formuła! Używając p%2>0i zmieniając kolejność w trójce możesz zapisać postać.
Frozn
Och, a także p/2 *(p+2)jest równyp*p/2+p
Frozn
Hehe świetne ulepszenia :) właściwie ta formuła pochodzi ze śmiesznej anegdoty :) @KevinCruijssen ładna odpowiedź, zdecydowanie lepsza niż moja :) +1
peech
3

Java 7, 43 40 bajtów

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

Java 8, 19 bajtów

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

Bezwstydnie skradzione z niesamowitej formuły Python 2 autorstwa @JonathanAllan .

Oryginalna odpowiedź ( 61 60 bajtów):

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

Przypadki bez golfa i testy:

Wypróbuj tutaj.

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

Wydajność:

-10
-415
42
-6
0
Kevin Cruijssen
źródło
Co z tym wymaga Java 7?
mbomb007
@ mbomb007 int c(int n,int p){...}. Gdyby był to Java 8 (lub 9), mógłby to być (n,p)->n-p*n+p*~p/2( 19 bajtów )
Kevin Cruijssen
Następnie zrób to, aby zapisać te bajty.
mbomb007
2

Labirynt , 15 bajtów

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

lub

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

Używa rozwiązania w formie zamkniętej n - n*P - P*(P+1)/2.

Martin Ender
źródło
2

php, 38 bajtów

<?=$argv[1]*(1-$a=$argv[2])-$a++*$a/2;
użytkownik59178
źródło
1

Pyth, 11 bajtów

Ms+Gm_+GdSH

Funkcja, gktóra pobiera dane wejściowe ni pargumenty oraz wypisuje wynik. Można go nazwać w formie gn p.

Wypróbuj online

Jak to działa

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
źródło
1

C89, 38 , 35 , 33 bajtów

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

Przetestuj na Coliru .

YSC
źródło
1

Klon, 19 bajtów

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

Stosowanie:

> f:=(n,p)->n-sum(i,i=n+1..n+p);
> f(2, 3);
  -10
> f(100,5);
  -415
> f(42,0);
  42
DSkoog
źródło
1

Perl 6 , 21 bajtów

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

Wyjaśnienie:

# 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
źródło