ไวรัส vs Antidotes code golf [ปิด]


12

มีอาร์เรย์ 2D แบบสี่เหลี่ยมผืนผ้าที่มีไวรัสซึ่งแสดงด้วย 'v', antidote1 ที่ระบุโดย 'a' และ antidote2 แสดงด้วย 'b' (ไม่มีค่าอื่นนอกจาก 'v', 'a' และ 'b')

Antidote1 สามารถฆ่าไวรัสเพื่อนบ้านในทิศทางแนวนอนและแนวตั้งได้ แต่ Antidote2 สามารถฆ่าไวรัสเพื่อนบ้าน (ถ้ามี) ในแนวนอนแนวตั้งและแนวทแยงมุม

เมื่อเปิดใช้งานยาแก้พิษจำนวนไวรัสจะยังคงอยู่ในตอนท้าย?

ตัวอย่าง:

การป้อนข้อมูล:

vv
vv

ผลลัพธ์: 4

การป้อนข้อมูล:

av
vv

ผลลัพธ์: 1

การป้อนข้อมูล:

vvv
vbv
vvv

ผลลัพธ์: 0

การป้อนข้อมูล:

bvb
bav
vab
vvv
vvb
vvv
vvv
bva
vav

ผลลัพธ์: 3


2
ฉันขอขอบคุณการแก้ไขของคุณ @Grimy - เป็นความท้าทายที่ดี :)
pixma140

2
@KevinCruijssen มันไม่ได้รูปร่างผิดปกติ
Kiara Dan

4
ขอให้เราใช้ค่าโดยพลการ 3 (ชัดเจน) แทน "v", "a" และ "b"?
attinat

2
แอนตี้ไวรัสห่อหุ้ม (เช่น "a" ในแถวล่างจะลบ "v" ในแถวบนสุด)?
Brian

2
@ Kiara Dan ฉันจะไม่แนะนำให้ใช้ค่าที่แตกต่างกัน 3 ค่าเนื่องจากมันทำให้ตัวละครบางตัวอยู่ในความท้าทายรวมถึงความเป็นไปได้ที่ถูกบังคับด้วยความฉลาดด้วยรหัสจุดของตัวอักษร
lirtosiast

คำตอบ:


8

Python 3 , 135 ไบต์

j=''.join
p='j(s)'+4*'.replace("%s%s","%s%s")'%(*'vbbbbvbbavacvaca',)
f=lambda x:j(eval(2*'(eval(p)for s in zip(*'+'x))))')).count('v')

ลองออนไลน์!

-2 ไบต์ต้องขอบคุณ Kevin Cruijssen

คำอธิบาย

แทนที่ 'v' เป็น 'b' ทั้งหมดหากพบถัดจาก 'b' ถัดไปแทนที่ 'v' ทั้งหมดเป็น 'c' หากพบถัดจาก 'a' การทำซ้ำครั้งที่สองพร้อมกับเวอร์ชัน transposed ของอาเรย์จะทำการกำจัดไวรัสในแนวตั้งและแนวทแยงทั้งหมด ในที่สุดมันจะคืนค่าจำนวนที่เหลือของ 'v's


เป็นฟังก์ชั่นวนซ้ำที่อ่านได้มากขึ้น (155 ไบต์)


3
y>1elseคุณสามารถลบพื้นที่หลัง วิธีการที่ดีแม้ว่า ตอนแรกฉันไม่แน่ใจว่าวิธีนี้เกี่ยวข้องกับเส้นทแยงมุมbแต่ดูเหมือนว่าจะทำงานได้ดีเนื่องจากการเปลี่ยนของคุณ :) +1 จากฉัน
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! เส้นทแยงมุมได้รับการดูแลโดยแทนที่ 'v' ด้วย 'a' หากพวกเขาอยู่ถัดจาก 'b' ในการวนซ้ำครั้งที่สอง 'v ที่อยู่ติดกันจะถูกลบออก
Jitse

3
สำหรับอินพุตต่อไปนี้เอาต์พุตควรเป็น 3 แต่จะส่งคืน 4: bvb bav vab vvv vvb vvv vvv bva vav
Kiara Dan


1
@KevinCruijssen พบรายการที่สั้นกว่านี้ แต่ข้อเสนอแนะของคุณบันทึกอีกหนึ่งไบต์!
Jitse

5

JavaScript (ES7), 108 ไบต์

รับอินพุตเป็นเมทริกซ์ของอักขระ

f=m=>(g=(y,X,V)=>m.map(r=>r.map((v,x)=>V?v>f&V>'a'>(x-X)**2+y*y-2?r[x]=n--:0:v<f?g(-y,x,v):n++)|y++))(n=0)|n

ลองออนไลน์!

