Замініть мене на суму моїх циклічних наступників!


25

Я маю для вас простий виклик цього разу. Враховуючи масив додатних цілих чисел A (або еквівалент у вашій мові), замініть кожен запис A i сумою наступних елементів A i A , повертаючись назад з початку, якщо не вистачає елементів.

Як завжди, ви можете змагатись на будь- якій мові програмування і можете приймати введення та надавати вихід будь-яким стандартним методом та в будь-якому розумному форматі, беручи до уваги, що ці лазівки заборонені за замовчуванням. Ви також можете взяти розмір 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]

Відповіді:


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

6

... ах ninja'd :(
Джонатан Аллан

@JonathanAllan TBF, у мене вже було таке брехня на хвилину-дві, коли ви розмістили своє (я думав, що саме це число повинно бути включене, тому з додатковим +в кінці). Крім того, так, можливо, ви наступного разу змусите мене ніндзя. :)
Ерік Аутгольфер

6

Пітон , 55 байт

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

Спробуйте в Інтернеті!


не надто знайомий з python, чи можете ви пояснити частину в паренах після суми?
Йона

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-індексований) тільки.
Джонатан Аллан

6

J, 33 байти

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

неозорий

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

пояснення

enter image description here

Спробуйте в Інтернеті!


фантазійне пояснення: o
Conor O'Brien

1
Класна картинка там, але я рекомендую також розмістити пояснення в текстовій формі, оскільки зображення можуть не тривати вічно. ;)
Ерік Аутгольфер

7
Це схоже на грабельну гру.
aschepler

Яка оцінка, якщо переписати моє рішення K в J?
стрітер


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   

Хороша робота! Насправді сканер (:) [] - це хвости
Демієн

@Damien: хвости. Правильно! Спасибі!
німі


4

К4 / К (оК) , 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 довжину кожного, підсумуйте

+/'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


3

Attache , 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 смішно, я почав щось подібне, але використовуючи сперму і загубився в процесі ... гарне рішення!
JayCe

66 (використовуючи Map. Вихід трохи некрасивий, тому посилання TIO не перераховує його. Я думаю, що повна програма була б ще коротшою!
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, повертаючи результат у вигляді сум циклічного наступника.


Не можу чекати пояснення!
JayCe

@JayCe додано! як це часто буває, пояснення це призвело до іншого гольфу; Я завжди рекомендую додати пояснення, щоб ви та інші, хто слідує за ними, могли знайти інший підхід, хоча я не завжди встигаю це зробити, ха-ха.
Джузеппе

1
Спільним елементом для обох рішень є ефективне генерування досить довгої переробки або індексу, або самих елементів, оскільки 1-індексовані мови не можуть витончено використовувати модульну арифметику, щоб повернутися до початку масиву.
ngm

@ngm так, точно. Мені подобається ваше використанняMap , і спочатку це було як 68 байт, перш ніж я зрозумів, що я можу взяти lза вклад!
Джузеппе

2

Pyth, 13 11 байт

.esm@Q+dkSb

Збережено 2 байти завдяки панові 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.


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

Безпосереднє рішення. Безголівки:

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цю програму, щоб отримати кращі результати друку.


2

Джулія 0,6 , 63 55 53 байти

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

Спробуйте в Інтернеті!


Старіше рішення:

Джулія 0,6 , 65 байт

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

Спробуйте в Інтернеті!


Ще одне рішення. Не велика кількість за рахунком, але мені це подобається, і це, мабуть, більш ефективно, ніж інші два, особливо якщо вхід має велику кількість.

Джулія 0,6 , 69 байт

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

Спробуйте в Інтернеті!



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 виходи представляють отриманий масив з елементами в порядку, який вони представлені.



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̶

гольф

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

неозорий

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

Спробуйте в Інтернеті!

(Невикористана версія вище) Я новачок у цій справі з кодовим гольфом!


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


Ласкаво просимо на сайт. Є кілька способів, як це можна було б покращити. Ви можете використовувати одноіменні назви змінних, і ви можете видалити зайвий пробіл. (операторам не потрібно оточувати пробіли.)
Пшеничний майстер

Крім підказок Cat Wizard, у нас є колекція Поради щодо гольфу в JavaScript . Як ви кажете, що ви новачок у гольфі, вам також можуть бути цікаві загальні поради щодо гри в гольф на <всіх мовах> .
манатура

Вам слід додати версію для гольфу до невольф'яної
Сефа

Ви припускаєте, що масиву призначено попередньо задану змінну ( n), яку ми не допускаємо. Ласкаво просимо до PPCG :)
Shaggy





0

Піп -rn , 14 байт

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

Приймає вхідні числа на послідовних рядках stdin; дає вихідні числа на послідовних лініях 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]


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.