เน้นกล่อง Bounding ส่วนที่สอง: ตารางหกเหลี่ยม


24

คุณได้รับตารางหกเหลี่ยมของตัวละคร.และ#ดังนี้:

 . . . . . . . .
. . . . # . . . 
 . # . . . # . .
. . . # . . . . 
 . . . . . # . .
. . . . . . . . 

งานของคุณคือเติมช่องว่างที่จัดเรียงตามแนวแกนของกล่อง#ด้วย#:

 . . . . . . . .
. . # # # # . . 
 . # # # # # . .
. . # # # # # . 
 . . # # # # . .
. . . . . . . . 

#แกนชิดกล่องขอบเขตเป็นที่เล็กที่สุดรูปทรงหกเหลี่ยมนูนที่มีทั้งหมด โปรดทราบว่าในกรณีของตารางหกเหลี่ยมมีสามแกนที่ต้องพิจารณา (W / E, SW / NE, NW / SE):

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นอีกตัวอย่างหนึ่งที่แสดงว่าในบางกรณีด้านหนึ่งหรือด้านข้างจะมีเพียงด้านเดียว#:

. . . . . . . .         . . . . . . . . 
 . # . . . . . .         . # # # # . . .
. . . . . # . .         . . # # # # . . 
 . . # . . . . .         . . # # # . . .
. . . . . . . .         . . . . . . . . 

คุณสามารถดูสิ่งเหล่านี้เป็นรูปหกเหลี่ยมที่มีด้านความเสื่อมหรือคุณสามารถวาดกล่องล้อมรอบพวกเขาเช่นฉันได้ทำข้างต้นในกรณีที่พวกเขายังคงเป็นรูปหกเหลี่ยม:

ป้อนคำอธิบายรูปภาพที่นี่

ยากเกินไป? ลองส่วนที่ฉัน!

กฎระเบียบ

คุณอาจจะใช้ทั้งสองแตกต่างกันไม่ใช่พื้นที่ตัวอักขระ ASCII (0x21 เพื่อ 0x7E รวม) ในสถานที่และ# .ฉันจะอ้างถึงพวกเขาเป็น#และ.สำหรับส่วนที่เหลือของข้อกำหนดแม้ว่า

อินพุตและเอาต์พุตอาจเป็นสตริงที่คั่นด้วยบรรทัดเดียวหรือรายการสตริง (หนึ่งสำหรับแต่ละบรรทัด) แต่รูปแบบต้องสอดคล้องกัน

คุณอาจสมมติว่าอินพุตมีอย่างน้อยหนึ่ง#บรรทัดและทุกบรรทัดมีความยาวเท่ากัน โปรดทราบว่ามี "ชนิด" สองบรรทัดที่แตกต่างกัน (เริ่มต้นด้วยช่องว่างหรือที่ไม่ใช่ช่องว่าง) - คุณอาจไม่คิดว่าอินพุตเริ่มต้นด้วยประเภทเดียวกันเสมอ คุณอาจสันนิษฐานว่ากล่องขอบพอดีเสมอภายในตารางที่คุณได้รับ

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นและใช้วิธีการมาตรฐานของเราในการรับอินพุตและให้เอาต์พุต

คุณอาจใช้ภาษาการเขียนโปรแกรมใด ๆแต่โปรดทราบว่าช่องโหว่เหล่านี้เป็นสิ่งต้องห้ามตามค่าเริ่มต้น

นี่คือดังนั้นคำตอบที่สั้นที่สุดที่ถูกต้อง - วัดเป็นไบต์ - ชนะ

กรณีทดสอบ

กรณีทดสอบแต่ละชุดมีอินพุตและเอาต์พุตอยู่ติดกัน

#    #

 . .      . . 
# . #    # # #
 . .      . . 

 . #      . # 
. . .    . # .
 # .      # . 

 # .      # . 
. . .    . # .
 . #      . # 

 # .      # . 
