โจมตีไฮดรา


15

แทนที่จะเป็นนักรบฝีมือดีที่สามารถสังหารHydras (ดูที่นี่และที่นี่ ) คราวนี้คุณเป็นนักรบที่ไม่มีความรู้มาก่อนเกี่ยวกับวิธีฆ่าหนึ่งหรืออาวุธที่จะใช้กับสัตว์ร้าย

ในปัญหานี้เมื่อใดก็ตามที่คุณตัดหัวเดียวสองจะเติบโตในสถานที่เดียวกัน เนื่องจากคุณไม่มีกลไกที่จะตัดหัวหลาย ๆ หัวในเวลาเดียวกันจำนวนหัวก็จะเพิ่มขึ้นเท่านั้น ในกรณีนี้ไฮดราของเราสามารถเริ่มต้นด้วยN(N ⩾ 1) หัว ลองเรียกรุ่นแรกพบรุ่นและเราจะแสดงหัวจากรุ่นแรกเป็น0หัวที่สร้างขึ้นหลังจากการระเบิดครั้งแรกเป็น1และอื่น ๆ

อินพุต

คุณจะได้รับจำนวนเต็มNแทนจำนวนหัวที่ไฮดรามีในตอนแรกและรายการขนาดNที่มีดัชนีซึ่ง (ในตัวอย่างฉันจะใช้รูปแบบดัชนี 0) คุณจะตัดหัวออก คุณสามารถสันนิษฐานได้ว่าดัชนีที่ให้นั้นถูกต้องเสมอ - จำไว้ว่ารายการ (เช่น: หัว) จะโตขึ้นเมื่อคุณตัดหัวออก

ตัวอย่าง

อินพุต : N = 4และ[0,4,2,5]

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!



จำเป็นต้องมีกรณีทดสอบที่จำนวนหัวเริ่มต้นมากกว่าจำนวนหัวที่ถูกตัดออก ฉันคิดว่าฉันเห็นคำตอบปัจจุบันอย่างน้อยหนึ่งคำตอบซึ่งจะล้มเหลวในกรณีนั้น
Xcali

@Xcali จำนวนของหัวที่ถูกตัดจริง ๆ แล้วรับประกันได้เท่ากับจำนวนหัวเริ่มต้น: คุณจะได้รับจำนวนเต็มN(... ) และรายการขนาดN (แต่ฉันพลาดส่วนนั้นเช่นกันเมื่อฉันอ่านครั้งแรก ความท้าทาย) ดังนั้นNไร้ประโยชน์
Arnauld

3
ฉันคิดเกี่ยวกับการนำออกNจากอินพุตเนื่องจากเป็น "ปริยาย" ที่กำหนดเป็นขนาดของอาร์เรย์ อย่างไรก็ตามฉันคิดว่าวิธีแก้ปัญหาจะช่วยประหยัดไบต์ด้วยการให้Nแทนที่จะพึ่งพาarray.size()หรือคล้ายกัน
ihavenoidea

1
ที่เกี่ยวข้องคำสั่งของสติ๊กการ์ตูน (อย่างใดอย่างหนึ่งต่อไป +)
Paŭlo Ebermann

คำตอบ:




5

Stax , 12 11 ไบต์

î╓≡╧▄#¥oWä)A

เรียกใช้และแก้ไขปัญหาได้ที่ staxlang.xyz!

ขอบคุณที่วนซ้ำเพื่อการออมหนึ่งไบต์!

คลายการแพคข้อมูล (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

ความท้าทายกล่าวอย่างชัดเจนว่า "คุณจะต้องส่งออกรุ่นที่แล้ว" ดังนั้นฉันเดาว่าฉันทามตินี้ไม่ได้อยู่ที่นี่ ถ้าเป็นเช่นนั้นสามารถจัดการได้สิบไบต์โดยทิ้งผลลัพธ์ไว้ในสแต็กที่ว่างเปล่า:

z),Fi^c\&:f

1
0]*z)สามารถถูกแทนที่ด้วย แก้ไข: เห็นได้ชัดว่านี่เป็นพฤติกรรมที่ไม่มีเอกสาร แต่แผ่นด้านซ้ายใช้ตัวถูกดำเนินการตามลำดับ (npm lol)
เรียกซ้ำ

