Kutuyu aç / kapat!


9

Potansiyel olarak kutulanmış bir dize verildiğinde kutuyu değiştirin. Bu test senaryolarında ve açıklamada daha açık hale gelir.

Giriş çıkış

Giriş Formatı

Giriş, CR, LF veya CRLF ile ayrılmış tek bir dize veya bir dize listesi olacaktır. Giriş formatı karar vermek size kalmış.

Çıkış biçimi

Çıktı formatı, girdi ile aynı formatta olmalıdır.

Açıklama + Örnek

Örnek olarak kutulu bir dize alalım:

+-------------+
|Hello, World!|
+-------------+

Kutuyu değiştirmek için ilk ve son satırı ve ilk ve son sütunu kaldırırız. Son satırdan sonra (son satırın sonunda isteğe bağlı bir son satırsonu ile) sondaki boşluk olmadığını ve satır sonunu saymadan herhangi bir satırda sondaki boşluk olmadığını varsayabilirsiniz.

Bu şöyle olur:

Hello, World!

Diğer yol

Dize bir kutuda değilse , ona bir kutu ekleyin. Bu oldukça basit; Başa eklenen +---...---+kendi hattında kçizgiler kher bir çizgi için daha sonra en uzun hat uzunluğudur, ve uzun çizgi uzunluğuna uygun ve daha sonra başa getirebilir ve bir dikey çizgi eklemek için boşluk nokta olan ped o ( "|"). Son +---...---+olarak, ilk satırla aynı kurulumu içeren bir satır ekleyin .

Örneğin:

Hello, World!

dönüşür:

+-------------+
|Hello, World!|
+-------------+

Girişteki hiçbir satırın sonunda boşluk olmayacağını varsayabilirsiniz.

Etrafına bir kutu konması gereken bir dize örneği:

Hello,
    World!

olur

+----------+
|Hello,    |
|    World!|
+----------+

Hala kutulanması gereken bir şey örneği:

+--------+
|        |
 --------+

dönüşür:

+----------+
|+--------+|
||        ||
| --------+|
+----------+

Kurallar + Özellikler

  • Standart Loopholes Uygula
  • Hiçbir giriş satırının, kutuya yerleştirilmiş olup olmadığına bakılmaksızın, hem genel hem de her satırda önde gelen veya arkadaki boşluklar olmayacaktır.
  • Kutular sadece +köşeleri gibi |, dikey kenarlar ve -yatay kenarlar için olacaktır.
  • Bir kutunun kutu olarak kabul edilebilmesi için artıları yerinde olmalıdır; yüksekliği veya genişliği 2 varsa (yani, içerik yoksa), kutunun yüksekliğine bağlı olarak bir sürü yeni satıra neden olacak şekilde kutudan çıkarılmalıdır.
  • Girişte bir kutu var ancak kutunun dışında bir metin varsa, her şey kutulu olmalıdır.
  • Programınız dizenin tüm çevresini kontrol etmelidir. Dışarıdaki tek bir karakter doğru değilse (eksik veya olması gerekenden farklı bir karakter), kutulu değil kutulu olmalıdır.
  • Kutusuz dizenin kendisi içerebilir + | -. Kutusuz dizenin kendisinde bir kutu varsa, dizeyi kutuyla birlikte döndürün; yalnızca bir kez kutudan çıkarılmalıdır.

Kenar Kılıfları

1: Küçük kutular

Giriş:

++
++

Çıktı boş veya satırsonu

Giriş:

+----+
+----+

Çıktı boş veya yeni satır

Giriş:

++
||
||
++

Çıktı 2 satır veya 3 satır

2: Kısmi Kutu

Giriş:

+-------+
| Hello |
+ ------+

Çıktı:

+---------+
|+-------+|
|| Hello ||
|+ ------+|
+---------+

3: Kutunun dışındaki metinler

Giriş:

 +-------+
a| Hello |
 +-------+

Çıktı:

+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+

1
"Hiçbir giriş satırının, kutuya yerleştirilmiş olup olmadığına bakılmaksızın, hem genel hem de her satırda önde gelen veya arkadaki boşluklar olmayacaktır." Test durumlarınızın birçoğunda önde gelen boşluk vardır. Dikdörtgen girdi sormak için çok mu fazla olurdu?
Neil

@Neil Muhtemelen tutarlı bir önde gelen boşluk anlamına gelmiyordu , yani 3 boşlukla başlayan her satır bir durum olmazdı, ancak 1, 2, 0, 3 boşlukla başlayan satırlar tutarlı olmadığı için olurdu.
Outgolfer Erik

bu bir kutu ya da değil?
user41805

@Cowsquack Spesifikasyondan öyle değil gibi görünüyor.
Outgolfer Erik

@Neil Üzgünüm, yani başlangıçta herhangi bir boşluk onu bir kutu olarak göstermeyecekti.
HyperNeutrino

Yanıtlar:


6

JavaScript (ES2017), 199 bayt

s=>/^\+-*\+\n(\|.*\|\n)*\+-*\+$/.test(s,s=s.split`
`,s.map(z=>z[y]?y=z.length:0,y=0))?s.slice(1,-1).join`
`.replace(/.(.*)./g,"$1"):(x=`+${'-'.repeat(y)}+`)+`
|${s.map(z=>z.padEnd(y)).join`|
|`}|
`+x

Saf çözüm. En iyisi olsun ya da olmasın, göreceğiz ...


