Nullifier'lerimi optimize et


12

Oyunun Creeper World ve özellikle devam filminin büyük bir hayranıyım. Bu oyunun soruyu cevaplamak için nasıl çalıştığını bilmenize gerek yok, sadece sorumun nereden geldiğini belirtmek istedim.

Oyunda amacınız, bir nullifier olarak bilinen bir silah kullanarak Creeper üreten Yayıcılar'ı yok etmektir.

Nullifier'ler bu yarıçaptaki herhangi bir yayıcıyı yok edebilir:

 eee
eeeee
eenee
eeeee
 eee

Her nullifier birden fazla Emitör'ü hedefleyebilir.

Hedefiniz

Hiçbir şeyden oluşan bir 2D haritayı simüle eden ve istediğiniz karakterlere sahip yayıcılar içeren bir dizi verildiğinde , boşluklar ve e veya sayılar olabilir - sadece ayırt edilebilir olduklarından emin olun, aynı haritayı optimal miktarda nullifikatör n (veya istediğiniz şeyle) çıkın ) yerleştirilir, böylece yayıcılar en az sayıda nullifikatörle yok edilir.

Bunu yapmanın birden çok optimal yolu varsa, sadece bir çıktı almak iyi olur. Bununla birlikte, görev çözülemezse, hiçbir düzenin hepsine çarpmayacak kadar çok yayıcı olduğunu söyleyin, ayırt edici derecede farklı bir şey çıkarmalısınız, null yeterli olacaktır

Hızlı Kurallar:

  • Girdi: çok boyutlu dizi
  • Giriş, hiçbir şey ve verici olmayan iki karakter içerecektir, cevabınıza ne olduğunu ekleyin
  • Çıktı: çok boyutlu dizi
  • Çıktı üç karakter içerecektir, yani hiçbir şey , verici ve nullifikatör VEYA giriş çözülemezse ayırt edilebilir bir çıktı anlamına gelir
  • Hiçbir karakteri yalnızca bir nullifier ile değiştirebilirsiniz.
  • Bir nullifier birden fazla yayıcıya çarpabilir ve daima menzil içindeki her şeye çarpar
  • Bir nullifier yukarıda belirtilen alana vurabilir ve her zaman hedefleyebileceği tüm yayıcılara çarpar
  • Bayt kazanmada en kısa cevaplar
  • standart boşluklar yasaktır

Örnekler

Giriş:

[[ , ,e, , ],
 [ , , , , ],
 [e, , , ,e],
 [ , , , , ],
 [ , ,e, , ]]

Çıktı:

 [[ , ,e, , ],
  [ , , , , ],
  [e, ,n, ,e],
  [ , , , , ],
  [ , ,e, , ]]

Giriş:

[[e,e,e,e,e],
 [e, , , ,e],
 [e, , , ,e],
 [e, , , ,e],
 [e,e,e,e,e]]

Çıktı:

[[e,e,e,e,e],
 [e, ,n, ,e],
 [e, , , ,e],
 [e, ,n, ,e],
 [e,e,e,e,e]]

Giriş:

[[e, , , , , , ,e, ,e, , , ,e, ,e, ,e, ,e],
 [ , ,e, , ,e, , , ,e,e, , , , ,e, , , , ],
 [ , ,e, , , ,e, ,e, ,e, ,e, ,e, ,e, , , ],
 [e, , , ,e, ,e, , , , , , , , , , , ,e, ],
 [e, , ,e, , , , , ,e, ,e, ,e, ,e, , , ,e],
 [ , , ,e, ,e, ,e, , , , , , , , , ,e, , ],
 [ ,e,e, ,e, , , ,e, ,e,e, ,e, ,e, ,e, , ],
 [ , ,e, , , ,e, , , , , , , , ,e,e, ,e, ],
 [ , , ,e, , , , ,e,e, , , , , , , , ,e, ],
 [e, , , , , , ,e, , , ,e,e, ,e, , , , , ],
 [ ,e,e, , ,e, , , , ,e, , , , , , ,e, , ],
 [ , , ,e,e, ,e, ,e, , , ,e,e, ,e, ,e, ,e],
 [e,e, , , , ,e, , , ,e, , , , , , , , , ],
 [ , , ,e, , , , , ,e, , ,e, ,e, ,e, ,e, ],
 [ , , , ,e, ,e, , , , , , , , , , , , , ],
 [e,e, , ,e,e, , ,e, , ,e, ,e, ,e, ,e, ,e],
 [e, ,e, ,e, , ,e,e,e, , ,e, , , ,e, , ,e],
 [ , , , ,e, , , , , ,e, , , ,e, , , , , ],
 [ , ,e, , , ,e, ,e, , , ,e, , , , ,e, , ],
 [ , , ,e, ,e, ,e, , ,e,e, , ,e,e, , ,e, ]]

