Задача про адвакадо


16

Вдохновленный этим . Никакие авокадо не пострадали при создании этого вызова.

Здравствуйте, у меня есть проблема, мне нужна помощь, чтобы приготовить авокадо, поэтому мне нужна программа, чтобы сказать мне, как долго готовить авокадо для

Обратите внимание на этот ASCII арт авокадо:

    ###### 
   #      #
   # #### #
  #  # p# #
  ## #### #
   #      #
    ######

Этот авокадо состоит из внешней части #s (в частности, первой и последней последовательностей #s в каждой строке) и ямы (форма #s в авокадо, которая не касается внешней части авокадо).

Путем тщательных экспериментов на этих авокадо ASCII art я обнаружил следующее:

avocado juice in fluid ounces = number of spaces inside avocado but outside pit (the pit is marked with a p in the example) + 2 * number of spaces inside pit

time to juice avocado in minutes = 13 * number of spaces inside pit

Например, этот авокадо потребует 26 (2 пространства внутри ямы * 13) минуты для сока и даст 23 (19 мест внутри авокадо, но снаружи ямы + 2 * 2 места внутри ямы) жидкой унции сока.

Вызов

При условии ввода ровно одного ASCII художественного авокадо, такого как приведенный выше, который состоит только из одного #и пустого пространства , выведите количество времени в минутах, которое потребуется для приготовления сока, и количество сока, которое он произведет в любом порядке.

Вы можете предположить, что входной авокадо всегда будет иметь ровно одну яму, и и авокадо, и яма всегда будут закрыты. Яма и авокадо всегда будут связаны, и любое подмножество ямы также будет связано. Авокадо и яма всегда будут выпуклыми. Обратите внимание, что внешность авокадо может быть сколь угодно толстой.

Образцы входов и выходов

    ###### 
   #      #
   # #### #
  #  #  # # -> 26 23
  ## #### #
   #      #
    ######


   #######
  #       #
  #  ###   ##
  #  #  #   # -> 26 35
  #   ##   #
  #        #
  ##########

Это , поэтому выигрывает самый короткий код в байтах.


Возможный дубликат Вы в самой большой комнате?
Мего

3
@Mego Я разговаривал с людьми в чате, и мы решили, что это совсем другое дело из-за ямы с авокадо.
спагетто

3
Я все еще думаю, что это дурак.
Мего

1
@DigitalTrauma Исправлено.
спагетто

1
Все еще кажется довольно неясным, каков набор допустимых входных данных.
feersum

Ответы:


6

Pyth, 59 51 байт

*Ksm/.s.s.sd\ \#\ \ fq4l:T"#+"4.z13+-/s.sR\ .zdK*2K

Попробуй это здесь!

Выводит время, чтобы сначала приготовить сочный адвакадо (полностью правильный английский), а в следующей строке - количество соков.

объяснение

Код - Обзор

* Ksm / .sssd \ \ # \ \ fq4l: T "# +" 4.z13 + - / s.sR \ .zdK * 2K # .z = список всех строк ввода

                    fq4l: T "# +" 4.z # Получить пит-линии
   m / .sssd \ \ # \ \ # Сопоставить пит-строки с количеством пробелов
 Ks # Сумма количества пробелов и присвоение K
* 13 # Распечатать соковыжималку
                                     /s.sR \ .zd # Подсчитать все пустые места в advacado
                                    - K # вычесть из него размер ямы
                                   + * 2K # Сделайте остаток суммы расчета и распечатайте его


Подробные объяснения деталей расчета размеров см. Ниже.

Получение размера адвакадо

Давайте посмотрим на это:

    ###### 
   # #
   # #### #
  # # # #
  ## #### #
   # #
    ######

Сначала удаляются начальные и конечные пробелы. После этого мы заключаем все в одну строку, что приводит к следующей строке:

#######      ## #### ##  #  # ### #### ##      #######

Он содержит все пробелы в advacado, поэтому нам просто нужно их посчитать (advacado всегда будет выпуклым, поэтому это работает для всех допустимых входных данных). Это число по-прежнему содержит пробелы в яме, но для расчета количества соков нам нужны только пробелы в фрукте без пробелов. Таким образом, мы должны рассчитать их тоже.

Код для этого объяснен подробно:

/s.sR \ .zd # .z = список всех строк ввода

  .sR \ .z # убрать пробелы из каждой строки ввода
 s # Объединить все строки
/ d # Подсчитать все пробелы

Получение размера ямы

Это немного сложнее. Сначала мы удаляем линии, которые не влияют на размер ямы. Это делается путем фильтрации всех строк, которые имеют менее 4 групп хэшей (используя регулярное выражение #+и считая его совпадения). В приведенном выше примере только одна строка переживет этот процесс:

  #  #--# #

Пробелы, которые я пометил -здесь, - это те, которые нам нужно сосчитать. Таким образом, мы просто удаляем пробелы, затем хэши и снова пробелы, что оставляет нас с этим:

#  #

Там мы просто должны посчитать пробелы. Мы делаем все это для каждой строки, которая пережила процесс фильтрации, суммируем все, и все готово. Остальное - тривиальная математика.

Код для этого объяснен подробно:

sm / .sssd \ \ # \ \ fq4l: T "# +" 4.z # .z = список всех строк ввода

                  f .z # фильтрует ввод
                     l: T "# +" 4 # длина совпадений для регулярного выражения `# +`
                   q4 #, если есть 4 группы хэшей, это линия пита
 m # сопоставить линии ям с ...
  / \ # Вхождения пробелов в ..
   .sssd \ \ # \ # ... зачеркнутая линия (см. объяснение выше)
s # Суммируйте все количество пробелов в ямах


5

Сетчатка , 70

  • 25 байтов сохранено благодаря @FryAmTheEggman и @randomra
T` `i` (? <= # + # +) * (? = # + + #)
T` `f` # + #
я
13 $ * тогда и только тогда
((Я) | (е) | \ W) +
$ # 2 $ # 3

Попробуйте онлайн.


1
Не знаю, поможет ли это, но я получил 90 байт, используя $*... все еще чувствует себя действительно пригодным для игры в гольф, хотя ...
FryAmTheEggman

2
@FryAmTheEggman Ооо, вы можете использовать литералы с $*_? Это мило. Мне удалось получить 70 байтов .
рандома

1
@randomra Да, на самом деле он использует любой «токен», и это очень приятно! Я пытался придумать похожую схему, но я продолжал зацикливаться на необходимости дополнительного разбора, повторное использование fочень умно! Жаль, что правильным «аргументом» $*может быть только персонаж, а не знак ... может быть, другой вид замены на будущее? : 0
FryAmTheEggman

@randomra очень круто - спасибо!
Цифровая травма

3

Python, 141 119 байт

import sys
s=str.strip;l=len;o=i=0
for x in sys.stdin:x=s(s(x),'#');y=s(x);o+=l(x)-l(y);i+=l(s(y,'#'))
print o+2*i,13*i

1
Добро пожаловать в Программирование Пазлов и Code Golf! Если вы определите sс помощью s=str.strip, тело цикла может стать x=s(s(x),'#');y=s(x);o+=l(x)-l(y);i+=l(s(y,'#')). Кроме того, в последней строке есть нефункциональное пространство.
Деннис

ааа, я даже не знал, что ты сможешь это сделать, спасибо :)
mtp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.