# . .    # # .
 . #      # # 

 . #      # # 
# . .    # # #
 . #      # # 

. . #    . # #
 . .      # # 
# . .    # # .

# . .    # # .
 . .      # # 
. . #    . # #

. . . . . . . .         . . . . . . . . 
 . . # . # . . .         . . # # # . . .
. . . . . . . .         . . . # # . . . 
 . . . # . . . .         . . . # . . . .

. . . . . . . .         . . . . . . . . 
 . . # . . . # .         . . # # # # # .
. . . . . . . .         . . . # # # # . 
 . . . # . . . .         . . . # # # . .

. . . . . . . .         . . . . . . . . 
 . # . . . . . .         . # # # # . . .
. . . . . # . .         . . # # # # . . 
 . . . . . . . .         . . . . . . . .

. . . . . . . .         . . . . . . . . 
 . # . . . . . .         . # # # # . . .
. . . . . # . .         . . # # # # . . 
 . . # . . . . .         . . # # # . . .

. . . . # . . .         . . # # # # . . 
 . # . . . # . .         . # # # # # . .
. . . # . . . .         . . # # # # # . 
 . . . . . # . .         . . # # # # . .

1
หัวของฉันกำลังหมุนพยายามหารูปแบบที่ชัดเจนใด ๆ คุณพูดว่า 'หกเหลี่ยม' แต่มีรูปแบบอินพุตเพียงสองรูปแบบในรูปหกเหลี่ยมในกรณีทดสอบ ฉันหลงทาง.
Anastasiya-Romanova 秀

1
@ Anastasiya-Romanova 秀ถ้าคุณนึกภาพรูปร่างผ่านศูนย์กลางของตัวละครด้านนอกแล้วใช่รูปหกเหลี่ยมบางอันจะมีด้านที่เสื่อมลง (เช่นในตารางสี่เหลี่ยม อย่างไรก็ตามถ้าคุณวาดสี่เหลี่ยมรอบตัวละคร (อย่างที่ฉันทำในแผนภาพ) ตัวอย่างทั้งหมดเป็นรูปหกเหลี่ยม (บางอันมีด้านสั้นมาก)
Martin Ender

1
@ Anastasiya-Romanova diagram แผนภาพใหม่ช่วยได้หรือไม่?
Martin Ender

3
ผม! ดูเหมือนครั้งที่สองถ้าฉันมีแว่นตาผิด ..
นีล

1
@ Neil หรือคุณรู้ว่าแอลกอฮอล์มากเกินไป;)
ThreeFx

คำตอบ:


7

Pyth , 82 71 ไบต์

L, hbebMqH @ S + GH1KhMyJs.e, Lkfq \ # @ bTUb.zA, YSM-FdJySsMJj.es.eXW && gKkgG-kYgH + kYZ \. \ # BZ
MQH @ S [hGHeG) 1j.es.eXW && ghMJs.e, Lkfq \ # @ bTUb.zkgSm-FDJ-kYgSsMJ + kYZ \. \ # BZ

ลองออนไลน์!

คำอธิบาย

  • ให้ A เป็นจุดที่มีค่าพิกัด y ต่ำสุดและ B เป็นจุดที่มีค่าพิกัด y สูงสุด

  • ให้ C เป็นจุดที่มีค่าต่ำสุด (ค่า x ลบด้วยค่า y) และ D เป็นจุดที่มีค่าสูงสุด

  • ให้ E เป็นจุดที่มีค่าต่ำสุด (x-value บวก y-value) และ F เป็นจุดที่มีค่าสูงสุด

จากนั้นก็เท่ากับการหาพิกัดที่พิกัด y อยู่ระหว่าง A และ B ค่า x ลบด้วยค่า y อยู่ระหว่าง C และ D และค่า x บวกค่า y-value อยู่ระหว่าง E และ F


