เชื่อมต่อพิกเซล


40

รับข้อความเช่นนี้:

# #### ## #
## #  ##  #
   ####  ##

เอาท์พุทข้อความเดียวกัน ─│┌┐└┘├┤┬┴┼แต่โดยการเชื่อมต่อพิกเซลกับตัวละคร หากพิกเซลไม่มีเพื่อนบ้านไม่ต้องเปลี่ยน

ดังนั้นผลลัพธ์ของข้อความสุดท้ายคือ:

│ ─┬── ┌─ │
└─ │  ┌┘  │
   └──┘  ─┘
  • คุณสามารถรับอินพุตเป็นอาร์เรย์บูลีน
  • ข้อมูลที่ป้อนจะมีอย่างน้อย 1 พิกเซล
  • คุณสามารถนับตัวอักษรแบบวาดกล่องเป็น 1 ไบต์
  • คุณสามารถสันนิษฐานว่าอินพุตนั้นถูกเติมด้วยช่องว่าง

กรณีทดสอบ

## #
=>
── #
###
 #
=>
─┬─
 │
##### ##
 # #  #
########
=>
─┬─┬─ ┌─
 │ │  │
─┴─┴──┴─
 # #
#####
 # #
=>
 │ │
─┼─┼─
 │ │
# # # # #
 # # # #
# # # # #
 # # # #
# # # # #
=>
# # # # #
 # # # #
# # # # #
 # # # #
# # # # #
#####
#####
#####
#####
#####
=>
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘

ตั้งแต่นี้เป็นรหัสที่สั้นที่สุดชนะ


2
ฉันต้องใช้อักขระแฮชเป็นพิกเซลหรือไม่ ฉันจะรับอินพุตเป็นอาร์เรย์บูลีนได้หรือไม่
Rohan Jhunjhunwala

มีพื้นที่ต่อท้ายหรือขึ้นบรรทัดใหม่หรือไม่
Sanchises

btw: -|r7LJE3TW+เป็นการแทนที่ 1 ไบต์ที่เหมาะสมสำหรับอักขระบล็อก
ติตัส

คำตอบ:


7

เยลลี่ , 60 52 51 50 49 48 ไบต์

ṖḤ0;+Ḋ×
“µ³Q~E!G⁸ṗṫ\’ḃ61+9471Ọ⁾# j
ZÑ€4×Z++Ñ€ị¢Y

บันทึกเป็นไบต์ด้วย @ Dennis

อินพุตเป็นอาร์เรย์บูลีนของ 1 และ 0 ทำซ้ำในแต่ละคอลัมน์และแต่ละแถวแปลงส่วนหัวและส่วนท้ายของแต่ละมัดขนาด 3 จากคู่ของเลขฐานสองเป็นทศนิยมและคูณด้วยจุดศูนย์กลางของแต่ละมัด '#───│┌┐┬│└┘┴│├┤┼ 'จากนั้นก็จะสรุปกับตัวเองเพื่อหาดัชนีลง

ลองออนไลน์! ( กรณีที่ 2 ) ( กรณีที่ 3 ) ( กรณีที่ 4 )

คำอธิบาย

สิ่งนี้อาศัยแนวคิดเดียวกันกับคำตอบของฉันใน J แต่แทนที่จะประมวลผลแต่ละ 3x3 subarray ฉันจะประมวลผลแต่ละแถวและแต่ละคอลัมน์ในขณะที่ยังคงได้รับดัชนีดัชนีเดียวกัน

'#───│┌┐┬│└┘┴│├┤┼ 'กว่าครึ่งหนึ่งของไบต์จะใช้เวลาในการสร้างรายการของตัวอักษรกล่อง สตริงตัวอักษรเริ่มต้นด้วยเจลลี่และมีความหมายแตกต่างกันขึ้นอยู่กับตัวยุติ นี่คือเทอร์มินอลหมายความว่าสตริงจะถูกวิเคราะห์เป็นจุดรหัสของแต่ละตัวอักษรตามหน้ารหัสวุ้นและแปลงจากรายการฐาน 250 หลักเป็นทศนิยม

