ขุดร่องลึกชายแดน


59

แบ็คกราวน์:ผู้อพยพผิดกฎหมายจำนวนมากจาก Blandia กำลังข้ามพรมแดนไปยัง Astan จักรพรรดิแห่ง Astan มอบหมายให้คุณขุดคูเพื่อป้องกันไม่ให้พวกเขาและ Blandia ต้องจ่ายค่าใช้จ่าย เนื่องจากพนักงานพิมพ์ดีดทุกคนได้รับการผ่อนปรนจนกว่าจะมีการจัดร่องรหัสของคุณจะต้องสั้นที่สุด * * * *

ภารกิจ:เมื่อได้รับแผนที่ 2 มิติของเส้นขอบระหว่าง Astan และ Blandia ทำให้ Blands จ่าย (พร้อมที่ดิน) สำหรับร่องลึกชายแดน

ตัวอย่างเช่น:เมื่อทำเครื่องหมายเซลล์ Astanian เซลล์ABlandic ที่ทำเครื่องหมายBและเซลล์ trench ที่ทำเครื่องหมายไว้+(เฟรมแผนที่มีไว้เพื่อความชัดเจนเท่านั้น):

┌──────────┐ ┌──────────┐
│AAAAAAAAAA│ │AAAAAAAAAA│
│ABAAAAAABA│ │A+AAAAAA+A│
│ABBBAABABA│ │A+++AA+A+A│
│ABBBAABABA│ │A+B+AA+A+A│
│ABBBBABABA│→│A+B++A+A+A│
│ABBBBABBBB│ │A+BB+A++++│
│ABBBBABBBB│ │A+BB+A+BBB│
│ABBBBBBBBB│ │A+BB+++BBB│
│BBBBBBBBBB│ │++BBBBBBBB│
└──────────┘ └──────────┘

รายละเอียด:แผนที่จะมีอย่างน้อยสามแถวและสามคอลัมน์ แถวบนสุดจะเป็นภาษาแอสตาเนี่ยนทั้งหมดและแถวด้านล่างจะเป็นแบลนด์ทั้งหมด
 คุณสามารถใช้สามค่าใด ๆ เพื่อแสดงอาณาเขตแอสตาน, ดินแดนแบลนด์และร่องลึกชายแดนตราบใดที่อินพุตและเอาต์พุตสอดคล้องกัน

สูตรอัตโนมัติ:เซลล์ Blandic ที่มีอย่างน้อยหนึ่งเซลล์ Astanian ในละแวกมัวร์ของมันจะกลายเป็นเซลล์ร่องลึกชายแดน

กรณีทดสอบ

[
  "AAAAAAAAAA",
  "ABAAAAAABA",
  "ABBBAABABA",
  "ABBBAABABA",
  "ABBBBABABA",
  "ABBBBABBBB",
  "ABBBBABBBB",
  "ABBBBBBBBB",
  "BBBBBBBBBB"
]

กลายเป็น:

[
  "AAAAAAAAAA",
  "A+AAAAAA+A",
  "A+++AA+A+A",
  "A+B+AA+A+A",
  "A+B++A+A+A",
  "A+BB+A++++",
  "A+BB+A+BBB",
  "A+BB+++BBB",
  "++BBBBBBBB"
]

[
  "AAA",
  "AAA",
  "BBB"
]

กลายเป็น:

[
  "AAA",
  "AAA",
  "+++"
]

[
  "AAAAAAAAAA",
  "AAAABBBAAA",
  "AAAABBBAAA",
  "AAAABBBAAA",
  "AAAAAAAAAA",
  "BBBBBBABBB",
  "BBBBBBAABB",
  "BBBAAAAABB",
  "BBBBBBBBBB"
]

กลายเป็น:

[
  "AAAAAAAAAA",
  "AAAA+++AAA",
  "AAAA+B+AAA",
  "AAAA+++AAA",
  "AAAAAAAAAA",
  "++++++A+++",
  "BB++++AA+B",
  "BB+AAAAA+B",
  "BB+++++++B"
]