ครั้งแรกที่ฉันสามารถโพสต์โซลูชันก่อนหน้านี้ได้เฉพาะแอพ SE Android เท่านั้นที่สามารถจัดการกับตัวละครแท็บได้อย่างถูกต้อง (ด้วยเหตุผลบางอย่างที่พวกเขาหายไปเมื่อวาง): /
Sarge Borsch

@SargeBorsch ฉันขอโทษ :(
Nun

ฮ่าฮ่าทำไมมันเป็นแอพ SE Android ที่ทำให้ฉันล้มเหลว: D
Sarge Borsch

6

Haskell, 256 254 243 ไบต์

import Data.List
f=z(\l->(,).(,))[0..]l)[0..]
q l=m(m(\e->min(snd e).(".#"!!).fromEnum.and.z($)(m(\x y->y>=minimum x&&y<=maximum x).transpose.m b.filter((==)'#'.snd).concat$l)$b e))l
b=(m uncurry[const,(-),(+)]<*>).pure.fst
z=zipWith
m=map
q.f

ขอบคุณ @Damien สำหรับการเล่นกอล์ฟf!

อินพุตถูกใช้เป็นรายการของตัวอักษรเอาต์พุตจะถูกจัดเตรียมในลักษณะเดียวกัน

ซูนี่เป็นสัตว์ร้ายที่จะเขียน มันขึ้นอยู่กับความคิดของ LeakyNun โดยใช้การกรองสูงสุดและต่ำสุดตามพิกัดของรายการ

ฉันประหลาดใจจริงm=mapๆที่จริง ๆ แล้วช่วยประหยัดไบต์เนื่องจากดูเหมือนว่ามีราคาแพง


คำอธิบาย:

ต่อไปนี้เป็นรุ่นที่ขายน้อยกว่าเล็กน้อย (เน้นเล็กน้อย )

import Data.List
f=zipWith(\y l->zipWith(\x e->((y,x),e))[0..]l)[0..]
p=map(\x y->y>=minimum x&&y<=maximum x).transpose.map b.filter((==)'#'.snd).concat
q l=map(map(\e->min(snd e).(".#"!!).fromEnum.and.zipWith($)(p$l)$b e))l
b=(map uncurry[const,(-),(+)]<*>).pure.fst
  • fเป็นฟังก์ชั่นที่กำหนดดัชนีถ่านแต่ละตัว(y-index, x-index)ในขณะที่รักษาโครงสร้างดั้งเดิมของรายการ

  • b: ให้รายการของรายการที่จัดทำดัชนีที่คำนวณb[y-index, y - x, y + x]

  • p: ในฟิลด์ที่ทำดัชนีให้ส่งคืน 3 ฟังก์ชันInt -> Boolซึ่งสิ่งแรกคือการตรวจสอบของดัชนี y, ความแตกต่างที่สองและที่สามของผลรวม min(snd e)ดูแลช่องว่าง (พื้นที่มีขนาดเล็กกว่าทั้งสอง) ฟังก์ชั่นนี้อยู่ในรหัส golfed

  • qได้รับข้อมูลการจัดทำดัชนีการเปลี่ยนแปลงที่จำเป็นทั้งหมด.เพื่อ#โดยการตรวจสอบว่าข้อมูลที่เฉพาะเจาะจงผลตอบแทนTrueให้กับฟังก์ชั่นการทดสอบทุก

วิธีการแก้ปัญหาสุดท้ายคือแล้วองค์ประกอบของและqf


1
f=z(\y->z((,).(,)y)[0..])[0..]
ดาเมียน

หรือh x=z x[0..] f=h$h.curry(,)
ดาเมียน

5

Python 3, 380 378 348 346 ไบต์

โปรดทราบว่าการเยื้องอยู่กับแท็บไม่ใช่ช่องว่าง

รุ่น Golfed:

