วาดรูปทรงของฉัน


25

ให้เมทริกซ์สี่เหลี่ยมของระดับความสูง, วาดรูปทรงของมัน

งาน

สององค์ประกอบxและอยู่ในระดับเดียวกันถ้ารูปร่างy floor(x/10) == floor(y/10)ตัวอย่างเช่น52และ58อยู่ในระดับรูปร่างเดียวกัน แต่58และ64ไม่ใช่

การกระทำของรูปวาดที่กำหนดไว้ดังต่อไปนี้: สำหรับทุกองค์ประกอบeแทนที่ด้วยสตริงสองถ่านเลือกดังนี้

  • อักขระตัวแรกคือ" "ถ้าองค์ประกอบด้านล่างeอยู่ในระดับรูปร่างเดียวกันกับeหรือหากไม่มีองค์ประกอบอยู่ด้านล่างeและ"_"อย่างอื่น
  • อักขระตัวที่สองคือ" "ถ้าองค์ประกอบทางด้านขวาของeอยู่ในระดับเส้นชั้นเดียวกับeหรือไม่มีองค์ประกอบทางด้านขวาของeและ"|"อื่น ๆ

องค์ประกอบภายในแถวเข้าด้วยกันจากนั้นรวมแถวเข้าด้วยกันด้วยการขึ้นบรรทัดใหม่

ตัวอย่าง

สมมติว่าอินพุตเป็น[[5,20],[3,6]]ภาพเป็น

5 20
3 6

5ครั้งแรกที่เรามองไปที่ ตั้งแต่3อยู่ในระดับเดียวกับรูปร่างตัวละครแรกคือ5 " "เนื่องจาก20ไม่ได้อยู่ในระดับเดียวกับรูปร่างตัวละครที่สองคือ5"|"

20ตอนนี้เรามองไปที่ เนื่องจาก6ไม่ได้อยู่ในระดับเดียวกับรูปร่างตัวละครแรกคือ20 "_"เนื่องจากมีองค์ประกอบไปทางขวาของไม่มีตัวละครที่สองคือ20" "

3ตอนนี้เรามองไปที่ เนื่องจากไม่มีองค์ประกอบด้านล่าง3, " "ตัวอักษรตัวแรกคือ ตั้งแต่6อยู่ในระดับเดียวกับรูปร่างตัวละครที่สองคือ3" "

6ตอนนี้เรามองไปที่ เนื่องจากไม่มีองค์ประกอบด้านล่าง6, " "ตัวอักษรตัวแรกคือ เนื่องจากมีองค์ประกอบไปทางขวาของไม่มีตัวละครที่สองคือ6" "

[[" |","_ "],[" "," "]]ขึ้นอยู่กับเหล่านี้สายสองถ่านที่เราทำทดแทนที่จะได้รับ เข้าร่วมด้วยกันเราจะได้ผลลัพธ์จาก

 |_ 
    

กฎระเบียบ

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

กรณีทดสอบ

input
output

