ASCII迷路をレンダリングする


18

見て!ASCII迷路です!スー・クーザー、アメーズボールなど。

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

しかし、しかし、しかし...迷路のすべての部分がどの方向に向かっているのかを考えるのは苦痛です。レイアウトを描きたいだけで、迷路は時間をかけずにすっごくクールになります。

これを単に描くことができたら...

#############
# #     #   #
# #  ##   # #
# #  ## ### #
#       #   #
######### # #
#         # #
#############

それはとても甘いでしょう!


ルール(ルールはクールだから):

  • 文字列をアスキー迷路に変換して結果を出力するコードを記述します。
  • 空白以外の文字は壁として読み取られます。
  • 壁の各文字は、隣人に基づいてどのキャラクターを決定するか(北、南、東、西の方向のみ)。
    • 文字に非空白文字がない場合、プラス記号(+)になります。
    • 文字に垂直(南北)方向と水平(東西)方向の両方に隣接がある場合、プラス記号(+)になります。
    • 文字が垂直(南北)方向にのみ隣接している場合、パイプ記号(|)になります。
    • 文字が水平(東西)方向にのみ隣接している場合、マイナス記号(-)になります。
  • 入力は単一の文字列(改行文字で区切られた行、または文字列の配列)にすることができます。
  • 入力文字はすべて印刷可能なASCII文字になります。拡張文字セットを扱う必要はありません。
  • 古い言語を使用してください。
  • 行の前に空白がある場合、各行で同じ量にする必要があります。出力の各行の後の空白は問題ありません。
  • 最小バイト数で解決しようとします。

テストケース:

1:フレーム

入力:

##########
#        #
#        #
#        #
##########

出力:

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

2:クラシック迷路

入力:

#################
        #       #
# ##### # ##### #
#   # # #     # #
# # # # ##### # #
#   # #       # # 
### # ####### # #
#   # #    #  # # 
# ### # ## # ##
#     # ##    #  
#################

出力:

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

3:緑の卵、男。

入力:

I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!

出力:

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

4:つらら

入力:

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

出力:

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

1
緑の卵とハムの3行目で終わるべきではありません---か?
-LiefdeWen

1
混合隣人の結果はまだ不明です。つららに-sがあるのか​​、古典的な迷路+の一番下の列にs がないのかはわかりません。
ニール

1
入力をスペースで埋められた正方形(つまり行列)として受け取ることはできますか?出力に余分な空白を含めることはできますか?また、smallest number of charactersバイトではなく、本当に意味しますか?
dzaima

1
1)古典的な迷路は+1行目の真ん中にある!必要があります2)つららのはに置き換えられるべきだと思います-。これらをもう一度確認してください。
アーナウルド

1
whitespace、あなたはちょうどスペースを意味するのですか?タブをサポートする必要はありませんし、おそらく改行も変換したくないでしょう
ジョーキング

回答:


11

APL(Dyalog Unicode)57 35 バイトSBCS

–22 ngnの新しいソリューションに感謝します。

引数として文字行列をとる匿名の暗黙関数。

{⊃'+-|+'↓⍨25 4 2⊃¨⊂⍱∘⌽⍨' '≠,⍵}⌺3 3

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

{}⌺3 3 3 x 3の各近傍で、次の関数を適用します。

,⍵ ラベル(平坦化)

' '≠ 非スペースのブール

⍱∘⌽⍨ NORが反転していること(上NORも下NOも左NORも右も含まない)

5 4 2⊃¨⊂リスト全体から5 番目、4 番目、2 番目の要素を選択します。
  つまり、空の自己、垂直なし、水平なし

2⊥ base-2(バイナリ)で評価し
  ます。つまり、≥4:空の自己。3:隣人なし; 2:水平方向の隣人なし; 1:垂直なし; 0:両方あります

'+-|+'↓⍨ この文字列から多くの要素、
  つまり空のself:をドロップします。単独:+; 垂直方向の近傍のみ:|+; 水平:-|+; どちらも:+-|+

 最初の要素(
  空いている場合はスペースで埋める)、つまり空のself:を選択し ます。単独:+; 垂直方向の近傍のみ:|; 水平:-; どちらも:+


古いソリューション

引数として文字行列をとる匿名の暗黙関数。

{' +-|+'⊃⍨1⍳⍨(' '=5⊃,⍵),(∧/,⊢)∨/2 21' '≠(90 1)/,⍵}⌺3 3

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

{}⌺3 3 3 x 3の各近傍で、次の関数を適用します。

,⍵ ラベル(平坦化)