* การปฏิเสธความรับผิด: การยอมรับใด ๆ ต่อ GEOPOLITICS ที่เกิดขึ้นจริงคือการเกิดขึ้นซ้ำซ้อน!


23
การเสียดสีทางการเมืองในรูปแบบของรหัสกอล์ฟฉันรักมัน: o)
Sok

4
-1 สำหรับสิ่งนั้น<sup><sub><sup><sub><sup><sub><sup><sub>:-P
หลุยส์เมนโด

25
หลาม, 4 ไบต์ : passแผนการสร้างร่องลึกชายแดนนำไปสู่การปิดระบบของรัฐบาลและไม่มีอะไรเกิดขึ้น
TheEspinosa

3
@TheEspinosa ไม่ไม่ปิดคือจนกว่าสลักมีการจัดเรียง
อดัม

1
ฉัน upvoting เพียงเพราะเรื่องราวเบื้องหลัง ไม่ได้อ่านต่อไป
ท่อ

คำตอบ:



9

MATL , 11 8 ไบต์

แรงบันดาลใจจาก@ flawr ของคู่คำตอบและ@ lirtosiast คำตอบของ

EG9&3ZI-

การป้อนข้อมูลที่เป็นเมทริกซ์ที่มีตัวแทนจาก Astan 0และ Blandia 1โดย 2ร่องลึกเป็นตัวแทนในการส่งออกโดย

ลองออนไลน์!

มันทำงานอย่างไร

E       % Implicit input. Multiply by 2, element-wise
G       % Push input again
9       % Push 9
&3ZI    % Erode with neighbourhood of 9 elements (that is, 3×3) 
-       % Subtract, element-wise. Implicit display

8

JavaScript (ES7),  84  82 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Shaggy

301

a=>(g=x=>a.map(t=(r,Y)=>r.map((v,X)=>1/x?t|=(x-X)**2+(y-Y)**2<v:v||g(X,y=Y)|t)))()

ลองออนไลน์!

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

a => (                      // a[] = input matrix
  g = x =>                  // g = function taking x (initially undefined)
    a.map(t =               //   initialize t to a non-numeric value
      (r, Y) =>             //   for each row r[] at position Y in a[]:
      r.map((v, X) =>       //     for each value v at position X in r[]:
        1 / x ?             //       if x is defined (this is a recursive call):
          t |=              //         set the flag t if:
            (x - X) ** 2 +  //           the squared Euclidean distance
            (y - Y) ** 2    //           between (x, y) and (X, Y)
            < v             //           is less than v (3 = Astan, 0 = Blandia)
        :                   //       else (this is the initial call to g):
          v ||              //         yield v unchanged if it's equal to 3 (Astan)
          g(X, y = Y)       //         otherwise, do a recursive call with (X, Y) = (x, y)
          | t               //         and yield the flag t (0 = no change, 1 = trench)
      )                     //     end of inner map()
    )                       //   end of outer map()
)()                         // initial call to g


4
@Shaggy คำถามไม่เพียงพอเมื่อเร็ว ๆ นี้ ฉันไม่รู้ว่าจะตีกอล์ฟอีกแล้ว : D ขอบคุณ!
Arnauld

ก่อนหน้านี้ฉันคิดแบบเดียวกัน!
Shaggy

7

K (ngn / k) , 23 ไบต์

{x+x&2{++/'3'0,x,0}/~x}

ลองออนไลน์!

ใช้0 1 2สำหรับ"AB+"

{ } ฟังก์ชั่นที่มีข้อโต้แย้ง x

~ ตรรกะไม่ได้

2{ }/ ทำสองครั้ง

  • 0,x,0 ล้อมรอบด้วย 0-s (ด้านบนและด้านล่างของเมทริกซ์)

  • 3' สามแถวติดต่อกัน

  • +/' รวมกัน

  • + ไขว้

x&ตรรกะและของxด้วย

x+เพิ่มxไปยัง


5

