Không có thứ gì gọi là một nửa ly trống


15

Bạn có thể biết câu hỏi tu từ về việc một ly đầy một nửa hay một nửa trống . Tôi cảm thấy hơi mệt với cụm từ này, vì vậy tôi quyết định rằng đã đến lúc loại bỏ sự nhầm lẫn này về sự đầy đặn của thủy tinh hoặc sự trống rỗng theo lập trình.

Nhiệm vụ của bạn là viết một chương trình lấy biểu tượng nghệ thuật ASCII của một chiếc kính xấu xí và đưa ra một nghệ thuật ASCII của một chiếc kính đẹp tương ứng . Nó cũng có để quyết định xem cái ly full, mostly full, mostly emptyhay emptyvà đầu ra này là tốt (bất kỳ 4 liên tục, giá trị sản lượng khác nhau làm).

TL; DR

Đầu vào là một nghệ thuật ASCII của kính ( #ký tự) và chất lỏng ( a-z) được phân phối ngẫu nhiên bên trong và bên ngoài kính. Chất lỏng trong thủy tinh rơi xuống và tích tụ ở đáy của nó, chất lỏng bên ngoài nó bị loại bỏ. Xuất ra một nghệ thuật ASCII của kính sau khi chất lỏng đã lắng xuống ở phía dưới. Xác định mức độ đầy đủ của kính và đầu ra.

Kính xấu và đẹp

Một chiếc kính nói chung là một vật chứa làm từ các #ký tự có đáy, hai mặt bên và không có đỉnh.

  • Kính hợp lệ không có lỗ trong chúng. (Tất cả các #ký tự phải được kết nối.)
  • Sẽ có ít nhất hai #ký tự trong mỗi dòng của nghệ thuật ASCII đầu vào, hoặc không có ký tự nào. Sẽ không có một dòng với chính xác một #.
  • Dòng trên cùng của nghệ thuật ASCII đầu vào sẽ luôn có chính xác hai #.
  • Kính hợp lệ có chính xác một mức tối thiểu cục bộ trong bức tường #ký tự phân định của chúng . Điều này có nghĩa là chất lỏng không thể bị mắc kẹt ở đâu đó.
  • Bức tường phân định của một tấm kính sẽ không có cực đại cục bộ.
  • Sẽ không có bất kỳ #dưới đáy của kính.
  • Nội thất của kính sẽ luôn là một không gian kết nối .
  • Có thể có khoảng trắng hàng đầu / dấu và dòng mới trong đầu vào.

Ví dụ về kính hợp lệ và không hợp lệ:

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.
#  #  #
#     #
#######

Một chiếc kính xấu xí là một chiếc kính với chất lỏng chỉ nổi xung quanh bên trong nó.

  • Chất lỏng được thể hiện bằng các chữ cái viết thường a-z.
  • Sẽ không có chất lỏng trên dòng #ký tự đầu tiên . Điều này có nghĩa là không bắt buộc phải cho chất lỏng rơi vào kính.
  • Có thể có chất lỏng bên ngoài kính . Chất lỏng này sẽ bị loại bỏ khi chuyển đổi kính xấu xí thành một kính đẹp.

Ví dụ về kính xấu xí :

        # 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)

Một ly đẹp là một ly mà tất cả chất lỏng đã tích tụ ở phía dưới.

  • Từ dưới lên, bên trong của một chiếc kính đẹp bao gồm một số dòng chứa đầy các chữ cái, theo sau là nhiều nhất là một dòng không hoàn toàn chứa đầy các chữ cái, và sau đó là một số dòng trống.
  • Có thể không có bất kỳ chất lỏng bên ngoài nội thất của một chiếc kính đẹp.

Chuyển đổi một chiếc kính xấu xí thành một chiếc kính đẹp

  • Chất lỏng bên trong thủy tinh rơi xuống và tích tụ ở phía dưới.
  • Chất lỏng bên ngoài của kính bị loại bỏ.
  • Khi chuyển đổi một chiếc kính xấu xí thành một chiếc kính đẹp, các chữ cái chính xác trong nó phải được giữ nguyên. Ví dụ, nếu chiếc kính xấu xí có ba acái trong đó, chiếc kính đẹp cũng phải có ba chiếc a. (Soda không đột nhiên biến thành nước.)
  • Các chữ cái trong kính đẹp không cần phải đặt hàng.
  • Hình dạng của kính phải được bảo tồn. Không có #ký tự có thể được thêm hoặc xóa.
  • Bất kỳ số lượng khoảng trắng hàng đầu / dấu và hàng mới được cho phép.

Xác định độ đầy của kính

  • Một tấm kính là fullnếu toàn bộ không gian bên trong của nó chứa đầy các chữ cái.
  • Đó là mostly fullnếu 50% hoặc nhiều hơn không gian nội thất được lấp đầy.
  • Đó là mostly emptynếu ít hơn 50% không gian bên trong được lấp đầy.
  • Đó là emptynếu không có chữ cái trong kính.
  • Có thể có bất kỳ số lượng dòng mới và khoảng trắng bổ sung nào giữa kính nghệ thuật ASCII và đầu ra đầy đủ.
  • Chương trình có thể xuất bất kỳ giá trị riêng biệt (nhưng không đổi!) Cho 4 mức độ đầy đủ của kính, nó không phải in các chuỗi chính xác ở trên. Vui lòng chỉ định giá trị nào đại diện cho mức độ đầy đủ.

Ví dụ 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

Linh tinh

  • Đây là mã golf nên câu trả lời ngắn nhất sẽ thắng.
  • Nếu có thể, vui lòng cung cấp một liên kết đến một trình thông dịch trực tuyến có thể được sử dụng để chạy chương trình của bạn trên các đầu vào ví dụ được cung cấp, ví dụ: tio.run

1
Là những chiếc cốc hợp lệ? paste.ubfox.com/26097168
l4m2

Tôi có thể đề nghị: "Một chiếc kính hầu hết đã đầy nếu hơn 50% không gian bên trong được lấp đầy." - Nếu sau đó bạn coi chính xác 50% là đầu vào không hợp lệ (không yêu cầu các giải pháp để xử lý trường hợp này) thì thực sự không có gì gọi là "một nửa ly rỗng" (hoặc "một nửa ly đầy"), phù hợp với tiêu đề thậm chí còn tốt hơn . Không có hiệu lực bất kỳ giải pháp thực sự xử lý trường hợp này.
Anedar

1
@ l4m2 Cập nhật thử thách và hạn chế đầu vào hơn nữa. Ví dụ đầu tiên của bạn không hợp lệ, ví dụ thứ hai không hợp lệ, ví dụ thứ ba không hợp lệ.
Jonathan S.

@Anedar Mặc dù nó có thể làm cho thử thách phù hợp với tiêu đề tốt hơn, nhưng điều này sẽ lấy đi quá nhiều từ thử thách theo quan điểm của tôi và dù sao nó cũng đã có đủ đầu vào không hợp lệ. Tôi sẽ để lại 50% trường hợp ở đó.
Jonathan S.

Câu trả lời:


12

Võng mạc , 56 byte

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

 +

Hãy thử trực tuyến!

Mã hóa đầu ra là 0\n0đầy đủ, 0\n1trống rỗng, 1\n0hầu như đầy đủ và 1\n1hầu như trống rỗng (nói cách khác, bit đầu tiên biểu thị "phần lớn" và bit thứ hai chỉ "trống rỗng").

Giải trình

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

Chúng tôi bắt đầu bằng cách biến tất cả các không gian và chữ cái bên ngoài kính thành !. Điều này được thực hiện bằng cách khớp một dòng - bắt đầu từ đầu tiên #hoặc bằng cách khớp với một kết thúc dòng không chứa #và phiên âm tất cả các khoảng trắng và chữ cái trong các kết quả khớp đó.

O` |\w

Sắp xếp tất cả các không gian và chữ cái. Vì các chữ cái có điểm mã cao hơn khoảng trắng, nên điều này sắp xếp tất cả các chữ cái ở cuối, có nghĩa là ở dưới cùng của kính. Điều này cũng xảy ra để tự sắp xếp các chữ cái, nhưng thứ tự của các chữ cái trong kết quả là không liên quan.

*`!
 

Chạy khô: in kết quả của việc thay thế tất cả !bằng dấu cách, nhưng thực tế không áp dụng thay đổi này cho chuỗi làm việc. Điều này in kính đẹp.

T`#!¶

Loại bỏ tất cả #, !và linefeeds, vì vậy mà chúng ta đang duy nhất còn lại với các không gian và chữ bên trong kính (vẫn được sắp xếp).

*M` \w

Chạy khô: in số lượng khớp của một khoảng trắng theo sau là một chữ cái. Điều này sẽ tìm thấy nhiều nhất một trận đấu và chỉ khi có cả khoảng trắng và chữ cái bên trong kính, tức là kính chủ yếu (đầy / trống).

+` \w

Liên tục xóa một khoảng trắng theo sau là một chữ cái. Chữ "hủy" này và dấu cách, để chúng ta kết thúc chỉ với loại ký tự đó xuất hiện thường xuyên hơn trong kính.

 +

Đếm số lượng trận đấu của regex này, cung cấp 1nếu còn bất kỳ khoảng trống nào (nghĩa là kính đã [hầu hết] trống) và 0nếu không còn lại (tức là kính ở mức chính xác 50% trở lên và do đó [hầu hết] ).


4

C, 190 byte

Cảm ơn @ l4m2 vì đã tiết kiệm 17 byte!

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

Đầu ra 0 cho kính trống, 1 cho hầu hết trống, 2 cho hầu hết đầy đủ và 3 cho đầy đủ.

Đầu tiên các vòng lặp thông qua chuỗi đầu vào đếm không gian bên trong kính, đánh dấu các chữ cái bên trong kính và thay đổi tất cả các chữ cái thành khoảng trắng. Sau đó, các vòng lặp qua chuỗi ngược lại đặt tất cả các chữ cái trong kính ở dưới cùng của kính.

Hãy thử trực tuyến!

Chưa được kiểm soát:

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

các biến toàn cục ban đầu là 0, vì vậy không cần phải khởi động lại
l4m2

@ l4m2 Cảm ơn, nhưng các chức năng cần phải được sử dụng lại , vì vậy tôi cần khởi tạo các biến bên trong hàm. Ngoại trừ icó vẻ như, vì hàm luôn luôn để giá trị của nó là 0 ở cuối.
Steadybox

· Char * malloc (strlen (g)) · có thể char l[strlen(g)]nếu C99 cho phép, vì nó ngắn hơn và không làm rò rỉ bộ nhớ
l4m2

t = *p-35 ? t : !t-> t ^= *p==35nếu t luôn là 0 hoặc 1
l4m2

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

1

Python 2 , 342 byte

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)

Hãy thử trực tuyến!


1

Perl 5 , 197 byte

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

Hãy thử trực tuyến!

Đầu ra:

 e  empty
me  mostly empty
mf  mostly full
 f  full
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.