巡回後継者の合計で私を置き換えてください!


25

今回は簡単な挑戦です。正の整数の配列を指定して、A(またはあなたの言語で同等)、各エントリ置き換えるAを、私は、次の合計とAのi個のの要素A、十分なアイテムが存在しない場合は、最初からバックをサイクリング。

いつものように、これらの抜け穴はデフォルトで禁止されていることに注意しながら、任意のプログラミング言語で競争し、標準的な方法および合理的な形式で入力を取得し、出力を提供できます。オプションで、入力としてAのサイズを取ることもできます。これはであるため、すべての言語の最短の送信(バイト単位)が優先されます。

例/テストケース

与えられた場合[1,3,4,5]、あなたのコードは[3,10,13,14]、に1置き換えられますので33に置き換えられます4+5+1=10(最初からどのように折り返されたかに注意してください)、4by 5+1+3+4=13および5by 1+3+4+5+1=14

与えられた[3,2,1,9]、あなたのプログラムが生成しなければならない[12,10,9,33]、我々は代用ので、32+1+9=1221+9=101993+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

MATL10 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

... ah ninja'd :(
ジョナサンアラン

@JonathanAllan TBF、あなたがあなたのものを投稿したとき、私はすでにこれを1〜2分間嘘をついていました(整数自体も含める必要があると思ったので+、最後に余分を追加しました)。また、ええ、多分あなたは私を次回忍者にしよう。:)
エリック・ザ・アウトゴルファー

6

Python、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で1が(例えば、それを繰り返すように整数でリストを乗算してもよい['a','b']*3です['a','b','a','b','a','b'])。-~v*a置き換えることができa+v*a、同じバイト数のため。最後に[i:i+v]スライスのインデックスがあり、要素ii+v-1(0インデックス付き)のみに保持されます。
ジョナサンアラン

6

J、33バイト

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

食べない

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

説明

ここに画像の説明を入力してください

オンラインでお試しください!


派手な説明:o
コナーオブライエン

1
あちらのクールな写真ですが、説明はテキスト形式でも置くことをお勧めします。画像は永遠に続くとは限りません。;)
アウトゴルファーのエリック

7
これはローグライクゲームのように見えます。
アシェプラー

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   

良くやった!実際、scanr(:)[]は尾です
ダミアン

@ダミアン:尾。右!ありがとう!
nimi


4

K4 / K(oK)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

アタッシュ、26バイト

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

オンラインでお試しください!

説明

これは、2つの機能の分岐点です。

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

これが意味することは、正しいタインIotaが引数に適用さxれ、2番目の引数として中央タイン(最初の関数)に渡されることです。したがって、これは入力の場合x

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

for _および_2:のそれらを置き換える

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

Iota[x]のインデックスの配列を返しますx。に相当し0...#xます。#xx、またはのサイズを表す簡単な方法ですSize[x]。本質的に、この関数はSum2番目の式に関数をマッピングしています。

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

これは、modの次のN要素のインデックスを表すインデックスのリストです。それらを取得のために安全にするために、この配列modを使用します。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

R89 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



3

R62 58バイト

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

オンラインでお試しください!

他のRソリューションの代替。JayCecumsumはコメントの中で私の脳の何かがdiffinv代わりに使用してマトリックスリサイクルを引き起こしたことについて言及しましたrep

説明:

入力配列a、let M=max(a)およびを指定しl=length(a)ます。

それM+lが、アクセスする必要がある最大の可能性のあるインデックスでありM+l<=M*l+1、if M,l>1M+l<=M*l(whenのみ等しい場合M=l=2)、if l==1またはM==1、thenであることに注意してください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

各列は、の各要素の循環後継者であり、最初の行aa横切っています。これは、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。同様に、2番目の列のエントリ5=3+2はに等しい10=3 + (4+1+2)、などです。

そのため、列ia[i]+2ndエントリはに等しくなり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が好きで、元々これはl入力として受け取ることができると考える前に68バイトのようでした!
ジュゼッペ

2

Pyth、13 11バイト

.esm@Q+dkSb

Mr. Xcoderのおかげで2バイト節約できました。
ここで試してみてください

説明

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

JavaScriptのmap()機能はジョブに最適です。指定されたコールバックを各要素に対して実行し、コールバックの結果に置き換えます。コールバックは2つのパラメーターを受け取ります。最初のパラメーターxは値で、2番目のパラメーターyはインデックスです。モジュラスi % a.lengthを取ることにより、必要に応じて複数回、配列を簡単にループできます。

テストスニペット

(入力をJSON表記として入力します)


2

Java 8、87バイト

int[]リストとint長さを取得するカリー化されたvoidラムダ。

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.663の 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])

オンラインでお試しください!


別の解決策。バイトカウントではあまり良くありませんが、私はそれが好きで、特に入力に大きな数がある場合は、おそらく他の2つよりも効率的です。

ジュリア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)))

オンラインでお試しください!

(上記のバージョンではありません)このcodegolfのことは初めてです!


*更新しました!コメントで提供されている便利なリンクのおかげで、サイズを65バイトに減らすことができました!


サイトへようこそ。これを改善する方法はいくつかあります。1文字の変数名を使用でき、余分な空白を削除できます。(オペレーターをスペースで囲む必要はありません。)
小麦ウィザード

Cat Wizardのヒント以外にも、JavaScriptでのゴルフヒントのコレクションがあります。あなたがゴルフに不慣れだと言うように、<すべての言語>でゴルフをするための一般的なヒントもおもしろいかもしれません。
マナトワーク

あなたはungolfed 1前golfedバージョンを追加する必要があります
斎場

配列には事前定義変数(n)が割り当てられていると仮定していますが、これは許可されていません。しかし、PPCGへようこそ:)
シャギー





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]


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.