APL (Dyalog Unicode) , 11 ไบต์SBCS

⊢⌈{2∊⍵}⌺3 3

นี้จะขึ้นอยู่กับวิธีการแก้ปัญหา 12 ไบต์ของ @ dzaima ในการแชท ให้เครดิตกับ @ Adámด้วยตนเองเพราะคิดว่าจะใช้ใน dfn และ @ H.PWiz สำหรับเตือนให้เราใช้การเข้ารหัสเดียวกันสำหรับอินพุตและเอาต์พุต

ลองออนไลน์!

หมายถึง'AB+'เป็น2 0 1ตามลำดับ

{ }⌺3 3 ใช้ฟังก์ชั่นกับแต่ละส่วนที่ซ้อนทับ 3 × 3 ของอินพุตรวมถึงพื้นที่ที่ขยายออกไป 1 ยูนิตนอกเมทริกซ์

2∊⍵2 มีอยู่ในการโต้แย้งหรือไม่ ส่งคืนบูลีน 0/1

⊢⌈ ค่าสูงสุดต่อองค์ประกอบนั้นและเมทริกซ์ดั้งเดิม


แน่นอนว่าการสลับไปใช้ลายฉลุจะช่วยให้คุณประหยัดมากกว่าครึ่งไบต์
อดัม

@ Adámที่จะเป็นคำตอบในภาษาที่แตกต่างกันดังนั้นจึงไม่สามารถเทียบเคียงหรือแข่งขันกับคำตอบนี้ได้ และฉันไม่พบว่าการเล่นกอล์ฟในภาษาวัตถุประสงค์พิเศษที่น่าสนใจโดยเฉพาะอย่างยิ่งขออภัย
ก.ย.

@ Adam เป็นชื่อแทนที่displayฉันลืมที่จะลบ นำออกแล้ว
ngn

5

PowerShellขนาด 220 ไบต์

มันไม่เล็กเท่ากับผลงานอื่น ๆ แต่ฉันคิดว่าฉันจะเพิ่มไว้เพื่อการอ้างอิง [FORE!]

function m($i,$m){($i-1)..($i+1)|?{$_-in0..$m}}
$h=$a.count-1;$w=$a[0].length-1
foreach($i in 0..$h){-join$(foreach($j in 0..$w){if ($a[$i][$j]-eq'B'-and($a[(m $i $h)]|?{$_[(m $j $w)]-match'A'})){'+'}else{$a[$i][$j]}})} 

ลองออนไลน์!


1
ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดีพร้อมลิงค์ของ TIO! ไม่ต้องกังวลเกี่ยวกับความยาวของรหัส แต่ละภาษาแข่งขันกันเอง Btw คุณสามารถบันทึกหนึ่งไบต์โดยการลบตัวแบ่งบรรทัดแรกโดยไม่มีผลร้าย
อดัม

บรรทัดสุดท้ายสามารถกลายเป็น0..$h|%{-join$(foreach($j in 0..$w){if ($a[$_][$j]-eq'B'-and($a[(m $_ $h)]|?{$_[(m $j $w)]-match'A'})){'+'}else{$a[$_][$j]}})}207 ไบต์ได้หรือไม่?
Gabriel Mills

4

อ็อกเทฟ , 37 31 26 ไบต์

ฟังก์ชั่นนี้ทำการพังทลายของรูปร่างในส่วน Astan ( 1-b) ของ "ภาพ" โดยใช้แล้วใช้เลขคณิตเพื่อทำให้สัญลักษณ์ทั้งสามด้านแตกต่างกัน ขอบคุณ @LuisMendo สำหรับ -5 ไบต์!conv2 imerode

@(b)2*b-imerode(b,ones(3))

ลองออนไลน์!


2
-1 โดยไม่มีการโน้มน้าว :-P
Luis Mendo

@LuisMendo รุ่นก่อนหน้านี้มีข้อตกลง :)
ข้อบกพร่อง

ขอขอบคุณอัปเดต!
ข้อบกพร่อง

