ขั้นตอนสุดท้ายของการปนเปื้อน


10

มีไวรัสอยู่ภายในผู้รับ 5x5 เมื่อเรารู้ว่ามันแพร่กระจายการปนเปื้อนภารกิจของคุณคือการส่งออกขั้นตอนสุดท้ายของการปนเปื้อน

ผู้รับ

มันจะแสดงเป็นอาร์เรย์สองมิติขนาด 5x5:

0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1

ในกรณีที่1หมายถึงตำแหน่งที่ไวรัสได้ที่ปนเปื้อนอยู่แล้วและ0ตำแหน่งไม่ปนเปื้อน

ไวรัสแพร่กระจายอย่างไร

  1. ตำแหน่งที่ปนเปื้อนไม่สามารถทำความสะอาดได้
  2. ตำแหน่งที่สะอาดจะถูกปนเปื้อนในขั้นตอนต่อไปเฉพาะในกรณีที่ตำแหน่งที่อยู่ติดกันอย่างน้อยสองแห่ง (เซลล์เหนือ, ตะวันออก, ใต้และตะวันตก) มีการปนเปื้อน
  3. ขั้นตอนสุดท้ายของการปนเปื้อนเกิดขึ้นเมื่อไม่มีเซลล์ที่สะอาดอีกต่อไปที่จะปนเปื้อน

ตัวอย่าง

เมื่อใช้ตามขั้นตอนที่ 1 ของการปนเปื้อนที่ผู้รับอธิบายไว้ข้างต้นขั้นตอนที่ 2 จะเป็น:

0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1

ขั้นตอนที่ 3 ของการปนเปื้อนจะเป็น:

0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

ขั้นตอนที่ 4 ของการปนเปื้อนจะเป็น:

0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

และขั้นตอนที่ 5 (ในตัวอย่างนี้อันสุดท้าย) จะเป็น:

0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

ท้าทาย

ให้เป็นอินพุตหนึ่งขั้นตอนของการปนเปื้อนคุณควรส่งออกขั้นตอนสุดท้ายของการปนเปื้อน

คุณได้รับอนุญาตให้เขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น คุณสามารถรับอินพุตเป็นอาร์เรย์ / รายการแยกตัวเลขหรือแม้กระทั่งเป็นสตริงได้ เลือกวิธีที่ดีที่สุดที่เหมาะกับภาษาของคุณ

คำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!

อีกกรณีทดสอบ

Input:
1 1 0 0 1
0 0 0 0 0
0 1 0 0 1
0 0 0 0 0
1 0 0 0 1

Output:
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1

Input:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
1 0 0 1 0
0 0 1 0 1
0 0 0 0 0
1 0 0 0 0
0 0 1 0 0

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

Output:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

1
จะ1 0 1เกิดขึ้นในผลลัพธ์ได้อย่างไร ไม่ใช่ศูนย์ศูนย์ที่อยู่ติดกับสอง1s?
ลินน์

@Lynn .. ฉันได้อัปเดตแล้ว) ... ขอโทษสำหรับสิ่งนั้น
นำออก

1
คุณสามารถเพิ่ม1 0 0 1 0 \ 0 0 1 0 1 \ 0 0 0 0 0 \ 1 0 0 0 0 \ 0 0 1 0 0เป็นกรณีทดสอบได้หรือไม่?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ ขอบคุณที่เพิ่มเข้ามา
ลบ

2
กรณีทดสอบทั้งหมดจนถึงขณะนี้มีเพียงแถวและคอลัมน์ที่ว่างเปล่าเท่านั้น ฉันขอแนะนำ0 1 0 0 0 \ 0 0 0 0 1 \ 0 0 1 0 0 \ 1 0 0 0 0 \ 0 0 0 1 0ซึ่งไม่เปลี่ยนแปลง
xnor

คำตอบ:


12

ตั้งแต่นี้โดยทั่วไปกำลังพูดถึงหุ่นยนต์มือถือฉันให้คุณ ..

กฎGolly Quicklife ขนาด 10 ไบต์

01234/234V

ใส่กฎวางตารางลงใน Golly เรียกใช้รูปแบบ รูปแบบผลลัพธ์คือผลลัพธ์

คำอธิบาย:

01234 Survive on any number of neighbors
     /234 Born on >2 neighbors
         V Only directly adjacent neighbors count

หรือถ้าคุณยืนยันในกฎ RuleLoader แบบเต็ม 89 ไบต์:

@RULE X
@TABLE
n_states:2
neighborhood:vonNeumann
symmetries:permute
011001
011101
011111

Rulename คือ X ซึ่งเหมือนกับขั้นตอนก่อนหน้านี้


3
นี่เป็นภาษาโปรแกรมหรือไม่
Lynn

1
Golly Quicklife สามารถจำลองB3/S23สิ่งที่สามารถทำอะไรได้! ... แต่มันมีรูปแบบการป้อนข้อมูลที่เข้มงวด (เช่นโปรแกรมทั้งหมดรวมอยู่ในอินพุต (คุณจะทำยังไงต่ออีก?)) แต่ทำไมทำลายความสนุก ??
CalculatorFeline

