เพิ่มประสิทธิภาพ Nullifiers ของฉัน


12

ฉันเป็นแฟนตัวยงของเกม Creeper World และเป็นภาคต่อโดยเฉพาะ คุณไม่จำเป็นต้องรู้ว่าเกมนี้ทำงานอย่างไรเพื่อตอบคำถามฉันแค่อยากพูดถึงที่มาของคำถามของฉัน

ในเกมเป้าหมายของคุณคือทำลาย Emitters ที่กำลังวางไข่ Creeper โดยใช้อาวุธที่เรียกว่า nullifier

Nullifiers สามารถทำลายอิมิตเตอร์ใด ๆ ในรัศมีนี้:

 eee
eeeee
eenee
eeeee
 eee

แต่ละ nullifier สามารถกำหนดเป้าหมายหลาย Emitters

วัตถุประสงค์ของคุณ

รับอาร์เรย์จำลองแผนที่ 2D ประกอบด้วยอะไรและemittersกับตัวละครสิ่งที่คุณต้องการอาจจะเป็นช่องว่างและอีเมลหรือหมายเลข - เพียงให้แน่ใจว่าพวกเขามีความแตกต่างออกแผนที่เดียวกันมีจำนวนที่เหมาะสมของ nullifiers n (หรือสิ่งที่คุณต้องการ ) ถูกวางไว้เพื่อให้ตัวปล่อยถูกทำลายด้วยจำนวนโมฆะน้อยที่สุด

หากมีวิธีที่เหมาะสมที่สุดในการทำเช่นนั้นเพียงแค่แสดงผลออกมาจะดี อย่างไรก็ตามถ้างานนั้นไม่สามารถแก้ไขได้บอกว่ามีตัวส่งสัญญาณจำนวนมากที่ไม่มีเลย์เอาต์ที่จะตีพวกเขาทั้งหมดคุณจะต้องแสดงสิ่งที่แตกต่างออกไปอย่างชัดเจน null จะพอเพียง

กฎด่วน:

  • อินพุต: อาร์เรย์หลายมิติ
  • ข้อมูลที่ป้อนจะมีอักขระสองตัวซึ่งไม่มีความหมายและตัวปล่อยรวมอยู่ในคำตอบของคุณ
  • เอาท์พุท: อาร์เรย์หลายมิติ
  • การส่งออกจะมีตัวละครทั้งสามมีความหมายอะไร , อีซีแอลและNullifierหรือผลผลิตแตกต่างถ้าใส่เป็นปัญหาโลกแตก
  • คุณสามารถแทนที่ตัวละครที่ไม่มีอะไรด้วย nullifier
  • nullifier สามารถกด emitters หลายและจะตีทั้งหมดที่อยู่ในช่วง
  • 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

ฉันสามารถใช้0, 1และ2หรือคล้ายคลึงกัน
user202729

@ user202729 ใช่ตราบใดที่คุณระบุว่าอะไรคืออะไรและทำให้มันสอดคล้องกัน IE หากตัวปล่อยคือ 1 ในอินพุตจากนั้นก็ต้องเป็น 1 ในเอาต์พุต
Troels MB Jensen

1
ฉันรัก Creeper World มันเป็นที่น่าพึงพอใจเสมอในที่สุดก็กำจัดร่องรอยสุดท้ายของไม้เลื้อย
Jo King

1
@ edc65 จุดรวมของcode-golfคือการลดขนาดรหัสโดยไม่ต้องกังวลกับ runtime
user202729

2
ฉันรักโลกวัลย์ด้วย!
orlp

คำตอบ:


4

Python 3 , 558 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 มากพอที่จะปรับให้เหมาะสมยิ่งขึ้น ฉันเรียนรู้บางสิ่งจากคำตอบของโอวีเอสนั่นสนุกดี

อินพุต (แก้ไขเพื่อให้ง่ายต่อการเขียนกรณีทดสอบ ) คาดว่า '' หรือ 'e' ในขณะที่เอาต์พุตใช้ '', 'n' สำหรับ nullifier และ 'x' สำหรับตัวปล่อยโมฆะที่ถูกลบล้าง ฟังก์ชั่นรับอินพุตที่คาดหวังซึ่งอธิบายไว้ในคำถาม

