Суммирование модуля

27

Я называю эту последовательность «последовательность Иисуса», потому что это сумма мод . </ Pun>

Для этой последовательности вы берете все натуральные числа m меньше, чем вход n , и берете сумму n по модулю каждого m . Другими словами:

an=m=1n1nmodm

Например, возьмем термин 14 :

14 % 1 = 0
14 % 2 = 0
14 % 3 = 2
14 % 4 = 2
14 % 5 = 4
14 % 6 = 2
14 % 7 = 0
14 % 8 = 6
14 % 9 = 5
14 % 10 = 4
14 % 11 = 3
14 % 12 = 2
14 % 13 = 1
0+0+2+2+4+2+0+6+5+4+3+2+1=31

Ваша цель здесь - написать функцию, которая реализует эту последовательность. Вы должны взять член последовательности (это будет положительное целое число от 1 до 2 31 ) в качестве единственного входа и вывести значение этого члена. Это OEIS A004125 .

Как всегда, применяются стандартные лазейки и выигрывает самый короткий ответ в байтах!

Нисса
источник

Ответы:

6

Фанки , 25 байт

n=>fors=~-i=1i<n)s+=n%i++

Просто наивный ответ, похоже, работает.

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

Desmos , 25 байт.

f(x)=\sum_{n=1}^xmod(x,n)

Вставьте в Desmos, затем запустите его, позвонив f.

При вставке в Desmos латекс выглядит следующим образом

Однако график выглядит так

Хотя это выглядит случайным и повсюду, это результат только поддержки целых чисел.

RProgN 2 , 9 байт

x=x³x\%S+

Разъяснения

x=x³x\%S+
x=          # Store the input in "x"
  x         # Push the input to the stack.
   ³x\%     # Define a function which gets n%x
       S    # Create a stack from "x" with the previous function. Thus this gets the range from (1,x), and runs (i%x) on each element.
        +   # Get the sum of this stack.

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

ReRegex , 71 байт

