Немає такого поняття, як «напівпорожній стакан»


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 рівнів наповненості скла, не потрібно надрукувати точні рядки вище. Будь ласка, вкажіть, яке значення представляє, який рівень повноти.

Приклади вводу / виводу

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 Оновлено виклик і ще більше обмежило введення даних. Перший із ваших прикладів недійсний, другий - дійсний, третій - недійсний.
Джонатан С.

@Anedar Хоча це може зробити так, щоб виклик збігався з назвою краще, це, на мій погляд, забирає занадто багато проблем, і в будь-якому випадку він вже має достатньо недійсних даних. Я залишу 50% справи там.
Джонатан С.

Відповіді:


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

С, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.