ボックスを切り替えます!


9

ボックス化される可能性のある文字列を指定して、ボックスを切り替えます。これは、テストケースと説明で明らかになります。

入出力

入力フォーマット

入力は、CR、LF、またはCRLFで区切られた単一の文字列、または文字列のリストです。入力フォーマットはあなた次第です。

出力フォーマット

出力形式は入力と同じ形式でなければなりません。

説明+例

例としてボックス化された文字列を見てみましょう:

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

ボックスを切り替えるには、最初と最後の行と最初と最後の列を削除します。(最後の行の終わりにオプションの末尾の改行がある)最後の行の後に末尾の空白がなく、どの行にも末尾の空白がなく、改行を数えないと想定することができます。

これは次のようになります。

Hello, World!

反対に

文字列がボックスにない場合は、ボックスを追加します。これはかなり簡単です。プリペンド+---...---+を持つ独自のライン上のkダッシュkライン毎に、次に最も長い直線の長さであり、そして、最も長い直線の長さと一致した後プリペンドとパイプ文字を追加する空白末尾とパッドを("|")。最後に、+---...---+最初の行と同じ設定を含む行を追加します。

例えば:

Hello, World!

になる:

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

入力のどの行にも末尾の空白がないと想定するかもしれません。

ボックスを囲む文字列の別の例:

Hello,
    World!

なる

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

まだボックス化する必要があるものの例:

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

になる:

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

ルール+仕様

  • 標準抜け穴が適用されます
  • ボックス化されているかどうかに関係なく、入力行の全体または各行の先頭または末尾に空白はありません。
  • ボックスは+、コーナー|として、垂直エッジと-水平サイドのみを持ちます。
  • ボックスは、ボックスと見なされるように適切な場所にある必要があります。高さまたは幅が2の場合(つまり、コンテンツがない場合)は、ボックス化を解除する必要があります。これにより、ボックスの高さに応じて、一連の改行が生成されます。
  • 入力にボックスがあり、テキストがボックスの外側にある場合、全体をボックス化する必要があります。
  • プログラムは文字列の周囲全体をチェックする必要があります。外の1つの文字が正しくない場合(欠落している文字または本来あるべき文字とは異なる文字)、ボックス化するのではなくボックス化する必要があります。
  • ボックス化されていない文字列自体にが含まれる場合があります+ | -。ボックス化されていない文字列自体がボックスで囲まれている場合は、ボックス付きの文字列を返します。開梱は1度だけにしてください。

エッジケース

1:小箱

入力:

++
++

出力は空または改行です

入力:

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

出力が空または改行

入力:

++
||
||
++

出力は2つの改行または3つの改行です

2:部分的なボックス

入力:

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

出力:

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

3:ボックス外のテキスト

入力:

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

出力:

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

1
「入力された行は、ボックス化されているかどうかに関係なく、全体と各行の両方に先頭または末尾の空白がありません。」テストケースのいくつかに先行空白があります。長方形の入力は多すぎて質問できませんか?
2017

@ニール彼はおそらく一貫した先頭の空白を意味しませんでした。つまり、3つのスペースで始まる各行はケースではありませんが、1、2、0、3のスペースで始まる行は一貫していないためです。
Erik the Outgolfer 2017

、これはボックスかどうか?
user41805 2017

@Cowsquack仕様から、そうではないようです。
Erik the Outgolfer 2017

@ニール申し訳ありませんが、最初のスペースはボックスではないことを意味します。
HyperNeutrino 2017

回答:


6

JavaScript(ES2017)、199バイト

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

素朴なソリューション。最高かどうかはわかりませんが...


「最高かもしれませんが、わかります...」それでもJSなどの非ゴルフ言語を200バイト未満で解決するのはクールです。;)
Erik the Outgolfer 2017

ハハ、「今なら2ドル未満」のコマーシャルのようですね。1.99の費用がかかる場合:P
ETHproductions 2017

それは産業強盗笑と呼ばれています。
Erik the Outgolfer 2017

これはテストケースでは機能しますが、次のような場合には機能しないと思います '+--+\n|hi|\n|world|\n+----------+'。長方形ではありませんが、線を削除します。
リックヒッチコック

3

SOGL V0.12、72のバイト

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

ここでお試しください!

+7バイト(⁰I{_=}¹χ)は、要素ごとの等号が実装されていない
+1バイト()なので、入力が四角形
+1バイト(A)であることが保証されていないためです。使いやすさ、オンラインリンクが含まれている→入力ボックスを使用できるため)


⁰I{_=}¹χ+7バイトではなく+8バイトです。
Erik the Outgolfer 2017

@EriktheOutgolferよく置換が必要ですが=、これは機能しないため、長さが-1 + 8 = +7だけ変更されます
dzaima


2

Retina197 195バイト

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

オンラインでお試しください!説明:

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

この段階はそれ自体がかなり複雑なので、少し詳しく説明します。+代替が見つからなくなるまでステージが繰り返されることを意味します。m`^ステージが任意の行の先頭で一致することを意味します。((.)*)次に、行全体と一致します。これ$1は単に一致した行ですが$2、一致(文字)のリストです。次に、行の終わり、つまり次の行の始まりに一致します。(?<-2>.)*.NETバランスグループを使用します。<-2>削除し一致$2文字限りは、第二行に一致させることができます。この時点で、次の3つのいずれかが発生する可能性があります。

  • 2行目には十分な文字がありませんでした。$2まだ試合が残っています。
  • 2つの線分はまったく同じ長さでした。$2残りの試合はありません。行の終わりです。
  • 2行目が長いため、少なくとも1文字残っています。

(?(2)$|(.)))条件を使用してこれらを区別するのに役立ちます。$2まだ一致が残っている場合は、2行目が短すぎるためにこれが必要であるため、行の終わりに$2一致しますが、一致するものが残っていない場合は、2行目を長くするために一致します。キャラクター($4マッチが起こったことを知るために入る)それ以外の場合、2つの行は同じ長さであり、この時点で一致は失敗します(もちろん、後の行で再び一致する可能性があります)。

置換文字列は$1$#4$* $3$#2$*です。$#4評価された1私たちは、2行目の追加の文字にマッチしている場合0ではない場合。つまり$#4$*、2行目が長い場合、1行目にスペースが追加されます。同様に$#2$*、1行目が長い場合は2行目にスペースを追加します。(実際には、正しい数のスペースを追加することになります。2つの行のバランスをとるだけの場合は+、4番目のキャプチャグループにaを追加して、長い2番目の行の場合もこれを直接実現できます。)

このすべての結果は、このステージが入力を長方形にパディングすることです。これでボックスを描くことができます。

%`^|$
|

|両側にsを置きます。

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

上に置き+-...-+ます。

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

そして再び底に。

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

ダブルボックスを作成したかどうかを確認します。その場合、残りのステージが一致するように上部と下部に余分な空白行が追加され、両方のボックスが削除されます。

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

末尾に空白行がある場合は、すべての行の最初と最後から2文字を削除します。

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

先頭の空白行がある場合は、その行と次の2行を削除します(-ボックスの上部に残っているsになります)。末尾に空白行がある場合は、その行と前の2行を削除します。(\G|¶)唯一の6行(したがって、5がありますケースを扱っボックスはまったく内容がなかったので秒)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.