あなたの仕事は醜いガラスの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
+
空の場合は 0 n1
、ほとんどがフルで 1 n0
は出力エンコーディングは 0 n0
はほとんど空です(つまり、最初のビットは
“ほとんど”を示し、2番目のビットは “空”を示します)。
説明
T%` l`!`^.*?#|[^#]+$
まず、ガラスの外のスペースと文字を!
に変えます。これは、最初の#
まで行を始めるか、#
を含まない行末をマッチングさせ、すべてのスペースと文字をそれらのマッチ。
O` |w
スペースと文字をすべて並べ替えます。文字はスペースよりもコードポイントが高いので、すべての文字を最後まで並べ替えます。これは、ガラスの底を意味します。これはまた、自分自身の中で文字をソートすることもありますが、結果の文字の順序は関係ありません。
*`!
ドライラン:すべての!
をスペースで置き換えた結果を表示しますが、実際にこの文字列をこの文字列に適用するわけではありません。これは素晴らしいガラスを印刷します。
T`#!¶
すべての#
、!
と改行を破棄して、スペースと文字をガラスの内側に残します(まだソートされていません)。
*M` w
ドライラン:空白の後に文字が続く一致の数を表示します。ガラス内にスペースと文字の両方がある場合、つまりガラスはほとんど(完全/空)です。
+` w
繰り返し空白文字を続けて削除します。これは文字とスペースを「取り消す」ので、ガラスの中にもっと頻繁に現れるそのタイプの文字で終わることになります。
+
この正規表現のマッチ回数を数えます。空白が残っている場合(つまり、ガラスがほとんど空の場合)、 0
の場合は 1
すなわち、ガラスは正確に50%以上であり、それゆえ、ほとんどが完全であった。