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

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

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


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


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


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,


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]

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

        }
    }
}

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.


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)


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

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


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

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

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

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.



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.


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

Myślę, że musisz użyć <?phplub <?skrócić kod PHP. Edytuj swoją odpowiedź.
Paul Schmitz,


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)



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


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

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




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

1

C89, 38 , 35 , 33 bajtów

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

Przetestuj na Coliru .


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

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)
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.