ヒドラの攻撃


15

ヒドラスを殺すことができる熟練した戦士であるのではなく(こちらこちらをご覧ください)、今度はあなたは戦士を殺す方法やクリーチャーに対してどの武器を使用するかについての予備知識がありません。

この問題では、1つの頭を切り落とすたびに、同じ場所で2つ成長します。多数のヘッドを同時に切断するメカニズムがないため、ヘッドの数は増えるだけです。この場合、HydraはN(N⩾1)頭から開始できます。レッツ・コールの最初の出会い世代と我々として第一世代から頭を表します0、として最初の打撃後に作成されたヘッド1ように、と。

入力

NHydraが最初に持つヘッドの数を表す整数と、Nインデックスを含むサイズのリスト(この例では0インデックス形式を使用します)が与えられ、ヘッドが切り取られます。与えられたインデックスは常に有効であると想定できます-頭を切り落とすとリスト(つまり頭)が大きくなることに注意してください。

入力N = 4および[0,4,2,5]

ジェネレーション0-攻撃インデックス0

0 0 0 0     =>     1 1 0 0 0
^                  ^ ^

ジェネレーション1-攻撃インデックス4

1 1 0 0 0     =>     1 1 0 0 2 2
        ^                    ^ ^

ジェネレーション2-攻撃インデックス2

1 1 0 0 2 2     =>     1 1 3 3 0 2 2
    ^                      ^ ^

ジェネレーション3-攻撃インデックス5

1 1 3 3 0 2 2     =>     1 1 3 3 0 4 4 2
          ^                        ^ ^

最終世代

1 1 3 3 0 4 4 2

ご覧のとおり、指定されたインデックスは前の世代のリストに関連しています。

出力

最終世代を出力する必要があります。

テストケース

N = 1 and [0] => [1,1]
N = 2 and [0,0] => [2,2,1,0]
N = 2 and [0,1] => [1,2,2,0]
N = 2 and [1,0] => [2,2,1,1]
N = 2 and [1,1] => [0,2,2,1]
N = 4 and [0,4,2,5] => [1,1,3,3,0,4,4,2]
N = 6 and [0,0,0,0,0,0] => [6, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0]
N = 6 and [5,6,7,8,9,10] => [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 6]
N = 10 and [1,7,3,12,9,0,15,2,2,10] => [6, 6, 9, 9, 8, 1, 3, 3, 0, 0, 10, 10, 2, 5, 5, 0, 0, 4, 7, 7]

これはので、バイト単位の最短回答が勝ちです!


サンドボックスリンク
-ihavenoidea

初期のヘッド数がカットオフされたヘッド数よりも大きいテストケースが必要です。私は、その場合に失敗する少なくとも1つの現在の答えを見ていると思います。
Xcali

@Xcali切断するヘッドの数は、実際には最初のヘッドの数と等しいことが保証されています:整数N(...)とサイズのリストが与えられますN(しかし、最初に読んだときにその部分も見逃しましたそのため、N単に役に立たない。
アーナルド

3
N配列のサイズとして「暗黙的に」指定されているため、入力から実際に削除することを考えました。しかし、ソリューションは、N依存array.size()または類似の代わりに与えることでバイトを節約すると考えました。
ihavenoidea

回答:




5

スタックス12 11 バイト

î╓≡╧▄#¥oWä)A

staxlang.xyzで実行してデバッグしてください!

再帰のおかげで 1バイトの節約にます!

開梱(13バイト)および説明:

z),{i^c\&:fFm
z)               Push initial array of zeroes to stack
  ,              Push array of attacks to stack
   {       F     For each attack, push it and then:
    i^c\           Push [x,x], where x is the generation number
        &          Set the head at the attack index to this new array
         :f        Flatten
            m    Print the last generation

課題は明示的に「あなたは最後の世代を出力する必要がある」と言っているので、私の推測では、このコンセンサスはここでは成り立たないでしょう。ただし、その場合、結果を他の空のスタックに残すことで10バイトを管理できます。

z),Fi^c\&:f

1
0]*に置き換えることができますz)。編集:明らかにこれは文書化されていない動作ですが、pad-leftはそのオペランドをいずれかの順序で取ります。(npm lol)
再帰的

1
@recursive文書化されていない動作は、最高の種類の動作です:)
Khuldraeseth na'Barya

5

Haskell63 57バイト

foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]

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


takeそしてdrop、よりも短いsplitAt。回すgラムダには、別のバイトを保存しますfoldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]
nimi

すごい-私はこれらの両方を試しましたが、何らかの理由で私はgポイントフリーを作ろうとしましたが、それはさらに悪化しました。
B. Mehtaの

4

Oracle SQL、325バイト

select listagg(ascii(substr(l,level,1)),', ')within group(order by level)
from(select * from t
model dimension by(1 i)measures(l,r)
rules iterate(1e5)until(r[1]is null)
(l[1]=regexp_replace(l[1],'.',chr(:n-length(r[1])+1)||chr(:n-length(r[1])+1),1,ascii(substr(r[1],1,1))+1),r[1]=substr(r[1],2)))
connect by level<=length(l);

SQL * Plusでテストします。

SQL> set heading off
SQL>
SQL> create table t(l varchar2(4000), r varchar2(4000));

Table created.

SQL>
SQL> var n number;
SQL> exec :n := 10;

PL/SQL procedure successfully completed.