1
@recursive พฤติกรรมที่ไม่มีเอกสารเป็นพฤติกรรมที่ดีที่สุด :)
Khuldraeseth na'Barya

5

Haskell , 63 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. เมห์ตา

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

ลองออนไลน์!

มาตรฐานที่ค่อนข้างดี: สร้างอาร์เรย์ 0s เพื่อเริ่มต้นพิมพ์ให้เสร็จ 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

สกาลา 104 ไบต์

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

ลองออนไลน์!

ดูเหมือนจะเป็นคำตอบที่ยาวที่สุดจนถึงตอนนี้ :)

List.fill(2)(l.max+1)สามารถถูกแทนที่ด้วยList(l.max+1,l.max+1)แต่ความยาวยังคงเหมือนเดิม


3

JavaScript (ES6),  61 59  51 ไบต์

ขอบคุณ @Shaggy สำหรับการชี้ให้เห็นว่าnเป็นความยาวของอาเรย์เสมอโดยประหยัดได้ 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()และ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ไร้ประโยชน์
Arnauld


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

ลองออนไลน์!


ยินดีต้อนรับ! พิจารณาการเพิ่มคำอธิบายและเชื่อมโยงไปล่ามออนไลน์เช่นติ้ว คำตอบที่ใช้รหัสเท่านั้นโดยปกติจะมีการทำเครื่องหมายว่ามีคุณภาพต่ำ ดูคำตอบที่มีอยู่สำหรับรายละเอียด
mbomb007

ฉันได้เพิ่มลิงค์ TIO
XMark

1

Perl 5 -pal , 48 ไบต์

@h=($i=0)x@F;splice@h,$_,1,(++$i)x2for@F;$_="@h"

ลองออนไลน์!

ใช้อาร์เรย์เป็นรายการที่คั่นด้วยช่องว่างจาก STDIN nไม่ได้ป้อนข้อมูล


ในกรณีที่ใครจะสงสัยว่าไม่ได้รับการป้อนข้อมูลที่ได้รับอนุญาต: ดูcodegolf.meta.stackexchange.com/questions/2447/...
wastl

1

เรติน่า 0.8.2 , 69 ไบต์

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

ลองออนไลน์! ลิงก์มีกรณีทดสอบ 1 การจัดทำดัชนี ...list,Nจะเข้าเป็น Nไม่จำเป็นต้องมีรายการที่มีความยาว คำอธิบาย:

\d+
$*_

แปลงอินพุตทั้งหมดเป็น unary แต่ใช้_เพื่อไม่ให้สับสนกับการใช้ตัวเลขใน1ภายหลัง (Retina 1 จะทำสิ่งนี้โดยอัตโนมัติเพื่อการประหยัด 2 ไบต์)

r`_\G
,0

แทนที่Nด้วยอาร์เรย์Nศูนย์ แต่ไม่เปลี่ยนรายการ

+`

ประมวลผลองค์ประกอบทั้งหมดของรายการ

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

ค้นหาองค์ประกอบถัดไปของรายการและตำแหน่งเทียบเท่าในอาร์เรย์ $1= การสร้างปัจจุบัน (ตามความยาว) $2= คอมมาจากรุ่นก่อนหน้า$3= ดัชนีปัจจุบัน - 1, $4= $3หัวแรก

$2$4$.1,$.1

แทนที่หัวที่ดัชนีปัจจุบันด้วยสำเนาสองรุ่นของการสร้างปัจจุบันเป็นทศนิยม


1

Pyth , 16 ไบต์

u.nXGH,=+Z1ZE*]0

ลองออนไลน์!

น่าสนใจที่มันกลายเป็นว่าฉันไม่สามารถใช้sเพื่อทำให้รายการเรียบเพราะมันเป็นการจดชวเลข+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;})

บันทึก 2 ไบต์ขอบคุณ Andrew Bauhmer

ลองออนไลน์!


คุณสามารถบันทึก 2 ไบต์ได้โดยการนำ a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})<
Andrew Baumher

5 นาทีที่ผ่านมา คุณสามารถทดสอบได้ที่นี่
Andrew Baumher


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.