3

J , 28 ไบต์

>.3 3(2 e.,);._3(0|:@,|.)^:4

ลองออนไลน์!

'AB+' -> 2 0 1

แรงบันดาลใจจากโซลูชัน APL ของ ngn 12 ไบต์เพื่อเลื่อนเมทริกซ์ด้วยเลขศูนย์ ...


เหตุใดโซลูชั่น APL จึงสามารถหนีได้โดยไม่ต้องเว้นระยะห่างศูนย์
โยนาห์

@Jonah: APL's (ฉลุ) ทำมันโดยไม่เจตนา: "สี่เหลี่ยมมีศูนย์กลางอยู่ที่องค์ประกอบต่อเนื่องของ Y และ (ยกเว้นขนาดสี่เหลี่ยมผืนผ้าคือ 1) เต็มไปด้วยองค์ประกอบเติม"
Galen Ivanov

ดูเหมือนว่ามีประโยชน์มากกว่าเวอร์ชั่นของ J ...
โยนาห์

@Jonah ใช่มันเป็น!
Galen Ivanov

2

ถ่าน 20 ไบต์

≔⪫θ⸿θPθFθ⎇∧№KMA⁼Bι+ι

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

≔⪫θ⸿θ

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

Pθ

พิมพ์สตริงอินพุตโดยไม่เลื่อนเคอร์เซอร์

Fθ

วนซ้ำอักขระแต่ละตัวของสตริงอินพุต

⎇∧№KMA⁼Bι

หากละแวกมัวร์มีAและตัวละครปัจจุบันคือB...

+

... จากนั้นเขียนทับBด้วย+...

ι

... มิฉะนั้นพิมพ์อักขระปัจจุบัน (หรือย้ายไปที่บรรทัดถัดไปหากอักขระปัจจุบันคือ carriage return)


2

JavaScript, 85 ไบต์

โยนสิ่งนี้ด้วยกันเมื่อคืนที่แล้วและลืมมันไป อาจยังคงมีห้องสำหรับการปรับปรุงบางแห่ง

อินพุตและเอาต์พุตเป็นอาร์เรย์ของอาร์เรย์หลักที่ใช้3สำหรับ Astan 0สำหรับ Blandia และ1สำหรับร่องลึกก้นสมุทร

a=>a.map((x,i)=>x.map((y,j)=>o.map(v=>o.map(h=>y|=1&(a[i+v]||x)[j+h]))|y),o=[-1,0,1])

ลองมันออนไลน์ (เพื่อความสะดวกสบายจากแผนที่และกลับเป็นรูปแบบของ I / O ที่ใช้ในความท้าทาย)


2

Javascript, 126 118 ไบต์

_=>_.map(x=>x.replace(/(?<=A)B|B(?=A)/g,0)).map((x,i,a)=>[...x].map((v,j)=>v>'A'&&(a[i-1][j]<v|(a[i+1]||x)[j]<v)?0:v))

ส่งผ่านหนึ่งในอาร์เรย์ของสตริงจากคำถามและคุณจะได้รับอาร์เรย์ของสตริงอักขระอาเรย์ (ขอบคุณ @Shaggy!) ออกโดยใช้ 0 สำหรับร่อง สามารถอาจจะแข็งแรงเล่นกอล์ฟมากขึ้น (โดยไม่ต้องสลับไปยังอาร์เรย์ตัวเลข) แต่ฉันไม่สามารถคิดอะไรในขณะนี้


ฉันคิดว่ามันใช้งานได้ 120 ไบต์
Shaggy

หรือ116 ไบต์ส่งกลับอาร์เรย์ของอาร์เรย์อักขระ
Shaggy

1
@Shaggy สนามกอล์ฟของคุณใช้งานไม่ได้เศร้า - มันไม่ได้เกิดขึ้นในที่ที่ A และ B อยู่ในแนวทแยงซึ่งกันและกัน ในทางกลับกันมันชี้ให้เห็นถึงสนามกอล์ฟที่เรียบง่ายจริงๆที่ฉันพลาด ...
. Dirr

