การกลับมาของผู้ฆ่าไฮดรา


13

เป็นเวลานานแล้วที่คุณฆ่าไฮดรานั้นคุณก็ดื่มด่ำกับความรุ่งเรืองมาหลายปี แต่ตอนนี้ผู้คนกำลังเรียกคุณว่าถูกชะล้าง ถึงเวลาที่คุณจะพิสูจน์พวกเขาผิดคุณได้ยินเสียงของไฮดราอีก เพียงแค่ฆ่ามันและคุณจะได้รับเกียรติทั้งหมดที่คุณสมควรได้รับ

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

คุณจะต้องเขียนโค้ดอีกครั้งเพื่อช่วยคุณฆ่าไฮดรา รหัสของคุณจะใช้เป็นจำนวนหัวที่ไฮดราเริ่มการต่อสู้ด้วยจำนวนหัวที่ไฮดราเติบโตในแต่ละตาและรายชื่อของภาค n ที่คุณสามารถใช้ รหัสของคุณจะแสดงรูปแบบการเคลื่อนไหวที่ดีที่สุดเพื่อสังหารไฮดราโดยเร็วที่สุด

ในแต่ละเทิร์นของการต่อสู้คุณสามารถเลือกดาบเดี่ยวที่จะใช้หากหลังจากไฮดราไฮดรามีหัวเดียวเท่านั้นที่คุณชนะถ้าไม่ใช่มันจะเพิ่มขึ้น คุณอาจไม่มีทางเคลื่อนไหวและถ้าไม่มีการเคลื่อนไหวใด ๆ ที่เป็นไปได้คุณก็แพ้

หากไม่สามารถแก้ปัญหาได้คุณสามารถส่งออกสิ่งอื่นนอกเหนือจากโซลูชันเช่นรายการว่างเปล่าไม่มีอะไรจำนวนศูนย์ ฯลฯ

นี่คือดังนั้นคำตอบจะถูกนับเป็นจำนวนไบต์โดยมีน้อยกว่าดีกว่า

กรณีทดสอบ

นี่คือบางกรณีทดสอบขั้นพื้นฐานสุดกรณีทดสอบเพิ่มเติมจะถูกเพิ่มตามคำขอ

24 heads, 1  heads per turn, [2,3] -> [3,3,2,3]
25 heads, 2  heads per turn, [2,3] -> No solutions
4  heads, 2  heads per turn, [2]   -> No solutions
4  heads, 3  heads per turn, [2,5] -> [2,5]
10 heads, 17 heads per turn, [2, 3, 7, 19] -> No solutions
10 heads, 6  heads per turn, [1,16] -> [1,16]
6  heads, 2  heads per turn, [2, 3, 5] -> [2, 5]
125 heads, 1  head per turn, [1, 2, 3, 127] -> [1, 1, 127]

ไฮดราสามารถมีหัวได้แค่ 1 หัวเท่านั้น?
ETHproductions

@ETHproductions คุณไม่ต้องจัดการกับกรณีดังกล่าว
Ad Hoc Garf Hunter

เราสามารถสรุปได้ว่ารายการเรียงลำดับหรือไม่?
ETHproductions

@ETHproductions ใช่คุณอาจ ฉันไม่เห็นว่าทำไม
Ad Hoc Garf Hunter

1 ส่วนคือดาบ "ข้ามข้าม"?
Neil

คำตอบ:


5

JavaScript (ES6), 111 105 ไบต์

บันทึกแล้ว 4 ไบต์ด้วย @ThePirateBay

(h,p,a)=>{for(b={[h]:[]};c=b,b=[];)for(d in c)for(e of a){d%e?0:q=b[d/e+p]=[...c[d],e];if(d==e)return q}}

ฉันเล่าเรื่องการสอบถามซ้ำเชิงลึกครั้งแรกที่ฉันพยายามจะใช้กับลูปแรกที่ปลอดภัยกว่า แสดงผลโซลูชันเป็นอาร์เรย์หากมีอยู่ให้รันตลอดไปหากไม่มี หากสิ่งนี้ไม่ได้รับอนุญาตนี่คือสิ่งที่หยุดในที่สุด (โดยส่วนใหญ่แล้ว):

