“Yarı boş bardak” diye bir şey yoktur.


15

Muhtemelen bir bardağın yarı dolu ya da yarı boş olup olmadığı konusundaki retorik soruyu biliyorsunuzdur . İfadeden biraz yoruldum, bu yüzden cam dolgunluğu veya boşluğu hakkındaki bu karışıklığı programsal olarak ortadan kaldırmanın zamanı geldiğine karar verdim.

Göreviniz, çirkin bir camın ASCII sanat temsilini alan ve karşılık gelen güzel bir camın ASCII sanatını çıkaran bir program yazmaktır . Bu aynı zamanda, cam olup olmadığına karar vermek sahiptir full, mostly full, mostly emptyya da emptyve çıkış da (bir 4 sabit, ayrı çıkış değerleri do).

TL; DR

Girdi, camın içine ve dışına rastgele dağıtılmış bir cam ( #karakter) ve sıvı ( a-z) ASCII sanatıdır . Cam içindeki sıvı düşer ve dibinde birikir, dışındaki sıvı atılır. Sıvı dibe çöktükten sonra camın ASCII sanatını çıkartın. Camın ne kadar dolu olduğunu belirleyin ve çıktısını alın.

Çirkin ve güzel gözlükler

Bir cam genel olarak yapılmış bir kap olup #, bir taban, iki yan duvar ve bir üst karakter.

  • Geçerli gözlüklerin içinde delik yoktur. (Tüm #karakterlerin bağlı olması gerekir.)
  • #Giriş ASCII resminin her satırında en az iki karakter olacaktır veya hiçbiri olmayacaktır . Tam olarak bir tane ile bir çizgi olmayacak #.
  • Giriş ASCII sanatının en üst satırında her zaman tam iki tane olacaktır #.
  • Geçerli gözlüklerin sınırlayıcı #karakter duvarlarında tam bir yerel minimum değeri vardır . Bu, sıvının bir yere hapsolmayacağı anlamına gelir.
  • Bir camın sınırlayıcı duvarının yerel maksimumu olmayacaktır.
  • #Camın altında herhangi bir şey olmayacak .
  • Camın içi her zaman bağlantılı bir alan olacaktır .
  • Girdide öndeki / sondaki boşluk ve yeni satırlar olabilir.

Geçerli ve geçersiz gözlük örnekleri:

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

Bir çirkin cam sadece kendi iç etrafında yüzen sıvı olan bir camdır.

  • Sıvı küçük harflerle gösterilir a-z.
  • İlk #karakter satırının üzerinde sıvı olmayacak . Bu, sıvının cama düşmesine izin verilmesi gerekmediği anlamına gelir.
  • Camın dışında sıvı olabilir . Bu sıvı çirkin camı güzel bir bardağa dönüştürürken atılır.

Çirkin gözlük örnekleri :

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

Bir güzel cam tüm sıvı dibinde biriken bir camdır.

  • Aşağıdan yukarıya doğru, güzel bir camın içi tamamen harflerle dolu bir dizi çizgiden oluşur, ardından harflerle tamamen dolu olmayan en fazla bir satır ve ardından boş olan birkaç satırdan oluşur.
  • Güzel bir camın dışında herhangi bir sıvı olmayabilir.

Çirkin bir camın güzel bir cama dönüşümü

  • Camın içindeki sıvı düşer ve altta birikir.
  • Camın dışındaki sıvı atılır.
  • Çirkin bir bardağı güzel bir bardağa dönüştürürken, içindeki kesin harfler korunmalıdır. Örneğin, çirkin camın içinde üç tane avarsa, güzel camın da üç tane olması gerekir a. (Soda aniden suya dönüşmez.)
  • Güzel cam içindeki harflerin sipariş edilmesi gerekmez.
  • Camın şekli korunmalıdır. Hiçbir #karakter eklenemez veya kaldırılamaz.
  • Herhangi bir miktarda önde gelen / sondaki boşluk ve yeni satırlara izin verilir.

Cam dolgunluğunun belirlenmesi

  • fullTüm iç alanı harflerle dolu ise bir camdır .
  • Bu bir mostly fulliç boşluk 50% ya da daha fazla dolu olması halinde.
  • Bu var mostly emptyiç mekan% 50'den az dolu ise.
  • Bu var emptycamda hiçbir harfler varsa.
  • ASCII cam sanatı ile doluluk çıkışı arasında herhangi bir sayıda ilave satır ve boşluk olabilir.
  • Program 4 cam doluluk seviyesi için farklı (ancak sabit!) Değerler verebilir, yukarıdaki kesin dizeleri yazdırmak zorunda değildir. Lütfen hangi değerin hangi doluluk seviyesini temsil ettiğini belirtin.

I / O örnekleri

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

Çeşitli

  • Bu kod golf yani kısa cevap kazanır.
  • Mümkünse, lütfen sağlanan örnek girişlerde programınızı çalıştırmak için kullanılabilecek bir çevrimiçi tercümana bağlantı verin, örneğin tio.run

1
Bunlar geçerli bardaklar mı? paste.ubuntu.com/26097168
l4m2

Önerebilir miyim: "İç mekanın% 50'sinden fazlası doluysa bir bardak çoğunlukla dolu." - Daha sonra tam olarak% 50'yi geçersiz giriş olarak görüyorsanız (bu davayı ele almak için çözümlere ihtiyaç duymadan), "yarı boş cam" (veya "yarım dolu cam") gibi bir şey artık yoktur, başlığı daha da iyi eşleştiriyor . Bu davayı ele alan herhangi bir çözümü geçersiz kılmadan.
Anedar

1
@ l4m2 Meydan okumayı güncelledi ve girişi daha da kısıtladı. İlk örnekleriniz geçersiz, ikincisi geçerli, üçüncüsü geçersiz.
Jonathan S.

@Anedar Zorluğun başlıkla daha iyi eşleşmesine rağmen, bu bence meydan okumadan çok fazla şey alacak ve zaten yeterince geçersiz girdiye sahip. % 50 davayı orada bırakacağım.
Jonathan S.

Yanıtlar:


12

Retina , 56 bayt

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

 +

Çevrimiçi deneyin!

Çıkış kodlaması 0\n0dolu, 0\n1boş, 1\n0çoğunlukla dolu ve 1\n1çoğunlukla boş içindir (diğer bir deyişle, ilk bit "çoğunlukla" ve ikinci bit "boş" anlamına gelir).

açıklama

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

Cam dışındaki tüm boşlukları ve harfleri dönüştürerek başlıyoruz !. Bu, ya bir satır başlangıcından ilk satıra kadar ya da a #içermeyen bir satır sonunu eşleştirerek #ve bu eşleşmelerdeki tüm boşlukları ve harfleri çevirerek yapılır.

O` |\w

Tüm boşlukları ve harfleri sıralayın. Harfler boşluklardan daha yüksek kod noktalarına sahip olduğu için, tüm harfler sonuna kadar, yani camın altına doğru sıralanır. Bu, harfleri kendi aralarında sıralamak için de olur, ancak sonuçtaki harflerin sırası önemsizdir.

*`!
 

Kuru çalışma: tümünü !boşluklarla değiştirmenin sonucunu yazdırın , ancak aslında bu değişikliği çalışma dizesine uygulamayın. Bu güzel camı basar.

T`#!¶

Tüm atın #, !biz sadece camın içindeki boşluklar ve harfler ile sol böylece, ve linefeeds (hala sıralı).

*M` \w

Kuru çalışma: bir boşluğun eşleşme sayısını ve ardından bir harfi yazdırmanızı sağlar. Bu, en fazla bir eşleşme bulacaktır ve yalnızca camın içinde hem boşluk hem de harf varsa, yani cam çoğunlukla (dolu / boş).

+` \w

Bir boşluk ve ardından bir harfi tekrar tekrar kaldırın. Bu, harfleri ve boşlukları "iptal eder", böylece yalnızca camın içinde daha sık görünen karakter türünü elde ederiz.

 +

Kalan 1boşluk varsa (yani cam [çoğunlukla] boşsa) ve 0sol olmayansa (yani cam tam olarak% 50 veya daha fazla ve bu nedenle [çoğunlukla] dolu ise , bu normal ifadenin eşleşme sayısını sayın ).


4

C, 190 bayt

17 bayt kazandığı için @ l4m2'ye teşekkürler!

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

Boş bardak için 0, çoğunlukla boş için 1, çoğunlukla dolu için 2 ve dolu için 3 çıktı.

İlk olarak camın içindeki boşluğu sayan, camın içindeki harfleri işaretleyen ve tüm harfleri boşluklara çeviren giriş dizgisi boyunca ilerler. Daha sonra, camın altındaki tüm harfleri camın alt kısmına yerleştirerek dizeden geriye doğru döner.

Çevrimiçi deneyin!

unrolled:

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

global değişkenler başlangıçta 0'dır, bu yüzden yeniden başlatmaya gerek yoktur
l4m2 18

@ l4m2 Teşekkürler, ancak işlevlerin yeniden kullanılabilir olması gerekir , bu nedenle işlev içindeki değişkenleri başlatmanız gerekir. Ancak i, işlev her zaman değerini sonunda 0'da bıraktığı için görünüyor.
Steadybox

· Char * malloc (strlen (g)) · char l[strlen(g)]
C99'a

t = *p-35 ? t : !t-> t ^= *p==35t her zaman 0 veya 1 ise
l4m2

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

1

Python 2 , 342 bayt

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)

Çevrimiçi deneyin!


1

Perl 5 , 197 bayt

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

Çevrimiçi deneyin!

Çıktılar:

 e  empty
me  mostly empty
mf  mostly full
 f  full
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.