Çıktı (Bu çıktı el yapımıdır ve en uygun çıktı olmayabilir):

[[e, , , , , , ,e, ,e, , , ,e, ,e, ,e, ,e],
 [ , ,e, , ,e, , ,n,e,e, , , ,n,e, , , , ],
 [ ,n,e, , ,n,e, ,e, ,e, ,e, ,e, ,e, ,n, ],
 [e, , , ,e, ,e, , , , , , , , , , , ,e, ],
 [e, , ,e, , , , , ,e, ,e, ,e, ,e, , , ,e],
 [ , ,n,e, ,e, ,e, , , ,n, , , , , ,e, , ],
 [ ,e,e, ,e, ,n, ,e, ,e,e, ,e, ,e,n,e, , ],
 [ , ,e, , , ,e, , , , , , , , ,e,e, ,e, ],
 [ , , ,e, , , , ,e,e, , , , , , , , ,e, ],
 [e, ,n, , , , ,e, , , ,e,e, ,e, , , , , ],
 [ ,e,e, , ,e,n, , ,n,e, , , ,n, , ,e,e, ],
 [ , , ,e,e, ,e, ,e, , , ,e,e, ,e, ,e, ,e],
 [e,e, , , , ,e, , , ,e, , , , , , , , , ],
 [ , , ,e, ,n, , , ,e, , ,e, ,e, ,e, ,e, ],
 [ ,n, , ,e, ,e, , , , , , , ,n, , , ,n, ],
 [e,e, , ,e,e, , ,e,n, ,e, ,e, ,e, ,e, ,e],
 [e, ,e, ,e, , ,e,e,e, , ,e, , , ,e, , ,e],
 [ , , , ,e, , , , , ,e, ,n, ,e, , ,n, , ],
 [ , ,e, ,n, ,e, ,e, , , ,e, ,n, , ,e, , ],
 [ , , ,e, ,e, ,e, ,n,e,e, , ,e,e, , ,e, ]]

Giriş:

[[e,e],
 [e,e]]

Çıktı:

null

Ben kullanabilir miyim 0, 1ve 2veya benzer?
user202729

@ user202729 Evet, ne olduğunu belirttiğiniz ve tutarlı tuttuğunuz sürece, bir verici girişte 1 ise IE, çıktıda 1 olmalıdır
Troels MB Jensen

1
Sarmaşık Dünyasını sevdim, sarmaşıkın son izlerini ortadan kaldırmak her zaman tatmin ediciydi
Jo King

1
@ edc65 Code- golf'ün tüm amacı, çalışma süresine önem vermeden kod boyutunu en aza indirmektir.
user202729

2
Sarmaşık dünyasını da seviyorum!
orlp

Yanıtlar:


4

Python 3 , 558 511 509 bayt

from itertools import*
E=enumerate
L=len
def s(s):
 q=[(x,y)for y,r in E(s)for x,k in E(r)if k==w]
 for i in range(1,L(q)):
  for c in combinations(q,i):
   m=[l*1for l in s]
   for p in c:
    m[p[1]][p[0]]=n
    for y,r in E([list(r) for r in' xxx ,xxxxx,xxnxx,xxxxx, xxx '.split(',')]):
     for x,k in E(r):
      o=(p[0]-x+2,p[1]-y+2)
      if k==d and-1<o[0]<L(m[0])and-1<o[1]<L(m)and m[o[1]][o[0]]==e:
       m[p[1]-y+2][p[0]-x+2]=d
   if e not in ','.join([''.join(r)for r in m]):return(m)
