ขยายรูปหกเหลี่ยม


24

กำหนดรูปหกเหลี่ยมศิลปะ ASCII เป็นอินพุตเอาต์พุตหนึ่งซึ่งมีด้านข้างเป็นหนึ่งหน่วยอีกต่อไป

                     _____
  ____              /     \
 /    \            /       \
/      \          /         \
\       \   =>    \          \
 \      /          \         /
  \____/            \       /
                     \_____/

รูปหกเหลี่ยมที่ป้อนเข้าจะมีความสมมาตร 180 องศา แต่มิฉะนั้นด้านข้างอาจมีความยาวต่างกัน ด้านบนความยาวด้านข้าง (2, 4, 3) ขยายให้เป็น (3, 5, 4) ความยาวด้านจะไม่ใช่ศูนย์

รูปหกเหลี่ยมที่ทำจากขีด_, ทับและเครื่องหมาย/ \โปรดสังเกตว่าขอบแนวนอน (ทำด้วยขีดล่าง) ขอบด้านบนอยู่ในบรรทัดของตัวเอง แต่ขอบด้านล่างไม่ได้

I / O

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

รายละเอียด

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

เอาท์พุทควรล้างด้วยขอบด้านซ้ายของหน้าจอเช่นอินพุต คุณอาจมีการขึ้นบรรทัดใหม่ด้านบนและด้านล่างเช่นเดียวกับช่องว่างต่อท้าย

กรณีทดสอบ

อินพุตตามด้วยเอาต์พุต

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

  ____
 /    \
/      \
\       \
 \      /
  \____/

   _____
  /     \
 /       \
/         \
\          \
 \         /
  \       /
   \_____/

     _
    / \
   /  /
  /  /
 /  /
/  /
\_/

      __  
     /  \
    /    \
   /     /
  /     /
 /     /
/     /
\    /
 \__/

ลีดเดอร์บอร์ด

<iframe src="https://xmikee1.github.io/ppcg-leaderboard/?id=185760" width="100%" height="100%" style="border: none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe><style>html,body{margin:0;padding:0;height:100%;overflow:hidden}</style>


ต้องมีรูปหกเหลี่ยมออกมาเหมือนกัน แต่ใหญ่กว่าหรือเป็นรูปหกเหลี่ยมที่มีความยาวด้านที่เหมาะสมหรือไม่?
Stephen

1
@Stephen มันจะต้องเหมือนกัน แต่ใหญ่กว่าในทิศทางเดียวกัน
xnor

2
นี่เป็นตัวอย่างที่ดีของความท้าทายที่เขียนได้ดีมาก สั้นชัดเจนและตรงประเด็น ฉันขอคำแนะนำเล็กน้อยได้ไหม "Stickler" อาจไม่ชัดเจนสำหรับผู้ที่ไม่ใช่เจ้าของภาษาอังกฤษทุกคน ฉันขอแนะนำว่า "ฉันจะยอมรับเท่านั้น ... " หรือสิ่งที่คล้ายกันอาจเข้าใจได้ง่ายขึ้น +1 อยู่ดี
ElPedro

เราสามารถคืนอาเรย์ / IEnumerableของตัวละครได้หรือไม่?
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ใช่สิ่งเหล่านั้นใช้ได้ตราบใดที่มีอักขระขึ้นบรรทัดใหม่ที่ต้องการ
xnor

คำตอบ:



5

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

m`(¶.*)( .)$
$1   $2
(_+¶)(( */)  ( *.))
 _$1 $3$4¶$2
( *.)(_+/)$
$1$.2$*   /¶ $1_$2

ลองออนไลน์! ใช้ได้กับรูปหกเหลี่ยมที่ผิดปกติ I / O ไม่มีการเสริมเบาะ คำอธิบาย:

m`(¶.*)( .)$
$1   $2

ขยายการตกแต่งภายในของรูปหกเหลี่ยม

(_+¶)(( */)  ( *.))
 _$1 $3$4¶$2

แก้ไขด้านบน

( *.)(_+/)$
$1$.2$*   /¶ $1_$2

แก้ไขส่วนล่าง


5

JavaScript (ES6),  159 156 153  150 ไบต์

s=>s[r='replace'](/\S /g,'$&   ')[r](/.*/,s=>s[r](e=/_+/,` $&_
`+s[r](e,'/$& \\')[r](e=/_/g,' ')))[r](/ *\\_+/,s=>s[r](e,' ')+`   /
 `+s[r](/_/,'__'))

ลองออนไลน์!

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

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

s =>                       // s = input
  s[r = 'replace'](        // r = alias for 'replace'
                           // STEP #1
    \S g,                // insert two middle spaces for all lines
    '$&   '                // that contain a border, followed by a space
  )                        // (i.e. all lines except the first and the last one)
  [r](                     // STEP #2
    ∕.*∕,                  // isolate the first line
    s =>                   // let s be this first line
      s[r](                //
        e = _+∕,          // find the sequence of underscores and replace it with:
        ` $&_\n` +         //   the same sequence preceded by a space and followed by '_'
        s[r](              //   followed by a linefeed and:
          e,               //     the same sequence preceded by '/' and followed by ' \'
          '/$& \\'         //     
        )                  //     with:
        [r](e = _g, ' ') //     all underscores replaced with spaces
  ))                       //
  [r](                     // STEP #3
     *\\_+∕,              // isolate the last line, without the trailing '/'
    s =>                   // let s be this last line
      s[r](e, ' ') +       // replace all underscores with spaces
      `   /\n ` +          // append 3 spaces and a trailing '/', followed by a linefeed
      s[r](∕_∕, '__')      // append s with an extra underscore
  )                        //

