Hydra Slayer'ın Dönüşü


13

Bu hydra'yı öldürdüğünüzden beri bir süredir , yıllarca şan için bastı, ama şimdi insanlar sizi yıkanmış olarak çağırıyor, oldu. Onları yanlış kanıtlamanın zamanı geldi, annra hidranın nerede olduğunu duydunuz. Sadece öldürün ve hak ettiğiniz tüm ihtişamla ödüllendirileceksiniz.

Kılıçlarınızı almak için cephaneliğe varıyorsunuz ama hepsi normal kılıçların dışında kalan tek sektörler. Bir n sektörü, bir Hydra üzerindeki kafa sayısını n'ye böler, ancak yalnızca kafa sayısı n'ye bölünebilirse kullanılabilir.

Bir kez daha, hydra'yı öldürmenize yardımcı olacak bazı kodlar yazacaksınız. Kodunuz hidranın kafa sayısını, kavgaya başlar, hidranın her turda büyüdüğü kafa sayısını ve kullanabileceğiniz n-sektörlerin listesini girdi olarak alır. Kodunuz, hidrayı olabildiğince çabuk katmak için en uygun hareket desenini çıkarır

Dövüşün her turunda, kullanmak için tek bir kılıç seçebilirsiniz, eğer bir dilimden sonra hidranın sadece bir başı varsa, kazanmazsa. Hiçbir zaman hamle yapamazsınız ve eğer olası hamle yoksa kaybedersiniz.

Çözüm mümkün değilse, boş bir liste, hiçbir şey, sıfır sayısı vb. Gibi bir çözümden başka bir çıktı alabilirsiniz.

Bu bu nedenle cevaplar bayt sayıları olarak puanlanır, daha azı daha iyi olur.

Test senaryoları

İşte bazı süper temel test senaryoları, istek üzerine daha fazla test örneği eklenecektir.

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]

Hidranın başlaması için sadece 1 kafa olabilir mi?
ETHproductions

@ETHproductions Bu durumu ele almanıza gerek yok.
Ad Hoc Garf Hunter

Listenin sıralandığını varsayabilir miyiz?
ETHproductions

@ETHproductions Evet yapabilirsiniz. Ben neden görmüyorum.
Ad Hoc Garf Hunter

1 sektör temelde "atla dön" kılıcı mıdır?
Neil

Yanıtlar:


5

JavaScript (ES6), 111 105 bayt

@ThePirateBay sayesinde 4 bayt kaydedildi

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

Çok daha güvenli genişlik-ilk döngüler için kullanmaya çalıştığım derinlik-ilk özyinelemeden vazgeçtim. Çözümü varsa dizi olarak çıktılar, yoksa sonsuza kadar çalışır. Buna izin verilmiyorsa, sonunda durdurulacak olan (çoğu durumda, yine de):

(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, 191190 bayt

Sayesinde bir bayt kaydetti Step Hen kurtardı

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

Kötü silah seçimlerinde döngüsel kafa rejenerasyonunu doğru şekilde ele almak için +26 bayt. (@ThePirateBay'e gösterdiği için teşekkürler)

Hatalara neden olan belirli kenar durumlarını düzeltmek için +27 bayt.

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]

Çevrimiçi deneyin!


Resuable bit genellikle global değişkenler oluşturamayacağınız, değiştiremeyeceğiniz ve bir dahaki sefere orijinal değerine geri döndüklerini varsayamayacağınız anlamına gelir. Politikanın burada ne hata yaptığını bilmiyorum - tam programların boş çıktı için kesinlikle hata vermesine izin verilecekti.
Stephen



1

VB.NET (.NET 4.5), 439 + 35 (içe aktarma) = 474 bayt

gerektirir 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

İşlev Ziki Int64(kafa sayısı ve kafa yeniden büyüme oranı) ve bir List(Of Int64)(Sektörler) alır ve List(Of Int64) (the ordered choice of Sectors). Returnsçözüm yoksa bir Şey ' döndürür .

Sektörlerin en büyüğünden en küçüğe doğru sıralanmış olarak sunulduğunu varsayar.

OptionalÖzyinelemeli çağrılar durumunu kaydetmek için parametrelerdir. Mevcut sektörlerin sırasını, şimdiye kadar sektörlerin en kısa sırasını ve karşılaşılan başkan sayısını takip ederler. Aynı sayıda kafa ile tekrar karşılaşırsak, ona ulaşmak için daha kısa bir yol olmalı.

Sektörlerin tek emri 1var ise sonuncu olmam gerekiyor . Aksi takdirde, hydra sınırsız büyüyebilir, çünkü her seferinde 1Sektörü kullanabilirim ve asla başka birini deneyemezdim.

Her kullanmak istediğimde 6 bayt tıraş Nederek temsil edecek bir sabit beyan Nothingettim Nothing.

And/ Orkısa devre değildir, bu yüzden ?.nesne null hatalarını önlemek için null koşullu işleci ( ) kullanın. Gerçek kodda, AndAlso/OrElse hangi kısa devre yapmak.

Çevrimiçi deneyin!


Z okunabilirlik için golf oynamaksızın

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.