Mở rộng một hình lục giác


24

Đưa ra một hình lục giác nghệ thuật ASCII làm đầu vào, đầu ra có các cạnh dài hơn một đơn vị.

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

Các hình lục giác đầu vào sẽ có đối xứng 180 độ, nhưng nếu không thì các cạnh có thể có tất cả các độ dài khác nhau. Ở trên, độ dài cạnh (2, 4, 3) được mở rộng thành (3, 5, 4). Các chiều dài bên sẽ là khác không.

Các hình lục giác được làm bằng dấu gạch dưới _, dấu gạch chéo /và dấu gạch chéo ngược \. Lưu ý rằng các cạnh ngang (được làm bằng dấu gạch dưới), cạnh trên nằm trên đường thẳng của chính nó nhưng cạnh dưới thì không.

Tôi / O

Tôi sẽ trở thành một stickler và yêu cầu định dạng ở đây: đầu vào và đầu ra phải là một chuỗi với các dòng mới đại diện cho hình ảnh, không phải là một danh sách các dòng. Tất nhiên, mã của bạn có thể lần lượt in từng dòng để tạo ra hình ảnh hoặc đọc STDIN một dòng thời gian để nhập nếu ngôn ngữ của bạn có thể làm điều đó.

Chi tiết

Đầu vào có thể bao gồm một dòng mới tùy chọn nếu bạn muốn, nhưng nếu không sẽ không có dòng trống. Bạn có thể chọn không có dấu cách ở đầu vào hoặc khoảng trắng để đệm mỗi dòng có cùng độ dài (đó là dòng dài nhất).

Đầu ra phải được làm phẳng với cạnh trái của màn hình, giống như đầu vào. Bạn có thể có thêm dòng mới bên trên và bên dưới cũng như dấu cách.

Các trường hợp thử nghiệm

Đầu vào theo sau là đầu ra.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Bảng xếp hạng

<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>


Các hình lục giác đầu ra phải giống nhau nhưng lớn hơn, hoặc nó có thể là bất kỳ hình lục giác nào có độ dài cạnh phù hợp không?
Stephen

1
@Stephen Nó phải là cùng một nhưng lớn hơn, trong cùng một định hướng.
xnor

2
Đây là một ví dụ tuyệt vời về một thách thức thực sự bằng văn bản. Ngắn gọn, rõ ràng và cho điểm. Tôi có thể đưa ra một đề nghị nhỏ? "Stickler" có thể không rõ ràng đối với tất cả những người không nói tiếng Anh bản ngữ. Tôi có thể đề nghị rằng "Tôi sẽ chỉ chấp nhận ..." hoặc một cái gì đó tương tự có thể dễ hiểu hơn? +1 dù sao đi nữa.
ElPedro

Chúng ta có thể trả về một mảng / IEnumerableký tự không?
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance Vâng, những thứ đó đều ổn, miễn là có các ký tự dòng mới cần thiết.
xnor

Câu trả lời:



5

Võng mạc 0.8.2 , 84 byte

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

Hãy thử trực tuyến!Hoạt động với các hình lục giác không đều. I / O không được đệm. Giải trình:

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

Mở rộng nội thất của hình lục giác.

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

Sửa lên trên.

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

Sửa lên phía dưới.


5

JavaScript (ES6),  159 156 153  150 byte

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

Hãy thử trực tuyến!

Đã bình luận

Lưu ý: Các ký tự thay thế được sử dụng bên dưới cho các dấu phân cách biểu thức chính quy để ngăn cú pháp SE tô sáng không bị lộn xộn.

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

Than , 48 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Nhập và nối tất cả các dòng trừ đầu tiên. (Đầu vào ở định dạng JSON sẽ làm cho hầu hết những thứ này không cần thiết với mức tiết kiệm 11 byte.)

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

Đếm số lượng /s, /s và _s trong chuỗi và sử dụng số đó để tính độ dài cạnh mới (trong trường hợp _s, là một chuỗi _s có độ dài đó).

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

Vẽ hình lục giác mở rộng.

Giải pháp thay thế, cũng 48 byte:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Nhập tất cả các dòng. (Đầu vào ở định dạng JSON sẽ khiến điều này không cần thiết khi tiết kiệm 17 byte.)

F²«

Vẽ riêng phần trên cùng bên phải và dưới cùng bên trái của hình lục giác.

≔E\/_⊕⊘№θκ

Đếm số lượng /s, /s và _s trong chuỗi và sử dụng số đó để tính độ dài cạnh mới.

η×_⊟ηM⁰¬ι

Xuất ra trên cùng hoặc dưới cùng, và di chuyển xuống một dòng nếu đây là dòng trên cùng.

Fη«↷¹κ↷¹¶

Vẽ cả hai bên phải hoặc trái.


2

APL (Dyalog Unicode) , 75 74 byte SBCS

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

Hãy thử trực tuyến!

'.+'⎕s'&' chia đầu vào thành các dòng

↑⍵ trộn các dòng thành một ma trận

⍺⍳thay thế ' /\_'bằng0 1 2 3

(0,0,⍨⍉)⍣3⍉ bao quanh với một lớp 0 ở trên và dưới và hai lớp 0 ở bên trái và bên phải

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 đối với mỗi ô, chọn số 0 đầu tiên từ: trên, dưới, trái, phải từ vùng lân cận 3x3 tập trung vào nó

2⌈/ tối đa theo cặp theo chiều ngang

a×1=(+⍀×a)⌊⊖+⍀⊖×a← chỉ giữ lại ranh giới ngoài của số 0

⍺[ ]thay thế 0 1 2 3bằng' /\_'



0

Perl 5 , 177 156 145 byte

@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

Có thể ngắn hơn? Đừng thấy thế nào. Với ý kiến ​​và thêm dòng mới và tiêu đề + chân trang:

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
}

Hãy thử trực tuyến!

Dòng số 1 chia chuỗi đầu vào nhiều dòng thành mảng @l.

Dòng # 2 nhân đôi dòng thứ hai và cuối cùng mà không có ký tự _.

Dòng # 3 thêm khoảng trắng ở nơi cần thiết trên dòng 2 đến giây cuối cùng.

Dòng số 4 mở rộng hai mặt ___ bằng một _ và trả về mảng @l của một dòng dưới dạng một chuỗi nhiều dòng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.