ทีนี้เราแค่รอคำถามที่ทำให้พฤติกรรมของหุ่นยนต์เซลลูล่าร์ในระยะยาวยาวนานขึ้น!
CalculatorFeline

1
ฉันมีข้อสงสัยเกี่ยวกับความถูกต้อง หาก Golly แสดงเฉพาะผลลัพธ์สุดท้ายเท่านั้นมันจะไม่เป็นไร แต่มันก็จะแสดงผลลัพธ์ระดับกลาง (เว้นแต่ฉันผิด)
lirtosiast

1
@CatsAreFluffy คุณมี upvote ของฉันแล้ว
lirtosiast

5

Python 2, 97 ไบต์

s=' '*6+input()
exec"s=s[1:]+('1'+s)[sum(s[i]<'1'for i in[-6,-1,1,6])>2or'/'>s];"*980
print s[6:]

ลองมันออนไลน์ อินพุตถูกใช้เป็นสตริงที่มีเครื่องหมายคำพูดโดยแต่ละบรรทัดคั่นด้วยบรรทัดใหม่ 980ไม่ดีที่สุดและสามารถแทนที่ด้วยหลายต่ำกว่า 35 เพราะมันมีผลกระทบกับความยาวของโปรแกรมนี้ไม่ฉันไม่เคยมีใครกำหนดความปลอดภัยต่ำสุดขอบเขตบนของการออกกำลังกายสำหรับผู้อ่าน


ต้องใช้เครื่องหมายคำพูดรอบอินพุตและ \ n หนีขึ้นบรรทัดใหม่
CalculatorFeline

@CatsAreFluffy ฉันเชื่อว่าลิงก์ Ideone จะอธิบายวิธีการป้อนข้อมูลให้ชัดเจน
xsot

อินพุตถูกใช้เป็นสตริงที่มีเครื่องหมายคำพูดโดยแต่ละแถวคั่นด้วย \ n s
CalculatorFeline

เอาล่ะฉันจะแก้ไขเพื่อให้มันคลุมเครือน้อยลง
xsot

3

Javascript (ES6), 91 89 87 ไบต์

เป็นฟังก์ชันที่รับอินพุตเป็นอาร์เรย์ของตัวเลขหรือสตริง

-2 ไบต์จาก Neil (การรวมการกำหนดyกับการแปลงสตริง)

-2 ไบต์ (ลบตัวแปรj)

f=x=>(y=x.map((z,i)=>~(i%5&&x[i-1])+~(i%5<4&x[i+1])+~x[i-5]+~x[i+5]<-5|z))+[]==x?y:f(y)
<!-- Snippet demo with array <-> string conversion for convenience -->
<textarea id="input" cols="10" rows="5">0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1</textarea>
<button id="submit">Run</button>
<pre id="output"></pre>
<script>
strToArray=x=>x.match(/\d/g)
arrayToStr=x=>([]+x).replace(/(.),(.),(.),(.),(.),*/g, '$1 $2 $3 $4 $5\n')
submit.onclick=_=>output.innerHTML=arrayToStr(f(strToArray(input.value)))
</script>


บันทึก 2 ไบต์โดยการเขียนแทน(y=...)+''==x (y=...),y+''==x
Neil

2

MATL , 22 ไบต์

tn:"t5Bt!=~2X53$Y+1>Y|

ใช้ได้กับภาษาปัจจุบัน (15.0.0)

ลองออนไลน์ !

รูปแบบอินพุตคือ: อาร์เรย์ 2 มิติที่มีแถวคั่นด้วยเครื่องหมายอัฒภาค ดังนั้นกรณีทดสอบทั้งสี่จึงมีอินพุตต่อไปนี้:

[0 0 0 0 1; 0 0 0 0 1; 0 0 0 1 1; 0 0 1 1 1; 0 1 1 1 1]

[1 1 0 0 1; 0 0 0 0 0; 0 1 0 0 1; 0 0 0 0 0; 1 0 0 0 1]

[1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1]

[1 0 0 1 0; 0 0 1 0 1; 0 0 0 0 0; 1 0 0 0 0; 0 0 1 0 0]

คำอธิบาย

สิ่งนี้จะทำการสังวัตนาซ้ำอีกครั้งแบบสองมิติของอาเรย์อินพุตด้วยมาสก์ต่อไปนี้ซึ่งกำหนดว่าเพื่อนบ้านใดที่นับว่ามีการปนเปื้อน:

0 1 0
1 0 1
0 1 0

เพื่อให้ได้ผลลัพธ์ที่มีขนาดเดียวกับอาเรย์ดั้งเดิมมันจะถูกเสริมด้วยกรอบของศูนย์และจากนั้นจะมีการเก็บรักษาส่วนที่ "ถูกต้อง" ไว้เท่านั้น (เช่นที่ไม่มีเอฟเฟกต์ขอบ)

