Bir altıgen genişlet


24

Giriş olarak bir ASCII art altıgen verilmişse, çıktısı bir tarafı daha uzun olan bir çıktı.

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

Giriş altıgenleri 180 derecelik bir simetriye sahip olacak, ancak aksi takdirde kenarlar farklı uzunluklarda olabilir. Yukarıda, yan uzunluklar (2, 4, 3), (3, 5, 4) olarak büyütülür. Yan uzunluklar sıfır olmayacak.

Altıgenler alt _çizgilerden /, eğik çizgilerden ve ters eğik çizgilerden oluşur \. Yatay kenarların (alt çizgi ile yapılmış), üst kenarın kendi çizgisinde olduğunu ancak alt kenarın olmadığını unutmayın.

I / O

Bir yapıştırıcı olacağım ve burada formatı gerekecek : giriş ve çıkış, çizgileri değil görüntüyü temsil eden yeni satırlara sahip bir dize olmalıdır. Elbette, kodunuz görüntüyü üretmek için sırayla her satırı yazdırabilir veya diliniz bunu yapabilirse giriş için STDIN satırını okuyabilir.

ayrıntılar

İsterseniz giriş isteğe bağlı bir takip satırı içerebilir, ancak aksi takdirde boş satır olmayacaktır. Girişte hiçbir boşluk bırakmamayı veya her bir çizgiyi aynı uzunluğa (en uzun çizginin çizgisi) kaydırmak için boşluk bırakmayı seçebilirsiniz.

Çıktı, giriş gibi ekranın sol kenarı ile aynı hizada olmalıdır. Sondaki boşlukların yanı sıra, yukarıda ve aşağıda ekstra yeni satırlarınız olabilir.

Test durumları

Girdi ardından çıktı.

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

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

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

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

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

Liderler Sıralaması

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


Çıktı altıgen aynı mı, fakat daha büyük mü olmalı yoksa uygun kenar uzunluklarına sahip altıgen olabilir mi?
Stephen

1
@Stephen Aynı yönde fakat aynı yönde daha büyük olmalı.
xnor

2
Bu gerçekten iyi yazılmış bir zorluğa harika bir örnektir. Kısa, net ve konuya. Küçük bir öneride bulunabilir miyim? "Stickler", ana dili İngilizce olmayan tüm konuşmacılar için net olmayabilir. "Sadece kabul edeceğim ..." veya benzer bir şeyin anlaşılması daha kolay olabilir mi? Yine de +1.
ElPedro

Bir IEnumerablekarakter / karakter dizisini döndürebilir miyiz ?
Cehalet

@EmbodimentofIgnorance Evet, gerekli yeni satır karakterleri olduğu sürece bunlar gayet iyi.
xnor

Yanıtlar:



5

Retina 0.8.2 , 84 bayt

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

Çevrimiçi deneyin! Düzensiz altıgenlerle çalışır. G / Ç bağlanmamış. Açıklama:

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

Altıgenin içini genişletin.

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

Üstünü düzelt.

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

Dibini düzelt.


5

JavaScript (ES6),  159 156 153  150 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

Not: SE sözdizimi vurgulayıcısının çılgına dönmesini önlemek için regex sınırlayıcıları için alternatif karakterler aşağıda kullanılmıştır.

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

Kömür , 48 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

İlki hariç tüm satırları girin ve birleştirin. (JSON formatında giriş yapmak, bu işlemin çoğunu 11 bayt tasarrufla gereksiz kılar.)

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

Dizedeki /s, /s ve _s sayısını sayın ve bunu yeni yan uzunlukları hesaplamak için kullanın ( _s durumunda _, o uzunluktaki bir s olarak).

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

Büyütülmüş altıgen çizin.

Alternatif çözüm, ayrıca 48 bayt:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

Tüm satırları girin. (JSON biçiminde giriş yapmak, bunu 17 bayt tasarrufla gereksiz kılar.)

F²«

Altıgenin sol üst ve sağ alt bölümlerini ayrı ayrı çizin.

≔E\/_⊕⊘№θκ

Dizedeki /s, /s ve _s sayısını sayın ve yeni kenar uzunluklarını hesaplamak için bunu kullanın.

η×_⊟ηM⁰¬ι

Üst veya alt çıktısını alın ve üst çizgiyse bir çizgiyi aşağı kaydırın.

Fη«↷¹κ↷¹¶

Hem sağ hem de sol tarafları çizin.


2

APL (Dyalog Unicode) , 75 74 bayt SBCS

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

Çevrimiçi deneyin!

'.+'⎕s'&' girdiyi satırlara bölme

↑⍵ Satırları matris halinde karıştır

⍺⍳yerine ' /\_'sahip0 1 2 3

(0,0,⍨⍉)⍣3⍉ üstte ve altta 0'lık bir katman ve solda ve sağda iki'lü 0'lık katmanlarla çevreleyin

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 Her bir hücre için ilk 0 olmayanı seçin: Üst, alt, sol, sağda 3x3 mahalleden sağa

2⌈/ Yatay olarak çiftler halinde maks.

a×1=(+⍀×a)⌊⊖+⍀⊖×a← 0 olmayanların yalnızca dış sınırını koru

⍺[ ]yerine 0 1 2 3sahip' /\_'



0

Perl 5 , 177 156 145 bayt

@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

Daha kısa olabilir mi? Henüz nasıl olduğunu anlamadım. Yorumlar ve eklenen yeni satırlar ve üstbilgi + altbilgi ile:

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
}

Çevrimiçi deneyin!

1. satır, çok satırlı giriş dizesini @l dizisine böler.

Satır # 2, _ karakterleri olmadan ikinci ve son satırları çoğaltır.

3. satır, ikinci satırda en son ikinci satırda gerektiğinde boşluk ekler.

Satır # 4 iki ___ tarafı bir _ ile genişletir ve satırların dizisini tek satırlı bir dizge olarak döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.