ฉันตั้งค่าตัวแปร e, w, n และ d นอกเพราะพวกเขาสามารถแทนที่ด้วยตัวเลขได้อย่างง่ายดายและหากอินพุตและเอาต์พุตถูกปรับเปลี่ยนให้ใช้ตัวเลขเช่นกันมันจะพิมพ์ออกมาเหมือนกัน ฉันใช้ตัวอักษรเพราะพวกเขาทำให้อ่านง่ายขึ้นในขณะที่ทำงานกับมัน

สนุกคำถาม OP! Creeper World นั้นยอดเยี่ยมและมันก็เป็นแรงบันดาลใจที่ยอดเยี่ยมสำหรับคำถาม :)

แก้ไข: -47 ไบต์ขอบคุณ Erik the Outgolfer


8
ขออภัยดูเหมือนว่านี่ไม่ใช่การแข่งขันที่รุนแรง ฉันขอแนะนำให้ลบมันจนกว่าคุณจะมีเวลาในการปรับให้เหมาะสม
Erik the Outgolfer

2
โอ๊ะฉันไม่ดี! แก้ไขให้ดีที่สุดในความสามารถของฉัน
GammaGames

1
คุณไม่จำเป็นต้องเว้นวรรค 2 อันสำหรับแต่ละระดับของการเยื้องและเพียงพอ 1
Erik the Outgolfer

3

Python 2 , 267 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สำหรับตัวปล่อย, 2สำหรับ nullifier และ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 ไบต์

ใช้0สำหรับ , 1สำหรับnและสำหรับ2e

โปรแกรมนี้สามารถใช้ในการแปลงจากรูปแบบอินพุตในการท้าทาย

หากมีการแก้ปัญหาไม่ว่ามันจะพิมพ์ข้อความข้อผิดพลาดlpdimเช่นนี้หรือlpsnfเช่นนี้

เวอร์ชันที่ใช้Outer(แม้ว่าจะอ่านได้มากขึ้น) นั้นยาวกว่า 2 ไบต์แม้จะมีชื่อย่อของOuter: ลองใช้ออนไลน์!


คำอธิบาย

โปรดทราบว่าสิ่งนี้สามารถลดลงเป็นปัญหาการโปรแกรมเชิงเส้นจำนวนเต็ม

แต่ละeเซลล์ได้รับการแก้ไขที่ 2 แต่ละเซลล์ว่างเป็นตัวแปรจำนวนเต็มซึ่งสามารถเป็นได้ทั้ง0(ว่าง) หรือ1(nullifier) pรายการของพิกัดของตัวแปรจะถูกเก็บไว้ในตัวแปร ( Positions ในtนั้นคือ0)

วัตถุประสงค์คือเพื่อลดจำนวนของ nullifier ที่ใช้ดังนั้นผลรวมของตัวแปรจำนวนเต็มเหล่านั้นจะต้องลดลง ( 1&/@pเวกเตอร์ประกอบด้วยทั้งหมด1และมีความยาวเท่ากับpความยาวของหมายถึงฟังก์ชันวัตถุประสงค์)

2q6

นี้เป็นสูตรที่มีเมทริกซ์m= (xBoole[Norm[x-#]^2<6]&/@p)/@q(สำหรับองค์ประกอบในแต่ละqสร้างแถวที่มีองค์ประกอบเป็น1ถ้าระยะทางสแควร์ ( Norm) เพื่อประสานงานที่สอดคล้องกันในpน้อยกว่า6) และเวกเตอร์=b1&/@q

หลังจากนั้นReplacePartและThread"ใช้" ค่าตัวแปรtและพิมพ์


Echoสามารถใช้แทนได้Printแต่เอาท์พุทที่มีก่อนหน้า>>นี้
user202729

น่าเสียดายที่1^pใช้งานไม่ได้ (แทน1&/@p)
user202729
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.