Beni döngüsel haleflerimin toplamı ile değiştir!


25

Bu sefer senin için basit bir mücadelem var. Pozitif tamsayı dizisi Verilen bir (veya kendi dilinizde eşdeğeri), her bir giriş yerini a i bir sonraki toplamı ile bir i unsurları A yeterince ürün bulunmuyorsa baştan arkasını bisiklet.

Her zamanki gibi, herhangi bir programlama dilinde rekabet edebilir ve herhangi bir standart yöntemle ve makul bir formatta girdi alabilir ve çıktı alabilirsiniz ; bu boşluklar varsayılan olarak yasaklanmıştır. İsteğe bağlı olarak A boyutunu da giriş olarak alabilirsiniz . Bu , yani her dil için en kısa sürede (bayt cinsinden) kazanıyor.

Örnekler / Test Durumları

Verilen [1,3,4,5]kodunuzu çıktı gerektiğini [3,10,13,14], çünkü 1değiştirilir 3, 3yerine 4+5+1=10, (baştan geri sarılmış nasıl haber) 4tarafından 5+1+3+4=13ve 5tarafından 1+3+4+5+1=14.

Verildiği [3,2,1,9]gibi, programınız üretmelidir [12,10,9,33], çünkü 3bununla 2+1+9=12, 2ile 1+9=10, 1ile 9ve 9ile 3+2+1+9+3+2+1+9+3=33geçiyoruz (en baştan bir kere daha nasıl geri sarıldığımızı fark edin).

Seçim yapabileceğiniz bazı daha fazla test durumu:

[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]

Yanıtlar:


8

MATL , 10 9 bayt

"G@:X@+)s

Çevrimiçi deneyin!

	% 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

Python , 55 bayt

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

Çevrimiçi deneyin!


python ile aşina olmayan biri parlardaki parçayı toplamdan sonra açıklayabilir misiniz?
Jonah

2
Öncelikle, ~operatör bitsel değildir, etkili bir şekilde kestirilmemiştir -1-v, bu yüzden -~vkestirilse -(-1-v)sadece 1+v(ama parantezlerden kaçınır (1+v)*a). İkinci Python bir (örneğin tekrarlamak bir tamsayı ile bir liste üreyebilir ['a','b']*3olan ['a','b','a','b','a','b']). -~v*aYerini olabilir a+v*aaynı bayt sayım için. Son olarak, [i:i+v]elemanları isadece i+v-1(0 indeksli) konumunda tutan bir dilim indekslemesidir .
Jonathan Allan,

6

J, 33 bayt

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

ungolfed

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

açıklama

görüntü tanımını buraya girin

Çevrimiçi deneyin!


fantezi açıklama: o
Conor O'Brien,

1
Orada harika bir resim var, ancak resimlerin sonsuza dek sürmeyebileceği için açıklamayı da metin biçiminde koymanızı öneririm. ;)
Outgolfer Erik,

7
Bu roguelike bir oyuna benziyor.
aschepler

J'deki K çözümümü yeniden yazarsanız puan kaçtır ?
streetster


6

Haskell, 50 47 44 bayt

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

Çevrimiçi deneyin!

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

İyi iş! Aslında, scanr (:) [] kuyruktur
Damien

@Damien: kuyrukları. Sağ! Teşekkürler!
nimi,

4

05AB1E , 8 7 bayt

εL¾+èO¼

Çevrimiçi deneyin!

açıklama

ε        # 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

4

K4 / K (oK) , 20 19 bayt

Çözüm:

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

Çevrimiçi deneyin!

Örnekler:

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

Açıklama:

Girişi yeniden şekillendir, önce bırak, her birinin x uzunluğunu al, topla.

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

Ataşesi , 26 bayt

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

Çevrimiçi deneyin!

açıklama

Bu iki işlevden oluşan bir çatal:

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

Bunun anlamı, doğru çatal Iotaargümana uygulanır xve ikinci argüman olarak merkez çatalına (ilk işlev) geçer. Yani bu girdi için x:

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

İçin olanlar değiştirilmesi _ve _2:

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

Iota[x]endekslerinin bir dizisini döndürür x. Eşittir 0...#x. veya #xboyutunu söylemenin kısa bir yoludur . Temelde, bu işlev, işlevi ikinci ifadeyle eşleştirir :xSize[x]Sum

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

Dış x[...]bit, ...seçilecek bir dizi endeks üreteceği anlamına gelir x. Endeksleri oluşturmanın en önemli kısmı şudur:

Iota[x] + 1:x

Bu ifade biraz vektörleştirme kullanır. Bunu görselleştirmek için, girişin olduğunu varsayalım x := [1, 3, 4, 5]. Ardından, bu ifade şuna eşittir:

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

Bu, bir sonraki endeksleri temsil endeksleri listesidir Nelemanların xmod #x. Onları geri almak için güvenli kılmak için şu dizi modunu kullanıyoruz #x:

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

Bu bize daha sonra elde edilen uygun endeksleri verir xve her bir dizi toplanır ve uygun sonuçları verir.

Diğer girişimler

36 bayt: {Sum@_&Get=>((_2+1.._2+_)%#_)}#Iota - x[...]Tamamen vektörleştirdiğimi unuttum , böylece:

30 bayt: {Sum=>_[(_2+1.._2+_)%#_]}#Iota - ama sonra _2+iç aralığın çarpanlara ayrılabileceğini fark ettim, :bunun yerine parantezleri kullanmak yerine ..o anki sürümü vererek kurtarabiliriz .


3

R , 89 64 bayt

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

Çevrimiçi deneyin!

Gerekli vektörleri giriş vektöründen elde etmek için kullanabileceğiniz, yeterince uzun bir döngü indeksi vektörü oluşturmak için ana fikir.

Orijinal versiyon:

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

Çevrimiçi deneyin!


Uzunluğunu ek bir argüman olarak kabul etmesine izin verildiğinden ... 75
JayCe

1
69 komik Benzer bir şey başlatmıştım ama cumsum kullanarak ve süreçte kayboldum ... güzel bir çözüm!
JayCe

66 (Haritası kullanarak bu TIO bağlantı un listeleri Ben tam program bile daha kısa olacağını tahmin böylece çıkış biraz çirkin..!
Jayce



3

R , 62 58 bayt

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

Çevrimiçi deneyin!

Diğer R çözümüne bir alternatif . Yorumlarda JayCe, beynimde bircumsum şeyler kullanmak diffinvyerine matris geri dönüşümünü tetikleyen bir şeyden bahsettirep .

Açıklama:

Verilen giriş dizisi a, izin ver M=max(a)ve l=length(a).

Bunun M+l, erişmemiz gereken maksimum endeks olduğunu ve M+l<=M*l+1eğer öyleyse M,l>1, M+l<=M*l( eğer sadece eşitlik olduğunda M=l=2) ve eğer, l==1veya M==1sonra olduğundan emin olun M+l==M*l+1.

Örnek olarak, izin verin a=c(4,3,2,1). Öyleyse M=l=4.

M*l+1 x lR ' deki matrisi kurarız matrix(a,max(a)*l+1,l). R a, sütun ana düzeninde geri dönüştüğü için, elemanlarını şu şekilde tekrarlayan bir matrisle sonuçlanır 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

Her bir sütun her bir elemanının frekans çevrimsel ardılları olduğu aile, abirinci satır boyunca; Bunun nedeni, R'nin argümanlarını bir matriste geri dönüştürmesidir.

Sonra, tersine "türev" i alırız diffinv, esas olarak her sütunun kümülatif toplamını 0, ilk satırda ek olarak ekleyerek matrisi oluştururuz.

      [,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

İlk sütunda giriş 6=4+2, 14=4 + (3+2+1+4)döngüsel halefi toplamı (CSS) artı bir öncü olan eşittir 4. Benzer şekilde, ikinci sütunda, giriş 5=3+2eşittir 10=3 + (4+1+2), vb.

Yani sütununda i, a[i]+2nd girişi eşittir CSS(i)+a[i]. Bu nedenle, a+2bir kare matris vererek dizine alınmış satırları alırız :

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

Köşegen boyunca yapılan girişler, döngüsel halefi toplamları artı değerine eşittir; bu anedenle a, sonucu döngüsel halefi toplamları olarak döndürerek, köşegen ve çıkartma çıkarırız .


Açıklama için sabırsızlanıyorum!
JayCe

@JayCe eklendi! Sık sık olduğu gibi, başka bir golf oynadığını açıklamak; Her zaman bir açıklama eklemenizi öneririm, böylece siz veya arkasından takip eden başkaları başka bir yaklaşım bulabilirler, buna rağmen her zaman bunu yapacak zamanım yok, haha.
Giuseppe

1
Her iki çözümün ortak unsuru, endeksin veya öğelerin kendilerinin yeterince uzun bir geri dönüşümünün verimli bir şekilde üretilmesidir, çünkü 1 indeksli diller, dizinin başlangıcına geri dönmek için zarifçe modüler aritmetik kullanamaz.
ngm

@ ngm evet, kesinlikle. Kullanımınızı seviyorum Mapve aslında bu lgirdi olarak kabul edebileceğimi düşünmeden önce 68 bayt gibiydi !
Giuseppe

2

Pyth, 13 11 bayt

.esm@Q+dkSb

Bay Xcoder sayesinde 2 bayt kurtarıldı.
Burada dene

açıklama

.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

Kömür , 12 bayt

IEθΣEι§θ⊕⁺κλ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  θ             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 bayt

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

Basit çözüm. Ungolfed:

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

JavaScript'in map()işlevi iş için mükemmeldir, verilen geri çağırmayı her bir öğeye karşı çalıştırır ve geri çağırmanın sonucu olarak değiştirir. Geri çağırma iki parametre alır, ilki xdeğer ve ikincisi ydizindir. Modülü alarak, i % a.lengthgerektiğinde birden fazla kez dizinin üzerinde kolayca dolaşabiliriz.

Test snippet'i

(Girişi JSON gösterimi olarak koyun)


2

Java 8, 87 bayt

Bir int[]liste ve intuzunluk alarak bir curried void lambda .

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

Çevrimiçi Deneyin . Daha System.outgüzel baskı sonuçları almak için bu programın gölgesinde olduğumu unutmayın .


2

Julia 0.6 , 63 55 53 bayt

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

Çevrimiçi deneyin!


Eski çözüm:

Julia 0.6 , 65 bayt

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

Çevrimiçi deneyin!


Başka bir çözüm. Bayt sayımı ile iyi değil, ama hoşuma gidiyor ve özellikle girişin büyük sayıları varsa, muhtemelen diğer ikisinden daha verimli.

Julia 0.6 , 69 bayt

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

Çevrimiçi deneyin!


1

Tuval , 10 bayt

²X{x+⁸@]∑]

Burada dene!

Açıklama:

{         ] map over the items in the input
 ²X           save this loops counter on X (because of a bad design choice..)
   {    ]     map over 1..current item
    x+          add to it X
      ⁸@        and index in the input using that
         ∑    sum the map

1

QBasic 1.1 , 115 bayt

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

İlk giriş L uzunluğu , ardından L sonraki girişler sıradaki öğelerdir. L çıkışları, ortaya çıkan diziyi temsil ettikleri sıradaki öğelerle birlikte gösterir.



1

APL + WIN, 37 bayt

Giriş için bilgi istemi:

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

Çevrimiçi deneyin! Dyalog Classic'in İzniyle

Açıklama:

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

Çevrimiçi deneyin!

(yukarıda ungolfed versiyonu) Bu codegolf olayında yeniyim!


*güncellenmiş! yorumlarda verilen faydalı bağlantılar sayesinde, boyutu 65 bayta düşürmeyi başardım!


Siteye Hoşgeldiniz. Bunun iyileştirilmesinin birkaç yolu var. Tek karakterli değişken adlarını kullanabilir ve fazladan beyaz boşluk kaldırabilirsiniz. (operatörlerin boşluklarla çevrili olmaları gerekmez.)
Wheat Wizard

Cat Wizard'ın ipuçlarının ötesinde , JavaScript'te golf oynamak için bir İpuçları koleksiyonumuz var . Golf oynamaya yeni başladığınızı söylediğiniz gibi, golf oynamaya ilişkin genel İpuçları da <tüm diller> içinde de bulabilirsiniz.
Manatwork

Golfe girilen versiyonunu ungolfed versiyonundan önce eklemelisiniz
Sefa

Dizinin nizin vermediğimiz önceden tanımlanmış bir değişkene ( ) atandığını varsayıyorsunuz . PPCG'ye hoş geldiniz :)
Shaggy





0

Pip -rn , 14 bayt

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

Art arda stdin satırlarında girdi numaraları alır; ardışık stdout satırlarında çıktı numaraları verir. Çevrimiçi deneyin!

açıklama

             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)

Veya, çalışılmış bir örnek kullanarak:

             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]


0

Perl 6 , 50 32 bayt

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

Çevrimiçi deneyin!

Perl 6'da golf oynamak için yeniyim, bu yüzden bunun daha kısa olabileceğine eminim. Artık yeni değil ve tekrar golf oynamaya!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.