"En iyisi olsun ya da olmasın, göreceğiz ..." yine de JS gibi golf dışı bir dili <200 baytta çözmek için görmek harika ... orada ne yaptığımı görüyor musun? ;)
Outgolfer Erik

Haha, "şimdi 2 doların altında!" maliyeti 1.99 olduğunda: P
ETHproductions 25:17

Buna endüstriyel soygun lol denir .
Outgolfer Erik

Bu test durumlarda çalışır, ama böyle bir şey için çalıştığını sanmıyorum: '+--+\n|hi|\n|world|\n+----------+'. Dikdörtgen olmasa bile çizgileri kaldırır.
Rick Hitchcock

3

SOGL V0.12 , 72 bayt

2-┌* +1Ο;2-⁴┌@ŗΖ+|ŗ∙⁴++B
▓Aa1w⁄;lGB╬8a⁰I{_=}¹χ?ajk{jk}⁰←a1w⁄;l2+G2+B00╬5

Buradan Deneyin!

+7 bytes ( ⁰I{_=}¹χ) çünkü elementwise eşittir uygulanmadığı için
+1 byte ( ) , tembel olduğum ve yazılan girişleri uygulamadığım için girdinin kare
+1 bayt ( A) olacağı garanti edilmediğinden (bu, yığındaki girdiyi bekler. kullanım kolaylığı, çevrimiçi bağlantı içerir → böylece giriş kutusu kullanılabilir)


⁰I{_=}¹χ+7 değil +8 bayttır.
Outgolfer Erik

@EriktheOutgolfer iyi olmalı =, ancak bu işe yaramazsa, uzunluğu -1 + 8 = +7
dzaima


2

Retina , 197195 bayt

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 
%`^|$
|
^.(.*).
+$.1$*-+¶$&
.(.*).$
$&¶+$.1$*-+
^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶
..(.*)..(?=(.|¶)*¶$)
$1
^¶-*¶-*¶|(\G|¶)-*¶-*¶$

Çevrimiçi deneyin! Açıklama:

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 

Bu aşama kendi içinde oldukça karmaşık, bu yüzden biraz parçalayacağım. +başka sahne bulunamayana kadar sahne tekrarlanır. m`^sahnenin herhangi bir satırın başında eşleştiği anlamına gelir. ((.)*)sonra tüm çizgiyle eşleşir. Şimdi $1sadece eşleşen çizgi, ancak $2eşleşmelerin bir listesi yani karakterler. daha sonra satırın sonu ve dolayısıyla bir sonraki satırın başlangıcıyla eşleşir. (?<-2>.)*.NET dengeleme grubu kullanır. <-2>Dan kaldırır maçlar $2uzun bir karakter olarak ikinci satırda eşleştirilebilir. Bu noktada, üç şeyden biri olabilir:

  • İkinci satırda yeterli karakter yoktu. $2hala bazı eşleşmeler kaldı.
  • İki çizgi aynı uzunluktaydı. $2eşleşmesi kalmadı ve satırın sonuna geldik.
  • İkinci satır daha uzun, bu yüzden en az bir karakter kaldı.

(?(2)$|(.)))bir koşul kullanarak bunların ayırt edilmesine yardımcı olur. Eğer $2hala bazı maçlar bıraktı vardır, o zaman ikinci satır çok kısa olduğu için biz hattın sonuna eşleşecek şekilde bu, olması gerekir, ama eğer $2var biz eşleşecek şekilde eşleşme, o zaman, daha uzun olması, ikinci hat istiyorum sol bir karakter ( $4eşleşmenin gerçekleştiğini bilmemiz için girer ). Aksi takdirde iki çizgi aynı uzunluktadır ve maç bu noktada başarısız olur (elbette daha sonraki bir satırda tekrar eşleşebilir).

Yeni dize $1$#4$* $3$#2$*. $#4İçin değerlendirir 1biz ikinci satırda ek bir karakteri uyum olursa 0değilse. Bu $#4$*, ikinci satır daha uzunsa ilk satıra bir boşluk eklediği anlamına gelir . $#2$*İlk satır daha uzunsa benzer şekilde ikinci satıra boşluk ekler. (Aslında, tam olarak doğru sayıda boşluk ekliyor. Eğer sadece iki satırı dengeliyorsak,+ bunu daha uzun ikinci çizgi durumunda da doğrudan başarmak için dördüncü yakalama grubuna a eklenebilirdi.)

Tüm bunların sonucu, bu aşamanın girişi bir dikdörtgene doldurmasıdır. Şimdi etrafına bir kutu çizebiliriz.

%`^|$
|

Talep |her bir tarafında bu.

^.(.*).
+$.1$*-+¶$&

+-...-+Üst tarafa yerleştirin.

.(.*).$
$&¶+$.1$*-+

Ve yine altta.

^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶

Bir çift kutu oluşturup oluşturmadığımızı görün. Öyleyse, kalan kutucukların her iki kutuyu da silecek şekilde eşleşmeleri için üst ve alt kısımlara ekstra boş satırlar eklenir.

..(.*)..(?=(.|¶)*¶$)
$1

Boş bir satır varsa, her satırın başından ve sonundan iki karakter kaldırın.

^¶-*¶-*¶|(\G|¶)-*¶-*¶$

Önde gelen boş bir satır varsa, onu ve sonraki iki satırı silin ( -kutunun üstünde kalan s olacaktır ). Boş bir satır varsa, onu ve önceki iki satırı silin. (\G|¶)Sadece altı çizgileri (ve bu nedenle 5 orada dava ile fırsatlar kutu hiçbir içeriğe çünkü s).

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.