Sự trở lại của Slayer Hydra


13

Đã được một thời gian kể từ khi bạn giết hydra đó , bạn đã đắm mình trong vinh quang trong nhiều năm, nhưng bây giờ mọi người đang kêu gọi bạn rửa sạch, đã được. Đã đến lúc bạn chứng minh họ sai, bạn đã nghe thấy nơi ở của ann ann hydra. Đơn giản chỉ cần giết nó và bạn sẽ được trao tất cả vinh quang mà bạn xứng đáng.

Bạn đến kho vũ khí để nhận thanh kiếm của mình nhưng tất cả chúng đều nằm ngoài thanh kiếm thông thường, tất cả những gì họ còn lại là Sector. Một n-sector sẽ chia số lượng đầu trên một Hydra cho n, nhưng chỉ có thể được sử dụng nếu số lượng đầu chia hết cho n.

Một lần nữa, bạn sẽ viết một số mã để giúp bạn giết hydra. Mã của bạn sẽ lấy đầu vào là số đầu của hydra, bắt đầu cuộc chiến với, số đầu của hydra tăng lên mỗi lượt và một danh sách các n-sector bạn có thể sử dụng. Mã của bạn sẽ tạo ra một mô hình di chuyển tối ưu để tiêu diệt hydra càng nhanh càng tốt

Mỗi lượt chiến đấu bạn có thể chọn một thanh kiếm duy nhất để sử dụng, nếu sau một lát, hydra chỉ có một đầu bạn thắng, nếu không nó sẽ mọc đầu. Bạn có thể không bao giờ thực hiện di chuyển, và nếu không có khả năng di chuyển có sẵn, bạn mất.

Nếu không có giải pháp nào khả thi, bạn có thể xuất bất cứ thứ gì ngoài giải pháp, ví dụ như một danh sách trống, không có gì, số 0, v.v.

Đây là vì vậy các câu trả lời sẽ được tính theo số byte của họ, với ít hơn là tốt hơn.

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

Dưới đây là một số trường hợp thử nghiệm siêu cơ bản, nhiều trường hợp thử nghiệm sẽ được thêm vào theo yêu cầu.

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]

Hydra chỉ có thể có 1 đầu để bắt đầu?
Sản phẩm ETH

@ETHproductions Bạn không phải xử lý trường hợp đó.
Đăng Rock Garf Hunter

Chúng ta có thể giả định rằng danh sách được sắp xếp?
Sản phẩm ETH

@ETHproductions Có bạn có thể. Tôi không thấy lý do tại sao không.
Đăng Rock Garf Hunter

Một khu vực 1 cơ bản là một thanh kiếm "bỏ qua"?
Neil

Câu trả lời:


5

JavaScript (ES6), 111 105 byte

Đã lưu 4 byte nhờ @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}}

Tôi đã bỏ qua đệ quy sâu đầu tiên mà tôi đang cố gắng sử dụng cho các vòng lặp đầu tiên an toàn hơn nhiều. Xuất ra giải pháp dưới dạng một mảng nếu nó tồn tại, chạy mãi mãi nếu không. Nếu điều này không được phép, thì đây là một trong những cuối cùng dừng lại (trong hầu hết các trường hợp, dù sao):

(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 byte

Đã lưu một byte nhờ Step Hen

(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 byte

+26 byte để xử lý đúng cách tái tạo đầu tuần hoàn trên các vũ khí xấu. (Cảm ơn @ThePirateBay đã chỉ ra)

+27 byte để sửa các trường hợp cạnh nhất định gây ra lỗi.

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]

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


Thông thường, bit có thể thay đổi có nghĩa là bạn không thể tạo các vars toàn cầu, sửa đổi chúng và cho rằng chúng trở lại giá trị ban đầu vào lần tới. Không có chính sách gì về lỗi ở đây - các chương trình đầy đủ chắc chắn sẽ được phép lỗi cho đầu ra trống.
Stephen


Có thể là 208 byte .
Jonathan Frech

1

VB.NET (.NET 4.5), 439 + 35 (nhập) = 474 byte

Đòi hỏi 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

Hàm Znày có hai Int64(số lượng đầu và tốc độ hoàn nguyên đầu) và một List(Of Int64)(Các ngành) và trả về Không có List(Of Int64) (the ordered choice of Sectors). Returnsgì 'nếu không có giải pháp.

Giả sử các ngành được trình bày theo thứ tự sắp xếp từ lớn nhất đến nhỏ nhất.

Các Optionaltham số dành cho các cuộc gọi đệ quy để lưu trạng thái. Họ theo dõi thứ tự hiện tại của Ngành đang sử dụng, thứ tự ngắn nhất của Ngành và số lượng người đứng đầu từng gặp. Nếu chúng ta gặp lại cùng một số đầu, thì phải có một cách ngắn hơn để tiếp cận nó.

Thứ tự duy nhất của Sector là vấn đề tôi cần 1phải là cuối cùng nếu nó tồn tại. Nếu không, hydra sẽ có thể phát triển mà không bị giới hạn bởi vì mỗi lượt tôi có thể chỉ cần sử dụng 1Khu vực và không bao giờ thử bất kỳ thứ gì khác.

Tôi đã khai báo một hằng số Nđể biểu diễn Nothing, loại bỏ 6 byte mỗi lần tôi muốn sử dụng Nothing.

And/ Orkhông bị đoản mạch, vì vậy tôi sử dụng toán tử điều kiện null ( ?.) để tránh các lỗi null đối tượng. Trong mã thực, tôi sẽ sử dụng AndAlso/ OrElselàm ngắn mạch.

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


Z không chơi gôn để dễ đọc

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
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.