Вычтите следующие числа


27

Описание

Вычтите следующие числа P от числа N. Следующее число N равно N + 1.

Посмотрите на примеры, чтобы понять, что я имею в виду.

Примеры:

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

Входные данные:

N : целое, положительное, отрицательное или 0

P : целое, положительное или 0, не отрицательное

Выход:

Целое число или строка, ведущий 0 разрешен, завершающий перевод новой строки разрешен

Правила:

  • Нет лазеек
  • Это код-гольф, поэтому выигрывает самый короткий код в байтах
  • Вход и выход должны быть такими, как описано

1
Существенной задачей здесь является вычисление номеров треугольников.
Питер Тейлор

4
Это больше, чем просто треугольные числа; начальная точка является произвольной, а также количество вычитаний, которые могут быть нулевыми.
JDL

Кроме того, для треугольных чисел возможно, что выполнение действительной суммы короче, чем использование закрытой формы, в то время как вы не можете просто вычислить произвольные многоугольные числа, суммируя диапазон от 0 до N. (Я согласен с закрытым голосованием, если другой вызов только что попросил треугольные числа.)
Мартин Эндер

1
для Input: N=0,P=3примера, ваше расширение имеет некоторые лишние двойные негативы
turbulencetoo

1
@JDL, та часть , которая «больше , чем просто треугольные числа» является простым умножением: N * (P-1). Это практически определение из тривиальных .
Питер Тейлор

Ответы:


15

05AB1E , 5 3 байта

Сохранено 2 байта благодаря Аднану

Ý+Æ

объяснение

Принимает P, а затем N в качестве ввода.

       # 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
Аааа, я почти хотел опубликовать свое решение, ха-ха. Также за три байта: Ý+Æ:).
Аднан

Он только переключает вход ( Pидет первым)
Adnan

@Adnan: я даже не знал, что 05AB1E Ý... я думал, что существует только диапазон на основе 1.
Эминья

В какой кодировке это всего 3 байта? ;-)
Янки

1
@yankee: CP-1252
Эминья,

16

Python 2, 26 24 23 байта

-2 байта благодаря @Adnan (заменить p*(p+1)/2на p*-~p/2)
-1 байта благодаря @MartinEnder (заменить -p*-~p/2на+p*~p/2

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

Тесты на Ideone


11

CJam, 8 байт

{),f+:-}

Тестирование.

Жаль, что решение в закрытой форме длиннее. : |

объяснение

),  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 байт

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

Сохранено 1 байт с помощью карри, как предложил Zwei.
Сохранено 1 байт благодаря user81655.

Тест

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


Вы можете сохранить байт, используя функцию. n=>p=>...и вызов функции с помощьюf(n)(p)
Zwei

(n,p)=>n-p*(++p/2+n)также будет работать в C #.
Aloisdg говорит восстановить Монику

1
n-p*(++p/2+n)эквивалентно n+p*(~p/2-n).
user81655 01.09.16


7

Haskell, 19 18 байтов

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

Предыдущие 19-байтовые решения

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

7

C #, 21 20 байт

Изменить: Сохраненный один байт благодаря TheLethalCoder

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

Попробуйте онлайн!

Полный исходный код, включая контрольные примеры:

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
используйте карри N=>P=>вместо того, (N,P)=>чтобы сохранить 1 байт
TheLethalCoder

5

Mathematica, 15 байт

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

Безымянная функция, которая получает Pи в nкачестве своих параметров в этом порядке.

Использует решение в закрытой форме n - n*p - p(p+1)/2.


5

Perl, 23 22 байта

Включает +1 для -p

Дайте n и p (в том порядке) в отдельных строках STDIN:

subtract.pl
2
3
^D

subtract.pl:

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

(использование ''кавычек для сохранения \вызывает 2-байтовое наказание, потому что его нельзя комбинировать с -e)

Та же идея и длина:

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

Удивительно, но фактический расчет короче, чем использование прямой формулы (это $очень плохо для арифметики)


5

C ++, 54 51 байт

  [](int N,int P){int F=N;while(P--)F-=++N;return F;}

[] (int N, int P) {int F; для (F = N; P; F - = ++ N, P -); вернуть F;}

Тест:

#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
Добро пожаловать в PPCG! К сожалению, все представления должны быть программами или вызываемыми функциями , тогда как это всего лишь фрагмент, который предполагает, что входные данные хранятся в предопределенных переменных и сохраняют выходные данные в других.
Мартин Эндер

1
@MartinEnder Я перешел на C ++ с лямбда-выражением. Это приемлемо?
VolA и


