「半分の空のガラス」というものはありません。

おそらく、ガラスが半分いっぱいになっているのか、半分空になっているのかについての修辞的な質問を知っているでしょう。私はフレーズに少し疲れているので、プログラムでガラスの充満度や空き具合に関するこの混乱を解消することにしました。

あなたの仕事は醜いガラスのASCIIアート表現を取り、それに対応する素敵なガラスのASCIIアートを出力するプログラムを書くことです。また、ガラスが
full
大半大部分空、または
(任意の4つの定数、異なる出力値があります)。

入力は、ガラスの内側と外側にランダムに配られたガラス(文字)と液体(
a-z
)のASCIIアートです。ガラスの中の液体は落下してその底部に蓄積し、その外側の液体は捨てられる。液体が底に沈んだ後、ガラスのASCIIアートを出力します。ガラスがどのくらい満たされているかを判断して出力します。

醜いと素敵な眼鏡

ガラスは、一般的に底部、2つの側壁、上部がない文字で作られたコンテナです。

  • 有効なメガネには穴がありません。 (すべての文字を接続する必要があります)。
  • 入力ASCIIアートの各行に少なくとも2つの文字が含まれているか、ないかのいずれかがあります。正確に1つのという行はありません。
  • 入力ASCIIアートの最上部の行には常に2つのがあります。
  • 有効なメガネは、文字の区切り文字に、ローカルミニマムが1つだけあります。これは、液体がどこかに閉じ込められないことを意味します。
  • ガラスの区切り壁には極大値はありません。
  • ガラス底面の下にはありません。
  • ガラスの内部は常に
  • 接続スペースになります。

  • 入力に空白と改行がある場合があります。

有効眼鏡と無効眼鏡の例:

VALID (possible input to your program):

#  # 
#  # 
#### 

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

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

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


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