#import math
(_*)_a$/d<$1_>b$1a/(\d+)b/((?#input)%$1)+/\+a//u<#input
>a

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

ARBLE , 19 байт

sum(range(1,a)|a%i)

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

MaybeLater , 56 байт

whenf is*{n=0whenx is*{ifx>0{n=n+f%x x--}elseprintn}x=f}

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

Ataco
источник
Закончатся ли когда-нибудь представления на этот вызов? До сих пор я получал новый каждые 40 минут: P
Nissa
@StephenLeppik О, у меня еще впереди, не волнуйтесь.
ATaco
@StephenLeppik Я бы не хотел, потому что они различного качества на разных языках.
ATaco
@ StefhenLeppik Я неохотно объединил их для тебя.
ATaco
4
Пожалуйста, не делай этого. Отдельные языки - даже отдельные подходы - должны идти в отдельных ответах.
Деннис
4

Python 2 , 44 байта

lambda n:sum(map(lambda x:x%(n-x),range(n)))

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

РЕДАКТИРОВАТЬ: изменение диапазона (0, n) на диапазон (n)

Max00355
источник
2
Здравствуйте и добро пожаловать на сайт! rangeнеявно принимает первый аргумент 0, поэтому вы можете сократить это на два байта, выполнив range(n)вместо этого.
DJMcMayhem
Ух ты! Я даже не думал об этом. Спасибо
Max00355
1
Добро пожаловать в PPCG! Вы можете использовать понимание списка вместо map38 байтов: попробуйте онлайн!
г-н Xcoder
Вы правы, но это было использовано в ответе Нейла, поэтому я не был уверен, что копирование было бы лучшим. Если, конечно, я что-то здесь не упустил. Я хотел опубликовать альтернативу, даже если она была немного длиннее.
Max00355
3

Стандартный ML (MLton) , 53 51 байт

fn& =>let fun f 1a=a|f%a=f(% -1)(a+ &mod%)in f&0end

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

Ungolfed:

fn n =>
   let fun f 1 a = a
         | f x a = f (x-1) (a + n mod x)
   in  
       f n 0
   end

Предыдущая 53-байтовая версия:

fn n=>foldl op+0(List.tabulate(n-1,fn i=>n mod(i+1)))

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

Объяснение:

List.tabulateберет целое число xи функцию fи генерирует список [f 0, f 1, ..., f(x-1)]. Учитывая некоторое число n, мы вызываем List.tabulateс помощью n-1и функцию, fn i=>n mod(i+1)чтобы избежать деления на ноль. Результирующий список суммируется с foldl op+0.

Laikoni
источник
3

Japt , 6 5 байт

Сохранено 1 байт благодаря @Shaggy

Æ%XÃx

Проверьте это онлайн!

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

         Implicit: U = input number
Æ        Create the range [0, U),
 %XÃ       mapping each item X to U%X. U%0 gives NaN.
    x    Sum, ignoring non-numbers.
         Implicit: output result of last expression
ETHproductions
источник
2

05AB1E , 6 байтов

ÎGIN%+

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

Моя первая программа 05AB1E;)

Кстати, я получил два 39, 1 для JS6 и 1 для Python, но я опоздал

Объяснение:

ÎGIN%+
Î                      # Push 0, then input, stack = [(accumulator = 0), I]
 G                     # For N in range(1, I), stack = [(accumulator)]
  IN                   # Push input, then N, stack = [(accumulator), I, N]
    %                  # Calculate I % N, stack = [(accumulator), I % N]
     +                 # Add the result of modulus to accumulator
Сиеру Асакото
источник
2

Добавить ++ , 14 байт

L,RAdx$p@BcB%s

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

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

L,   - Create a lambda function.
     - Example argument:     [7]
  R  - Range;        STACK = [[1 2 3 4 5 6 7]]
  A  - Argument;     STACK = [[1 2 3 4 5 6 7] 7]
  d  - Duplicate;    STACK = [[1 2 3 4 5 6 7] 7 7]
  x  - Repeat;       STACK = [[1 2 3 4 5 6 7] 7 [7 7 7 7 7 7 7]]
  $p - Swap and pop; STACK = [[1 2 3 4 5 6 7] [7 7 7 7 7 7 7]]
  @  - Reverse;      STACK = [[7 7 7 7 7 7 7] [1 2 3 4 5 6 7]]
  Bc - Zip;          STACK = [[7 1] [7 2] [7 3] [7 4] [7 5] [7 6] [7 7]]
  B% - Modulo each;  STACK = [0, 1, 1, 3, 2, 1, 0]
  s  - Sum;          STACK = [8]
Caird Coneheringaahing
источник
2

Пакет Windows (CMD), 63 байта

@set s=0
@for /l %%i in (1,1,%1)do @set/as+=%1%%%%i
@echo %s%

Предыдущая 64-байтовая версия:

@set/ai=%2+1,s=%3+%1%%i
@if %i% neq %1 %0 %1 %i% %s%
@echo %s%
Нил
источник
2

T-SQL, 80- 79 байт

-1 байт благодаря @MickyT

WITH c AS(SELECT @ i UNION ALL SELECT i-1FROM c WHERE i>1)SELECT SUM(@%i)FROM c

Получает входные данные от целочисленного параметра с именем @, примерно так:

DECLARE @ int = 14;

Использует общее табличное выражение для генерации чисел из 1в n. Затем использует этот cte для суммирования модулей.

Примечание: для cte необходимо указать ;между предыдущим оператором и cte. Большая часть кода, который я видел, ставит ;прямо перед объявлением, но в этом случае я могу сохранить байт, поместив его в оператор ввода (поскольку технически мой код сам по себе является единственным оператором).

Попробуй это (СЕДЕ)


Менее "SQL-у" способ составляет всего 76 байтов. На этот раз входная переменная @iвместо @(сохраняет один байт). Этот просто делает whileцикл.

DECLARE @ int=2,@o int=0WHILE @<@i BEGIN SELECT @o+=@i%@,@+=1 END PRINT @o
Брайан Дж
источник
1

Pyth , 5 байт

s%LQS

s%LQS - Full program, inputs N from stdin and prints sum to stdout
s     - output the sum of
 %LQ  - the function (elem % N) mapped over 
    S - the inclusive range from 1..N

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

Дейв
источник
О, на самом деле я нашел 5 байт, отличных от вас, неправильно прочитал ваш
Дейв