ไม่มีสิ่งใดเหมือน "ครึ่งแก้วที่ว่างเปล่า"


15

คุณอาจจะรู้คำถามเชิงโวหารว่าแก้วเป็นครึ่งเต็มหรือครึ่งที่ว่างเปล่า ฉันเริ่มเบื่อกับคำศัพท์นี้แล้วดังนั้นฉันจึงตัดสินใจว่าถึงเวลาที่จะขจัดความสับสนเกี่ยวกับความแน่นของแก้วหรือความว่างเปล่าทางโปรแกรม

งานของคุณคือการเขียนโปรแกรมที่ใช้เวลาการแสดงศิลปะ ASCII ของแก้วที่น่าเกลียดและผลงานศิลปะ ASCII ของที่สอดคล้องแก้วที่ดี นอกจากนี้ยังมีการตัดสินใจว่าแก้วเป็นfull, mostly full, mostly emptyหรือemptyและผลผลิตนี้เช่นกัน (4 ใด ๆ คงค่าเอาท์พุทที่แตกต่างกันทำ)

TL; DR

อินพุตเป็นศิลปะ ASCII ของแก้ว ( #ตัวอักษร) และของเหลว ( a-z) กระจายแบบสุ่มภายในและภายนอกของแก้ว ของเหลวภายในกระจกหล่นลงมาและสะสมที่ด้านล่างของเหลวด้านนอกจะถูกทิ้ง เอาท์พุทศิลปะ 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% เป็นอินพุตที่ไม่ถูกต้อง (โดยไม่ต้องใช้โซลูชันเพื่อจัดการกับกรณีนี้) ไม่มีสิ่งเช่น "ครึ่งแก้วเปล่า" (หรือ "ครึ่งแก้วเต็ม") อีกต่อไปจับคู่ชื่อให้ดียิ่งขึ้น . โดยไม่ยกเลิกการแก้ไขปัญหาใด ๆ ที่จัดการกับกรณีนี้จริง
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`#!¶

ยกเลิกทั้งหมด#,!และ linefeeds เพื่อที่เราจะเหลือเพียง แต่มีช่องว่างและตัวอักษรภายในแก้ว (ยังคงเรียงลำดับ)

*M` \w

การวิ่งแบบแห้ง: พิมพ์จำนวนการจับคู่ของช่องว่างตามด้วยตัวอักษร สิ่งนี้จะพบได้มากที่สุดในการแข่งขันและถ้ามีทั้งช่องว่างและตัวอักษรในแก้วนั่นคือแก้วเป็นส่วนใหญ่ (เต็ม / ว่างเปล่า)

+` \w

ลบช่องว่างซ้ำตามด้วยตัวอักษรซ้ำแล้วซ้ำอีก ตัวอักษร "ยกเลิก" และช่องว่างนี้เพื่อให้เราจบลงด้วยตัวละครประเภทนั้นที่ปรากฏบ่อยครั้งในแก้ว

 +

นับจำนวนแมตช์ของ regex นี้ซึ่งจะให้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

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

ลองออนไลน์!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.