Замени меня суммой моих циклических преемников!

25

У меня есть простой вызов для вас на этот раз. Учитывая массив положительных целых чисел A (или эквивалент на вашем языке), замените каждую запись A i суммой следующих элементов A i в A , возвращаясь назад с начала, если не хватает элементов.

Как обычно, вы можете соревноваться на любом языке программирования и можете принимать и выводить данные любым стандартным методом и в любом приемлемом формате, при этом отмечая, что эти лазейки по умолчанию запрещены. Вы можете дополнительно взять размер А в качестве входных данных тоже. Это , поэтому выигрывает самое короткое представление (в байтах) для каждого языка .

Примеры / Тестовые случаи

Учитывая [1,3,4,5], что ваш код должен вывести [3,10,13,14], так как 1заменяются 3, 3заменяются 4+5+1=10(заметьте , как он завернутым назад с самого начала), с 4помощью 5+1+3+4=13и с 5помощью 1+3+4+5+1=14.

Учитывая [3,2,1,9], ваша программа должна производить [12,10,9,33], потому что мы заменяем 3с 2+1+9=12, 2с 1+9=10, 1с 9и 9с 3+2+1+9+3+2+1+9+3=33(обратите внимание, как мы завернули с самого начала более чем один раз).

Еще несколько тестов для вас на выбор:

[4,3,2,1]                       -> [10,7,5,4]
[3,2,1,9]                       -> [12,10,9,33]
[1,3,4,5]                       -> [3,10,13,14]
[4,4,3,2,2]                     -> [11,11,8,6,8]
[3,5,3,2,1]                     -> [10,14,6,4,3]
[3,2,4,3,2,1,1]                 -> [9,7,7,4,2,1,3]
[7,8,6,5,4,3,2,1,5]             -> [29,33,20,15,11,8,6,5,30]
[28,2,4,2,3,2,3,4,5,3]          -> [137,6,10,5,9,7,12,38,39,34]
[1,2,3,4,5,4,3,2,1,2,3,4,3,2,1] -> [2,7,13,14,12,8,5,3,2,7,9,7,4,2,1]
Мистер Xcoder
источник

Ответы:

8

MATL , 10 9 байт

"G@:X@+)s

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

	% implicit input
"	% for loop, iterate over the input array 
G	% push input x
@	% push for loop index, x[i]
:	% range, push [1,...,x[i]]
X@	% push for loop index, i
+	% sum, so stack holds [i+1,...,i+x[i]]
)	% index, modularly, so gets the cyclic successors
s	% sum cyclic successors, leaving the sum on the stack
	% implicit end of for loop
	% implicit output of stack
Giuseppe
источник
6

Желе , 6 байт

ṙJṁS¥"

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

Эрик Outgolfer
источник
... ах ниндзя :(
Джонатан Аллан
@JonathanAllan TBF, я уже вроде как лежал на минутку-две, когда ты публиковал свое (я думал, что целое число тоже должно быть включено, так что с дополнительным +в конце). Кроме того, может быть, ты будешь ниндзя в следующий раз. :)
Эрик Outgolfer
6

Python , 55 байт

lambda a:[sum((-~v*a)[i:i+v])for i,v in enumerate(a,1)]

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

Джонатан Аллан
источник
не слишком знаком с питоном, можете ли вы объяснить роль в паранах после суммы?
Иона
2
Во-первых, ~оператор не является побитовым, он фактически сокращен -1-v, поэтому -~vсокращен для -(-1-v)которого просто 1+v(но избегает таких скобок, как (1+v)*a). Во-вторых, в Python можно умножить список на целое число, чтобы повторить его (например, ['a','b']*3есть ['a','b','a','b','a','b']). -~v*aМожет быть заменен a+v*aна тот же счетчику байтов. Наконец, [i:i+v]это индексация фрагмента, сохраняющая элементы iтолько i+v-1(0-indexed).
Джонатан Аллан
6

J, 33 байта

