Menyerang Hydra

15

Alih-alih menjadi prajurit yang terampil yang mampu membunuh Hydra (lihat di sini dan di sini ), kali ini Anda adalah seorang prajurit yang tidak memiliki pengetahuan sebelumnya tentang cara membunuh satu atau senjata apa yang digunakan untuk melawan makhluk itu.

Dalam masalah ini, setiap kali Anda memotong satu kepala, dua akan tumbuh di tempat yang sama. Karena Anda tidak memiliki mekanisme untuk memotong banyak kepala secara bersamaan, jumlah kepala hanya akan bertambah. Dalam hal ini, Hydra kami dapat mulai dengan N(N ⩾ 1) kepala. Mari kita sebut pertemuan pertama satu generasi dan kami akan mewakili kepala dari generasi pertama sebagai 0 , kepala dibuat setelah pukulan pertama sebagai 1 , dan seterusnya.

Memasukkan

Anda akan diberikan bilangan bulat yang Nmewakili berapa banyak kepala Hydra awalnya dan daftar ukuranN berisi indeks mana (dalam contoh saya akan menggunakan format 0-diindeks) Anda akan memotong kepala. Anda selalu dapat menganggap indeks yang diberikan valid - ingat bahwa daftar (yaitu: kepala) akan tumbuh ketika Anda memotong kepala.

Contoh

Input : N = 4dan[0,4,2,5]

Generasi 0 - Indeks serangan 0

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

Generasi 1 - Indeks serangan 4

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

Generasi 2 - Indeks serangan 2

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

Generasi 3 - Indeks serangan 5

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

Generasi terakhir

1 1 3 3 0 4 4 2

Seperti yang Anda lihat, indeks yang diberikan terkait dengan daftar generasi sebelumnya.

Keluaran

Anda harus menampilkan generasi terakhir.

Uji kasus

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]

Ini adalah sehingga jawaban terpendek dalam byte menang!

Saya tidak punya ide
sumber
Tautan kotak
ihavenoidea
Membutuhkan kasus uji di mana jumlah awal kepala lebih besar dari jumlah kepala terputus. Saya pikir saya melihat setidaknya satu jawaban saat ini yang akan gagal dalam kasus itu.
Xcali
@Xcali Jumlah kepala untuk dipotong sebenarnya dijamin sama dengan jumlah awal kepala: Anda akan diberi bilangan bulat N(...) dan daftar ukuranN (Tapi saya melewatkan bagian itu juga ketika saya pertama kali membaca tantangan.) Oleh karena itu, Nsama sekali tidak berguna.
Arnauld
3
Saya berpikir untuk benar-benar menghapus Ndari input karena "secara implisit" diberikan sebagai ukuran array. Namun, saya pikir solusi akan menghemat byte dengan memberi Nalih-alih mengandalkan array.size()atau serupa.
ihavenoidea
1
Urutan komik Tongkat yang Relevan (+ berikutnya).
Paŭlo Ebermann

Jawaban:

11

Python 2 , 59 byte

H,a=input()
H*=[0]
for i in a:H[i:i+1]=[max(H)+1]*2
print H

Cobalah online!

-1 sangat pintar berkat xnor .

Erik the Outgolfer
sumber
2
Sial. Kalahkan saya dengan 52 detik ...
TFeld
1
@TFeld LOL Anda mencoba menghindari variabel ekstra untuk generasi juga! : D
Erik the Outgolfer
9

Python 2 , 60 byte

n,a=input()
h=[0]*n
for c in a:h[c:c+1]=[max(h)+1]*2
print h

Cobalah online!

TFeld
sumber
5

Stax , 12 11 byte

î╓≡╧▄#¥oWä)A

Jalankan dan debug di staxlang.xyz!

Berkat rekursif untuk penghematan satu byte!

Dibongkar (13 byte) dan penjelasan:

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

Tantangannya secara eksplisit mengatakan "Anda diminta untuk menghasilkan generasi terakhir," jadi dugaan saya adalah konsensus ini tidak berlaku di sini. Namun, jika berhasil, sepuluh byte dapat dikelola dengan membiarkan hasilnya pada tumpukan yang kosong:

z),Fi^c\&:f
Khuldraeseth na'Barya
sumber
1
0]*dapat diganti dengan z). Sunting: Tampaknya ini adalah perilaku tidak berdokumen, tetapi pad-left mengambil operandnya dalam urutan apa pun. (npm lol)
rekursif
1
@recursive, Perilaku tidak terdokumentasi adalah jenis perilaku terbaik :)
Khuldraeseth na'Barya
5

Haskell , 63 57 byte

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

Cobalah online!

B. Mehta
sumber
takedan droplebih pendek dari splitAt. Beralih gke lambda menghemat byte lain: foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..].
nimi
Ahh bagus - Saya mencoba keduanya tetapi untuk beberapa alasan saya hanya mencoba untuk membuat gpointfree, dan itu semakin buruk.
B. Mehta
4

Oracle SQL, 325 byte

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

