Wyzwanie dotyczące advacado

16

Zainspirowany tym . Przy podejmowaniu tego wyzwania nie ucierpiały żadne awokado.

Cześć, mam wyzwanie. Potrzebuję pomocy w przygotowaniu awokado, więc potrzebuję programu, który powie mi, jak długo powinienem produkować awokado

Obserwuj awokado sztuki ASCII:

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

To awokado składa się z części zewnętrznej #s (konkretnie pierwszej i ostatniej sekwencji #s w każdej linii) i dołu (kształt #s w awokado, który nie dotyka zewnętrznej części awokado).

Poprzez rygorystyczne eksperymenty na tych awokado sztuki ASCII odkryłem, co następuje:

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

Na przykład, to awokado zajmie 26 (2 miejsca w jamie * 13) minut na sok i da 23 (19 miejsc w awokado, ale poza jamą + 2 * 2 miejsca w jamie) fl oz soku.

Wyzwanie

Biorąc pod uwagę dokładnie jedno awokado sztuki ASCII, takie jak powyższe, które składa się tylko z #białych znaków, wypisz ilość czasu w minutach, jaką zajmie jego wyciśnięcie, i ilość soku, który wyprodukuje w dowolnej kolejności.

Możesz założyć, że awokado wejściowe zawsze będzie miało dokładnie jeden dół, a zarówno awokado, jak i dół będą zawsze zamknięte. Pit i awokado będą zawsze połączone, a także dowolny podzbiór pitów. Awokado i dół zawsze będą wypukłe. Pamiętaj, że zewnętrzna część awokado może być dowolnie gruba.

Przykładowe wejścia i wyjścia

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


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

To jest , więc wygrywa najkrótszy kod w bajtach.

spaghetto
źródło
Możliwy duplikat Czy jesteś w największym pokoju?
Mego
3
@Mego Rozmawiałem z ludźmi na czacie i zdecydowaliśmy, że jest wystarczająco inny z powodu awokado.
spaghetto
3
Nadal uważam, że to dupek.
Mego
1
@DigitalTrauma Naprawiono.
spaghetto
1
Nadal wydaje się niejasne, jaki jest zestaw prawidłowych danych wejściowych.
feersum

Odpowiedzi:

6

Pyth, 59 51 bajtów

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

Wypróbuj tutaj!

Zwraca najpierw czas na wyciskanie advacado (całkowicie poprawny angielski), aw następnym wierszu ilość soku.

Wyjaśnienie

Kod - przegląd

* Ksm / .sssd \ \ # \ \ fq4l: T "# +" 4.z13 + - / s.sR \ .zdK * 2K # .z = lista wszystkich linii wejściowych

                    fq4l: T "# +" 4.z # Uzyskaj linie pit
   m / .sssd \ \ # \ \ # Odwzoruj pit-linie na ilość białych znaków
 Ks # Zsumuj ilość miejsc do spania i przypisz do K
* 13 # Wydrukuj czas soku
                                     /s.sR \ .zd # Policz wszystkie białe spacje w advacado
                                    - K # Odejmij od niego rozmiar dołu
                                   + * 2K # Wykonaj resztę obliczeń i wydrukuj ją


Szczegółowe objaśnienia części do obliczania rozmiaru patrz poniżej.

Uzyskanie rozmiaru advacado

Spójrzmy na to:

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

Najpierw usuwane są wiodące i końcowe białe spacje. Następnie zawijamy wszystko w jednym wierszu, co daje następujący ciąg:

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

Zawiera wszystkie białe spacje w advacado, więc musimy je policzyć (advacado zawsze będzie wypukłe, więc działa to na wszystkie prawidłowe dane wejściowe). Ta liczba nadal zawiera spacje w jamie, ale do obliczenia kwoty soku potrzebujemy tylko spacji w owocu bez pit-spacji. Dlatego też musimy je obliczyć.

Kod tego szczegółowo wyjaśniono:

/s.sR \ .zd # .z = lista wszystkich linii wejściowych

  .sR \ .z # usuwa spacje z każdego wiersza wprowadzania
 s # Połącz wszystkie linie
/ d # Policz wszystkie spacje

Uzyskiwanie rozmiaru dołu

To trochę trudniejsze. Najpierw usuwamy linie, które nie wpływają na rozmiar dołu. Odbywa się to poprzez odfiltrowanie wszystkich linii, które mają mniej niż 4 grupy skrótów (za pomocą wyrażenia regularnego #+i zliczania dopasowań). W powyższym przykładzie tylko jedna linia przetrwa ten proces:

  #  #--# #

Miejsca, które zaznaczyłem -tutaj, to te, które musimy policzyć. Więc po prostu usuwamy spacje, następnie hasze, a następnie spacje, co pozostawia nam to:

#  #

Tam musimy tylko policzyć spacje. Robimy to wszystko dla każdej linii, która przetrwała proces filtrowania, podsumowując wszystko i gotowe. Reszta to banalna matematyka.

Kod tego szczegółowo wyjaśniono:

sm / .sssd \ \ # \ \ fq4l: T "# +" 4.z # .z = lista wszystkich linii wejściowych

                  f .z # filtruj dane wejściowe
                     l: T "# +" 4 # długość dopasowań dla wyrażenia regularnego `# +`
                   q4 # jeśli są 4 grupy skrótów, jest to linia pit
 m # mapuj linie pit do ...
  / \ # Występowanie spacji w ..
   .sssd \ \ # \ # ... okrojona linia pit (patrz wyjaśnienie powyżej)
s # Suma wszystkich ilości spacji w dołach

Denker
źródło
5

Retina , 70

  • 25 bajtów zaoszczędzonych dzięki @FryAmTheEggman i @randomra
T`` i` (? <= # + # +) * (? = # + + #)
T`` f` # + #
ja
13 $ * iff
((i) | (f) | \ W) +
2 USD 3 USD

Wypróbuj online.

Cyfrowa trauma
źródło
1
Nie wiem, czy to pomoże, ale mam 90 bajtów przy użyciu $*... nadal czuję się naprawdę dobrze gra w golfa ...
FryAmTheEggman
2
@FryAmTheEggman Ohh, możesz używać literałów z $*_? To miłe. Udało mi się uzyskać 70 bajtów .
randomra
1
@ randomra tak, faktycznie użyje dowolnego „tokena” i jest bardzo fajny! Próbowałem wymyślić podobny schemat, ale utknąłem przy konieczności dodatkowego analizowania, ponowne użycie fjest bardzo sprytne! Szkoda, że ​​właściwym „argumentem” $*może być tylko postać, a nie token ... może inny rodzaj zamiany na przyszłość? : 0
FryAmTheEggman
@randomra bardzo fajne - dzięki!
Cyfrowa trauma
3

Pyton, 141 119 bajtów

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
mtp
źródło
1
Witamy w Programowaniu Puzzle i Code Golf! Jeśli zdefiniujesz za spomocą s=str.strip, ciało pętli może się stać x=s(s(x),'#');y=s(x);o+=l(x)-l(y);i+=l(s(y,'#')). Ponadto w ostatnim wierszu znajduje się niefunkcjonalne miejsce.
Dennis
ahh nawet nie wiedziałem, że możesz to zrobić, dzięki :)
mtp