[:({.+/@{.}.)"1 i.@#|."{($~>./*#)

ungolfed

[: ({. +/@{. }.)"1 i.@# |."0 _ ($~ (>./ * #))

объяснение

введите описание изображения здесь

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

Ион
источник
Необычное объяснение: o
Конор О'Брайен,
1
Отличная картинка, но я рекомендую также изложить объяснение в текстовом виде, поскольку изображения могут длиться не вечно. ;)
Эрик Outgolfer
7
Это похоже на игру в стиле roguelike.
aschepler
Какой счет, если вы переписываете мое решение K в J?
Стритстер
6

C (gcc) , 86 85 байт

  • Спас Байт благодаря Якобу .
C(y,c,l,i,k)int*y;{for(l=~0;++l<c;printf("%d,",k))for(k=i=0;i++<y[l];k+=y[(l+i)%c]);}

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

Джонатан Фрех
источник
-1 байт:for(k=i=0;i++<y[l];)k+=y[(l+i)%c];
Якоб
1
Есть мой upvote для C(y,c,l,i,k).
Йонас Шефер
6

Haskell, 50 47 44 байта

zipWith((sum.).take)<*>scanr(:)[].tail.cycle

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

                    -- <*> in function context is Haskell's S combinator, i.e.
                    --     (zipWith ... <*> scanr ...) arg
                    -- resovles to
                    --     zipWith ... arg (scanr ... arg)
zipWith             -- so we zip
                    --   the input list and
 scanr(:)[]         --   the tails (tails of [1,2,3] are [[1,2,3],[2,3],[3],[]])
      tail          --   of the tail of
          cycle     --   and infinite cycle of the input list
                    -- with the function
 (sum.).take        --   take that many elements given by the element
                    --   of the input list from the list given by the inits
                    --   and sum it   
Ними
источник
Хорошая работа! На самом деле, scanr (:) [] это хвосты
Дэмиен
@Damien: хвосты. Правильно! Благодарность!
Ними
4

05AB1E , 8 7 байт

εL¾+èO¼

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

объяснение

ε        # apply to each element x of the input
 L       # push range [1 ... x]
  ¾+     # add counter to each (initially 0)
    è    # cyclically index into input with each
     O   # sum
      ¼  # increment counter
Emigna
источник
4

K4 / K (ок) , 20 19 байтов

Решение:

+/'x#'1_(1+2##x)#x:

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

Примеры:

q)k)+/'x#'1_(1+2##x)#x:1 3 4 5
3 10 13 14
q)k)+/'x#'1_(1+2##x)#x:4 3 2 1
10 7 5 4
q)k)+/'x#'1_(1+2##x)#x:3 2 4 3 2 1 1
9 7 7 4 2 1 3
q)k)+/'x#'1_(1+2##x)#x:1 2 3 4 5 4 3 2 1 2 3 4 3 2 1
2 7 13 14 12 8 5 3 2 7 9 7 4 2 1

Объяснение:

Измените ввод, отбросьте сначала, возьмите х длину каждого, суммируйте.

+/'x#'1_(1+2##x)#x: / the solution
                 x: / store input as x
                #   / reshape
        (      )    / do this together
             #x     / count x
           2#       / duplicate (2-take)
         1+         / add 1
      1_            / 1 drop (_), remove first element
   x#'              / x take each-both
+/'                 / sum (+/) each
streetster
источник
3

Атташе , 26 байт

{Sum=>_[(_2+1:_)%#_]}#Iota

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

объяснение

Это форк двух функций:

  • {Sum=>_[(_2+1:_)%#_]}
  • Iota

Это означает, что правый зуб Iotaприменяется к аргументу xи передается в качестве второго аргумента центральному зубцу (первая функция). Таким образом, это становится для ввода x:

{Sum=>_[(_2+1:_)%#_]}[x, Iota[x]]

Замена тех, кто в течение _и _2:

Sum => x[(Iota[x] + 1:x) % #x]

Iota[x]возвращает массив индексов x. Это эквивалентно 0...#x. #xэто короткий способ сказать размер xили Size[x]. По сути, эта функция отображает Sumфункцию на второе выражение:

x[(Iota[x] + 1:x) % #x]

Внешний x[...]бит означает, что ...будет сгенерирован ряд индексов для выбора x. Наиболее важной частью генерации индексов является следующее:

Iota[x] + 1:x

Это выражение использует немного векторизации. Чтобы визуализировать это, давайте предположим, что ввод x := [1, 3, 4, 5]. Тогда это выражение эквивалентно:

Iota[[1, 3, 4, 5]] + 1:[1, 3, 4, 5]
[0, 1, 2, 3] + [1:1, 1:3, 1:4, 1:5]
[0, 1, 2, 3] + [[1], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
[0 + [1], 1 + [1, 2, 3], 2 + [1, 2, 3, 4], 3 + [1, 2, 3, 4, 5]]
[[0 + 1], [1 + 1, 1 + 2, 1 + 3], [2 + 1, 2 + 2, 2 + 3, 2 + 4], [3 + 1, 3 + 2, 3 + 3, 3 + 4, 3 + 5]]
[[1], [2, 3, 4], [3, 4, 5, 6], [4, 5, 6, 7, 8]]

Это список индексов, которые представляют собой индексы следующих Nэлементов в xмоде #x. Чтобы сделать их безопасными для поиска, мы возьмем этот мод массива #x:

(Iota[x] + 1:x) % #x

Это дает нам правильные индексы, которые затем получаются, xи каждый массив суммируется, давая правильные результаты.

Другие попытки

36 байт: {Sum@_&Get=>((_2+1.._2+_)%#_)}#Iota - Я забыл x[...]полностью векторизовать, так что становится:

30 байт: {Sum=>_[(_2+1.._2+_)%#_]}#Iota - но потом я понял, что _2+внутренний диапазон может быть учтен, что означает, что мы могли бы сохранить скобки, используя :вместо .., давая нам текущую версию.

Конор О'Брайен
источник
3

R , 89 64 байта

j=rep(x<-scan(),max(x));Map(function(u,v)sum(j[v+1:u]),x,seq(x))

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

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

Оригинальная версия:

function(x,i=seq(x),j=rep(i,max(x))){for(k in i){T=c(T,sum(x[j[(k+1):(k+x[k])]]))};T[-1]}

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

НГМ
источник
Поскольку разрешено принимать длину в качестве дополнительного аргумента ... 75
JayCe
1
69 забавно, я начал что-то похожее, но использовал cumsum, и затерялся в процессе ... отличное решение!
JayCe
66 (используя Map. Вывод немного уродливый, поэтому ссылка TIO и его список. Я думаю, что полная программа будет еще короче!
JayCe
это
JayCe
3

R , 62 58 байт

function(a,l)diag(diffinv(matrix(a,max(a)*l+1,l))[a+2,])-a

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

Альтернатива другого решения R . В комментариях JayCe упомянул о том,cumsum что вызвало что-то в моем мозгу для использования diffinvи переработки матрицы вместо rep.

Объяснение:

Учитывая входной массив a, пусть M=max(a)и l=length(a).

Заметим , что M+lмаксимально возможный индекс , мы должны были бы получить доступ, и что M+l<=M*l+1, так как если M,l>1, M+l<=M*l(с равенством только тогда , когда M=l=2) , а если l==1и M==1, то M+l==M*l+1.

В качестве примера, пусть a=c(4,3,2,1). Потом M=l=4.

Построим M*l+1 x lматрицу в R с помощью matrix(a,max(a)*l+1,l). Поскольку R перезаписывается aв главном порядке столбцов, мы получаем матрицу, повторяющую элементы aкак таковые:

      [,1] [,2] [,3] [,4]
 [1,]    4    3    2    1
 [2,]    3    2    1    4
 [3,]    2    1    4    3
 [4,]    1    4    3    2
 [5,]    4    3    2    1
 [6,]    3    2    1    4
 [7,]    2    1    4    3
 [8,]    1    4    3    2
 [9,]    4    3    2    1
[10,]    3    2    1    4
[11,]    2    1    4    3
[12,]    1    4    3    2
[13,]    4    3    2    1
[14,]    3    2    1    4
[15,]    2    1    4    3
[16,]    1    4    3    2
[17,]    4    3    2    1

Каждый столбец представляет циклические наследники каждого элемента a, с aпоперек первой строки; это связано с тем, что R повторяет свои аргументы в матрице.

Далее мы берем обратную «производную» с diffinv, по существу, совокупной суммой каждого столбца с дополнительным 0в качестве первой строки, генерируя матрицу

      [,1] [,2] [,3] [,4]
 [1,]    0    0    0    0
 [2,]    4    3    2    1
 [3,]    7    5    3    5
 [4,]    9    6    7    8
 [5,]   10   10   10   10
 [6,]   14   13   12   11
 [7,]   17   15   13   15
 [8,]   19   16   17   18
 [9,]   20   20   20   20
[10,]   24   23   22   21
[11,]   27   25   23   25
[12,]   29   26   27   28
[13,]   30   30   30   30
[14,]   34   33   32   31
[15,]   37   35   33   35
[16,]   39   36   37   38
[17,]   40   40   40   40
[18,]   44   43   42   41

В первом столбце запись 6=4+2равна 14=4 + (3+2+1+4), что является суммой циклического преемника (CSS) плюс ведущий 4. Аналогично, во втором столбце запись 5=3+2равна 10=3 + (4+1+2)и т. Д.

Таким образом , в столбце i, то a[i]+2й вход равно CSS(i)+a[i]. Следовательно, мы берем строки, проиндексированные с a+2помощью квадратной матрицы:

     [,1] [,2] [,3] [,4]
[1,]   14   13   12   11
[2,]   10   10   10   10
[3,]    9    6    7    8
[4,]    7    5    3    5

Элементы по диагонали равны сумме циклического преемника плюс a, поэтому мы извлекаем диагональ и вычитаем a, возвращая результат в виде суммы циклического преемника.

Giuseppe
источник
Не могу дождаться объяснения!
JayCe
@JayCe добавил! как это часто бывает, объяснение этого привело к другому гольфу; Я всегда рекомендую добавлять объяснения, чтобы вы или другие последователи могли найти другой подход, хотя у меня не всегда есть время, хаха.
Джузеппе
1
Общим элементом обоих решений является эффективное генерирование достаточно продолжительной переработки либо индекса, либо самих элементов, поскольку языки с 1 индексом не могут изящно использовать модульную арифметику, чтобы вернуться к началу массива.
НГМ
@ngm да, конечно. Мне нравится ваше использование Map, и первоначально это было как 68 байтов, прежде чем я понял, что я мог бы взять lв качестве входных данных!
Джузеппе
2

Pyth, 13 11 байт

.esm@Q+dkSb

Сохранено 2 байта благодаря Mr. Xcoder.
Попробуй здесь

объяснение

.esm@Q+dkSb
.e         Q   For each index k and value b in (implicit) input...
         Sb    ... get the list [1, ..., b]...
   m  +dk      ... add k to each...
    @Q         ... and index into the input...
  s            ... then take the sum.

источник
11 байт .
г-н Xcoder
2

Древесный уголь , 12 байт

IEθΣEι§θ⊕⁺κλ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

  θ             Input array
 E              Map over elements
     ι          Current element
    E           Map over implicit range
           λ    Inner index
          κ     Outer index
         ⁺      Sum
        ⊕       Increment
       θ        Input array
      §         Cyclically index
   Σ            Sum
I               Cast to string
                Implicitly print on separate lines
Нил
источник
2

JavaScript ES6, 65 байт

a=>a.map((x,y)=>{for(s=0,i=y;i<y+x;)s+=a[++i%a.length];return s})

Простое решение. Ungolfed:

a => a.map((x,y) => {
    var s = 0;
    for (i = y; i < y + x; i++) {
        s += a[i % a.length];
    }
    return s;
});

map()Функция JavaScript идеально подходит для работы, она запускает данный обратный вызов для каждого элемента и заменяет его результатом обратного вызова. Обратный вызов получает два параметра, первый x- значение, а второй y- индекс. Взяв модуль, i % a.lengthмы можем легко зациклить массив, несколько раз, если это необходимо.

Тестовый фрагмент

(Поместите ввод в виде записи в формате JSON)

Педро А
источник
2

Java 8, 87 байт

Каррированная пустота лямбда, берущая int[]список и intдлину.

l->s->{for(int i=-1,j,t;++i<s;System.out.println(t))for(j=t=0;j++<l[i];)t+=l[(i+j)%s];}

Попробуйте онлайн . Обратите внимание, что я затенял System.outв этой программе, чтобы получить результаты для более красивой печати.

Jakob
источник
2

Юлия 0,6 , 63 55 53 байта

A->[sum(repmat(A,v+1)[i+1:i+v])for(i,v)=enumerate(A)]

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


Старое решение:

Юлия 0,65 байт

A->(l=length(A);[sum(A[mod1(j,l)]for ji+1:i+A[i])for i1:l])

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


Другое решение Bytecount не очень хорош, но мне это нравится, и, вероятно, он более эффективен, чем два других, особенно если на входе большие цифры.

Юлия 0,6 , 69 байт

A->(l=length(A);[sum([A;A][i+1:i+A[i]%l])+A[il*sum(A)for i1:l])

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

sundar - Восстановить Монику
источник
1

QBasic 1.1 , 115 байт

INPUT L
DIM A(L)
FOR I=0TO L-1
INPUT C
A(I)=C
NEXT
FOR I=0TO L-1
S=0
FOR C=I+1TO I+A(I)
S=S+A(C MOD L)
NEXT
?S
NEXT

Первый вход - это длина L , затем L, последующие входы - это элементы по порядку. L выходы представляют результирующий массив с элементами в том порядке, в котором они представлены.

Эрик Outgolfer
источник
1

APL + WIN, 37 байт

Подсказки для ввода:

+/¨v↑¨⊂[2](⍳⍴v)⌽((⍴v),⍴n)⍴n←(+/v)⍴v←⎕

Попробуйте онлайн! Предоставлено Dyalog Classic

Объяснение:

n←(+/v)⍴v←⎕ prompts for input and creates a repeating vector of length max v

((⍴v),⍴n)⍴n converts n to a matrix of length v x length n

(⍳⍴v)⌽ rotates each row of n by the size of each element of v

⊂[2] converts each row of m to an element in a nested vector

+/¨v↑¨ selects the number of elements from each element of the nested vector according to v and sums
Грэхем
источник
1

JavaScript, 65 байтов 3̶0̶0̶ ̶b̶y̶t̶e̶s̶

golfed

n=>n.map((z,x)=>{for(s=0,i=x;i<z+x;)s+=n[++i%n.length];return s})

ungolfed

     f = n=>n.map((z,x)=>{
            for(s=0,i=x;i<z+x;)s+=n[++i%n.length];
            return s
            }
        );
console.log(f(process.argv[2].slice(1, -1).split(", ").map(x=>+x)))

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

(версия без игры в гольф выше) Я новичок в этой штуке с Codegolf!


* Обновлен! Благодаря полезным ссылкам, приведенным в комментариях, мне удалось уменьшить размер до 65 байт!

ArashSM79
источник
Добро пожаловать на сайт. Есть несколько способов улучшить это. Вы можете использовать имена переменных из одного символа и удалить лишние пробелы. (операторы не должны быть окружены пробелами.)
Wheat Wizard
Помимо советов Cat Wizard, у нас есть коллекция советов по игре в гольф на JavaScript . Поскольку вы говорите, что вы новичок в игре в гольф, вы также можете найти общие советы по игре в гольф на <все языки> .
Манатворк
Вы должны добавить версию для игры в гольф, а не версию для гольфа
Sefa
Вы предполагаете, что массиву назначена предопределенная переменная ( n), которую мы не разрешаем. Добро пожаловать в PPCG, хотя :)
Shaggy
Вот 59-байтовая версия .
лохматый
0

Пип -rn , 14 байт

$+g@(_+\,B)MEg

Принимает входные числа в последовательных строках стандартного ввода; дает выходные числа на последовательных строках stdout. Попробуйте онлайн!

объяснение

             g  List of lines of stdin (from -r flag)
           ME   Enumerate and map this function to the (index, value) pairs:
       \,B       One-based range(value)
     _+          To each element, add the index of that value
  g@(     )      Use the resulting range to slice into the original list g
                 (cyclical indexing is built in)
$+               Sum the numbers in the slice
                Output the list of results one per line (from -n flag)

Или, используя проработанный пример:

             g  [1 3 4 5]
           ME   
       \,B      [(1,2) (1,4) (1,5) (1,6)]
     _+         [(1,2) (2,5) (3,7) (4,9)]
  g@(     )     [[3] [4 5 1] [5 1 3 4] [1 3 4 5 1]]
$+              [3 10 13 14]
DLosc
источник
0

Perl 6 , 50 32 байта

{$_>>.&{.[++$+ ^$^a X%+$_].sum}}

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

Я новичок в гольф в Perl 6, так что я уверен, что это может быть короче. Больше не новинка, и вернемся к этому гольфу!

Джо Кинг
источник