ใช้ค่าเริ่มต้นที่ 2 กับเอาต์พุตของการแปลงและผลลัพธ์คือ ORed แบบองค์ประกอบพร้อมกับอินพุตดั้งเดิม

สิ่งนี้จะต้องทำในจำนวนที่เพียงพอเพื่อให้มั่นใจว่าสถานะสุดท้ายได้มาถึงแล้ว เกณฑ์ง่าย ๆ ที่ตอบสนองสิ่งนี้คือ: ซ้ำหลาย ๆ ครั้งตามจำนวนรายการในอาร์เรย์อินพุต (นั่นคือ 25 ครั้งในกรณีทดสอบ)

t          % get input 2D array implicitly. Duplicate
n:"        % repeat as many times as elements in the input array
  t        %   duplicate array
  5B       %   number 5 in binary: row vector [1 0 1] 
  t!       %   duplicate and transpose into column
  =~       %   compare for inequality with broadcast. Gives desired mask
  2X53$Y+  %   2D convolution. Output has same size as input 
  1>       %   true for elements equal or greater than 2
  Y|       %   element-wise OR with previous copy of the array
           % end loop. Implicitly display

1

TI-BASIC, 151 ไบต์

Prompt [A]
[A]→[B]
Lbl 0
[B]→[A]
For(Y,1,5
For(X,1,5
DelVar ADelVar BDelVar CDelVar D
If Y>1:[A](Y-1,X→A
If Y<5:[A](Y+1,X→B
If X>1:[A](Y,X-1→C
If X<5:[A](Y,X+1→D
max(A+B+C+D≥2,[A](Y,X→[B](Y,X
End
End
If [A]≠[B]:Goto 0
[B]

[[1,0,0,1,1][1,0,0,0,0]...]การป้อนข้อมูลเป็น


1
ฉันคิดว่าคุณสามารถรับได้ถึง 100 ไบต์ เคล็ดลับแรก: ใช้Repeatวง
lirtosiast

1

Lua 236 ไบต์

s=arg[1]u=s.sub while p~=s do p=s s=s:gsub("(%d)()",function(d,p)t=0 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)t=t+(p-7>0 and u(s,p-7,p-7)or 0)t=t+(p+5<30 and u(s,p+5,p+5)or 0)t=t+(p%6>0 and u(s,p,p)or 0)return t>1 and 1 or d end)end print(s)

ยอมรับอินพุตบนบรรทัดรับคำสั่งและใช้การจัดการสตริงของ Lua เพื่อรับคำตอบ

Ungolfed:

s=arg[1]
u=s.sub
while p~=s do
    p=s
    s=s:gsub("(%d)()", function(d, p)
                 t=0
                 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)
                 t=t+(p-7>0 and u(s,p-7,p-7)or 0)
                 t=t+(p+5<30 and u(s,p+5,p+5)or 0)
                 t=t+(p%6>0 and u(s,p,p)or 0)
                 return t>1 and 1 or d
    end)
end
print(s)

1

APL, 76 72 70 ไบต์

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡

มันทำอะไรได้บ้าง: ขยายเมทริกซ์ไปเป็น 7x7 จากนั้นให้เราวางตำแหน่งอาร์กิวเมนต์ของเรา (โอเมก้า) จากเมทริกซ์นี้ให้สร้างเมทริกซ์เด็ก "4" แต่ละอันเปลี่ยนไปในทิศทางที่แตกต่างกัน (ขึ้น / ลง / ซ้าย / ขวา) เพิ่มเข้าด้วยกัน (เพื่อให้เราได้จำนวนเพื่อนบ้าน) วางเฟรม (เพื่อกลับไปที่ เมทริกซ์ 5x5) หรือเมทริกซ์ใหม่นี้ที่มี "เก่า" เพื่อให้แน่ใจว่าเราไม่ได้วางเซลล์ใด ๆ ในกระบวนการ (เช่นที่ขอบ) จากนั้นใช้⍣≡ชุดค่าผสมเพื่อไปยังค่าจุดคงที่

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡
                                                             7 7↑⍵    ⍝ Expand the matrix
                                                       ¯1⊖¯1⌽         ⍝ Center the original matrix
                  (1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂               ⍝ Construct 4 child matrices, each offset from the original one by the values on the left of {}
                +/                                                    ⍝ Sum each matrix into one giant matrix
               ↑                                                      ⍝ Mix
     ¯1 ¯1↓1 1↓                                                       ⍝ Transform the 7x7 matrix back to a 5x5 matrix
   1<                                                                 ⍝ Check which elements are smaller than 1
 ⍵∨                                                                   ⍝ "Or" this matrix and the generated matrix
{                                                                 }⍣≡ ⍝ Find the fixpoint

ตัวอย่าง (พิจารณาหน้าที่ที่ได้รับมอบหมายcontaminate):

          stage ⍝ the base matrix
0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
      contaminate stage ⍝ apply the function
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.