1

เรติน่า 0.8.2 , 92 80 ไบต์

(?<=¶(.)*)B(?=.*¶(?<-1>.)*(?(1)_)A|(?<=¶(?(1)_)(?<-1>.)*A.*¶.*))
a
iT`Ba`+`.?a.?

ลองออนไลน์! ตามคำตอบของฉันอย่างอิสระฉันจะทำมันให้ทันเวลาหรือไม่? คำอธิบาย: Bs ใด ๆที่สูงกว่าหรือต่ำกว่าAs จะกลายเป็นas ซึ่งจะช่วยลดปัญหาในการตรวจสอบBs ไปทางซ้ายหรือขวาของAs หรือas as ตัวเองยังต้องได้รับกลายเป็น+ของแน่นอน แต่โชคดีiธงTมีผลกระทบเฉพาะการจับคู่ regex ไม่ทับศัพท์ที่เกิดขึ้นจริงดังนั้นAs ยังคงได้รับผลกระทบ


1

05AB1E , 29 ไบต์

_2FIн¸.øVgN+FYN._3£})εøO}ø}*Ā+

เมทริกซ์ไม่ใช่ชุดสูทที่แข็งแกร่งของ 05AB1E (ไม่ใช่ชุดสูทที่แข็งแกร่งของฉัน) .. สามารถตีกอล์ฟได้มากกว่านี้
แรงบันดาลใจจาก@ngn 's K (ngn / k) คำตอบดังนั้นยังใช้ I / O ของเมทริกซ์จำนวนเต็ม 2D ด้วย012สำหรับAB+ตามลำดับ

ลองมันออนไลน์ (ส่วนท้ายของ TIO คือพิมพ์งานสวย ๆ เอาออกเพื่อดูผลลัพธ์ของเมทริกซ์)

คำอธิบาย:

_                # Inverse the values of the (implicit) input-matrix (0→1 and 1→0)
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #   → [[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0]]
 2F              # Loop `n` 2 times in the range [0, 2):
   Iн            #  Take the input-matrix, and only leave the first inner list of 0s
                 #   i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]] → [0,0,0,0]
     ¸           #  Wrap it into a list
                 #   i.e. [0,0,0,0] → [[0,0,0,0]]
               #  Surround the inverted input with the list of 0s
                 #   i.e. [[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0]] and [0,0,0,0]
                 #    → [[0,0,0,0],[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0]]
        V        #  Pop and store it in variable `Y`
   g             #  Take the length of the (implicit) input-matrix
                 #   i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]] → 4
    N+           #  Add `n` to it
                 #   i.e. 4 and n=0 → 4
                 #   i.e. 4 and n=1 → 5
      F          #  Inner loop `N` in the range [0, length+`n`):
       Y         #   Push matrix `Y`
        N._      #   Rotate it `N` times towards the left
                 #    i.e. [[0,0,0,0],[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0]] and N=2
                 #     → [[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1]]
            3£   #   And only leave the first three inner lists
                 #    i.e. [[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1]]
                 #     → [[1,0,1,1],[1,0,0,0],[0,0,0,0]]
              }  #  After the inner loop:
    )            #  Wrap everything on the stack into a list
                 #   → [[[0,0,0,0],[1,1,1,1],[1,0,1,1]],[[1,1,1,1],[1,0,1,1],[1,0,0,0]],[[1,0,1,1],[1,0,0,0],[0,0,0,0]],[[1,0,0,0],[0,0,0,0],[0,0,0,0]]]
     €ø          #  Zip/transpose (swapping rows/columns) each matrix in the list
                 #   → [[[0,1,1],[0,1,0],[0,1,1],[0,1,1]],[[1,1,1],[1,0,0],[1,1,0],[1,1,0]],[[1,1,0],[0,0,0],[1,0,0],[1,0,0]],[[1,0,0],[0,0,0],[0,0,0],[0,0,0]]]
       O         #  And take the sum of each inner list
                 #   → [[2,1,2,2],[3,1,2,2],[2,0,1,1],[1,0,0,0]]
        ø        #  Zip/transpose; swapping rows/columns the entire matrix again
                 #   i.e. [[2,1,2,2],[3,1,2,2],[2,0,1,1],[1,0,0,0]]
                 #    → [[2,3,2,1],[1,1,0,0],[2,2,1,0],[2,2,1,0]]
               } # After the outer loop:
                 #   i.e. [[3,5,5,4,2],[4,6,5,4,2],[2,3,2,2,1],[1,1,0,0,0]]
  *              # Multiple each value with the input-matrix at the same positions,
                 # which implicitly removes the trailing values
                 #  i.e. [[3,5,5,4,2],[4,6,5,4,2],[2,3,2,2,1],[1,1,0,0,0]]
                 #   and [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #    → [[0,0,0,0],[0,1,0,0],[0,2,1,0],[2,2,1,0]]
   Ā             # Truthify each value (0 remains 0; everything else becomes 1)
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,2,1,0],[2,2,1,0]]
                 #   → [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,0,0]]
    +            # Then add each value with the input-matrix at the same positions
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,0,0]]
                 #   and [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #    → [[0,0,0,0],[0,2,0,0],[0,2,2,2],[2,2,1,1]]
                 # (and output the result implicitly)

1

C # (Visual C # Interactive Compiler) , 187 ไบต์

a=>a.Select((b,i)=>b.Select((c,j)=>{int k=0;for(int x=Math.Max(0,i-1);x<Math.Min(i+2,a.Count);x++)for(int y=Math.Max(0,j-1);y<Math.Min(j+2,a[0].Count);)k+=a[x][y++];return k>1&c<1?9:c;}))

แทนที่จะใช้การผูกมัดTake()s, Skip()s และSelect()s แทนที่จะใช้การวนซ้ำสองครั้งเพื่อค้นหาเพื่อนบ้าน ไบต์ขนาดใหญ่ลดลงจาก 392 ไบต์เป็น 187 Linq ไม่ได้สั้นที่สุดเสมอไป!

ลองออนไลน์!


1

Perl 5, 58 46 ไบต์

$m=($n=/$/m+"@+")-2;s/A(|.{$m,$n})\KB|B(?=(?1)A)/+/s&&redo

TIO

-12 ไบต์ขอบคุณ @Grimy

/.
/;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo

TIO

  • -pชอบ-nแต่พิมพ์ด้วย
  • -00 โหมดย่อหน้า
  • เพื่อให้ width-1 /.\n/ตรงกับอักขระตัวสุดท้ายของบรรทัดแรก
  • @{-} อาร์เรย์พิเศษตำแหน่งของการเริ่มต้นของการจับคู่ของกลุ่มที่จับคู่ก่อนหน้านี้ถูกบังคับเป็นสตริง (องค์ประกอบแรก)
  • s/../+/s&&redoแทนที่การแข่งขันโดย+ในขณะที่การแข่งขัน
    • /sตั้งค่าสถานะเพื่อให้.ตรงกับอักขระขึ้นบรรทัดใหม่
  • A(|.{@{-}}.?.?)\KB ไม้ขีด
    • ABหรือAตามด้วยอักขระ (width-1) ถึง (width + 1) อักขระB
    • \Kเพื่อให้ด้านซ้ายของBไม่เปลี่ยนแปลง
  • B(?=(?1)A),
    • (?1) การวนซ้ำแบบซ้ำเพื่ออ้างอิงนิพจน์ก่อนหน้า (|.{$m,$o})
    • (?=..) lookahead เพื่อให้ตรงกับโดยไม่ต้องใช้อินพุต

-9 ไบต์ด้วย/. /,@m=@-while s/A(|.{@m}.?.?)\KB|B(?=(?1)A)/+/s(ขึ้นบรรทัดใหม่ตามตัวอักษรใน regex แรก) TIO
Grimmy

1
ลงไปที่ /. /;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo46: TIO
Grimmy

ขอบคุณฉันยังมีความคิด แต่ถูกทิ้งเพราะกำลังคิดที่จะย้อนรอยหายนะอย่างไรก็ตามสำหรับการเล่นกอล์ฟรหัสไม่สำคัญ
Nahuel Fouilleul

1

Java 8, 169 145 ไบต์

m->{for(int i=m.length,j,k;i-->0;)for(j=m[i].length;j-->0;)for(k=9;m[i][j]==1&k-->0;)try{m[i][j]=m[i+k/3-1][j+k%3-1]<1?2:1;}catch(Exception e){}}

-24 ไบต์ขอบคุณที่@ OlivierGrégoire

ใช้0แทนAและ1แทนที่Bด้วยอินพุตเป็นเมทริกซ์จำนวนเต็ม 2D แก้ไขอินพุตเมทริกซ์แทนการส่งคืนใหม่เพื่อบันทึกไบต์

เซลล์จะถูกตรวจสอบเช่นเดียวกับในคำตอบของฉันสำหรับทุกแปดเดียวท้าทาย

ลองออนไลน์

คำอธิบาย:

m->{                            // Method with integer-matrix parameter and no return-type
  for(int i=m.length,j,k;i-->0;)//  Loop over the rows
    for(j=m[i].length;j-->0;)   //   Inner loop over the columns
      for(k=9;m[i][j]==1&       //    If the current cell contains a 1:
          k-->0;)               //     Inner loop `k` in the range (9, 0]:
        try{m[i][j]=            //      Set the current cell to:
             m[i+k/3-1]         //       If `k` is 0, 1, or 2: Look at the previous row
                                //       Else-if `k` is 6, 7, or 8: Look at the next row
                                //       Else (`k` is 3, 4, or 5): Look at the current row
              [j+k%3-1]         //       If `k` is 0, 3, or 6: Look at the previous column
                                //       Else-if `k` is 2, 5, or 8: Look at the next column
                                //       Else (`k` is 1, 4, or 7): Look at the current column
               <1?              //       And if this cell contains a 0:
                  2             //        Change the current cell from a 1 to a 2
                 :              //       Else:
                  1;            //        Leave it a 1
        }catch(Exception e){}}  //      Catch and ignore ArrayIndexOutOfBoundsExceptions
                                //      (try-catch saves bytes in comparison to if-checks)

1
ฉันไม่ได้ตรวจสอบมากนัก แต่มีอะไรผิดปกติm[i+k/3-1][j+k%3-1]หรือไม่? 145 ไบต์
Olivier Grégoire

@ OlivierGrégoire Dang มันง่ายกว่ามากเลยขอบคุณมาก!
Kevin Cruijssen

ฉันคิดว่ามันยังใช้ได้สำหรับคำตอบของคุณสำหรับความท้าทายที่ผ่านมาเนื่องจากดูเหมือนว่าพวกเขาจะมีโครงสร้างเดียวกัน
Olivier Grégoire

@ OlivierGrégoireใช่ฉันกำลังจะตีกอล์ฟเหล่านั้นด้วยคำแนะนำของคุณ แต่แล้วความคิดเห็นอื่น (และคำถามที่ทำงาน) มาในระหว่าง จะทำเช่นนั้นสักครู่
Kevin Cruijssen

1

PowerShell , 86 80 ไบต์

$p="(.?.?.{$(($args|% i*f '
')-1)})?"
$args-replace"(?s)(?<=A$p)B|B(?=$p`A)",'+'