SQL>
SQL> insert into t
  2  values(rpad(chr(0),:n,chr(0)), chr(1)||chr(7)||chr(3)||chr(12)||chr(9)||chr(0)||chr(15)||chr(2)||chr(2)||chr(10));

1 row created.

SQL>
SQL> select listagg(ascii(substr(l,level,1)),', ')within group(order by level)
  2  from(select * from t
  3  model dimension by(1 i)measures(l,r)
  4  rules iterate(1e5)until(r[1]is null)
  5  (l[1]=regexp_replace(l[1],'.',chr(:n-length(r[1])+1)||chr(:n-length(r[1])+1),1,ascii(substr(r[1],1,1))+1),r[1]=substr(r[1],2)))
  6  connect by level<=length(l);

6, 6, 9, 9, 8, 1, 3, 3, 0, 0, 10, 10, 2, 5, 5, 0, 0, 4, 7, 7

PS。255までの数字で機能します。


3

Zsh、41バイト

規則で述べられているように、 Nは無視します

for i;a+=(0)
for i;a[i]=($[++j] $j)
<<<$a

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

かなり標準:0の配列を作成して開始し、印刷して終了します。a[i]=(a b)変更と挿入の両方の方法は私にとって新しいものであり、私はその使用法を見つけて幸せです。


または、41バイト

a[#]=
for i;a[i]=($[++j] $j)
<<<${a/#%/0}

これはあまり標準ではありません。いくつかの巧妙なトリックを利用します。

  • ${a/#%/0}:これは交換ですが、 #%zshに開始と終了で一致を固定するように指示します。空なので、すべての空の要素を0に置き換えます。
  • a[#]=:これはサイズの空の配列を効果的に宣言します $#、Zsh。char *a[argc]C のようなものです。これを行わないと、必要な末尾のゼロが得られません。

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



3

JavaScript(ES6)、 61 59  51バイト

n常に配列の長さであると指摘してくれた@Shaggyに感謝します。両方のバージョンで8バイトを節約します。

0インデックス形式の配列を期待します。無視しnます。

a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b

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


JavaScript(Node.js) 64  56バイト

reduce()and を使用flat()

a=>a.reduce((b,i,g)=>b.flat(1,b[i]=[++g,g]),a.map(_=>0))

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


思いa=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&bかけずに、仕事n
シャギー

@Shaggyおっと。私はその部分を見逃した:とサイズのリストN。それで、ええ、それはn役に立たないようです。
アーナルド


2

PHP、101バイト

function h($n,$a){$h=array_fill(0,$n,0);foreach($a as$b)array_splice($h,$b,0,$h[$b]=++$x);return $h;}

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


ようこそ!TIOなどのオンライン通訳への説明とリンクを追加することを検討してください。コードのみの回答は通常、低品質として自動的にマークされます。詳細については、既存の回答を参照してください。
mbomb007

TIOリンクを追加しました
-XMark


1

Retina 0.8.2、69バイト

\d+
$*_
r`_\G
,0
+`^((,*)_)(_)*(.*,,(?<-3>\d+,)*)\d+
$2$4$.1,$.1
^,+

オンラインでお試しください!リンクにはテストケースが含まれます。1インデックス付き。入力をとして受け取ります...list,N。リストの長さは必要ありませんN。説明:

\d+
$*_

すべての入力を単項に変換しますが、を_使用し1ます。これにより、後でdigitを使用する場合と混同しないようにします。(Retina 1は、2バイトの節約のためにこれを自動的に行います。)

r`_\G
,0

ゼロのN配列に置き換えますがN、リストは変更しません。

+`

リストのすべての要素を処理します。

^((,*)_)(_)*(.*,,(?<-3>\d+,)*)\d+

リストの次の要素と、配列内の同等の位置を見つけます。$1=現在の世代(長さとして)、$2=前の世代のコンマ、$3=現在のインデックス-1、$4=最初の$3ヘッド。

$2$4$.1,$.1

現在のインデックスのヘッドを、10進数の現在の世代の2つのコピーで置き換えます。


1

パイス、16バイト

u.nXGH,=+Z1ZE*]0

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

興味深いことに、sリストのフラット化には使用できないことがわかります。これは、リストの左端の2つの要素に対してすべての要素が処理されるまで+F実行+されるための略記であるためです。これは、最後の置換が行われた場所に応じて、最初のいくつかの要素が単純に合計されることを意味します。

u.nXGH,=+Z1ZE*]0Q   Implicit: Q=input 1 (N), E=input 2 (array), Z=0
                    Trailing Q inferred
              ]0    [0]
             *  Q   Repeat Q times
u           E       Reduce E, with current value G and next value H, starting with the above:
       =+Z1           Increment Z in-place
      ,  Z Z          Pair the updated Z with itself
   XGH                In G, replace the element with index H with the above
 .n                   Flatten
                    Implicit print


1

C#(Visual C#Interactive Compiler)94 89 85バイト

a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c.Insert(d,c[d]=++a);return c;})

Andrew Bauhmerのおかげで2バイト節約

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


aを再利用することで2バイト節約できます。 a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})<
アンドリューバウムハー


@AndrewBaumherありがとう
無知の

1

05AB1E、10バイト

-IvN>D‚yǝ˜

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

   -             # subtract the input from itself (yields a list of 0s)
    Iv           # for each number y in the input
      N          # push the 0-based loop count
       >         # add 1 to get the generation number
        D        # duplicate
         ‚       # wrap the two copies in a list
          yǝ     # replace the element at index y with that list
            ˜    # flatten
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.