"반 빈 유리"와 같은 것은 없습니다


15

유리가 반쯤 채워 졌는지 반쯤 비어 있는지에 대한 수사 학적 질문을 알고있을 것입니다 . 나는 그 구절에 조금 지쳐서 글래스 충만 또는 공허에 대한이 혼란을 프로그램 적으로 제거 할 때가되었다고 결정했다.

당신의 임무는 못생긴 유리 의 ASCII 예술 표현을 취하고 해당 좋은 유리 의 ASCII 예술을 출력하는 프로그램을 작성하는 것 입니다. 또한 유리인지를 결정하는 full, mostly full, mostly empty또는 empty출력이도 (4 어떤 일정한 별개 출력값을 수행).

TL; DR

입력은 유리 내부와 외부에 무작위로 분포 된 유리 ( #문자)와 액체 ( a-z) 의 ASCII 기술입니다 . 유리 내부의 액체가 떨어져 바닥에 쌓이고 외부의 액체는 버려집니다. 액체가 바닥에 정착 한 후 유리의 ASCII 아트를 출력합니다. 유리가 얼마나 가득 차 있는지 결정하고 출력하십시오.

못생긴 멋진 안경

유리 일반이 만들어진 컨테이너 #바닥 두 측벽없고 위쪽 캐릭터.

  • 유효한 안경에는 구멍이 없습니다. (모든 #문자를 연결해야합니다.)
  • #입력 ASCII 아트의 각 줄에 두 개 이상의 문자가 있거나 없을 것입니다. 정확히 하나의 줄이 없습니다 #.
  • 입력 ASCII 아트의 맨 위 줄에는 항상 정확히 2가 #있습니다.
  • 유효한 안경은 문자의 벽면에서 정확히 하나의 로컬 최소값을 갖습니다 #. 이것은 액체가 어딘가에 갇힐 수 없음을 의미합니다.
  • 유리의 경계 벽에는 국소 최대 값이 없습니다.
  • #유리 바닥 아래에는 아무것도 없습니다 .
  • 유리의 내부는 항상 연결된 공간 입니다.
  • 입력에 선행 / 후행 공백과 줄 바꿈이있을 수 있습니다.

유효하고 유효하지 않은 안경의 예 :

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)

좋은 유리는 모든 액체가 바닥에 축적 된 유리입니다.

  • 맨 아래부터 멋진 유리의 내부는 문자로 완전히 채워진 여러 줄로 구성되고, 문자로 완전히 채워지지 않은 최대 한 줄로 구성되며 빈 줄은 여러 줄로 구성됩니다.
  • 멋진 유리 내부에는 액체가 없을 수 있습니다.

못생긴 유리를 멋진 유리로 전환

  • 유리 내부의 액체가 떨어져 바닥에 쌓입니다.
  • 유리 외부의 액체는 버려집니다.
  • 못생긴 유리를 멋진 유리로 변환 할 때 정확한 글자를 보존해야합니다. 예를 들어, 못생긴 유리에 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 %를 유효하지 않은 입력으로 간주하면 (이 경우를 처리하기위한 솔루션이 필요하지 않음) 더 이상 "반 빈 유리"(또는 "반 전체 유리")와 같은 것은 더 이상 제목과 더 잘 일치합니다. . 실제로이 경우를 처리하는 솔루션을 무효화하지 않고.
Anedar

1
@ l4m2 챌린지를 업데이트하고 입력을 더 제한했습니다. 첫 번째 예는 유효하지 않으며 두 번째 예는 유효하며 세 번째 예는 유효하지 않습니다.
Jonathan S.

@Anedar 챌린지가 타이틀과 더 잘 어울리게 만들 수 있지만, 이것은 내 의견으로는 챌린지에서 너무 많은 것을 빼앗아 가고 어쨌든 이미 유효하지 않은 입력이 충분합니다. 나는 거기에 50 % 사건을 남겨 둘 것이다.
Jonathan S.

답변:


12

레티 나 , 56 바이트

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

 +

온라인으로 사용해보십시오!

출력 인코딩은 0\n0전체, 0\n1비우기, 1\n0대부분 전체 및 1\n1비우기입니다 (즉, 첫 번째 비트는 "대부분"을 나타내고 두 번째 비트는 "빈"을 나타냄).

설명

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

유리 외부의 모든 공백과 문자를로 시작 !합니다. 이것은 처음부터 시작하는 줄 #을 일치 시키거나 일치하지 않는 #모든 공백과 문자를 포함하고 포함하지 않는 줄 끝을 일치시킴으로써 수행됩니다 .

O` |\w

모든 공백과 문자를 정렬하십시오. 문자는 공백보다 코드 포인트가 높기 때문에 모든 문자를 끝까지 정렬합니다. 즉, 유리의 맨 아래를 의미합니다. 이것은 또한 문자를 자체적으로 정렬하기 위해 발생하지만 결과의 문자 순서는 관련이 없습니다.

*`!
 

드라이 런 : !공백으로 모두 바꾼 결과를 인쇄 하지만 실제로는이 변경 사항을 작업 문자열에 적용하지 마십시오. 멋진 유리를 인쇄합니다.

T`#!¶

모두 버리고 #, !우리 만 유리 안에 공간과 문자로 남겨 그래서, 그리고 줄 바꿈을 (아직 분류).

*M` \w

드라이 런 : 공백과 일치하는 문자 수와 문자를 인쇄합니다. 이것은 최대 하나의 일치 항목을 찾을 수 있으며 유리 내부에 공백과 글자가 모두있는 경우에만 유리가 대부분 (최대 / 빈)입니다.

+` \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);
}

필요 REINIT 없습니다 때문에 글로벌 변수는 초기에는 더 0이다
l4m2

@ l4m2 고맙지 만 함수는 재사용 할 수 있어야 하므로 함수 내부의 변수를 초기화해야합니다. 제외 i보인다,이 함수는 항상 마지막에 값을 0으로 떠날 때.
Steadybox

· 문자 *의 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

파이썬 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.