Виклик про адвакадо


16

Натхненний цим . Жодне авокадо не завдало шкоди при створенні цього виклику.

Здравствуйте, у мене є виклик, мені потрібна допомога в соку з авокадо, тому мені потрібна програма, яка підкаже, як довго соковити авокадо

Дотримуйтесь цього арт-авокадо ASCII:

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

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

Шляхом жорстких експериментів над цими мистецтвами авокадо ASCII я виявив наступне:

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 місця всередині ями) 1 сік унції соку.

Виклик

З огляду на введення точно одного авокадо мистецтва 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

Спробуйте тут!

Виводить час на перше соковування advacado (повністю правильної англійської мови), а в наступному рядку кількість соку.

Пояснення

Код - Огляд

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

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


Детальні пояснення деталей для розрахунку розміру див. Нижче.

Отримання розміру адвакадо

Давайте розглянемо це:

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

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

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

Тут містяться всі пробіли в адвакадо, тому нам просто треба порахувати їх (адвакадо завжди буде опуклим, тому це працює для всіх дійсних даних). Це число все ще містить пробіли в ямі, але для розрахунку соковитої кількості нам потрібні лише пробіли у плодах без пробілів. Тож нам потрібно їх і обчислити.

Код для цього детально пояснений:

/s.sR \ .zd # .z = список усіх рядків введення

  .sR \ .z # пробіли з кожного рядка введення
 s # Об'єднайте всі рядки
/ d # Порахуйте всі пробіли

Отримання розміру ями

Це трохи складніше. Спочатку видаляємо лінії, які не сприяють розміру ями. Це робиться шляхом фільтрації всіх рядків, які мають менше 4 груп хешів (використовуючи регулярний вираз #+і рахуючи його збіги). У наведеному вище прикладі лише один рядок переживе цей процес:

  #  #--# #

Пробіли, які я тут позначив, - -це ті, що нам потрібно порахувати. Отже, ми просто знімаємо пробіли, хеші, а потім знову пробіли, що залишає нас із цим:

#  #

Там нам просто треба порахувати пробіли. Ми робимо все це для кожного рядка, який пережив процес фільтрації, підсумовуємо все, і ми робимо все. Решта - тривіальна математика.

Код для цього детально пояснений:

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

                  f .z # відфільтруйте вхід
                     l: T "# +" 4 # довжина відповідностей для регулярного виразів "# +"
                   q4 # якщо є 4 групи хешів, його піт-рядок
 м # нанесіть на карту лінії ям до ...
  / \ # Виникнення просторів у ..
   .sssd \ \ # \ # ... смугастий рядок (див. пояснення вище)
s # Підсумовуйте всі кількості пробілів у ямах


5

Сітківка , 70

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

Спробуйте в Інтернеті.


1
Данно, якщо це допоможе, але я отримав 90 байт, використовуючи $*... все ще відчуває себе справді гольфуючим ...
FryAmTheEggman

2
@FryAmTheEggman О, ви можете використовувати літерали $*_? Це мило. Мені вдалося отримати 70 байт .
випадкові

1
@randomra Так, він насправді буде використовувати будь-який "маркер", і дуже приємно! Я намагався придумати подібну схему, але я постійно зациклювався на необхідності робити додатковий аналіз, повторно використовувати fдуже розумно! Дуже погано, хоча правильним "аргументом" $*може бути лише характер, а не лексема ... можливо, інший вид заміни майбутнього? : 0
FryAmTheEggman

@randomra дуже круто - спасибі!
Digital Trauma

3

Пітон, 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
Ласкаво просимо до головоломки програмування та коду для гольфу! Якщо ви визначитеся 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.