Tấn công Hydra


15

Thay vì là một chiến binh khéo léo có khả năng giết chết Hydras (xem tại đâyđây ), lần này bạn là một chiến binh không có kiến ​​thức trước về cách giết một hoặc sử dụng vũ khí nào để chống lại sinh vật.

Trong vấn đề này, bất cứ khi nào bạn cắt một đầu ra, hai cái sẽ mọc cùng một chỗ. Vì bạn không có cơ chế cắt bỏ nhiều đầu cùng một lúc, số lượng đầu sẽ chỉ tăng lên. Trong trường hợp này, Hydra của chúng ta có thể bắt đầu bằng N(N ⩾ 1) đầu. Hãy gọi cuộc chạm trán đầu tiên là một thế hệ và chúng ta sẽ đại diện cho những người đứng đầu từ thế hệ đầu tiên là 0 , những người đứng đầu được tạo ra sau cú đánh đầu tiên là 1 , v.v.

Đầu vào

Bạn sẽ được cung cấp một số nguyên Nbiểu thị số lượng đầu mà Hydra ban đầu có và danh sách kích thước Nchứa chỉ mục nào (trong ví dụ tôi sẽ sử dụng định dạng 0 chỉ mục) bạn sẽ cắt đầu. Bạn luôn có thể giả sử các chỉ mục được cung cấp là hợp lệ - hãy nhớ rằng danh sách (ví dụ: các đầu) sẽ phát triển khi bạn cắt đầu.

Thí dụ

Đầu vào : N = 4[0,4,2,5]

Thế hệ 0 - Chỉ số tấn công 0

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

Thế hệ 1 - Chỉ số tấn công 4

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

Thế hệ 2 - Chỉ số tấn công 2

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

Thế hệ 3 - Chỉ số tấn công 5

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

Thế hệ cuối cùng

1 1 3 3 0 4 4 2

Như bạn có thể thấy, các chỉ mục được cung cấp có liên quan đến danh sách của thế hệ trước.

Đầu ra

Bạn được yêu cầu xuất ra thế hệ cuối cùng.

Các trường hợp thử nghiệm

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]

Đây là để câu trả lời ngắn nhất trong byte thắng!



Cần một trường hợp thử nghiệm trong đó số lượng đầu ban đầu lớn hơn số lượng đầu bị cắt. Tôi nghĩ rằng tôi thấy ít nhất một câu trả lời hiện tại sẽ thất bại trong trường hợp đó.
Xcali

@Xcali Số lượng đầu cần cắt thực sự được đảm bảo bằng với số lượng đầu ban đầu: Bạn sẽ được cấp một số nguyên N(...) và danh sách kích thướcN (Nhưng tôi cũng đã bỏ lỡ phần đó khi tôi đọc lần đầu tiên thách thức.) Do đó, Nđơn giản là vô dụng.
Arnauld

3
Tôi đã nghĩ về việc thực sự loại bỏ Nkhỏi đầu vào vì nó "hoàn toàn" được đưa ra dưới dạng kích thước của mảng. Tuy nhiên, tôi nghĩ rằng các giải pháp sẽ tiết kiệm byte bằng cách đưa ra Nthay vì chúng dựa vào array.size()hoặc tương tự.
ihavenoidea

1
Thứ tự liên quan của truyện tranh Stick (+ tiếp theo).
Paŭlo Ebermann

Câu trả lời:




5

Stax , 12 11 byte

î╓≡╧▄#¥oWä)A

Chạy và gỡ lỗi nó tại staxlang.xyz!

Nhờ đệ quy cho một byte tiết kiệm!

Giải nén (13 byte) và giải thích:

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

Thách thức nói rõ ràng rằng "bạn được yêu cầu xuất ra thế hệ cuối cùng", vì vậy tôi đoán là sự đồng thuận này không được giữ ở đây. Tuy nhiên, nếu có, mười byte có thể được quản lý bằng cách để kết quả trên ngăn xếp trống khác:

z),Fi^c\&:f

1
0]*có thể được thay thế bằng z). Chỉnh sửa: Rõ ràng đây là hành vi không có giấy tờ, nhưng pad-left lấy toán hạng của nó theo thứ tự. (npm lol)
đệ quy

1
@recursive Hành vi không có giấy tờ là loại hành vi tốt nhất :)
Khuldraeseth na'Barya

5

Haskell , 63 57 byte

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

Hãy thử trực tuyến!


takedropngắn hơn splitAt. Biến gthành lambda tiết kiệm một byte khác : foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..].
nimi

Ahh tốt đẹp - tôi đã thử cả hai thứ này nhưng vì một số lý do tôi chỉ cố gắng làm cho không có gđiểm, và nó trở nên tồi tệ hơn.
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);