“µ³Q~E!G⁸ṗṫ\’ => 10041542192416299030874093
(bijective base 61) => [1, 1, 1, 3, 13, 17, 45, 3, 21, 25, 53, 3, 29, 37, 61]
(add 9471 and convert to char) => '───│┌┐┬│└┘┴│├┤┼'

แล้วแปลงทศนิยมที่ไปยังรายการของตัวเลขในฐาน bijective 61 และเพิ่มขึ้นแต่ละ 9471 chrที่จะย้ายเข้ามาในช่วงของตัวอักษรกล่องและแปลงแต่ละใช้งูใหญ่ แล้วย่อหน้าด้วยตัวอักษรตัวอักษรและผนวกพื้นที่”#

ṖḤ0;+Ḋ×  Helper link - Input: 1d list A
Ṗ        Get all of A except the last value
 Ḥ       Double each value in it
  0;     Prepend a 0
    +    Add elementwise with
     Ḋ     All of A except the first value
      ×  Multiply elementwise by A

“µ³Q~E!G⁸ṗṫ\’ḃ61+9471Ọ⁾# j  Nilad. Represents '#───│┌┐┬│└┘┴│├┤┼ '
“µ³Q~E!G⁸ṗṫ\’               Get the code points of each char in the string and
                            convert from a list of base 250 digits to decimal
             ḃ61            Convert that to a list of digits in bijective base 61
                +9471       Add 9400 to each
                     Ọ      Convert from ordinals to chars, gets '───│┌┐┬│└┘┴│├┤┼'
                      ⁾#    A pair of chars ['#', ' ']
                         j  Join the pair using the box characters

ZÑ€4×Z++Ñ€ị¢Y  Input: 2d list M
Z              Transpose
 р            Apply the helper link to each row of the transpose (each column of M)
   4×          Multiply each by 4
     Z         Transpose
      +        Add elementwise with M
       +       Add elementwise with
        р       The helper link applied to each row of M
          ị¢   Use each result as an index to select into the nilad
            Y  Join using newlines
               Return and print implicitly

15

J , 82 72 66 ไบต์

