没有“半空杯子”之类的东西


15

您可能知道玻璃是半满还是半空的反问。我对这个词感到有些厌倦,所以我决定是时候以编程方式消除对玻璃充满或空虚的困惑了。

您的任务是编写一个程序,该程序采用 丑陋的玻璃杯并输出相应的精美玻璃杯的ASCII艺术作品。它也必须决定玻璃是否是fullmostly fullmostly emptyempty和输出这个问题,以及(4任何恒定的,不同的输出值做)。

TL; DR

输入是玻璃(#字符)和液体(a-z)在玻璃内部和外部随机分布的ASCII艺术。玻璃内的液体掉落并积聚在其底部,玻璃外的液体被丢弃。液体沉淀在底部后,输出玻璃的ASCII文字。确定玻璃杯已满并输出。

丑陋又漂亮的眼镜

通常,玻璃是由#字符制成的容器,该字符具有底部,两个侧壁且没有顶部。

  • 有效的眼镜上没有孔。(#必须连接所有字符。)
  • #输入ASCII文字的每行中至少要有两个字符,或者没有。没有一行恰好一条#
  • 输入的ASCII艺术作品的顶行将始终恰好有两个#
  • 有效的眼镜在其定界#字符壁中恰好有一个局部最小值。这意味着液体不会被困在某处。
  • 玻璃的分隔墙将没有局部最大值。
  • #玻璃底部下方不会有任何东西。
  • 玻璃的内部将始终是一个连通的空间
  • 输入中可能包含前导/后缀空格和换行符。

有效眼镜和无效眼镜的示例:

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)

一个漂亮的玻璃是所有液体已经积累在底部的玻璃。

  • 从下至上,一个漂亮的玻璃杯的内部由多条完全用字母填充的行组成,然后是由多条没有完全由字母填充的行组成,然后是几行是空的。
  • 好的玻璃杯内部可能没有任何液体。

将丑陋的玻璃杯变成漂亮的玻璃杯

  • 玻璃内部的液体下落并积聚在底部。
  • 玻璃外的液体被丢弃。
  • 将丑陋的玻璃杯变成漂亮的玻璃杯时,必须保留其中的确切字母。例如,如果丑陋的杯子里面有三个a,那么漂亮的杯子就必须有三个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更新了质询并进一步限制了输入。您的第一个示例无效,第二个示例有效,第三个无效。
Jonathan S.

@Anedar虽然它可以使挑战与标题更好地匹配,但在我看来,这将与挑战相去甚远,并且无论如何它已经具有足够的无效输入。我将把50%的箱子留在那里。
Jonathan S.

Answers:


12

视网膜,56字节

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

 +

在线尝试!

输出编码是0\n0完整的,0\n1空的,1\n0几乎完整的和1\n1几乎空的(换句话说,第一位指示“大部分”,第二位指示“空”)。

说明

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

我们首先将玻璃外面的所有空格和字母都变成!。这是通过匹配从头到第#一个的行或匹配不包含a的行尾#并音译匹配中的所有空格和字母来完成的。

O` |\w

对所有空格和字母进行排序。由于字母的代码点比空格高,因此将所有字母排序到末尾,也就是玻璃的底部。这也发生在它们之间的字母排序上,但是结果中字母的顺序无关紧要。

*`!
 

空运行:打印!用空格替换所有内容的结果,但实际上不要将此更改应用于工作字符串。这样可以打印漂亮的玻璃杯。

T`#!¶

放弃所有#!并换行,让我们只剩下玻璃内部的空间和字母(仍然排序)。

*M` \w

空运行:打印空格的匹配数,然后加上字母。这将最多找到一个匹配项,并且只有在玻璃杯中同时存在空格和字母的情况下,即玻璃杯大部分(满/空)。

+` \w

反复删除一个空格,后跟一个字母。这样可以“取消”字母和空格,从而使我们最终只能获得在玻璃杯中更常出现的那种字符。

 +

计算此正则表达式的匹配项数量,它给出1是否剩余空间(即玻璃杯[大部分]是空的)和0是否剩余空间(即玻璃杯正好在50%或更多,因此[大部分]已满) )。


4

C,190字节

感谢@ l4m2节省了17个字节!

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);
}

全局变量最初为0,因此无需重新
初始化

@ l4m2谢谢,但是函数需要可重用,所以我需要初始化函数内部的变量。除非i看起来如此,否则该函数最后总是将其值保留为0。
Steadybox

·char * malloc(strlen(g))· char l[strlen(g)]如果允许C99,则可以使用,因为它更短并且不会造成内存泄漏
l4m2

t = *p-35 ? t : !t-> t ^= *p==35如果t始终为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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.