คล้ายกับคำตอบดั้งเดิมของฉัน แต่V>'a'>(x-X)**2+y*y-2จริง ๆ แล้วการทำสั้นกว่า 1 ไบต์โดยใช้เคล็ดลับ hexa ที่อธิบายไว้ด้านล่าง ¯ \ _ (ツ) _ / ¯


JavaScript (ES7), 109 ไบต์

รับอินพุตเป็นเมทริกซ์ของอักขระ

f=m=>(g=(y,X,V)=>m.map(r=>r.map((v,x)=>V?v>f&(x-X)**2+y*y<V-8?r[x]=n--:0:v<f?g(-y,x,'0x'+v):n++)|y++))(n=0)|n

ลองออนไลน์!

อย่างไร?

A1=(x1,Y1)A2=(x2,Y2)

Q(A1,A2)=(x2-x1)2+(Y2-Y1)2

เมื่อพิจารณาจากพิกัดจำนวนเต็มจะมีลักษณะดังนี้:

854585212541145212585458

ดังนั้น:

  • A1A2Q(A1,A2)<2
  • A1A2Q(A1,A2)<3

238

  • A16-810=210
  • B16-810=310

แสดงความคิดเห็น

f =                      // named function, because we use it to test if a character
                         // is below or above 'm'
m => (                   // m[] = input matrix
  g = (                  // g is a recursive function taking:
    y,                   //   y = offset between the reference row and the current row
    X,                   //   X = reference column
    V                    //   V = reference value, prefixed with '0x'
  ) =>                   //
    m.map(r =>           // for each row r[] in m[]:
      r.map((v, x) =>    //   for each value v at position x in r[]:
        V ?              //     if V is defined:
          v > f &        //       if v is equal to 'v'
          (x - X) ** 2 + //       and the quadrance between the reference point and
          y * y          //       the current point
          < V - 8 ?      //       is less than the reference value read as hexa minus 8:
            r[x] = n--   //         decrement n and invalidate the current cell
          :              //       else:
            0            //         do nothing
        :                //     else:
          v < f ?        //       if v is either 'a' or 'b':
            g(           //         do a recursive call:
              -y,        //           pass the opposite of y
              x,         //           pass x unchanged
              '0x' + v   //           pass v prefixed with '0x'
            )            //         end of recursive call
          :              //       else:
            n++          //         increment n
      ) | y++            //   end of inner map(); increment y
    )                    // end of outer map()
  )(n = 0)               // initial call to g with y = n = 0
  | n                    // return n

ขอบคุณ @Arnauld คุณสามารถอธิบายรหัสได้หรือไม่
Kiara Dan

3
@KiaraDan เรียบร้อยแล้ว
Arnauld

3

05AB1E , 33 30 29 ไบต์

2F.•s¯}˜?•2ô€Â2ä`.:S¶¡øJ»}'v¢

ลองออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามข้อ

พอร์ตของ@Jitse 's Python 3 คำตอบดังนั้นอย่าลืม upvote เขาด้วย!
-1 ขอบคุณไบต์@Jitse

คำอธิบาย:

เวอร์ชันดั้งเดิมมีข้อดีของความสามารถในการซิป / สลับรายการสตริงซึ่งเวอร์ชันใหม่จะต้องมีความชัดเจนSและJเนื่องจากใช้ได้กับรายการอักขระเท่านั้น แต่เวอร์ชันใหม่ยังคงสั้นกว่า 3 ไบต์โดยใช้€Âร่วมกับสตริงที่บีบอัดที่สั้นกว่า ในเวอร์ชันดั้งเดิมจะเก็บค่าสุดท้ายไว้ในสแต็กภายในแผนที่เท่านั้น แต่ในรุ่นใหม่มันจะเก็บค่าทั้งหมดไว้ในสแต็กภายในแผนที่

2F                  # Loop 2 times:
  .•s¯}˜?•          #  Push compressed string "vbvabbca"
   2ô               #  Split it into parts of size 2: ["vb","va","bb","ca"]
     €Â             #  Bifurcate (short for duplicate & reverse copy) each:
                    #   ["vb","bv","va","av","bb","bb","ca","ac"]
       2ä           #  Split it into two parts:
                    #   [["vb","bv","va","av"],["bb","bb","ca","ac"]]
         `          #  Push both those lists separated to the stack
          .:        #  Replace all strings once one by one in the (implicit) input-string
            S       #  Then split the entire modified input to a list of characters
             ¶¡     #  Split that list by newlines into sublists of characters
               ø    #  Zip/transpose; swapping rows/columns
                J   #  Join each inner character-list back together to a string again
                 »  #  And join it back together by newlines
}'v¢               '# After the loop: count how many "v" remain

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•s¯}˜?•"vbvabbca"