def s(i):
    L=i.splitlines();E=enumerate;A=lambda x,y:(y,x+y,x-y);N=(2**64,)*3;X=(-2**64,)*3
    for y,l in E(L):
        for x,c in E(l):
            if c=='#':p=A(x,y);X=tuple(map(max,X,p));N=tuple(map(min,N,p))
    R=''
    for y,l in E(L):
        for x,c in E(l):
            if c!='.':R+=c
            else:p=A(x,y);f=all(N[j]<=p[j]<=X[j]for j in range(0,3));R+='.#'[f]
        R+='\n'
    return R

ทดสอบบน Ideone

คำอธิบาย (สำหรับรุ่นที่ไม่ได้อัปโหลดด้านล่าง):

การประมวลผลทั้งหมดเสร็จสิ้นโดยไม่มีการแปลงอักขระเว้นวรรคจะถูกข้ามไป
ฟังก์ชั่นaxes_posคำนวณพิกัด 3-tuple ของจินตภาพ "3D" ซึ่งจะถูกรวมไว้ใน (องค์ประกอบที่ชาญฉลาด) ขั้นต่ำและสูงสุด 3-tuples ( bmin, bmax) สำหรับ#ตัวละครทุกตัว

พิกัดคำนวณdef axes_pos(x, y): return y, x + y, lc - y + x;
โดยที่ X นับจาก 0 ถึงขวาและ Y นับจาก 0 ถึงล่าง (จากบรรทัดแรกถึงสุดท้าย)
พิกัดจินตภาพแรกคือพื้น Y เพราะมันชัดเจนว่าทำไม ขวานของมันคือ orthogonal ถึงขอบเขตสีเขียว (ในภาพของ OP)
ที่สองคือ orthogonal เป็นขอบเขตสีแดงและที่สามคือ orthogonal ไปจนถึงขอบเขตสีฟ้า

ในรอบที่สองการแทนที่จะทำสำหรับ.ตัวละครทั้งหมดที่พิกัด "3D" ตกอยู่ในช่วงbmin.. bmaxองค์ประกอบที่ชาญฉลาด - นี่คือการตรวจสอบในการแสดงออกall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))นี้

เวอร์ชัน Ungolfed พร้อมการทดสอบบน Ideone ด้วย :