(ucp' #───│┌┐┬│└┘┴│├┤┼'){~]+]*3 3((2#.1 7 3 5{,);._3)0,.~0,.0,~0,]

อินพุตเป็นตารางบูลีน 1 และ 0 กฎระบุว่ากล่องอักขระแต่ละตัวนับเป็นหนึ่งไบต์ไม่ใช่สามและถูกนำไปใช้ที่นี่

การใช้

   f =: (ucp' #───│┌┐┬│└┘┴│├┤┼'){~]+]*3 3((2#.1 7 3 5{,);._3)0,.~0,.0,~0,]
   m =: 1 0 1 1 1 1 0 1 1 0 1 , 1 1 0 1 0 0 1 1 0 0 1 ,: 0 0 0 1 1 1 1 0 0 1 1
   m { ' #'
# #### ## #
## #  ##  #
   ####  ##
   f m
│ ─┬── ┌─ │
└─ │  ┌┘  │
   └──┘  ─┘
   ' #' {~ m =: 5 5 $ 1
   f m
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘
   ' #' {~ m =: 5 9 $ 1 0
# # # # #
 # # # # 
# # # # #
 # # # # 
# # # # #
   f m
# # # # #
 # # # # 
# # # # #
 # # # # 
# # # # #

คำอธิบาย

ก่อนอื่นอินพุตจะถูกเติมด้วย 0 ของทุกด้าน

   ] m =: 1 0 1 1 1 1 0 1 1 0 1 , 1 1 0 1 0 0 1 1 0 0 1 ,: 0 0 0 1 1 1 1 0 0 1 1
1 0 1 1 1 1 0 1 1 0 1
1 1 0 1 0 0 1 1 0 0 1
0 0 0 1 1 1 1 0 0 1 1
   (0,.~0,.0,~0,]) m
0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 0 1 1 0 1 0
0 1 1 0 1 0 0 1 1 0 0 1 0
0 0 0 0 1 1 1 1 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0

จากนั้นเลือกแต่ละ subarray ขนาด 3

   3 3 <;._3 (0,.~0,.0,~0,]) m
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
│0 1 0│1 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 1│0 1 1│1 1 0│1 0 1│0 1 0│
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 1 0│1 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 1│0 1 1│1 1 0│1 0 1│0 1 0│
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
│0 0 0│0 0 0│0 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 0│0 0 1│0 1 1│1 1 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
│0 0 0│0 0 0│0 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 0│0 0 1│0 1 1│1 1 0│
│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

จากนั้นพิจารณาเพียง 5 ค่าในแต่ละ subarray

┌───┐
│xAx│
│CED│
│xBx│
└───┘

ค่าที่ABCDจะถูกเลือกโดยแฟบแต่ละ subarray 1 7 3 5และเลือกที่ดัชนี ค่าเหล่านั้นจะถูกคูณด้วยEซึ่งเป็นดัชนีที่ 4 Eมันจะถูกแปลงแล้วจากรายการของตัวเลขฐานสองให้เป็นทศนิยมและเพิ่มขึ้นโดย xค่าที่ไม่จำเป็น

   3 3 (4&{([+2#.*)1 7 3 5&{)@,;._3 (0,.~0,.0,~0,]) m
 5 0 2  8 4 3  0  6 3 0  5
10 3 0 13 0 0  6 11 0 0 13
 0 0 0 10 4 4 11  0 0 2 11

ใช้เป็นดัชนีเพื่อเลือกอักขระที่จะวาดตามตารางด้านล่าง (เรียงลำดับเล็กน้อยสำหรับการเล่นกอล์ฟ) คอลัมน์สุดท้ายตรงกับค่าผลลัพธ์ของแต่ละ subarray กับอักขระกล่อง

 0  (space)  0
 1  #        1
 2  ┌        6
 3  ┬        8
 4  ┐        7
 5  ├        14
 6  ┼        16
 7  ┤        15
 8  └        10
 9  ┴        12
10  ┘        11
11  │        5, 9, 13
12  ─        2, 3, 4

นอกจากนี้ใน J สตริง' #───│┌┐┬│└┘┴│├┤┼'ใช้อักขระ8 บิตทำให้มีความยาว 47 (สำหรับแต่ละไบต์) สำหรับ 17 อักขระที่ต้องการ คำสั่งucpแปลงเป็นอักขระแบบ 16 บิตซึ่งอนุญาตให้มีความยาว 17


13

JavaScript (ES6), 155 121 103 102 ตัวอักษร

let f =
    
s=>s.replace(/#/g,(c,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]==c,8*t(w=s.search`
`+1)+4*t(1)+2*t(-1)+t(-w)])

console.log(f(
  '# #### ## #\n' +
  '## #  ##  #\n' +
  '   ####  ##'
));

แก้ไข: บันทึก 18 ไบต์ด้วยความช่วยเหลือของ ETHproductions
แก้ไข: บันทึก 1 ไบต์โดยใช้พารามิเตอร์ที่ 1 ของ replace () เป็น'#'

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

เราวน#อักขระทั้งหมดที่พบในสตริงอินพุต สำหรับแต่ละคนเราทดสอบว่าเพื่อนบ้านเป็น#อักขระโดยใช้t()ฟังก์ชั่นนี้หรือไม่:

t = x => s[p + x] == c  // where c = '#'

พารามิเตอร์xของt()ฟังก์ชัน offset pของเพื่อนบ้านที่เกี่ยวกับตำแหน่งปัจจุบัน เราใช้ -1 / + 1 เพื่อทดสอบเพื่อนบ้านซ้าย / ขวาและ -w / + w สำหรับเพื่อนบ้านบน / ล่าง (โดยที่wความกว้างของแถวคือตำแหน่งของการแบ่งบรรทัดแรก + 1)

แต่ละเพื่อนบ้านได้รับการกำหนดน้ำหนักแตกต่างกัน (1, 2, 4 หรือ 8) ตามเข็มทิศดังต่อไปนี้:

  1
2 + 4
  8

การผสมน้ำหนักแต่ละแบบจะนำไปสู่คุณค่าที่เป็นเอกลักษณ์ใน [0 .. 15] ตัวอย่างเช่นหากตั้งค่าทั้งเพื่อนบ้านที่ด้านบนและเพื่อนบ้านทางด้านขวายอดรวมจะเป็น 1 + 4 = 5 ซึ่งแปลเป็นการใช้ตารางนี้:

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
#  │  ─  ┘  ─  └  ─  ┴  │  │  ┐  ┤  ┌  ├  ┬  ┼

ดังนั้น'#│─┘─└─┴││┐┤┌├┬┼'[weight_sum]นำไปสู่ตัวละครที่คาดหวัง


ฮาเรามีความคิดเดียวกันโดยทั่วไป;)
ETHproductions

@ ETHproductions - สวยมาก ^^
Arnauld

จริงๆเทคนิคที่ดีจริงๆที่นั่น คุณออกไปเล่นกอล์ฟฉันอย่างแข็งแรง :)
ETHproductions

คุณสามารถบันทึก 2 ไบต์ดังนี้:s=>(w=s[0].length+1,s=s.join`\n`).replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)])
ETHproductions

และจริงๆแล้วมันสั้นกว่ามากที่จะเปลี่ยนกลับไปเป็นสตริงหลายs=>s.replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)],w=s.indexOf`\n`+1)
บรรทัด

8

Python 2.7, 318 315 ไบต์ ( 270 267 ตัวอักษร)

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟต่อไปได้ (โดยเฉพาะฉันชอบที่จะกำจัดความคิดเห็นบรรทัดแรกที่น่ารำคาญ) แต่นี่คือรายการของฉัน:

#encoding:utf-8
f=lambda t:(lambda l,s:'\n'.join(''.join((u'┼├┤│┬┌┐│┴└┘│───#'[(s==l[i][j-1])+2*(s==l[i][j+1])+4*(i<1 or s==l[i-1][j])+8*(i>len(l)-2 or s==l[i+1][j])],s)[s==l[i][j]]for j in range(len(l[i])-1))for i in range(len(l))))([l+' 'for l in t.split('\n')],' ')

นี่คือคำอธิบายวิธีการทำงานทั้งหมด:

#encoding:utf-8 # Dammit, Python. This adds an extra 16 bytes!
f=lambda t:( # main lambda function
    lambda l,s: # inner lambda so we can pass it "local constants" (see last line)
        '\n'.join( # join each line
            ''.join( # join each char within the line
                (u'┼├┤│┬┌┐│┴└┘│───#'[ # string of all possible characters, indexed by binary 0-15 based on adjacent chars
                    (s==l[i][j-1])+ # left
                    2*(s==l[i][j+1])+ # right
                    4*(i<1 or s==l[i-1][j])+ # up ('i<1' just yields zero in case this is the first line, so that we don't get index problems)
                    8*(i>len(l)-2 or s==l[i+1][j])], # down ('i>len(l)-2' is same as above)
                s)[s==l[i][j]] # if original is space, choose space, else choose the previously chosen box-drawing char
                for j in range(len(l[i])-1)) # do this process for each char (excluding last, which is a space)
            for i in range(len(l))) # do this for each line
    )([l+' ' for l in t.split('\n')],' ') # call the inner lambda with two parameters: first, the text split into lines; second, a space char (actually makes code shorter)

แก้ไข: ลบช่องว่างบางส่วนก่อน for ... in ...


9
ใช้งูหลาม 3 แทนควรจะแก้ปัญหาการเข้ารหัส Unicode ของคุณผมคิดว่า ...
Byte บัญชาการ

6

JavaScript (ES6), 150 139 133 131 ตัวอักษร

a=>a.map((q,y)=>q.replace(/#/g,(c,x)=>"#│─┘─└─┴││┐┤┌├┬┼"[g=(X,Y=0)=>(a[Y+y]||[])[X+x]==c,g(0,1)*8+g(1)*4+g(-1)*2+g(0,-1)])).join`
`

f(["###", " # "])จะเข้าเป็นอาร์เรย์ของสตริงเช่น

ตัวอย่างการทดสอบ


5

ALPACA , 414 + 2 = 416 ไบต์

neighbourhoodV(^ v < >);states" ";statep"#"toA when4inV p,toB when3inV p andvs,toC when3inV p and^s,toD when3inV p and>s,toE when3inV p and<s,toF when2inV p and>s andvs,toG when2inV p andvs and<s,toH when2inV p and<s and^s,toI when2inV p and^s and>s,toJ when^p orvp,toK when<p or>p;stateA"┼";stateB"┴";stateC"┬";stateD"┤";stateE"├";stateF"┘";stateG"└";stateH"┌";stateI"┐";stateJ"│";stateK"─".

ต้องใช้-fIธง

วิธีการแก้ปัญหานี้ใช้จำนวนไบต์ที่สูงมาก แต่มันไม่เหมือนกันในการใช้ระบบเซลลูลาร์อัตโนมัติ ALPACA มักจะใช้เป็นภาษาโลหะ แต่ที่นี่ฉันใช้มันเป็นภาษาการเขียนโปรแกรม

เวอร์ชันที่ไม่ถูกปรับแต่ง:

neighbourhood V (^ v < >);
state s " ";
state p "#" to A when 4 in V p,
to B when 3 in V p and v s,
to C when 3 in V p and ^ s,
to D when 3 in V p and > s,
to E when 3 in V p and < s,
to F when 2 in V p and > s and v s,
to G when 2 in V p and v s and < s,
to H when 2 in V p and < s and ^ s,
to I when 2 in V p and ^ s and > s,
to J when ^ p or v p,
to K when < p or > p;
state A "┼";
state B "┴";
state C "┬";
state D "┤";
state E "├";
state F "┘";
state G "└";
state H "┌";
state I "┐";
state J "│";
state K "─".

4

PHP, 203 ไบต์

สิ่งนี้สามารถทำได้ในทางที่สั้นลง

while($s=fgets(STDIN))$f[]=$s;foreach($f as$y=>&$s)for($x=strlen($s);$x--;)if($s[$x]>$b=" ")$s[$x]="#───│┘└┴│┐┌┬│┤├┼"[($s[$x-1]>$b)+2*($s[$x+1]>$b)+4*($f[$y-1][$x]>$b)+8*($f[$y+1][$x]>$b)];echo join($f);

อ่านอินพุตจาก STDIN -rทำงานด้วย


4

Python 3, 149 ไบต์

def f(s):S=' ';w=s.find('\n')+1;t=lambda i:(s+w*S)[i]>S;return[[c,'#│─┘─└─┴││┐┤┌├┬┼'[t(p-w)+2*t(p-1)+4*t(p+1)+8*t(p+w)]][c>S]for p,c in enumerate(s)]

จะเข้าเหมือนและผลตอบแทนการส่งออกเช่น##\n #\n['─', '┐', '\n', ' ', '│', '\n']


3

R, 199 212 ไบต์

แก้ไข: ตอนนี้มันเป็นฟังก์ชั่นแทนที่จะเป็นข้อมูลโค้ด

อินพุตเป็นเมทริกซ์m1 และ 0 นี่มันช่างน่าเกลียดและแฮ็ค

function(m){
v=strsplit(" #─│┘│┐│┤──└┴┌┬├┼","")[[1]]
d=dim(m)+1
n=array(0,dim=d+1)
n[2:d[1],2:d[2]]=m
for(i in 0:(d[1]-2)){for(j in 0:(d[2]-2))cat(v[1+(p<-n[2+i,2+j])*sum(2^(0:3)*n[1:3+i,1:3+j][1:4*2])+p]);cat("\n")}
}

การทดสอบสองอย่าง:

> m = matrix(c(1, 1, 1, 0, 1, 0), nrow=2, byrow=TRUE)
> v=strsplit(" #─│┘│┐│┤──└┴┌┬├┼","")[[1]]
> d=dim(m)+1
> n=array(0,dim=d+1)
> n[2:d[1],2:d[2]]=m
> for(i in 0:(d[1]-2)){for(j in 0:(d[2]-2))cat(v[1+(p<-n[2+i,2+j])*sum(2^(0:3)*n[1:3+i,1:3+j][1:4*2])+p]);cat("\n")}
─┬─
 │ 
> m = matrix(rep(1, 16), ncol=4)
> v=strsplit(" #─│┘│┐│┤──└┴┌┬├┼","")[[1]]
> d=dim(m)+1
> n=array(0,dim=d+1)
> n[2:d[1],2:d[2]]=m
> for(i in 0:(d[1]-2)){for(j in 0:(d[2]-2))cat(v[1+(p<-n[2+i,2+j])*sum(2^(0:3)*n[1:3+i,1:3+j][1:4*2])+p]);cat("\n")}
┌┬┬┐
├┼┼┤
├┼┼┤
└┴┴┘

ส่งจะต้องเป็นโปรแกรมเต็มหรือฟังก์ชั่น การอ่านจากตัวแปรที่มีอยู่ไม่ใช่รูปแบบอินพุตที่ได้รับอนุญาต
TuxCrafting

คุณจะทำให้ตัวละครยูนิโค้ดบางตัวทำงานร่วมกับ R ได้อย่างไร? x = "\ U253C" ใช้งานได้ แต่ x = "┼" ไม่ทำงาน
Vlo

@ TùxCräftîñg: แก้ไขแล้ว!
rturnbull

@Vlo utf-8 เป็นการเข้ารหัสระบบปฏิบัติการของฉัน x = "┼"ทำงานได้ดีสำหรับฉัน
rturnbull

3

Perl, 89 88 ไบต์

รวม 2 -0pสำหรับ อักขระพิเศษจะถูกนับเป็น 1 ไบต์ แต่เพื่อให้แสดงเป็นอักขระเดียวจริง ๆ แล้ววิธีที่ดีที่สุดคือเพิ่มตัวเลือก -C

ให้อินพุตบน STDIN ด้วยพื้นที่เส้นที่มีเบาะดังนั้นพวกเขาทั้งหมดมีความยาวเท่ากัน

perl -C connect.pl
# #### ## #
## #  ##  #
   ####  ##
^D

connect.pl:

#!/usr/bin/perl -0p
/
/;$n=".{@-}";s%#%substr"#───│└┘┴│┌┐┬│├┤┼",/\G##/+2*/#\G/+4*/#$n\G/s+8*/\G#$n#/s,1%eg

1

MATL, 102 ตัวอักษร

ฉันกำหนดค่าเพื่อนบ้าน (1, 2, 4 หรือ 8); ผลรวมของพวกเขาจะจับคู่อักขระในสตริงที่มีอักขระรูปวาด ฉันคิดว่ายังมีพื้นที่เหลือเฟือสำหรับการปรับปรุง แต่สำหรับร่างคร่าวๆ:

' #│││─┌└├─┐┘┤─┬┴┼' % String to be indexed
wt0J1+t4$(          % Get input, and append zeros at end of matrix (solely to avoid
                    %  indexing a non-existent second row/column for small inputs)
ttttt               % Get a whole load of duplicates to work on
3LXHY)              % Select rows 2:end from original matrix (one of the many dupes)
      w4LXIY)       % Select rows 1:end-1 from the 'destination' summing matrix)
             +HY(   % Add the neighbors below, store in 'destination' matrix
tIY)b3LY)2*+IY(     % +2* the neighbors above    +-------------------------------+
tHZ)b4LZ)4*+HZ(     % +4* the neighbors right    |(note: H and I contain 1:end-1 |
tIZ)b3LZ)8*+IZ(     % +8* the neighbors left     |  and 2:end respectively)      |
HH3$)               % Select the original matrix +-------------------------------+
*                % Make sure only cells that originally had a # get replaced
  1+)            % Add one because the original string is one-indexed. Index using ).

การปรับปรุงที่จะทำ:

  • อาจแทนที่ส่วนที่รวมทั้งหมดด้วยวงวนบางชนิดที่ทำงานกับสำเนาที่หมุนของเมทริกซ์
  • ทิ้งทุกสิ่งและทำบางอย่างโดยใช้ลูปเดี่ยวที่ทำงานผ่านเมทริกซ์
  • ใช้การทำดัชนีแบบแยกส่วนเพื่อทำงานกับเวกเตอร์แบบแบนจากอาร์เรย์เดิม (?)

ลองออนไลน์! (อาจไม่มีอักขระสนับสนุนการวาดกล่อง)

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