()/ 次のマスクを使用してフィルタリングします。

  9⍴0 1[0,1]長さ9に 周期的に変形します(N、W、E、Sを選択)

' '≠ 非スペースのブール

1⌽ 左に1ステップ回転します。 [W,E,S,N]

2 2⍴ 2行2列の行列に変形します。 [[W,E],[S,N]]

∨/ 行ごとのOR削減: [horizontal,vertical]

() 次の暗黙関数を適用します。

   アイデンティティ; [horizontal,vertical]

  ∧/, AND削減が先行します。 [both,horizontal,vertical]

(), 次を追加します。

  ,⍵ 近所をほぐす(平らにする)

  5⊃ 5 番目の要素(それ自体)を選択します

  ' '= スペース(空)の場合はブール値

 今、私たちは持っています [empty,both,horizontal,vertical]

1⍳⍨ 左端1のインデックス(隣人がいない場合は5を与えます)

' +-|+'⊃⍨ それを使用してシンボルを選択します

   




5

MATLAB、113 110 101バイト

function F(A)
B=A>32
c=[1 1 1]
f=@(c)conv2(B,c,'s')>1
h=f(c)
v=f(c')
char((13*h+92*v-94*(h&v)).*B+32)

入力を論理に変換し、水平および垂直に畳み込みを適用し、出力を結合して対応する文字を作成します。

PPCGの出力を詰まらせることができると言うために@Adriaanによって保存された3バイト:P

多数の@flawrコメントのおかげで9バイトが節約されました!



2

Retina 0.8.2、92バイト

\S
0
(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1
T`d`+|`\b.\b
T`d`-+

オンラインでお試しください!長方形の入力が必要です。リンクにはテストケースが含まれます。説明:

\S
0

すべての非スペースを0sに変更します。

(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1

同じ列のすぐ上または下にあるすべて0のsを探し0て、1に変更します1。sは、垂直方向の近傍を持つ場所になります0が、垂直方向の近傍はありません。

T`d`+|`\b.\b

水平方向の隣人のいないすべての数字を探します。0彼らはなるのでsが、どちらか全く垂直隣人を持っていない+のが、1彼らはなるのでsが、垂直方向の隣人を持っている|の。

T`d`-+

残りの数字には水平方向の隣人がいます。1彼らはなっても、垂直方向の隣人を持っているsは+sの一方で、0Sのみ水平隣人を持っている彼らはなるので、-S。


1

Python 3、336バイト

def g(s):
 h,j,s=' +|-+','',s.splitlines()
 s+=['']
 for n in range(len(s)):
  s[n]+=' '
  for i in range(len(s[n])-1):
   l,r,k=s[n][i-1],s[n][i+1],0
   try:u=s[n-1][i]
   except:u=' '
   try:d=s[n+1][i]
   except:d=' '
   if not s[n][i]==' ':
    k+=1
    if not u==d==' ':k+=1
    if not l==r==' ':k+=2
   j+=h[k]
  j+='\n'
 print(j)

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

エッジケースエラーに対処するには、多くのコードを使用する必要がありました。


1

C(gcc)、143バイト

char**y,*z,h,v;f(char**x){for(y=x;*y;++y)for(z=*y;*z;++z)if(*z-32){h=z[1]-32|z[-1]-32;v=y[1][z-*y]-32|y[-1][z-*y]-32;*z=h?v?43:45:(v?'|':43);}}

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

関数fは、文字列の配列をその場で変更します。配列の周囲の領域はスペースで埋める必要があります(少し制限されています)。これはほとんどのソリューションが使用している要件を完全に満たしていませんが、2つのスペースで改行を表すと言うと、ルールに準拠します(そして改行で終わる文字列の配列を取ります)。

非ゴルフ

f(char**x){
    char **y;
    for (y = x; *y; ++y) {
        char *z;
        for (z = *y; *z; ++z) {
            if (*z != ' ') {
                if (z[1] != ' ' || z[-1] != ' ') {
                    // Horizontal exists
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '+';
                    else
                        *z = '-';
                } else {
                    // Horizontal doesn't exist
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '|';
                    else
                        *z = '+';
                }
            }
        }
    }
}

これは、ポインター演算の楽しい挑戦でした。Cスタイルのポインター反復を使用すると、水平方向の近傍を取得するのは簡単ですが、垂直方向の近傍はより困難でした。幸い、yポインターはまだ(zの初期値を指している)周りにあるので、そこからインデックスを推測し、それを使用して別の行の同じ要素にアクセスできます。それはy[-1][z-*y]合理的なスタイルに直面して飛ぶので、非常に間違った書き方を感じました!


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