[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
  _ _  
 |   | 
 |_ _| 

[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
 |_|_|_|_|_|_|_|_|_
   |_  |_ _|_ _|_ _
     |_    |_ _  |_
       |_      |_ _
         |_        
           |_      
             |_    
               |_  
                 |_


[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
  _ _ _ _ _ _ _ _ _  
 |                 | 
 |    _ _ _ _ _    | 
 |   |         |   | 
 |   |    _    |   | 
 |   |   |_|   |   | 
 |   |         |   | 
 |   |_ _ _ _ _|   | 
 |                 | 
 |_ _ _ _ _ _ _ _ _| 

[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
  _|             |_  
_|    _ _ _ _ _    |_
    _|         |_    
   |    _ _ _    |   
   |   |     |   |   
   |   |     |   |   
   |   |_ _ _|   |   
   |_           _|   
_    |_ _ _ _ _|    _
 |_               _| 
   |             |  

1
ฉันไม่ได้เริ่มอ่านสิ่งนี้ก่อนที่จะรู้ว่ามันจะเจ๋งขนาดไหน
Christopher

คำตอบ:


6

Perl 6 , 135 ไบต์ (131 ตัวอักษร)

{my$n="_";sub w{$^a.chop-$^b.chop??$n!!" "};my&q={|.[1..*],.tail};(($_ «[&w]».&q) ZZ~{$n="|";$_ «[&w]».map(*.&q)}()).map:{say |$_}}

ลองออนไลน์!

ungolfed เล็กน้อย:

{
    my $n = "_";
    sub w { $^a.chop - $^b.chop ?? $n !! " "};
    my &q = {|.[1..*],.tail};
    (
        ($_ «[&w]».&q)
        ZZ~
        {$n="|";$_ «[&w]».map(*.&q)}()
    ).map:{say |$_}
}

คำอธิบาย : อันดับแรกเรากำหนดตัวแปร$n(บรรทัดที่ 2) และฟังก์ชั่นw(บรรทัดที่ 3) ฟังก์ชันนี้จะคืนค่าช่องว่างหากอาร์กิวเมนต์สองตัวอยู่ใน "ระดับความสูง" เดียวกันและเนื้อหาของตัวแปรเป็น$nอย่างอื่น แทนการหารด้วย 10 และการปูพื้นเราใช้ข้อเท็จจริงที่ว่า ints Cool(สามารถถูกปฏิบัติเหมือนสตริง) และใช้chopเพื่อลบอักขระตัวสุดท้าย (= ดิจิต) จากนั้นเราก็ลบมันอย่างใจเย็นบังคับพวกมันให้เป็นตัวเลขอีกครั้ง: —)

หลังจากนั้น (บรรทัดที่ 4) เราสร้างฟังก์ชันqที่รับรายการและส่งคืนรายการนั้นด้วยการลบองค์ประกอบแรกและองค์ประกอบสุดท้ายที่ซ้ำกัน

ใน 3 บรรทัดถัดไปเราจะสร้างเมทริกซ์เพิ่มเติมอีก 2 ตัวจากเมทริกซ์อินพุท: อันแรกมีแถวแรกหายไปและแถวสุดท้ายทำซ้ำ (นั่นเป็นเพียงการ.&qใช้.&คุณสามารถเรียกใช้ฟังก์ชันได้ทุกอย่างราวกับว่ามันเป็น a method - สิ่งที่อยู่ด้านหน้าของจุดนั้นเป็นอาร์กิวเมนต์แรก) อีกอันหนึ่งมีคอลัมน์แรกหายไปและคอลัมน์สุดท้ายทำซ้ำ (นั่นคือ.map(*.&q))

อันดับแรก (บรรทัดที่ 4) เราใช้เมทริกซ์ดั้งเดิม$_"ซ้อนทับ" กับเมทริกซ์ "เลื่อนแถว" และใช้ฟังก์ชันwเป็นตัวดำเนินการไบนารี (นั่นคือ[&w]) ในองค์ประกอบที่ตรงกัน ที่หนึ่งทำให้_ทุกที่ที่องค์ประกอบที่ตรงกันอยู่ในระดับที่แตกต่างกันและเป็นอย่างอื่น ดังนั้นเราจึงได้½ของผลลัพธ์ (เฉพาะ "อักขระตัวแรก")

ที่บรรทัด 6 เราทำสิ่งเดียวกัน แต่ก่อนอื่นเราเปลี่ยน$nไป|และตอนนี้เรา "ซ้อนทับ" เมทริกซ์ดั้งเดิมด้วยเมทริกซ์ที่มีคอลัมน์เลื่อน ผลลัพธ์มีความ|แตกต่างและระดับความสูงเดียวกัน นี่คือ "ตัวละครที่สอง"

ตอนนี้เราเพิ่งรวมเข้าด้วยกัน เราทำการซิปอาร์เรย์ด้วย zip พร้อม concat (ใช่ ... ) ซึ่งส่งผลให้เมทริกซ์ของรูปร่างดั้งเดิมซึ่งแต่ละองค์ประกอบคือองค์ประกอบที่จับคู่ 2 องค์ประกอบของ "half-solution" ที่ต่อกัน สุดท้ายเราก็แมปเมทริกซ์นี้ (ซึ่งเป็นรายการจริง ๆ ) แต่ละรายการเหล่านี้จะถูกทำให้แบนแล้วsay-ed (พิมพ์ด้วยบรรทัดใหม่) เนื่องจากsayสามารถใช้อาร์กิวเมนต์จำนวนเท่าใดก็ได้และมันพิมพ์ออกมาทั้งหมดโดยไม่มีตัวคั่นทำให้ขึ้นบรรทัดใหม่ในตอนท้ายเท่านั้นเราจึงได้รูปภาพที่ต้องการใน stdout (และบล็อกส่งคืนรายการTrues (แต่ละรายการsayคืนหนึ่งTrue) แต่ใครจะสนใจ)


+1 สำหรับbut who cares
HyperNeutrino

5

เยลลี่ ,  25 23  22 ไบต์

-1 ไบต์ขอบคุณไมล์ ( Iเวกเตอร์)

:⁵I;€0ao⁶
Zç”_Zż"ç”|$Y

โปรแกรมเต็มรูปแบบการพิมพ์ผล ในฐานะที่เป็นลิงค์เอกมันต้องใช้รายชื่อของรายการของตัวเลขเอนไซม์และส่งกลับรายการรายการ แต่เหล่านี้ "แถว" ประกอบด้วยรายชื่อของสองตัวละคร "คู่" - ถ้าเรื่องนี้เป็นเรื่องปกติแล้ว 1 Yไบต์อาจถูกบันทึกไว้โดยการเอา

ลองออนไลน์!

อย่างไร?

:⁵I;€0ao⁶ - Link 1, assignCharacters (row-wise): list of lists of numbers; character, c
 ⁵        - literal 10
:         - integer division (vectorises)
  I       - incremental differences (vectorises) (zero if the same else non-zero)
     0    - literal 0
   ;€     - concatenate for €ach (rightmost edge of a row has no contour mark)
      a   - logical and (vectorises) with c (replace non-zeros with the contour character)
        ⁶ - literal space character
       o  - logical or (vectorises) (replace the zeros with spaces)

Zç”_Zż"ç”|$Y - Main link: list of lists of numbers, contours
Z            - transpose the input (get the columns)
  ”_         - literal underscore character, '_'
 ç           - call the last link (1) as a dyad with '_'
    Z        - transpose the result
          $  - last two links as a monad:
        ”|   -   literal pipe character, '|'
       ç     -   call the last link (1) as a dyad with '|'
      "      - zip with the dyadic operation:
     ż       -   zip (interleave the column-wise characters with the row-wise ones)
           Y - join with newlines
             - implicit print

grr 3 ไบต์ +1 แต่ฉันจะพยายามเอาชนะคุณ;)
HyperNeutrino

ทางออกที่เป็นอิสระ - เพิ่งเห็นคุณคล้ายกันมาก! ช่วยคุณประหยัดได้ทันที ...
Jonathan Allan

คุณสามารถบันทึกไบต์โดยใช้แต่ละรายการในการเข้าร่วมในผู้ช่วยเหลือ:⁵I;€0ao⁶แทนที่จะอยู่ในลิงก์หลักZç”_Zż"ç”|$Y
ไมล์

@miles โอ้ว้าวมันใช้ได้มั้ย ขอบคุณ! ฉันคิดว่าIจะไม่เป็นแบบเวกเตอร์
Jonathan Allan

ใช่Ivectorizes ที่ความลึก 1 และทั้งสองaและovectorize ที่ความลึก 0
ไมล์


3

เยลลี่ 24 ไบต์

:⁵IṠ;€0
ZÇZị⁾_ +³Ç¤ị⁾| ¤

ลองออนไลน์!

คำอธิบาย

:⁵IṠ;€0           Helper Link; get contour data
:                 Floor division by
 ⁵                10
  I               Compute increments
   Ṡ              Sign; ±1 for different values and 0 for same values
    ;             Append
      0           Zero
     €            To each row
ZÇZị⁾_ +³Ç¤ị⁾| ¤  Main Link
Z                 Zip the input (for vertical contours _)
 Ç                Get the contour data
  Z               Zip the data (because it's zipped from the first Z)
   ị              Index into the string
    ⁾_            "_ "
       +          Add (vectorizing twice) to
        ³ ¤    ¤  Nilad starting from (input)
         Ç        Get contour data (horizontal contours |)
           ị      Index into the string
            ⁾|    "| "

-2 ไบต์ขอบคุณ Jonathan Allan


วิธีแก้ปัญหาของคุณสามารถทำได้โดยใช้Y- มันจะส่งคืนรายการของตัวละครซึ่งฉันเชื่อว่าใช้ได้ (ในขณะที่ฉันมีคู่อยู่ภายใน "แถว")
Jonathan Allan

@JanathanAllan โอ้ใช่จริง ... ขอบคุณ!
HyperNeutrino

2

Python 2 , 226 ไบต์

l=[[j/10for j in i]for i in input()]
for i,j in enumerate(l[:-1]):print''.join('_ '[h==l[i+1][g]]+'| '[h==j[g+1]]for g,h in enumerate(j[:-1]))+'_ '[j[-1]==l[i+1][-1]]
print''.join(' '+'| '[i==j]for i,j in zip(l[-1],l[-1][1:]))

ลองออนไลน์!

ว้าวนั่นเป็นเรื่องที่ลำบากมากที่จะจัดการกับตรรกะ ตอนนี้ฉันเห็น Hyper Neutrino ninja'd ฉันด้วยคำตอบสั้น ๆ แต่ฉันใช้เวลาทำงานมากเกินไปในเรื่องนี้ไม่โพสต์ : P

นอกจากนี้ฉันสามารถพูดได้ว่านี่เป็นวิธีที่ยอดเยี่ยมในการสร้าง ASCII-art ขอโทษฉันในขณะที่ฉันทำ boatload เพิ่มเติมเหล่านี้


> ninja'd: เพื่อนมันเป็นเวลา 45 นาที
HyperNeutrino

ใช่ฉันไม่ได้ดูคำตอบ ... : P
มนุษย์

คุณสามารถบันทึก 4 ไบต์โดยกำหนดตัวแปรenumerateแทนการใช้ชื่อเต็มสองครั้ง
Jonathan Frech

218 bytesโดยการลบตัวแรกenumerate(obs, ฉันต้องลบอินพุตบางตัวเพื่อให้สามารถเชื่อมโยงได้ที่นี่)
Felipe Nardi Batista

2

J, 58 ไบต์

f=.{~0==/@]
[:(,/"2)2 2((' _'f{."1),' |'f{.);.3 1:+<.@%&10

ลองออนไลน์!

ฟังก์ชั่นที่ไม่ระบุชื่อซึ่งใช้เวลาเมทริกซ์และส่งออกรูปทรง

หาห้องพักเพื่อการปรับปรุงที่นี่ ฉันไม่มีเวลาลองกรณีทดสอบทั้งหมดเพื่อแจ้งให้ฉันทราบหากมีปัญหาใด ๆ จะลองเล่นกอล์ฟให้มากขึ้นและอธิบายในภายหลัง

(ด่วน) คำอธิบาย

ฟังก์ชั่นผู้ช่วย: จัดทำดัชนีเป็นสตริงความยาว 2 โดยพิจารณาจากองค์ประกอบแรกของอาร์เรย์ความยาว 2 เท่ากับค่าที่สอง ถ้ามันเท่ากันมันจะจัดทำดัชนีเป็นองค์ประกอบของศูนย์ถ้ามันไม่เท่ากันก็จะจัดทำดัชนีเป็นองค์ประกอบแรก อาร์เรย์ความยาว 1 จะจัดทำดัชนีลงในองค์ประกอบศูนย์ของสตริง

f=.{~0==/@]

ฟังก์ชั่นหลัก

[:(,/"2)2 2((' _'f{."1),' |'f{.);.3 1:+<.@%&10

1:+<.@%&10 ชั้นแต่ละองค์ประกอบหารด้วย 10 และเพิ่ม 1 (ดังนั้นเราจะไม่ได้รับ 0 - นี่เป็นสิ่งสำคัญสำหรับฟังก์ชั่นตัวช่วย)

2 2((' _'f{."1),' |'f{.);.3ตัดเมทริกซ์ออกเป็น 2 x 2 เซ็กเมนต์หากทำได้ (ไม่เช่นนั้นจะให้เซ็กเมนต์ 2 x 1, 1 x 2 หรือ 1 x 1 ใกล้ขอบ) และใช้ฟังก์ชั่นที่ใช้fในการเปรียบเทียบองค์ประกอบด้านบนซ้ายไปด้านบน ขวาและองค์ประกอบด้านซ้ายไปด้านล่างซ้าย

(,/"2)แปลงผลให้เป็นรูปร่างที่ต้องการ ฉันรู้สึกเหมือนฉันควรหลีกเลี่ยงการใช้สิ่งนี้ (และสิ่งอื่น ๆ อีกมากมาย แต่ฉันพูดนอกเรื่อง)



2

JavaScript (ES6), 120 118 ไบต์

a=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>((a[i+1]||0)[j]-c?'_':' ')+(b[j+1]-c?'|':' ')).join``).join`\n`

ไหน\nหมายถึงอักขระ newline ที่แท้จริง แก้ไข: บันทึก 2 ไบต์ด้วย @ Bálint

f=
a=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>((a[i+1]||0)[j]-c?'_':' ')+(b[j+1]-c?'|':' ')).join``).join`
`
;[
[[5,20],[3,6]]
,
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
,
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
,
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
,
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
].forEach(a=>document.write(['<pre>','</pre>'].join(f(a))));


คุณสามารถเปลี่ยน(a[i] || [])[j]โครงสร้างเป็น(a[i] || 0)[j]
Bálint

ในที่สุดjoin`\n`คุณสามารถถอดชิ้น\nส่วนออกและแทนที่ด้วย newline จริง
Bálint

114 bytes:a=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
Bálint

@ Bálint Bah ฉันลืมที่จะทำ\nส่วนนั้น; ฉันทดสอบใน REPL ดังนั้นการขึ้นบรรทัดใหม่ตามตัวอักษร
Neil

@ Bálint แต่ข้อเสนอแนะสุดท้ายของคุณล้มเหลวสำหรับตัวอย่างดั้งเดิมซึ่งฉันได้เพิ่มลงในรายการผลลัพธ์
Neil

1

โปรตอน , 202 ไบต์

R=(L=len)+range
k=[map((//)&10,r)for r:eval(input())]
d=(x,y,X,Y)=>X>=L(k)or Y>=L(k[X])or k[x][y]==k[X][Y]
print('\n'.join(map(''.join,[['_ '[d(x,y,x+1,y)]+'| '[d(x,y,x,y+1)]for y:R(k[x])]for x:R(k)])))

ลองออนไลน์!

-2 ไบต์ขอบคุณ Jonathan Frech
-15 bytes โดยเปลี่ยนไปใช้ Proton แทน Python 2


คุณสามารถบันทึกไบต์ที่สองโดยการแทนที่lenด้วยและการกำหนดL L=len;
Jonathan Frech

1

Java 8, 200 170 169 ไบต์

a->{String r="";for(int l=a.length,i=0,j;i<l;i++,r+="\n")for(j=0;j<l;r+=(i>l-2||a[i][j]/10==a[i+1][j]/10?" ":"_")+(j++>l-2||a[i][j-1]/10==a[i][j]/10?" ":"|"));return r;}

คำอธิบาย:

ลองที่นี่

โปรดทราบว่าการแบ่งจำนวนเต็มใน Java จะทำการปูพื้นโดยอัตโนมัติ

a->{                   // Method with 2D int-array as parameter and String return-type
  String r="";         //  Result-String
  for(int l=a.length,  //  Length of the input array
      i=0,j;           //  Index integers
      i<l;i++,         //  Loop (1) over the rows of the input array
          r+="\n")     //  and append a new-line to the result after every iteration
    for(j=0;j<l;       //   Inner loop (2) over the columns of a row
      r+=              //    Append the String with:
         (i>l-2        //      If it's the last row,
         ||a[i][j]/10==a[i+1][j]/10?
                       //      or the current and next rows are equal floored/10:
          " "          //       Use a space
         :             //      Else:
          "_")         //       Use a "_"
        +              //     Plus
         (j++>l-2      //      If it's the last column in the row,
         ||a[i][j-1]/10==a[i][j]/10?
                       //      or the current and next columns are equal floored/10:
          " "          //       Use a space
         :             //      Else:
          "|")         //       Use "|"
    );                 //   End of column loop (2)
                       //  End of row-loop (1) (implicit / single-line body)
  return r;            //  Return the result-String
}                      // End of method

1

R, 159 ไบต์

f=function(m){M=m%/%10;a=cbind(0,t(apply(M,1,diff)));b=rbind(apply(M,2,diff),0);a[!!a]="|";b[!!b]="_";M[]=gsub("0"," ",paste0(a,b));write(t(M),"",ncol(m),,"")}

ด้วยการขึ้นบรรทัดใหม่และการเยื้อง:

f=function(m){
    M=m%/%10
    a=cbind(0,t(apply(M,1,diff))) #row-wise difference
    b=rbind(apply(M,2,diff),0) #column-wise difference
    a[!!a]="|"
    b[!!b]="_"
    M[]=gsub("0"," ",paste0(a,b)) # M[] is a trick to force the result to have the same structure as M
    write(t(M),"",ncol(m),,"")
    }

การหารจำนวนเต็มของเมทริกซ์วัดความแตกต่างระหว่างแถวที่ชาญฉลาดและคอลัมน์ที่ชาญฉลาดและเมื่อไม่แทนที่โมฆะ|และ_ตามลำดับจากนั้นวางทั้งคู่ (ไม่เจ็บปวดขอบคุณ vectorization ของ R) และเอาท์พุท

กรณีทดสอบ:

> m=matrix(c(0,10,20,30,40,50,60,70,80,90,0,0,10,10,20,20,30,30,40,40,0,0,0,10,10,10,20,20,20,30,0,0,0,0,10,10,10,10,20,20,0,0,0,0,0,10,10,10,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0),byrow=T,ncol=10)
> f(m)
  |_|_|_|_|_|_|_|_|_
    |_  |_ _|_ _|_ _
      |_    |_ _  |_
        |_      |_ _
          |_        
            |_      
              |_    
                |_  
                  |_

> m=matrix(c(5,5,5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,5,5,10,15,15,15,15,15,15,15,10,5,5,10,15,20,20,20,20,20,15,10,5,5,10,15,20,25,25,25,20,15,10,5,5,10,15,20,25,30,25,20,15,10,5,5,10,15,20,25,25,25,20,15,10,5,5,10,15,20,20,20,20,20,15,10,5,5,10,15,15,15,15,15,15,15,10,5,5,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,5,5),byrow=T,ncol=11)
> f(m)
   _ _ _ _ _ _ _ _ _  
  |                 | 
  |    _ _ _ _ _    | 
  |   |         |   | 
  |   |    _    |   | 
  |   |   |_|   |   | 
  |   |         |   | 
  |   |_ _ _ _ _|   | 
  |                 | 
  |_ _ _ _ _ _ _ _ _| 

0

Perl 5 , 130 126 ไบต์

124 ไบต์ของรหัส + 2 สำหรับการตั้ง-apค่าสถานะ

push@a,[map 0|$_/10,@F]}{map{say map{($a[$r+1][$c]-$_&&$r<$#a?'_':$").($a[$r][++$c]-$_&&$c<@{$a[0]}?'|':$")}@$_;$c=0;$r++}@a

ลองออนไลน์!

รูปแบบอินพุตเป็นตาราง 2 มิติของตัวเลขคั่นด้วยช่องว่าง

คำอธิบาย

นี่คือจากการทำซ้ำก่อนหน้าของรหัส

push@a,[map 0|$_/10,@F]     # read the input, divide it by 10, and store it in a 2-D array
}{                          # end the implicit while loop and start the final block
map{                        # repeat this for each line
  $_=($a[$r+1][$c]-$_&&$r<$#a?'_':$")       # set appropriate characters to output based
     .($a[$r][++$c]-$_&&$c<@{$a[0]}?'|':$") # on the given rules
  for@$_;                                   # repeat for each number on the line
  $c=0;$r++;                         # setup row and column counters for next iteration
  say@$_                             # output this line
}@a
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.