def solve(i):
    ls = i.splitlines()
    lc = len(ls)

    def axes_pos(x, y):
        return y, x + y, lc - y + x

    I = 2 ** 64
    bmin = (I, I, I)
    bmax = (0, 0, 0)

    for y, line in enumerate(ls):
        for x, char in enumerate(line):
            if char != '#': continue
            p = axes_pos(x, y)
            bmax = tuple(map(max, bmax, p))
            bmin = tuple(map(min, bmin, p))

    result = ''
    for y, line in enumerate(ls):
        for x, char in enumerate(line):
            if char != '.':
                result += char
            else:
                p = axes_pos(x, y)
                f = all(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
                result += '#' if f else char
        result += '\n'

    return result


def run_test(a, b):
    result = solve(a)
    if result != b:
        raise AssertionError('\n' + result + '\n\nshould be equal to\n\n' + b)


def run_tests():
    run_test(
        "#\n",

        "#\n")

    run_test(
        " . . \n"
        "# . #\n"
        " . . \n",

        " . . \n"
        "# # #\n"
        " . . \n")

    run_test(
        " . # \n"
        ". . .\n"
        " # . \n",

        " . # \n"
        ". # .\n"
        " # . \n")

    run_test(
        " # . \n"
        ". . .\n"
        " . # \n",

        " # . \n"
        ". # .\n"
        " . # \n")

    run_test(
        " # . \n"
        "# . .\n"
        " . # \n",

        " # . \n"
        "# # .\n"
        " # # \n")

    run_test(
        " . # \n"
        "# . .\n"
        " . # \n",

        " # # \n"
        "# # #\n"
        " # # \n")

    run_test(
        ". . . . . . . . \n"
        " . . # . # . . .\n"
        ". . . . . . . . \n"
        " . . . # . . . .\n",

        ". . . . . . . . \n"
        " . . # # # . . .\n"
        ". . . # # . . . \n"
        " . . . # . . . .\n")

    run_test(
        ". . . . . . . . \n"
        " . . # . . . # .\n"
        ". . . . . . . . \n"
        " . . . # . . . .\n",

        ". . . . . . . . \n"
        " . . # # # # # .\n"
        ". . . # # # # . \n"
        " . . . # # # . .\n")

    run_test(
        ". . . . . . . . \n"
        " . # . . . . . .\n"
        ". . . . . # . . \n"
        " . . . . . . . .\n",

        ". . . . . . . . \n"
        " . # # # # . . .\n"
        ". . # # # # . . \n"
        " . . . . . . . .\n")

    run_test(
        ". . . . . . . . \n"
        " . # . . . . . .\n"
        ". . . . . # . . \n"
        " . . # . . . . .\n",

        ". . . . . . . . \n"
        " . # # # # . . .\n"
        ". . # # # # . . \n"
        " . . # # # . . .\n")

    run_test(
        ". . . . # . . . \n"
        " . # . . . # . .\n"
        ". . . # . . . . \n"
        " . . . . . # . .\n",

        ". . # # # # . . \n"
        " . # # # # # . .\n"
        ". . # # # # # . \n"
        " . . # # # # . .\n")


if __name__ == '__main__':
    run_tests()
อัปเดต 1:

ลบที่ไม่จำเป็น-1สำหรับการประสานงานจินตภาพที่สามเพราะมันไม่เปลี่ยนแปลงอะไรเลย

อัปเดต 2,3:

มีการปรับปรุงบางส่วนที่ดำเนินการโดยLeaky Nun+ ของฉันเองเช่นกัน


โดยพื้นฐานแล้วเราใช้อัลกอริทึมเดียวกันหรือไม่? คุณสามารถต่อท้ายคำอธิบายได้ไหม?
Leun Nun

1
def A(x,y):return y,x+y,len(L)-1-y+x->A=lambda x,y:(y,x+y,len(L)-1-y+x)
Leun Nun

นอกจากนี้ความเข้าใจในรายการยังช่วยให้คุณเล่นกอล์ฟได้อีกด้วย
Leun Nun

1
ฉันคิดว่าคุณสามารถกลายlen(L)-y+xเป็นx-y
แม่ชี Leaky

1
คุณสามารถรับรายชื่อบรรทัดได้
Leun Nun

5

เยลลี่ , 45 35 13 42 41 ไบต์

Ṁ€»\
ṚÇṚ«Çṁ"
ŒDṙZL$ÇṙL’$ŒḌ«Ç
ṚÇṚ«Ç
n⁶aÇo⁶

นี่คือรายการลิงก์ อันสุดท้ายต้องถูกเรียกบนอินพุตเพื่อสร้างเอาต์พุต

I / O อยู่ในรูปแบบของสตริงอาร์เรย์โดยที่.บ่งชี้ว่าว่างเปล่าและ@ระบุว่าเติมแล้ว

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

พื้นหลัง

ลองพิจารณาตัวอย่างต่อไปนี้

. . . . . . . . 
 . @ . . . . . .
. . . . . @ . . 
 . . @ . . . . .

โดยการวาดเส้นคู่หรือเส้นคู่ขนาน - คู่ที่ใกล้เคียงที่สุดซึ่งล้อมรอบตำแหน่งที่บรรจุไว้ทั้งหมด - ในแต่ละทิศทางทั้งสามเราสามารถกำหนดกล่องขอบหกเหลี่ยมได้

ในการนำไปใช้เราจะแทนที่อักขระทั้งหมดระหว่างสองบรรทัดเหล่านั้น@และทุกอย่างที่อยู่นอกบรรทัดเหล่านี้ด้วย.ข้อยกเว้นที่เป็นไปได้ของ diagonals ที่มีช่องว่างเท่านั้น)

สำหรับแกนนอนสิ่งนี้จะให้