(h,p,a)=>{for(b={[h]:[]};c=b,b=[],c+c;)for(d in c){for(e of a){a[[,d]]||d%e?0:q=b[d/e+p]=[...c[d],e];if(d==e)return q}a[[,d]]=1}}

3

JavaScript, 191 190 ไบต์

บันทึกเป็นไบต์ขอบคุณStep Step

(h,t,s)=>eval(`r=[],d=0,q=[],s.map(a=>q.push([],h));while(q.length){p=q.shift(),h=q.shift(),s.map(w=>(a=h/w)==1?d=w:!(a%1)&!r[a+=t]?r[q.push([...p,w],a),a]=1:0);d?(q=[],p).push(d):0}d?p:[]`)

f=(h,t,s)=>eval(`r=[],d=0,q=[],s.map(a=>q.push([],h));while(q.length){p=q.shift(),h=q.shift(),s.map(w=>(a=h/w)==1?d=w:!(a%1)&!r[a+=t]?r[q.push([...p,w],a),a]=1:0);d?(q=[],p).push(d):0}d?p:[]`)

console.log(`[${f(24, 1, [2,3])}]`);
console.log(`[${f(25, 2, [2,3])}]`);
console.log(`[${f(4, 2, [2])}]`);
console.log(`[${f(4, 3, [2,5])}]`);
console.log(`[${f(10, 17, [2, 3, 7, 19])}]`);
console.log(`[${f(10, 6, [1,16])}]`);
console.log(`[${f(125, 1, [1, 16])}]`);
console.log(`[${f(1024, 3, [1, 2, 137])}]`);



2

Python 2 , 169 195 222 ไบต์

+26 ไบต์เพื่อจัดการการงอกใหม่ของหัวอย่างแม่นยำในการหยิบอาวุธที่ไม่ดี (ขอบคุณ @ThePirateBay ที่ชี้ให้เห็น)

+27 ไบต์เพื่อแก้ไขกรณีขอบบางอย่างทำให้เกิดข้อผิดพลาด

lambda n,p,w:g(n,n,p,w[::-1])[:-1]
def g(n,b,p,w,a=[]):
 if b<2:return[1]
 for x in w:
	if n%x<1and n/x+p!=n and n not in a:
	 try:
		l=[x]+g(n/x+p,n/x,p,w,[n]+a)
	 	if l and l[-1]!=0:return l
	 except:return[0]
 return[0]

ลองออนไลน์!


โดยปกติบิต resuable หมายความว่าคุณไม่สามารถสร้าง vars ส่วนกลางปรับเปลี่ยนและสมมติว่าพวกเขาจะกลับไปเป็นค่าเดิมในครั้งต่อไป Dunno มีข้อผิดพลาดอะไรในนโยบายที่นี่ - โปรแกรมเต็มรูปแบบจะได้รับอนุญาตให้แก้ไขข้อผิดพลาดสำหรับผลลัพธ์ที่ว่างเปล่า
สตีเฟ่น


เป็นไปได้208 ไบต์
Jonathan Frech

1

VB.NET (.NET 4.5), 439 + 35 (อิมพอร์ต) = 474 ไบต์

ต้องใช้ Imports System.Collections.Generic

Const N=Nothing
Function Z(h,r,a,Optional c=N,Optional p=N,Optional ByRef s=N)
If c Is N Then
c=New List(Of Long)
p=New List(Of Long)
End If
If s IsNot N And s?.Count<c.Count Then Return N
If p.Contains(h)Then Return N
p.Add(h)
For i=0To a.Count-1
Dim w=a(i)
If h Mod w=0Then
c.Add(w)
If h\w=1And(s Is N Or s?.Count>c.Count)Then
s=New List(Of Long)
s.AddRange(c)
End If
Z(h\w+r,r,a,c,p,s)
c.RemoveAt(c.Count-1)
End If
Next
Z=s
End Function