Вы можете сделать это в C с 40 байтами, f;g(n,p){f=n;while(p--)f-=++n;return f;}используя ваш алгоритм
cleblanc

@cleblanc Спасибо за подсказку - глобальная переменная и объявление без явного типа действительно полезны. Как жаль, что стандарт C99 удален неявноint
VolAnd


4

Брахилог , 19 17 байт

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

объяснение

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 байтов

:y+s-

Входы есть Pи тогда N.

Попробуйте это в MATL Online!

объяснение

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

Пакетный, 30 байтов

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

Принимает nи pкак параметры командной строки и печатает результат без завершающей строки.



3

R, 17 14 байт

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

Благодаря Billywob для игры в гольф 3 байта. Предыдущий ответ:

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

Обратите внимание, что 1: 0 расширяется до вектора (1,0), поэтому нам нужно условие if (P) (или использовать seq_len, но это больше байтов). Без условия мы получили бы неправильный вывод, если P = 0.

Если P равно нулю, то сумма увеличивается до sum(N+NULL), а затем до sum(numeric(0))нуля.


3
Не уверен, что это квалифицируется как полная программа, потому что для этого требуется, чтобы N и P уже были определены. В любом случае использование n-n*p-sum(0:p)будет короче в любом случае :)
Billywob

Моя интерпретация проблемы состоит в том, что N и P уже определены (другие ответы, кажется, также принимают эту линию). Гольф точка взята, хотя.
JDL

3
Если не указано иное, представления должны быть полными программами или вызываемыми функциями, а не просто фрагментами. Какие другие ответы предполагают, что переменные уже определены?
Мартин Эндер

Я не эксперт по javascript, но похоже, что решение javascript использует переменные, как уже определено. Это может быть моим собственным недоразумением. Так как N и P были названы как таковые в задаче, я принял это как «указано иначе». Если нет, тогда нам нужна обертка function(N,P){...}илиN=scan();P=scan();...
JDL

@JDL запись javascript не принимает предопределенную переменнуюd
Blue

3

PHP, 33 байта

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

Я думаю, что вы должны использовать <?phpили сокращенно <?для PHP-кода. Пожалуйста, отредактируйте свой ответ.
Пол Шмитц


Извини, забудь, что сказал. Я видел много ответов на это и поэтому думал, что для этого есть правило, которого нет. Должен быть один, чтобы избежать подобных дискуссий.
Пол Шмитц

3

Желе , 7 байт

RS+×_×-

Аргументы P, N
протестировать на TryItOnline

Как?

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 байта

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

В основном я сделал некоторые математические формулы. n - p*nЧасть заботится о всех n-х в формуле. Затем я использовал супер интересное свойство суммирования линейно увеличивающегося набора целых чисел (арифметических рядов): я использовал сумму первого и последнего целого числа, а затем умножил ее на set.length / 2(я также проверяю четность и обрабатываю ее соответствующим образом).

Попробуйте это: https://ideone.com/DEd85A


Вы можете удалить пробел между, int n,int pчтобы сохранить байт. Кроме того , вы можете изменить , p%2==0чтобы p%2<1спасти другие байты. - Я не знал, что вы уже опубликовали ответ Java, когда я опубликовал свой более короткий вариант с помощью for-loop . Мне нравится ваша математическая формула, так что +1 от меня. :)
Кевин Круйссен

Отличная формула! Используя p%2>0и переключая порядок в троичной, вы можете сохранить персонажа.
Frozn

Ох, а также p/2 *(p+2)равноp*p/2+p
Frozn

Хе-хе большие улучшения :) на самом деле эта формула происходит от забавного анекдота :) @KevinCruijssen хороший ответ, безусловно, лучше, чем у меня :) +1
peech

3

Java 7, 43 40 байт

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

Java 8, 19 байт

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

Бесстыдно украденный из потрясающей формулы Python 2 @JonathanAllan .

Оригинальный ответ ( 61 60 байт):

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

Ungolfed и тестовые случаи:

Попробуй это здесь.

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

Выход:

-10
-415
42
-6
0

Что по этому поводу требует Java 7?
mbomb007

@ mbomb007 int c(int n,int p){...}. Если бы это была Java 8 (или 9), это могло бы быть (n,p)->n-p*n+p*~p/2( 19 байт )
Кевин Круйссен

Затем сделайте это, чтобы сохранить эти байты.
mbomb007




1

Pyth, 11 байт

Ms+Gm_+GdSH

Функция, gкоторая принимает входные данные nи pчерез аргумент и печатает результат. Это можно назвать по форме gn p.

Попробуйте онлайн

Как это работает

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

Клен, 19 байт

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

Использование:

> 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 байт

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

Объяснение:

# 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)
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.