................
@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@

สำหรับแกนทแยงมุมที่ลดลง

..@@@@@@@......
...@@@@@@@......
....@@@@@@@.....
 ....@@@@@@@....

และสำหรับแกนทแยงที่เพิ่มขึ้น

....@@@@@@@@@...
...@@@@@@@@@....
..@@@@@@@@@....
.@@@@@@@@@.... .

ด้วยการใช้ความฉลาดน้อยที่สุดของตัวละครทั้งสามตั้งแต่.< @เราจะได้รับ

...............
...@@@@@@@......
....@@@@@@@....
 ....@@@@@.... .

สิ่งที่เหลือให้ทำคือการกู้คืนช่องว่าง

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

n⁶aÇo⁶           Main link. Argument: A (array of strings)

n⁶               Not-equal space; yield 0 for spaces, 1 otherwise.
  aÇ             Take the logical AND with the result the 4th helper link.
                 This will replace 1's (corresponding to non-space characters) with
                 the corresponding character that result from calling the link.
    o⁶           Logical OR with space; replaces the 0's with spaces.
ṚÇṚ«Ç            4th helper link. Argument: A

Ṛ                Reverse the order of the strings in A.
 Ç               Call the 3rd helper link.
  Ṛ              Reverse the order of the strings in the resulting array.
    Ç            Call the 3rd helper link with argument A (unmodified).
   «             Take the character-wise minimum of both results.
ŒDṙZL$ÇṙL’$ŒḌ«Ç  3rd helper link. Argument: L (array of strings)

ŒD               Yield all falling diagonals of L. This is a reversible operation,
                 so it begins with the main diagonal.
   ZL$           Yield the length of the transpose (number of columns).
  ṙ              Shift the array of diagonals that many units to the left.
                 This puts the diagonals in their natural order.
      Ç          Call the helper link on the result.
        L’$      Yield the decremented length (number of columns) of L.
       ṙ         Shift the result that many units to the left.
                 This puts the changed diagonals in their original order.
           ŒḌ    Undiagonal; reconstruct the string array.
              Ç  Call the 2nd helper link with argument L (unmodified).
             «   Take the character-wise minimum of both results.
ṚÇṚ«Çṁ"          2nd helper link. Argument: M (array)

Ṛ                Reverse the rows of M.
 Ç               Call the 1st helper link on the result.
  Ṛ              Reverse the rows of the result.
    Ç            Call the 1nd helper link with argument M (unmodified).
   «             Take the minimum of both results.
     ṁ"          Mold zipwith; repeat each character in the result to the left
                 as many times as needed to fill the corresponding row of M.
Ṁ€»\             1st helper link. Argument: N (array)

Ṁ€               Take the maximum of each row of N.
  »\             Take the cumulative maxima of the resulting characters.

2

Python 237 230 ไบต์

7 ไบต์ขอบคุณเดนนิส

def f(a):i=range(len(a[0]));j=range(len(a));b,c,d=map(sorted,zip(*[[x,x+y,x-y]for y in i for x in j if"?"<a[x][y]]));return[[[a[x][y],"#"][(a[x][y]>" ")*(b[0]<=x<=b[-1])*(c[0]<=x+y<=c[-1])*(d[0]<=x-y<=d[-1])]for y in i]for x in j]

ท่าเรือคำตอบของฉันใน Pyth

ใช้อาร์เรย์ของบรรทัดเป็นอินพุตเอาต์พุตอาร์เรย์ของอักขระ 2D


2

Perl, 128 126 ไบต์

รวมถึง +6 สำหรับ -0F\n

รันด้วยอินพุตบน STDIN ใช้1สำหรับการเติม0สำหรับที่ว่างเปล่า เส้นไม่จำเป็นต้องมีการบุด้วยช่องว่างในตอนท้าย:

perl -M5.010 hexafill.pl
 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 
 0 1 1 1 1 1 0 0
