「半分空のグラス」のようなものはありません


15

グラスが半分いっぱいなのか半分空っぽなのという修辞的な質問を知っているでしょう。私はこのフレーズに少しうんざりしているので、プログラムでガラスの膨らみや空さに関するこの混乱を解消する時が来たと判断しました。

あなたの仕事は、ASCIIいガラスの ASCIIアート表現を取り、対応する素敵なガラスの ASCIIアートを出力するプログラムを書くことです。それはまた、ガラスであるかどうかを決定しなければならないfullmostly fullmostly emptyまたはempty出力これも(任意4定数、異なる出力値が何を)。

TL; DR

入力は、グラスの内側と外側にランダムに分布するグラス(#キャラクター)と液体(a-z)のASCIIアートです。ガラス内の液体は落下して底に溜まり、ガラス外の液体は廃棄されます。液体が底に落ち着いた後、グラスのASCIIアートを出力します。ガラスがどれだけいっぱいかを判断し、それも出力します。

glyい素敵なメガネ

ガラス一般的には、で作られた容器であり、#底部、両側壁なし上部と文字。

  • 有効なメガネには穴がありません。(すべての#キャラクターを接続する必要があります。)
  • #入力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行、空の行で構成されています。
  • 素敵なガラスの内部の外側に液体がないかもしれません。

いガラスを素敵なガラスに変える

  • ガラス内部の液体は落下し、底に蓄積します。
  • ガラスの外側の液体は廃棄されます。
  • ugいガラスを素敵なガラスに変換するとき、その中の正確な文字を保存する必要があります。たとえば、いガラスに3つaの記号が含まれている場合、素敵なガラスにも3つaの記号が必要です。(ソーダは突然水になりません。)
  • 素敵なグラスの中の文字を注文する必要はありません。
  • ガラスの形状を保存する必要があります。#文字を追加または削除することはできません。
  • 任意の量の先頭/末尾の空白および改行を使用できます。

ガラスの膨満感の判定

  • ガラスはfull、その内部空間全体が文字で満たされている場合です。
  • これは、あるmostly full内部空間の50%以上が満たされている場合。
  • それはだmostly empty内部空間の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

その他

  • これはコードゴルフなので、最短の答えが勝ちます。
  • 可能であれば、提供された入力例(例:tio.run)でプログラムを実行するために使用できるオンラインインタープリターへのリンクを提供してください

1
これらは有効なカップですか?paste.ubuntu.com/26097168
l4m2

「内部空間の50%以上が満たされている場合、ガラスはほとんどいっぱいです。」-正確に50%を無効な入力と見なした場合(ソリューションがこのケースを処理する必要はありません)、「半分空のグラス」(または「半分いっぱいのグラス」)のようなものはまったくなく、タイトルにさらに一致します。このケースを実際に処理するソリューションを無効にすることなく。
アネダー

1
@ l4m2チャレンジを更新し、入力をさらに制限しました。最初の例は無効、2番目の例は有効、3番目の例は無効です。
ジョナサンS.

@Anedarチャレンジをタイトルに一致させることができますが、これは私の意見ではチャレンジからあまりにも多くを奪うことになり、とにかく十分な無効な入力が既にあります。50%のケースはそのままにしておきます。
ジョナサンS.

回答:


12

網膜、56バイト

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

 +

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

出力エンコードは0\n0、フル、0\n1エンプティ、1\n0ほぼフル、1\n1ほぼエンプティです(つまり、最初のビットは「ほぼ」を示し、2番目のビットは「空」を示します)。

説明

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

ガラスの外側のすべてのスペースと文字をに変えることから始めます!。これは、最初から最初までの行を一致させるか、aを#含まない行末を一致させ、#それらの一致内のすべてのスペースと文字を音訳します。

O` |\w

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

*`!
 

ドライラン:すべて!をスペースで置換した結果を出力しますが、実際にこの変更を作業文字列に適用しないでください。これは素敵なガラスを印刷します。

T`#!¶

すべての#!および改行を破棄し、ガラス内にスペースと文字のみが残るようにします(ソートされたまま)。

*M` \w

予行演習:スペースの一致数に続いて文字を印刷します。これにより、最大で1つの一致が検出されます。これは、ガラス内にスペースと文字の両方があった場合、つまり、ガラスがほとんど(満杯/空)の場合のみです。

+` \w

スペースとそれに続く文字を繰り返し削除します。これは、文字とスペースを「キャンセル」します。その結果、ガラスの内側により頻繁に現れるタイプのキャラクターのみになります。

 +

この正規表現の一致数をカウントします。これ1は、スペースが残っている場合(つまり、ガラスが[ほとんど]空だった0場合)および残っていない場合(すなわち、ガラスがちょうど50%以上で、 )。


4

C、190バイト

17バイトを節約してくれた@ l4m2に感謝します!

i,k,t,s;f(char*g){char*p=g,l[strlen(g)];for(s=t=0;*p;*p>35&&(t?l[i++]=*p:1)?*p=32:0,~*p++&t&&++s)t^=*p==35;for(k=i;i;t&*p==32?*p=l[--i]:0)t^=*--p==35;printf("%s\n%d",g,k?k-s?k*2<s?1:2:3:0);}

空のガラスの場合は0、ほとんどが空の場合は1、ほとんどが満杯の場合は2、満杯の場合は3を出力します。

最初に、ガラス内のスペースをカウントする入力文字列をループし、ガラス内の文字をマークダウンし、すべての文字をスペースに変更します。次に、ガラスの下にあるガラスにあるすべての文字を配置して、文字列を逆方向にループします。

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

展開:

i,k,t,s;
f(char*g)
{
    char l[strlen(g)], *p=g;
    for (s=t=0; *p; *p>35&&(t?l[i++]=*p:1)?*p=32:0, ~*p++&t&&++s)
        t ^= *p==35;
    for (k=i; i; t&*p==32?*p=l[--i]:0)
        t ^= *--p==35;
    printf("%s\n%d", g, k?k-s?k*2<s?1:2:3:0);
}

グローバル変数は再初期化する必要はありませんので、initally 0です
l4m2

@ l4m2ありがとう。ただし、関数は再利用可能である必要があるため、関数内の変数を初期化する必要があります。i関数が最後に常に値を0のままにするように見えることを除いて。
Steadybox

・CHAR *のmalloc(strlen関数(G))・可能char l[strlen(g)]C99が許可されている場合、それは短いですし、メモリリークをしないよう、
l4m2

t = *p-35 ? t : !t-> t ^= *p==35tが常に0または1の場合
l4m2

&&(*p=32)-> ?*p=32:0 char l[strlen(g)],*p=g->char*p=g,l[strlen(g)]
l4m2

1

Python 2、342バイト

import re
def f(g):
 g=[l for l in g if'#'in l];s,w,l,W=zip(*[re.findall(r'([^#]*)(#+)'*2,l)[0] for l in g[:-1]]);a=sorted(''.join(l));R=len(a);r=a.count(' ');L=[]
 for x in l:L+=[''.join(a[:len(x)])];a=a[len(x):]
 for l in zip([' '*len(x)for x in s],w,L,W)+[re.sub('[^#]',' ',g[-1]),'mostly '*(0<r<R)+['full','empty'][r>R/2]]:print''.join(l)

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


1

Perl 5、197バイト

map{/#([^#]+)#/;$l.=$1;y/#/ /c}@a=grep/#/,<>;$f=length$l;$_=$l=~y/ //d/$f;$a[--$i]=~s/#( +)#/'#'.(substr$l,0,($q=length$1),"").$"x($q-$p).'#'/e while$p=length$l;say for@a;say'm'x($_!=int),$_>.5?e:f

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

出力:

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