INVALID (you won't get one of those as input to your program):

#  #
   #  Has a hole.
####

#      #
   #  #  This is also considered a hole.
    ##

#   #
 # #  Less than two # on a line.
  #

## #
 # #  More than two # on the first line.
 ###

   #
 # #  Less than two # on the first line.
 ###

#               #
 #     #       #  More than one local minimum.
  #   # #     #   Liquid might get trapped.
   ###   #   #
          ###

#  #
#  #
####  Interior is not a connected space.
#  #
#  #
####

#   #
#   #######
#   ###   #
#   ##   #  Has a local maximum.
#   #   #
#      #
#     #
######

#    #
#    #
#     #
 #####
 #  #    <--- # below the bottom of the glass.

#     #
#  #  #  This is also a glass with a hole. The #'s aren't all connected.
#  #  #
#     #
#######

醜いガラスは、その内部に液体が浮遊しているガラスです。

  • 液体は小文字の a-z で表されます。
  • 文字の最初の行の上には液体がありません。これは、液体がガラスに落ちるのを許す必要はないことを意味します。
  • ガラスの外に液体があります。醜いガラスを素敵なガラスに変換すると、この液体は捨てられるでしょう。

醜い眼鏡の例:

        # y    b #      i
   x   v#p  q   l#   l
  a     # a   zj # p   g
     g  #ppcg   c#
   u    #  r   n #   r
        ##########
Discard    Keep    Discard

                   <-- There will never be liquid above the glass
   #  tz  g#
    #y abc # d
 av z#ox s #  l
   c#y abth# b
   #vg y rm#   a
    ########
 e   a  b c  d     <-- Discard this as well (not within interior)

素晴らしいガラスは、すべての液体が底部に集まったガラスです。

  • 下から上に向かって、素敵なガラスの内部は、文字で完全に満たされている行の数が多く、1行には文字が完全に埋め込まれていない行が1つ、次に空の行がいくつかあります。
  • 素敵なガラスの内部に液体が入っていない可能性があります。

醜いガラスを素敵なガラスに変換する

  • ガラスの内部の液体が落下して底に溜まります。
  • ガラスの外側の液体は捨てられます。
  • 醜いガラスを素敵なガラスに変換するときは、その中の正確な文字を保存する必要があります。たとえば、醜いガラスに3つの
    a がある場合、素晴らしいガラスには3つの a が必要です。
    (ソーダは突然水に変わることはありません)
  • 素敵なガラスの中の手紙は注文する必要はありません。
  • ガラスの形状を維持する必要があります。 文字を追加したり削除したりすることはできません。
  • 空白と改行の前後に任意の量を入れることができます。

ガラス充填量の決定

  • ガラス全体が文字で満たされている場合、ガラスは full です。
  • 内部空間の50%以上が満たされている場合は、大部分は完全です。
  • 内部空間の50%未満が埋められている場合は empty です。
  • ガラスに文字がない場合はです。
  • ASCIIアートガラスとフルネス出力の間には、改行やスペースをいくつでも追加することができます。
  • プログラムは、4つのレベルのガラス充満度のために異なる(但し定数!)値を出力しますが、上の正確な文字列を出力する必要はありません。どんな値がどの充満度を表すかを指定してください。

I/Oの例

Example 1 input:

        # y    b #      i
   x   v#p  q   l#   l
  a     # a   zj # p   g
     g  #ppcg   c#
   u    #  r   n #   r
        ##########

Example 1 output:

        #        #       
        #        #    
        #        #      
        #ppcglqb #
        #yprazjnc#    
        ##########
mostly empty

Example 2 input:

   #  tz  g#
    #y abc # d
 av z#ox s #  l
   c#y abth# b
   #vg y rm#   a
    ########
 e   a  b c  d

Example 2 output:

   #       #
    #   bc #  
     #oxysa#   
    #ygabth#  
   #vgtyzrm#    
    ########
mostly full

Example 3 input:

#      #
#  g   # f
 ###ih #  d
a C#  # e
 b  ####

Example 3 output:

#      #
#      #  
 ###  g#   
    #hi#  
    ####
mostly empty

Example 4 input:

#ab# 
#cd# 
#### 

Example 4 output:

#cb# 
#da# 
#### 
full

Example 5 input:

  #        # h
   #      #
  a #    # g
   b#    #  f
 c  #    #  
     #  #  e
   d  ##

Example 5 output:

  #        #  
   #      #
    #    #  
    #    #   
    #    #  
     #  #   
      ##
empty

Example 6 input:

# b  az#
#y s ###
###### t
  l  u

Example 6 output:

#  z   #
#ybsa###
######  
mostly full

Example 7 input:

#   # g
# b #f
#  c###
#da ### i
#  e###
##### h

Example 7 output:

#   #
#   #
#   ###
#de ###
#abc###
#####
mostly empty

その他

  • This is code golf so the shortest answer
    wins.
  • If possible, please provide a link to an online
    interpreter that can be used to run your program on the provided
    example inputs, for example
  • tio.run

ベストアンサー

Retina, 56 bytes

T%` l`!`^.*?#|[^#]+$
O` |w
*`!
 
T`#!¶
*M` w
+` w

 +

Try it
online!

空の場合は 0 n1 、ほとんどがフルで 1 n0
は出力エンコーディングは 0 n0 はほとんど空です(つまり、最初のビットは
“ほとんど”を示し、2番目のビットは “空”を示します)。

説明

T%` l`!`^.*?#|[^#]+$

まず、ガラスの外のスペースと文字をに変えます。これは、最初のまで行を始めるか、を含まない行末をマッチングさせ、すべてのスペースと文字をそれらのマッチ。

O` |w

スペースと文字をすべて並べ替えます。文字はスペースよりもコードポイントが高いので、すべての文字を最後まで並べ替えます。これは、ガラスの底を意味します。これはまた、自分自身の中で文字をソートすることもありますが、結果の文字の順序は関係ありません。

*`!
 

ドライラン:すべてのをスペースで置き換えた結果を表示しますが、実際にこの文字列をこの文字列に適用するわけではありません。これは素晴らしいガラスを印刷します。

T`#!¶

すべてのと改行を破棄して、スペースと文字をガラスの内側に残します(まだソートされていません)。

*M` w

ドライラン:空白の後に文字が続く一致の数を表示します。ガラス内にスペースと文字の両方がある場合、つまりガラスはほとんど(完全/空)です。

+` w

繰り返し空白文字を続けて削除します。これは文字とスペースを「取り消す」ので、ガラスの中にもっと頻繁に現れるそのタイプの文字で終わることになります。

 +

この正規表現のマッチ回数を数えます。空白が残っている場合(つまり、ガラスがほとんど空の場合)、 0
の場合は 1 すなわち、ガラスは正確に50%以上であり、それゆえ、ほとんどが完全であった。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です