0 0 1 1 1 1 1 0 
 0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0 
^D

hexafill.pl

#!/usr/bin/perl -0F\n
$-=map{s%$=%$=^!map{/$/;grep{pos=$`;$=?$_|="!"x$`.1:!/\b.*\G./}${--$@}}@F-$-+pos,$-+pos,$-%eeg;--$-;$=||say}@F while$=--

ใช้พิกัดคิวบ์ กำหนดค่าสูงสุดและต่ำสุดในระหว่างการ$= == 1วนซ้ำและเติมพิกัดระหว่างขอบเขตเหล่านี้ในระหว่างการ$= == 0วนซ้ำ 58 ลูปแรกไม่มีจุดหมายและอยู่ที่นั่นเพื่อเติม$-จำนวนบรรทัดเท่านั้น


1

TSQL, 768 ไบต์

ฉันเขียนแบบสอบถามเพื่อแก้ปัญหานี้ - ซึ่งฉันพบว่าค่อนข้างยาก มันไม่สามารถแข่งขันกับคำตอบสั้น ๆ ที่ยอดเยี่ยมทั้งหมดได้ แต่ต้องการโพสต์ไว้สำหรับผู้ที่สนใจ ขออภัยเกี่ยวกับความยาวของคำตอบ - การหวัง codegolf ก็เกี่ยวกับวิธีการที่แตกต่างกัน

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

DECLARE @ varchar(max)=
'
. . . . # . . . 
 . # . . . # . .
. . . # . . . . 
 . . . . . # . .
. . . . . . . . 
'

;WITH c as(SELECT cast(0as varchar(max))a,x=0,y=1,z=0UNION ALL SELECT SUBSTRING(@,z,1),IIF(SUBSTRING(@,z,1)=CHAR(10),1,x+1),IIF(SUBSTRING(@,z,1)=CHAR(10),y+1,y),z+1FROM c WHERE LEN(@)>z)SELECT @=stuff(@,z-1,1,'#')FROM c b WHERE((exists(SELECT*FROM c WHERE b.y=y and'#'=a)or exists(SELECT*FROM c WHERE b.y<y and'#'=a)and exists(SELECT*FROM c WHERE b.y>y and'#'=a))and a='.')and(exists(SELECT*FROM c WHERE b.x<=x-ABS(y-b.y)and'#'=a)or exists(SELECT*FROM c WHERE b.x<=x+y-b.y and a='#'and b.y<y)and exists(SELECT*FROM c WHERE b.x<=x+b.y-y and a='#'and b.y>y))and(exists(SELECT*FROM c WHERE b.x>=x+ABS(y-b.y)and'#'=a)or exists(SELECT*FROM c WHERE b.x>=x-y+b.y and b.y<y and'#'=a)and exists(SELECT*FROM c WHERE b.x>=x-b.y+y and a='#'and b.y>y))OPTION(MAXRECURSION 0)PRINT @

Ungolfed:

DECLARE @ varchar(max)=
'
. . . . # . . . 
 . # . . . # . .
. . . # . . . . 
 . . . . . # . .
. . . . . . . . 
'
;WITH c as
(
  SELECT 
    cast(0as varchar(max))a,x=0,y=1,z=0
  UNION ALL
  SELECT
    SUBSTRING(@,z,1),IIF(SUBSTRING(@,z,1)=CHAR(10),1,x+1),
    IIF(SUBSTRING(@,z,1)=CHAR(10),y+1,y),
    z+1
  FROM c
  WHERE LEN(@)>z
)
SELECT @=stuff(@,z-1,1,'#')FROM c b
WHERE((exists(SELECT*FROM c WHERE b.y=y and'#'=a)
or exists(SELECT*FROM c WHERE b.y<y and'#'=a)
and exists(SELECT*FROM c WHERE b.y>y and'#'=a)
)and a='.')
and 
(exists(SELECT*FROM c WHERE b.x<=x-ABS(y-b.y)and'#'=a)
or exists(SELECT*FROM c WHERE b.x<=x+y-b.y and a='#'and b.y<y)
and exists(SELECT*FROM c WHERE b.x<=x+b.y-y and a='#'and b.y>y))
and(exists(SELECT*FROM c WHERE b.x>=x+ABS(y-b.y)and'#'=a)
or exists(SELECT*FROM c WHERE b.x>=x-y+b.y and b.y<y and'#'=a)
and exists(SELECT*FROM c WHERE b.x>=x-b.y+y and a='#'and b.y>y))
OPTION(MAXRECURSION 0) 
PRINT @