คุณไม่จำเป็นต้องbc=> baถ้าคุณใช้bv=> baก่อน=>av acดังนั้น.•6øнãI•(รูปแบบการบีบอัดของ `" bvavbaac ") ก็เพียงพอแล้วบันทึก 2 ไบต์
Grimmy

@Grimy ได้ผลใน 1 แทน 3 กรณีทดสอบที่ผ่านมาอย่างไร
Kevin Cruijssen

1
@KevinCruijssen สองขั้นตอนการเปลี่ยนแทนสามดูเหมือนว่าจะทำเคล็ดลับหลังจากทั้งหมด
23914

@ Jitse ขอบคุณ สตริงการบีบอัดสั้นลง 2 ไบต์ แต่ตอนนี้ฉันต้องการ.:(แทนที่ทั้งหมดหนึ่งครั้ง) แทน:(ให้แทนที่ทั้งหมดจนกว่าจะไม่มีอยู่อีกต่อไป) ถึงกระนั้น -1 :) ขอบคุณสำหรับการให้ฉันรู้ว่า.
Kevin Cruijssen

2

Java 10, 211 209 ไบต์

m->{int i=m.length,j,c=0,f,t,I,J;for(;i-->0;)for(j=m[i].length;j-->0;c+=m[i][j]>98?f/9:0)for(f=t=9;t-->0;)try{f-=m[I=i+t/3-1][J=j+t%3-1]==98||Math.abs(I-i+J-j)==1&m[I][J]<98?1:0;}catch(Exception e){}return c;}

การดัดแปลงคำตอบของฉันสำหรับความท้าทายแปดก้าวเดียวทั้งหมด
-2 ไบต์ขอบคุณที่@ceilingcat

ลองออนไลน์

คำอธิบาย:

m->{                           // Method with char-matrix parameter & int return-type
  int i=m.length,              //  Amount of rows
      j,                       //  Amount of columns
      c=0,                     //  Virus-counter, starting at 0
      f,                       //  Flag-integer
      t,I,J;                   //  Temp-integers
  for(;i-->0;)                 //  Loop over the rows of the matrix
    for(j=m[i].length;j-->0    //   Inner loop over the columns
        ;c+=                   //     After every iteration: increase the counter by:
            m[i][j]>98         //      If the current cell contains a 'v'
             f/9               //      And the flag is 9:
                               //       Increase the counter by 1
            :0)                //      Else: leave the counter unchanged by adding 0
      for(f=t=9;               //    Reset the flag to 9
          t-->0;)              //    Loop `t` in the range (9, 0]:
         try{f-=               //     Decrease the flag by:
           m[I=i+t/3-1]        //      If `t` is 0, 1, or 2: Look at the previous row
                               //      Else-if `t` is 6, 7, or 8: Look at the next row
                               //      Else (`t` is 3, 4, or 5): Look at the current row
            [J=j+t%3-1]        //      If `t` is 0, 3, or 6: Look at the previous column
                               //      Else-if `t` is 2, 5, or 8: Look at the next column
                               //      Else (`t` is 1, 4, or 7): Look at the current column
            ==98               //      And if this cell contains a 'b'
            ||Math.abs(I-i+J-j)==1
                               //      Or if a vertical/horizontal adjacent cell
              &m[I][J]<98?     //      contains an 'a'
               1               //       Decrease the flag by 1
            :0;                //      Else: leave the flag unchanged by decreasing with 0
         }catch(Exception e){} //     Catch and ignore any ArrayIndexOutOfBoundsExceptions,
                               //     which is shorter than manual checks
  return c;}                   //  And finally return the virus-counter as result

1

ถ่านขนาด 39 ไบต์

WS⊞υι≔⪫υ⸿θPθ≔⁰ηFθ«≧⁺›⁼ιv⁺№KMb№KVaηι»⎚Iη

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

WS⊞υι≔⪫υ⸿θPθ

เข้าร่วมสตริงการป้อนข้อมูลด้วย\rตัวละครและวาดผลลัพธ์ไปที่ผืนผ้าใบ

≔⁰η

ล้างจำนวน virii สด

Fθ«

วนซ้ำอักขระในอินพุต

≧⁺›⁼ιv⁺№KMb№KVaη

หากตัวละครปัจจุบันเป็นไวรัสและไม่มีbs ที่อยู่ติดกันในทิศทางใด ๆ หรือas orthogonally จากนั้นเพิ่มจำนวนของ virii สด

ι»

ทำซ้ำกับตัวละครต่อไป

⎚Iη

ล้างผ้าใบและพิมพ์จำนวนรวมของ virii สด


1

Perl ( -00lp), 82 ไบต์

ใช้ regex เพื่อแทนที่vด้วยช่องว่างแล้วนับvs

/.
/;$,="(|..{@-})";$;="(|.{@-,@+})";$_=s/(a$,|b$;)\Kv|v(?=$,a|$;b)/ /s?redo:y/v//

TIO

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