print(s(m))

Çevrimiçi deneyin!

Çok döngüsel, ama daha da optimize etmek için Python hakkında yeterince bilgim yok. Ovs'un cevabından bazı şeyler öğrendim, bu yüzden eğlenceliydi.

Giriş ( test senaryolarının yazılmasını kolaylaştırmak için değiştirildi ) '' veya 'e' beklerken, çıktı nullifier için '', 'n' ve nullifize bir verici için 'x' kullanır. İşlev, soruda açıklanan beklenen girdiyi alır.

E, w, n ve d değişkenlerini dışarıda ayarladım çünkü bunlar kolayca sayılarla değiştirilebiliyordu ve giriş ve çıkış da sayıları kullanacak şekilde değiştirildiyse aynı şeyi yazdıracaktı. Harfler kullandım çünkü üzerinde çalışırken daha okunabilir hale getirdiler.

Eğlenceli soru OP! Creeper World harika ve soru için harika bir ilham kaynağı oldu :)

Düzenleme: Outgolfer Erik sayesinde -47 bayt


8
Üzgünüz, ama bu ciddi bir rekabet değil. Optimize etmek için zamanınız olana kadar silmenizi tavsiye ederim.
Outgolfer Erik

2
Hata!
Yeteneklerimin

1
Aslında her girinti seviyesi için 2 boşluğa ihtiyacınız yoktur, 1 yeterlidir.
Outgolfer Erik

3

Python 2 , 267 263 bayt

from itertools import*
m=input()
E=enumerate
e=[(x,y)for y,a in E(m)for x,e in E(a)if e]
for n in count():
 for p in combinations(e,n):
	k=[l*1for l in m]
	for x,y in p:k[y][x]=2
	all(e+any(8>(y-Y)**2+(x-X)**2for X,Y in p)for y,a in E(m)for x,e in E(a))>0>exit(k)

Çevrimiçi deneyin!

0yayıcı, 2nullifikatör ve 1boş alan için.


1

Wolfram Dili (Mathematica) , 173168 bayt

t=ToExpression@$ScriptInputString
P=Position
p=t~P~0
q=t~P~2
Print@ReplacePart[t,Thread[p->LinearProgramming[1&/@p,(xBoole[Norm[x-#]^2<6]&/@p)/@q,1&/@q,0,Integers]]]

Çevrimiçi deneyin!

En büyük test senaryosunu 1 saniyede çözer .

Tam program. Bir fonksiyon olarak, daha kısa, sadece 130 bayt .

0İçin  , 1için nve 2için kullanın e.

Bu program , girişteki giriş formatından dönüştürmek için kullanılabilir.

Hiçbir çözüm varsa o hata mesajını yazdırır lpdimgibi bu ya, lpsnfgibi bu .

OuterKısa adı olmasına rağmen (daha okunabilir olmasına rağmen) sürüm 2 bayt daha uzun Outer: Çevrimiçi deneyin!


Açıklama.

Bunun bir tamsayı doğrusal programlama problemine indirgenebileceğini unutmayın.

Her ehücre 2'ye sabitlenir, her boş hücre 0(boş) veya 1(nullifier) olabilen bir tamsayı değişkenidir . Değişkenlerin koordinatları listesi değişkende saklanır p. ( Positions tolmasıdır 0)

Amaç, kullanılan nullifikatör sayısını en aza indirmektir, bu nedenle bu tamsayı değişkenlerinin toplamı en aza indirilmelidir. ( 1&/@p, bir vektör hepsinden oluşur 1ve uzunluğu p's uzunluğuna eşittir , objektif işlevi belirtir)

2q6

Bu, matris m= (xBoole[Norm[x-#]^2<6]&/@p)/@q(içindeki her öğe için, karşılık gelen koordinattaki kare mesafesi ( ) küçükse ) ve vector = qolan bir satır oluşturun .1Normp6b1&/@q

Bundan sonra ReplacePartve Threaddeğişken değerlerini "geçerli" tve yazdırabilirsiniz.


Echoyerine kullanılabilir Printancak çıktı bir öncekidir >>.
user202729

Maalesef 1^p(yerine 1&/@p) çalışmıyor .
user202729
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.