Kiểm tra trong 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

Tái bút Hoạt động cho số lên tới 255.


3

Zsh , 41 byte

Chúng tôi bỏ qua N, như quy định .

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

Hãy thử trực tuyến!

Khá chuẩn: Tạo một mảng 0 để bắt đầu, in nó để hoàn thành. Các a[i]=(a b)phương pháp của cả hai thay đổi và chèn là mới với tôi, hạnh phúc tôi tìm thấy một sử dụng cho nó.


HOẶC, cũng 41 byte :

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

Điều này là ít tiêu chuẩn. Chúng tôi tận dụng một vài thủ thuật gọn gàng:

  • ${a/#%/0}: Đây là sự thay thế, nhưng #%bảo zsh neo trận đấu ở đầu và cuối. Vì nó trống, chúng tôi thay thế tất cả các phần tử trống bằng 0.
  • a[#]=: Điều này có hiệu quả khai báo một mảng trống có kích thước $#trong Zsh. Giống như char *a[argc]ở C. Nếu chúng ta không làm điều này, chúng ta sẽ không nhận được các số 0 mà chúng ta cần.

Hãy thử trực tuyến!


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

Hãy thử trực tuyến!

Có vẻ là câu trả lời dài nhất cho đến nay. :)

List.fill(2)(l.max+1)có thể được thay thế bằng List(l.max+1,l.max+1)nhưng chiều dài vẫn như cũ.


3

JavaScript (ES6),  61 59  51 byte

Cảm ơn @Shaggy đã chỉ ra đó nluôn là độ dài của mảng, tiết kiệm 8 byte trong cả hai phiên bản

Yêu cầu mảng ở định dạng 0-index. Bỏ qua n.

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

Hãy thử trực tuyến!


JavaScript (Node.js) ,  64  56 byte

Sử dụng reduce()flat():

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

Hãy thử trực tuyến!


Sẽ a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&blàm việc, mà không cần n?
Xù xì

@ Shaggy Rất tiếc. Tôi đã bỏ lỡ phần đó: và một danh sách kích thướcN . Vì vậy, yeah, có vẻ như nIS vô dụng.
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;}

Hãy thử trực tuyến!


Chào mừng bạn Xem xét thêm một lời giải thích và một liên kết đến một thông dịch viên trực tuyến, chẳng hạn như TIO . Các câu trả lời chỉ có mã thường được tự động đánh dấu là chất lượng thấp. Xem câu trả lời hiện có để biết chi tiết.
mbomb007

Tôi đã thêm một liên kết TIO
XMark


1

Võng mạc 0.8.2 , 69 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. 1 chỉ mục. Đưa đầu vào là ...list,N. Không yêu cầu danh sách phải có độ dài N. Giải trình:

\d+
$*_

Chuyển đổi tất cả các đầu vào thành đơn nguyên, nhưng sử dụng _, để nó không bị nhầm lẫn với các lần sử dụng sau này của chữ số 1. (Retina 1 sẽ tự động làm điều này để tiết kiệm 2 byte.)

r`_\G
,0

Thay thế N bằng một mảng Nsố không, nhưng không thay đổi danh sách.

+`

Xử lý tất cả các yếu tố của danh sách.

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

Tìm phần tử tiếp theo của danh sách và vị trí tương đương trong mảng. $1= thế hệ hiện tại (dưới dạng độ dài), $2= dấu phẩy từ các thế hệ trước, $3= chỉ mục hiện tại - 1,$4 = các đầu tiên $3.

$2$4$.1,$.1

Thay thế đầu ở chỉ mục hiện tại bằng hai bản sao của thế hệ hiện tại ở dạng thập phân.


1

Bình thường , 16 byte

u.nXGH,=+Z1ZE*]0

Hãy thử trực tuyến!

Thật thú vị, hóa ra tôi không thể sử dụng sđể làm phẳng danh sách vì nó thực sự là tốc ký +F, nó thực hiện +ở hai yếu tố ngoài cùng bên trái của danh sách cho đến khi tất cả các yếu tố đã được xử lý. Điều này có nghĩa là một vài yếu tố đầu tiên có thể được tóm tắt, tùy thuộc vào nơi xảy ra sự thay thế cuối cùng.

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 # (Trình biên dịch tương tác Visual C #) , 94 89 85 byte

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

Đã lưu 2 byte nhờ Andrew Bauhmer

Hãy thử trực tuyến!


bạn có thể lưu 2 byte bằng cách sử dụng lại a. a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})<
Andrew Baumher

Quá 5 phút, derp. bạn có thể kiểm tra nó ở đây
Andrew Baumher


1

05AB1E , 10 byte

-IvN>D‚yǝ˜

Hãy thử trực tuyến!

   -             # 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.