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.