Nullifierを最適化する


12

私はゲームCreeper World、特に続編の大ファンです。質問に答えるためにこのゲームがどのように機能するかを知る必要はありません。私の質問がどこから来たのかを言及したかっただけです。

ゲームの目的は、無効化装置として知られる武器を使用して、クリーパーを生成しているエミッターを破壊することです。

Nullifierは、この半径内のエミッターを破壊できます。

 eee
eeeee
eenee
eeeee
 eee

各無効化機能は、複数のエミッターをターゲットにすることができます。

あなたの目的

配列からなる2Dマップシミュレートを考えると、何もしてエミッタ可能性があり、あなたが好きな文字とし、スペース電子または数字-ちょうど彼らが識別可能であること、nullifiersの最適な量と出力と同じマップがn個(またはあなたが希望するもの)エミッターが最小の無効化要素で破壊されるように配置されます。

最適な方法が複数ある場合は、1つを出力するだけで十分です。ただし、タスクが解決できない場合、レイアウトがそれらのすべてに当てはまらないほど多くのエミッタがあると言う場合、明確に異なる何かを出力する必要があります。nullで十分です。

クイックルール:

  • 入力:多次元配列
  • 入力には「なし」と「エミッタ」を意味する2つの文字が含まれ、回答には何が含まれますか
  • 出力:多次元配列
  • 出力には3つの文字が含まれます。これは、何もエミッターnullifierを意味するか、入力が解決できない場合は区別可能な出力を意味します
  • 何もしない文字はnullifierでのみ置き換えることができます
  • nullifierは複数のエミッターにヒットする可能性があり、常に範囲内のすべてにヒットします
  • nullifierは、上記で指定された領域にヒットでき、常にターゲットにできるすべてのエミッタにヒットします
  • バイト単位の最短回答が勝つ
  • 禁止されている標準的な抜け穴

入力:

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

出力:

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

入力:

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

出力:

[[e,e,e,e,e],
 [e, ,n, ,e],
 [e, , , ,e],
 [e, ,n, ,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, ,e, , ,e,e, , ,e,e, , ,e, ]]

出力(この出力は手作りであり、最適な出力ではない場合があります):

[[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, ]]

入力:

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

出力:

null

01および2/または同様のものを使用できますか?
user202729

@ user202729エミッタは入力中1である場合は、[はい、限り、あなたは何を何であるかを指定し、一貫性を保つよう、IEは、その後、同様にそれは出力に1でなければなりません
Troels MBジェンセン

1
私はクリーパーワールドが大好きで、クリーパーの最終的な痕跡を最終的に根絶することは常に満足でした
ジョーキング

1
@ edc65 code-golfのポイントは、ランタイムを気にせずにコードサイズを最小化することです。
user202729

2
クリーパーの世界も大好きです!
orlp

回答:


4

Pythonの3558の 511 509バイト

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

オンラインでお試しください!

非常にループ的ですが、Pythonをさらに最適化するのに十分な知識がありません。私はovsの答えからいくつかのことを学んだので、それは楽しかったです。

入力(テストケースを記述しやすくするために変更)は、「」または「e」を期待しますが、出力は、「」、「n」をnullifierに、「x」をnull化されたエミッターに使用します。この関数は、質問で説明された予想される入力を受け取ります。

e、w、n、およびd変数を外部に設定しました。これらは簡単に数字に置き換えることができ、入力と出力が数字を使用するように変更された場合、同じものを出力するからです。作業中に文字が読みやすくなったため、文字を使用しました。

楽しい質問、OP!Creeper Worldは素晴らしく、質問に対するクールなインスピレーションでした:)

編集:エリック・ザ・アウトゴルファーのおかげで-47バイト


8
申し訳ありませんが、これは真剣に競合するエントリではないようです。最適化する時間があるまで削除することをお勧めします。
エリックアウトゴルファー

2
おっと、私の悪い!私の能力を最大限に編集
GammaGames

1
実際には、各レベルのインデントに2つのスペースは必要ありません。1つあれば十分です。
エリックアウトゴルファー

3

パイソン2267の 263バイト

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)

オンラインでお試しください!

0エミッタ、2nullifier、および1空のスペース。


1

Wolfram言語(Mathematica)173 168バイト

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

オンラインでお試しください!

1秒で最大のテストケースを解きます。

完全なプログラム。関数としては、より短く、わずか130バイトです。

0for  1for nおよび2forを使用しeます。

このプログラムを使用して、チャレンジの入力形式から変換できます。

何の解決策が存在しない場合は、エラーメッセージを出力しますlpdimように、この、またはlpsnfのような

Outer(より読みやすい)を使用したバージョンは、短い名前にもかかわらず、2バイト長くなりますOuterオンラインで試してみてください!


説明。

これは整数線形計画問題に縮小できることに注意してください。

eセルは2に固定され、各空のセルは整数変数であり、0(空)または1(無効化)のいずれかです。変数の座標のリストはvariableに保存されますp。(その中Positionのs t0

目的は、使用される無効化の数を最小化することであるため、これらの整数変数の合計を最小化する必要があります。(1&/@p、ベクトルはすべて1で構成され、長さがの長さに等しいp、目的関数を示します)

制約は、各エミッター(2)(その位置はに格納されますq)の周囲に少なくとも無効化要素が存在するか、正確にはユークリッド距離が最大である必要があります6

これは、マトリックスm= (xBoole[Norm[x-#]^2<6]&/@p)/@q(の各要素に対して、対応する座標への2乗距離()がより小さい場合のq要素を持つ行を作成)とベクトル= で定式化されます。1Normp6b1&/@q

その後ReplacePartThread、変数の値を「適用」tし、それを印刷します。


Echoの代わりに使用できますPrintが、出力には先行する>>
user202729

残念ながら1^p(ではなく1&/@p)動作しません。
user202729
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.