ฟังก์ชั่นZใช้เวลาสองInt64(จำนวนของหัวและอัตราการปลูกหัว) และList(Of Int64)(ภาค) และส่งกลับไม่มีList(Of Int64) (the ordered choice of Sectors). Returnsอะไรถ้าไม่มีวิธีการแก้ปัญหา

ถือว่าส่วนต่าง ๆ จะถูกจัดเรียงตามลำดับจากมากไปน้อยที่สุด

Optionalพารามิเตอร์สำหรับการโทร recursive บันทึกสถานะ พวกเขาติดตามลำดับปัจจุบันของภาคที่ใช้งานลำดับที่สั้นที่สุดของภาคและจำนวนหัวเคยพบ หากเราพบจำนวนหัวเท่ากันอีกครั้งก็ต้องมีวิธีที่สั้นกว่าในการเข้าถึง

การสั่งซื้อของภาคที่มีความสำคัญเพียงอย่างเดียวคือฉันจะต้อง1อยู่ได้นานหากมีอยู่ มิฉะนั้นไฮดราจะเติบโตอย่างไร้ขอบเขตเพราะฉันสามารถใช้1เซกเตอร์และไม่เคยลองเลย

ผมประกาศคงที่Nจะเป็นตัวแทนของNothingโกนหนวดออก 6 Nothingไบต์ในแต่ละครั้งที่ผมอยากจะใช้

And/ Orไม่ใช่การลัดวงจรดังนั้นฉันใช้ตัวดำเนินการเงื่อนไขแบบ null ( ?.) เพื่อหลีกเลี่ยงข้อผิดพลาด null object ในรหัสจริงฉันจะใช้AndAlso/ OrElseซึ่งทำลัดวงจร

ลองออนไลน์!


Z ยกเลิกการตีกอล์ฟเพื่อการอ่าน

Public Function Z(currentHeads As Long, regrowRate As Integer, weapons As ISet(Of Long), Optional currentWeapons As List(Of Long) = Nothing, Optional previousHeads As List(Of Long) = Nothing, Optional shortestWeapons As List(Of Long) = Nothing) As List(Of Long)

    ' initial call
    If currentWeapons Is Nothing Then
        currentWeapons = New List(Of Long)
        previousHeads = New List(Of Long)
    End If

    ' we've made more moves than our best so far
    If shortestWeapons IsNot Nothing AndAlso shortestWeapons.Count <= currentWeapons.Count Then
        Return Nothing
    End If

    ' exit, we've been here before
    If previousHeads.Contains(currentHeads) Then
        Return Nothing
    End If

    ' keep track of previous state to prevent duplicate paths
    previousHeads.Add(currentHeads)

    For Each w In weapons

        ' save 1 for last
        If w = 1 Then Continue For

        If currentHeads Mod w = 0 Then
            currentWeapons.Add(w)

            If currentHeads \ w = 1 Then
                If shortestWeapons Is Nothing OrElse shortestWeapons.Count > currentWeapons.Count Then
                    shortestWeapons = New List(Of Long)(currentWeapons)
                End If
            End If

            Dim answer = A(currentHeads \ w + regrowRate, regrowRate, weapons, currentWeapons, previousHeads, shortestWeapons)
            If answer IsNot Nothing Then
                If shortestWeapons Is Nothing OrElse shortestWeapons.Count > answer.Count Then
                    shortestWeapons = New List(Of Long)(answer)
                End If
            End If

            currentWeapons.RemoveAt(currentWeapons.Count - 1)
        End If
    Next

    If weapons.Contains(1) Then
        currentWeapons.Add(1)

        Dim answer = A(currentHeads \ 1 + regrowRate, regrowRate, weapons, currentWeapons, previousHeads, shortestWeapons)
        If answer IsNot Nothing Then
            If shortestWeapons Is Nothing OrElse shortestWeapons.Count > answer.Count Then
                shortestWeapons = New List(Of Long)(answer)
            End If
        End If

        currentWeapons.RemoveAt(currentWeapons.Count - 1)
    End If

    Return shortestWeapons
End Function
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.