Rentangkan segi enam

24

Diberi segi enam seni ASCII sebagai input, output yang sisi-sisinya semua satu unit lebih panjang.

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

Segi enam input akan memiliki simetri 180 derajat, tetapi jika tidak, sisi-sisinya dapat memiliki panjang yang berbeda. Di atas, panjang sisi (2, 4, 3) diperbesar menjadi (3, 5, 4). Panjang sisi akan menjadi nol.

Segi enam terbuat dari garis bawah _, garis miring /, dan garis miring terbalik \. Perhatikan bahwa dari tepi horizontal (dibuat dengan garis bawah), tepi atas adalah pada jalurnya sendiri tetapi tepi bawah tidak.

I / O

Saya akan menjadi stickler dan memerlukan format sini: input dan output harus berupa string dengan baris baru yang mewakili gambar, bukan daftar garis. Tentu saja, kode Anda dapat mencetak setiap baris secara bergantian untuk menghasilkan gambar, atau membaca STDIN satu kali untuk input jika bahasa Anda dapat melakukannya.

Detail

Input mungkin menyertakan baris tambahan baru jika Anda mau, tetapi sebaliknya tidak akan memiliki baris kosong. Anda dapat memilih untuk tidak memiliki spasi tambahan di input, atau spasi untuk mengisi setiap baris dengan panjang yang sama (garis terpanjang).

Outputnya harus rata dengan tepi kiri layar, seperti input. Anda mungkin memiliki baris baru tambahan di atas dan di bawah serta spasi tambahan.

Uji kasus

Input diikuti oleh output.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Papan peringkat

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

Tidak
sumber
Haruskah segi enam keluaran sama tetapi lebih besar, atau bisakah itu segi enam dengan panjang sisi yang sesuai?
Stephen
1
@Stephen Itu harus sama tetapi lebih besar, dalam orientasi yang sama.
xnor
2
Ini adalah contoh yang bagus dari tantangan yang ditulis dengan sangat baik. Singkat, jelas dan to the point. Bolehkah saya membuat saran kecil? "Stickler" mungkin tidak jelas untuk semua penutur bahasa Inggris yang bukan asli. Bolehkah saya menyarankan bahwa "Saya hanya akan menerima ..." atau sesuatu yang serupa mungkin lebih mudah dipahami? Tetap memberi +1.
ElPedro
Bisakah kita mengembalikan array / IEnumerablekarakter?
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance Ya, itu bagus, asalkan memiliki karakter baris baru yang diperlukan.
xnor

Jawaban:

6

Stax , 28 byte

╙Σ■♀♪«G[▀[TÖe╟╗ê'○▀ÄT→│╧(╡¢╩

Jalankan dan debug itu

Sepertinya harus ada cara untuk melakukannya sebagian besar dengan regex, tapi aku masih mencari ...

rekursif
sumber
5

Retina 0.8.2 , 84 byte

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

Cobalah online! Bekerja dengan segi enam yang tidak teratur. I / O tidak murni. Penjelasan:

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

Memperluas bagian dalam segi enam.

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

Perbaiki di bagian atas.

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

Memperbaiki bagian bawah.

Neil
sumber
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](/_/,'__'))

Cobalah online!

Berkomentar

NB: Karakter alternatif digunakan di bawah ini untuk pembatas regex untuk mencegah penyorot sintaks SE agar tidak mengamuk.

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
  )                        //
Arnauld
sumber
2

Arang , 48 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Input dan gabungkan semua baris kecuali yang pertama. (Input dalam format JSON akan membuat sebagian besar dari ini tidak perlu dengan penghematan 11 byte.)

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

Hitung jumlah /s, /s, dan _s dalam string dan gunakan itu untuk menghitung panjang sisi baru (dalam kasus _s, sebagai string _s dari panjang itu).

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

Gambarkan segi enam yang diperbesar.

Solusi alternatif, juga 48 byte:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Masukkan semua baris. (Input dalam format JSON akan membuat ini tidak perlu dengan penghematan 17 byte.)

F²«

Gambarlah bagian kanan atas dan kiri bawah segi enam secara terpisah.

≔E\/_⊕⊘№θκ

Hitung jumlah /s, /s, dan _s dalam string dan gunakan itu untuk menghitung panjang sisi baru.

η×_⊟ηM⁰¬ι

Keluarkan bagian atas atau bawah, dan turunkan garis jika ini adalah garis atas.

Fη«↷¹κ↷¹¶

Gambarlah kedua sisi kanan atau kiri.

Neil
sumber
2

APL (Dyalog Unicode) , 75 74 byte SBCS

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

Cobalah online!

'.+'⎕s'&' pisahkan input menjadi beberapa baris

↑⍵ mencampur garis menjadi matriks

⍺⍳ganti ' /\_'dengan0 1 2 3

(0,0,⍨⍉)⍣3⍉ mengelilingi dengan lapisan 0s di atas & bawah dan dua lapisan 0s di kiri & kanan

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 untuk setiap sel pilih non-0 pertama dari: atas, bawah, kiri, kanan dari lingkungan 3x3 yang berpusat di atasnya

2⌈/ Maks berpasangan secara horizontal

a×1=(+⍀×a)⌊⊖+⍀⊖×a← pertahankan hanya batas luar dari bukan-0

⍺[ ]ganti 0 1 2 3dengan' /\_'

ngn
sumber
1

PowerShell , 126 byte

$args-replace' *\S +','$0   '-replace'( +)(_+)','$1 $2_
$1/$2 \'-replace'( *)(\\_+)/','$1$2   /
$1 $2_/'-replace'_(?=.* )',' '

Cobalah online!

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

Mungkinkah lebih pendek? Jangan melihat bagaimana dulu. Dengan komentar dan menambahkan baris baru dan header + footer:

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
}

Cobalah online!

Baris # 1 membagi string input multi-baris ke dalam array @ l.

Baris # 2 menduplikasi baris kedua dan terakhir tanpa _ chars.

Baris # 3 menambahkan spasi di mana diperlukan pada baris 2 ke detik terakhir.

Baris # 4 melebarkan kedua sisi ___ dengan satu _ dan mengembalikan array baris @l sebagai satu string multi-baris.

Kjetil S.
sumber