Віднімайте наступні числа


27

Опис

Відняти наступні числа Р від числа 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

П : Ціле число, позитивне чи 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: Я навіть не знав, що 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 байт за допомогою currying, як це запропонував Zwei
Збережено 1 байт завдяки користувачеві81655

Тест

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).
користувач81655


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

Математика, 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 ++. Це прийнятно?
VolAnd


Ви можете зробити це на 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 не приймає заздалегідь задані змінні
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 байти

Гольф:

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

Безголівки:

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та перемикаючи порядок у тернарі, ви можете зберегти персонаж.
Фрозн

Ой і теж 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;}

Невикористані та тестові справи:

Спробуйте тут.

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.