ลองออนไลน์!

แผนที่เป็นสตริงที่มีการขึ้นบรรทัดใหม่ สคริปต์นี้แทนที่Bการ+กับ (?<=A(.?.?.{$MapWidth-1})?)B|B(?=(.?.?.{$MapWidth-1})?A)regexp

สคริปต์ทดสอบที่ตีกอล์ฟน้อย:

$f = {
$l=($args|% indexOf "`n")-1
$p="(.?.?.{$l})?"
$args-replace"(?s)(?<=A$p)B|B(?=$p`A)",'+'
}

@(
,(@"
AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB
"@,@"
AAAAAAAAAA
A+AAAAAA+A
A+++AA+A+A
A+B+AA+A+A
A+B++A+A+A
A+BB+A++++
A+BB+A+BBB
A+BB+++BBB
++BBBBBBBB
"@)
,(@"
AAA
AAA
BBB
"@,@"
AAA
AAA
+++
"@)
,(@"
AAAAAAAAAA
AAAABBBAAA
AAAABBBAAA
AAAABBBAAA
AAAAAAAAAA
BBBBBBABBB
BBBBBBAABB
BBBAAAAABB
BBBBBBBBBB
"@,@"
AAAAAAAAAA
AAAA+++AAA
AAAA+B+AAA
AAAA+++AAA
AAAAAAAAAA
++++++A+++
BB++++AA+B
BB+AAAAA+B
BB+++++++B
"@)
) | % {
    $map,$expected = $_
    $result = &$f $map
    $result-eq$expected
    #$result # uncomment this line to display results
}

เอาท์พุท:

True
True
True



0

TSQL, 252 ไบต์

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

แข็งแรงเล่นกอล์ฟ:

WITH C as(SELECT x,x/z r,x%z c,substring(@,x+1,1)v
FROM spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
WHERE'P'=type)SELECT @=stuff(@,x+1,1,'+')FROM c WHERE
exists(SELECT*FROM c d WHERE abs(r-c.r)<2and
abs(c-c.c)<2and'AB'=v+c.v)PRINT @

Ungolfed:

DECLARE @ varchar(max)=
'AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB';

WITH C as
(
  SELECT x,x/z r,x%z c,substring(@,x+1,1)v
  FROM spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE'P'=type
)
SELECT
  @=stuff(@,x+1,1,'+')
FROM c
WHERE exists(SELECT*FROM c d 
         WHERE abs(r-c.r)<2 
           and abs(c-c.c)<2 and'AB'=v+c.v)
PRINT @

ลองดู

TSQL, 127 ไบต์ (การใช้ตัวแปรตารางเป็นอินพุต)

ดำเนินการสคริปต์นี้ในสตูดิโอการจัดการ - ใช้ "แบบสอบถาม" - "ผลลัพธ์เป็นข้อความ" เพื่อให้สามารถอ่านได้

--populate table variable
USE master
DECLARE @v varchar(max)=
'AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB'

DECLARE @ table(x int, r int, c int, v char)

INSERT @
SELECT x+1,x/z,x%z,substring(@v,x+1,1)
FROM spt_values
CROSS APPLY(SELECT number x,charindex(char(10),@v)z)z
WHERE'P'=type and len(@v)>number

-- query(127 characters)

SELECT string_agg(v,'')FROM(SELECT
iif(exists(SELECT*FROM @
WHERE abs(r-c.r)<2and abs(c-c.c)<2and'AB'=v+c.v),'+',v)v
FROM @ c)z

ลองใช้ - เอาต์พุตเตือนถูกเลือกและไม่สามารถอ่านได้ จะสามารถอ่านได้ด้วยการพิมพ์ แต่ไม่สามารถใช้วิธีนี้ได้


อะไรทำให้คุณคิดว่าคุณไม่สามารถโต้เถียงในตารางได้?
อดัม

@ Adámไม่ใช่ความคิดที่ดีในการสร้างรหัสโดยใช้ตารางเป็นอาร์กิวเมนต์เช่นกัน - ฉันจะได้รับสิทธิในการมัน
t-clausen.dk

@ Adam ฉันคิดว่าฉันผิดเพื่อให้สคริปต์ทำงานได้ถึง 120 ตัวอักษรฉันต้องการทั้งตารางและ varchar เป็นอินพุตฉันได้เขียนมันใหม่ ใช้เวลาทั้งหมด 151 ตัวอักษร
t-clausen.dk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.