2

ถ่าน 48 ไบต์

SθW¬№ω_≔⁺ωSω≔⊕⊘№ω\η≔⊕⊘№ω/ζ≔×_⊕№ω_θ↗ζθ↓↘η←↙ζ↑←θ↖η

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

SθW¬№ω_≔⁺ωSω

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

≔⊕⊘№ω\η≔⊕⊘№ω/ζ≔×_⊕№ω_θ

นับจำนวน/s, /s และ_s ในสตริงและใช้เพื่อคำนวณความยาวด้านใหม่ (ในกรณีของ_s เป็นสตริงของ_s ของความยาวนั้น)

↗ζθ↓↘η←↙ζ↑←θ↖η

วาดรูปหกเหลี่ยมที่ขยายใหญ่ขึ้น

ทางเลือกอื่น ๆ เช่น 48 ไบต์:

SθW¬№ω_≔⁺ωSω≔⁺θωθF²«≔E\/_⊕⊘№θκη×_⊟ηM⁰¬ιFη«↷¹κ↷¹¶

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

SθW¬№ω_≔⁺ωSω≔⁺θωθ

ใส่ทุกบรรทัด (อินพุตในรูปแบบ JSON จะทำให้สิ่งนี้ไม่จำเป็นที่การบันทึก 17 ไบต์)

F²«

วาดส่วนบนขวาและซ้ายล่างของรูปหกเหลี่ยมแยกกัน

≔E\/_⊕⊘№θκ

นับจำนวน/s, /s และ_s ในสตริงและใช้เพื่อคำนวณความยาวด้านใหม่

η×_⊟ηM⁰¬ι

เอาท์พุทด้านบนหรือด้านล่างและย้ายลงบรรทัดถ้านี่คือเส้นด้านบน

Fη«↷¹κ↷¹¶

วาดทั้งด้านขวาหรือซ้าย


2

APL (Dyalog Unicode) , 75 74 ไบต์SBCS

' /\_'∘{⍺[a×1=(+⍀×a)⌊⊖+⍀⊖×a2⌈/{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3(0,0,⍨⍉)⍣3⍉⍺⍳↑⍵]}'.+'s'&'

ลองออนไลน์!

'.+'⎕s'&' แยกอินพุตเป็นบรรทัด

↑⍵ ผสมเส้นเป็นเมทริกซ์

⍺⍳แทนที่' /\_'ด้วย0 1 2 3

(0,0,⍨⍉)⍣3⍉ ล้อมรอบด้วยเลเยอร์ 0s ที่ด้านบน & ล่างและ 0 เลเยอร์สองด้านซ้าย & ขวา

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 สำหรับแต่ละเซลล์เลือก non-0 แรกจาก: บน, ล่าง, ซ้าย, ขวาจากพื้นที่ใกล้เคียง 3x3 ที่อยู่ตรงกลาง

2⌈/ สูงสุดในคู่แนวนอน

a×1=(+⍀×a)⌊⊖+⍀⊖×a← เก็บเฉพาะขอบเขตด้านนอกที่ไม่ใช่ 0

⍺[ ]แทนที่0 1 2 3ด้วย' /\_'



0

Perl 5 , 177 156 145 ไบต์

@l=pop=~/.+/g;splice@l,$_,0,$l[$_]=~s,_, ,gr for-1,1;$l[$_]=~s, (\S)( +)(\S),$_<2?" $1$2 $3":"$1$2   $3",e for 1..@l-2;join("\n",@l)=~s,_+,$&_,gr

อาจจะสั้นกว่านี้? ยังไม่เห็นเลย ด้วยความคิดเห็นและเพิ่มบรรทัดใหม่และส่วนหัว + ส่วนท้าย:

sub f {
@l=pop=~/.+/g;                                                      #1
splice@l,$_,0,$l[$_]=~s,_, ,gr for-1,1;                             #2
$l[$_]=~s, (\S)( +)(\S),$_<2?" $1$2 $3":"$1$2   $3",e for 1..@l-2;  #3
join("\n",@l)=~s,_+,$&_,gr                                          #4
}

ลองออนไลน์!

บรรทัดที่ # 1 แยกสตริงอินพุตหลายบรรทัดลงในอาร์เรย์ @l

บรรทัด # 2 ซ้ำบรรทัดที่สองและบรรทัดสุดท้ายโดยไม่มีตัวอักษร _

บรรทัด # 3 เพิ่มช่องว่างที่จำเป็นในบรรทัด 2 ถึงวินาทีที่ผ่านมา

บรรทัดที่ # 4 ขยายทั้งสองด้าน ___ ด้วยหนึ่ง _ และส่งกลับอาร์เรย์ @l ของบรรทัดเป็นสตริงหลายบรรทัดเดียว

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