Повернення вбивці гідри


13

Минуло час, коли ви вбили цю гідру , роками ви грілися в славі, але тепер люди називають вас вмитими, це було. Ну, настав час, коли ви доведете їх неправильно, ви чули, де знаходиться інша гідра. Просто вбийте його, і ви отримаєте всю славу, яку ви заслужили.

Ви приїжджаєте до збройової зброї, щоб отримати свої мечі, але всі вони поза звичайними мечами, все, що їм залишилося, - це Сектори. N-сектор поділить кількість головок на Hydra на 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 Hunter Hunter

1-сектор - це в основному меч "пропустити поворот"?
Ніл

Відповіді:


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 байт

Збережено байт завдяки кроку Хен

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

Спробуйте в Інтернеті!


Зазвичай збірний біт означає, що ви не можете створити глобальні VARS, змінити їх і припустити, що наступного разу вони повернуться до початкового значення. Не знаю, в чому політика тут помиляється - повним програмам, безумовно, буде дозволено помилитися за порожній вихід.
Стівен



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параметри є рекурсивними викликами для збереження стану. Вони відслідковують поточний порядок використовуваних секторів, найкоротший порядок секторів коли-небудь та кількість голов, що коли-небудь зустрічалися. Якщо ми знову зустрінемо однакову кількість голів, то, мабуть, був коротший шлях, щоб досягти цього.

Єдине впорядкування секторів, яке має значення, - мені потрібно 1бути останнім, якщо воно існує. Інакше гідра може рости без меж, тому що я можу на кожному кроці просто користуватися 1Сектором і ніколи не пробувати жодного іншого.

Я оголосив константу Nпредставляти Nothing, обробляючи 6 байт кожного разу, коли хотів використовувати Nothing.

And/ Orне мають короткого замикання, тому я використовую null умовний оператор ( ?.), щоб уникнути помилок об'єкта null. У реальному коді я б використовував 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.