ซอไม่ดีนัก


1

GNU Octave, 212 , 196 bytes

อาจไม่ใช่ภาษาตัวเลือกที่นักกอล์ฟชื่นชอบจริง ๆ แต่นั่นคือสิ่งที่ทำให้เกิดความท้าทายใช่ไหม สมมติมจะมาเป็นเมทริกซ์ถ่าน: 178 ไบต์ยืนอยู่คนเดียวและ196 ถ้ายัดลงในฟังก์ชั่น

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

function k=f(m)[a,b]=size(m);[y,x]=ndgrid(1:a,1:b);t={y,y+x,x-y};k=m;s=x>0;for j=1:3l{j}=unique(sort(vec(t{j}.*(m==['#']))))([2,end]);s&=(l{j}(1)<=t{j})&(l{j}(2)>=t{j});endk(s&mod(x+y,2))=['#']end

ungolfed:

function k=f(m)
[a,b]=size(m);[y,x]=ndgrid(1:a,1:b);t={y,y+x,x-y};k=m;s=x>0;
for j=1:3
  l{j}=unique(sort(vec(t{j}.*(m==['#']))))([2,end]);
  s&=(l{j}(1)<=t{j})&(l{j}(2)>=t{j});
end
k(s&mod(x+y,2))=['#']
end

คำอธิบาย : เราสร้างระบบพิกัด 3 แกน - มุมฉากไปยังด้านรูปหกเหลี่ยมหาค่าสูงสุดและค่าต่ำสุดของแต่ละพิกัดจากนั้นสร้างรูปแบบเชิงตรรกะที่เริ่มต้นด้วย 1 ทุกที่และมีเหตุผลและ: กำหนดพิกัดสูงสุดและต่ำสุดในแต่ละครั้ง แต่ละตำแหน่งที่เหลือ "จริง" ถึง "#" อักขระ

หากคุณต้องการทดสอบคุณสามารถสร้างเมทริกซ์ m ดังนี้:

m = [' . . . . . . . .. . . . # . . .  . # . . . # . .. . . # . . . .  . . . . . # . .. . . . . . . . ']; m = reshape(m,[numel(m)/6,6])';

จากนั้นเรียก f (m) และเปรียบเทียบกับ m โดยสร้างเมทริกซ์กับทั้งคู่ใน:

['     before           after      ';m,ones(6,1)*'|',f(m)]

1
(ล่าช้า) ยินดีต้อนรับสู่ PPCG! คำตอบระดับแปดเสียงเป็นมากกว่าคำต้อนรับ :) แม้ว่ามีสองสิ่ง: 1) โปรดใส่รหัสที่คุณนับจริง (โดยไม่ต้องมีช่องว่างที่ไม่จำเป็น) เพื่อให้ผู้คนสามารถตรวจสอบคะแนนได้ง่ายขึ้น คุณสามารถรวมเวอร์ชันที่อ่านได้แยกต่างหาก 2) ปรากฏว่าการส่งของคุณเป็นข้อมูลเท่านั้นซึ่งถือว่าการป้อนข้อมูลจะถูกเก็บไว้ในและเอาท์พุทจะถูกเก็บไว้ในm คำตอบควรเป็นโปรแกรมแบบเต็มหรือฟังก์ชั่นที่เรียกได้ k
Martin Ender

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