Tes dalam 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. Berfungsi untuk angka hingga 255.

Dr Y Wit
sumber
3

Zsh , 41 byte

Kami mengabaikan N, sebagai dinyatakan oleh aturan .

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

Cobalah online!

Cukup standar: Buat array 0s untuk memulai, cetak sampai selesai. The a[i]=(a b)Metode kedua berubah dan memasukkan adalah baru bagi saya, senang saya menemukan gunakan untuk itu.


ATAU, juga 41 byte :

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

Yang ini kurang standar. Kami mengambil keuntungan dari beberapa trik rapi:

  • ${a/#%/0}: Ini pengganti, tapi # dan% beri tahu zsh untuk memasang jangkar di awal dan akhir. Karena kosong, kami mengganti semua elemen kosong dengan 0.
  • a[#]=: Ini secara efektif mendeklarasikan ukuran array kosong $#di Zsh. Seperti char *a[argc]di C. Jika kita tidak melakukan ini, kita tidak akan mendapatkan nol yang kita butuhkan.

Cobalah online!

Fungsi Gamma
sumber
3

Scala , 104 byte

def^(l:Seq[Int],r:Seq[Int]):Seq[Int]=if(r.size>0)^(l.patch(r(0),Seq.fill(2)(l.max+1),1),r.drop(1))else l

Cobalah online!

Tampaknya menjadi jawaban terpanjang sejauh ini. :)

List.fill(2)(l.max+1)dapat diganti dengan List(l.max+1,l.max+1)tetapi panjangnya tetap sama.

Dr Y Wit
sumber
3

JavaScript (ES6),  61 59  51 byte

Terima kasih kepada @Shaggy untuk menunjukkannya n selalu panjang array, menghemat 8 byte di kedua versi

Mengharapkan array dalam format 0-diindeks. Abaikan n.

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

Cobalah online!


JavaScript (Node.js) ,  64  56 byte

Menggunakan reduce()dan flat():

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

Cobalah online!

Arnauld
sumber
Akan a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&bberhasil, tanpa minum n?
Shaggy
@Shaggy Ups. Saya melewatkan bagian itu: dan daftar ukuranN . Jadi, ya, sepertinya ntidak berguna.
Arnauld
2

PHP , 101 byte

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

Cobalah online!

XMark
sumber
Selamat datang! Pertimbangkan untuk menambahkan penjelasan dan tautan ke juru bahasa online, seperti TIO . Jawaban hanya kode biasanya secara otomatis ditandai sebagai berkualitas rendah. Lihat jawaban yang ada untuk detailnya.
mbomb007
Saya telah menambahkan tautan TIO
XMark
1

Retina 0.8.2 , 69 byte

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

Cobalah online! Tautan termasuk kasus uji. 1-diindeks. Mengambil input sebagai ...list,N. Tidak membutuhkan daftar yang panjang N. Penjelasan:

\d+
$*_

Konversikan semua input menjadi unary, tetapi gunakan _, sehingga tidak menjadi bingung dengan penggunaan digit selanjutnya 1. (Retina 1 akan melakukan ini secara otomatis untuk penghematan 2-byte.)

r`_\G
,0

Ganti Ndengan array Nnol, tetapi jangan ubah daftar.

+`

Proses semua elemen dalam daftar.

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

Temukan elemen berikutnya dari daftar dan posisi yang setara dalam array. $1= generasi saat ini (panjangnya), $2= koma dari generasi sebelumnya, $3= indeks saat ini - 1, $4= $3kepala pertama .

$2$4$.1,$.1

Ganti kepala di indeks saat ini dengan dua salinan dari generasi saat ini dalam desimal.

Neil
sumber
1

Pyth , 16 byte

u.nXGH,=+Z1ZE*]0

Cobalah online!

Menariknya, ternyata saya tidak bisa menggunakan suntuk meratakan daftar karena sebenarnya singkatan +F, yang bekerja +pada dua elemen paling kiri dari daftar sampai semua elemen telah diproses. Ini berarti bahwa beberapa elemen pertama mungkin dijumlahkan, tergantung di mana penggantian terakhir terjadi.

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
Sok
sumber
1

Jelly , 13 byte

;`ɼṁœP@j‘ɼɗƒ@

Cobalah online!

Tautan monadik yang mengambil daftar kepala yang diindeks 1 untuk dipotong sebagai argumennya dan mengembalikan generasi akhir.

Nick Kennedy
sumber
1

C # (Visual C # Interactive Compiler) , 94 89 85 byte

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

Disimpan 2 byte berkat Andrew Bauhmer

Cobalah online!

Perwujudan Ketidaktahuan
sumber
Anda dapat menyimpan 2 byte dengan menggunakan kembali a. a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})<
Andrew Baumher
5 menit terakhir, derp. Anda dapat mengujinya di sini
Andrew Baumher
@AndrewBaumher Terima kasih
Perwujudan Ketidaktahuan
1

05AB1E , 10 byte

-IvN>D‚yǝ˜

Cobalah online!

   -             # 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
Grimmy
sumber