Tantang tentang advacado

16

Terinspirasi oleh ini . Tidak ada avokad yang terluka dalam membuat tantangan ini.

Halo Saya punya tantangan Saya butuh bantuan untuk membuat alpukat jadi saya perlu program untuk memberi tahu saya berapa lama untuk membuat alpukat untuk

Perhatikan alpukat seni ASCII ini:

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

Alpukat ini terdiri dari bagian luar #s (khusus urutan pertama dan terakhir dari #s pada setiap baris) dan lubang (bentuk #s dalam alpukat yang tidak menyentuh bagian luar alpukat).

Melalui eksperimen keras pada alpukat seni ASCII ini, saya telah menemukan yang berikut:

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

Sebagai contoh, alpukat ini akan memakan waktu 26 (2 spasi di dalam lubang * 13) menit untuk jus dan akan memberikan 23 (19 ruang di dalam alpukat tetapi di luar lubang + 2 * 2 ruang di dalam lubang) fl oz jus.

Tantangan

Diberikan input tepat satu alpukat seni ASCII seperti yang di atas yang hanya terdiri dari #dan spasi, output jumlah waktu dalam hitungan menit yang diperlukan untuk membuatnya dan jumlah jus yang akan diproduksi dalam urutan apa pun.

Anda dapat berasumsi bahwa alpukat input akan selalu memiliki tepat satu lubang dan alpukat serta lubang tersebut akan selalu tertutup. Pit dan alpukat akan selalu terhubung, dan setiap subset dari pit akan terhubung juga. Alpukat dan lubang selalu cembung. Perhatikan bahwa bagian luar alpukat mungkin sewenang-wenang tebal.

Input dan Output Sampel

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


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

Ini adalah , jadi kode terpendek dalam byte menang.

sebuah spaghetto
sumber
Kemungkinan rangkap dari Apakah Anda di kamar terbesar?
Mego
3
@Mego Saya berbicara dengan orang-orang dalam obrolan dan kami memutuskan itu cukup berbeda karena lubang alpukat.
spaghetto
3
Saya masih berpikir itu adalah penipuan.
Mego
1
@DigitalTrauma Diperbaiki.
spaghetto
1
Masih tampak tidak jelas apa set input yang valid.
feersum

Jawaban:

6

Pyth, 59 51 byte

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

Coba di sini!

Output waktu untuk juic advacado (bahasa Inggris yang benar-benar benar) pertama dan pada baris berikutnya jumlah juic.

Penjelasan

Kode - Tinjauan Umum

* Ksm / .sssd \ \ # \ \ fq4l: T "# +" 4.z13 + - / s.sR \ .zdK * 2K # .z = daftar semua jalur input

                    fq4l: T "# +" 4.z # Dapatkan pit-lines
   m / .sssd \ \ # \ \ # Memetakan pit-lines ke jumlah spasi putih
 Ks # Jumlahkan ruang pit dan tetapkan ke K
* 13 # Cetak waktu juic
                                     /s.sR \ .zd # Hitung semua spasi putih di advacado
                                    - K # Kurangi ukuran lubang dari itu
                                   + * 2K # Lakukan penghitungan jumlah sisa dan cetaklah


Penjelasan terperinci dari bagian perhitungan ukuran lihat di bawah.

Mendapatkan ukuran advacado

Mari kita lihat yang ini:

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

Pertama, spasi putih depan dan belakang dihapus. Setelah itu kami membungkus semuanya dalam satu baris, yang menghasilkan string ini:

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

Ini berisi semua spasi putih di advacado, jadi kita hanya harus menghitungnya (advacado akan selalu cembung, jadi ini berfungsi untuk semua input yang valid). Angka ini masih berisi spasi di pit, tapi untuk perhitungan jumlah juic kita hanya perlu spasi di dalam buah tanpa spasi. Jadi kita perlu menghitungnya juga.

Kode untuk itu dijelaskan secara rinci:

/s.sR \ .zd # .z = daftar semua jalur input

  .sR \ .z # menghapus spasi dari setiap saluran input
 s # Concatenate all lines
/ d # Hitung semua spasi

Mendapatkan ukuran lubang

Ini agak sulit. Pertama, kami menghapus garis yang tidak berkontribusi pada ukuran lubang. Ini dilakukan dengan memfilter semua garis yang memiliki kurang dari 4 kelompok hash (menggunakan regex #+dan menghitung kecocokannya). Dalam contoh di atas hanya satu baris yang akan bertahan proses ini:

  #  #--# #

Ruang yang saya tandai dengan -sini adalah yang perlu kita hitung. Jadi kita hanya menghapus spasi, lalu hash dan kemudian spasi lagi yang meninggalkan kita dengan ini:

#  #

Di sana kita hanya perlu menghitung spasi. Kami melakukan semua itu untuk setiap baris yang selamat dari proses penyaringan, jumlah semuanya dan kami selesai. Sisanya adalah matematika sepele.

Kode untuk itu dijelaskan secara rinci:

sm / .sssd \ \ # \ \ fq4l: T "# +" 4.z # .z = daftar semua baris input

                  f .z # memfilter input
                     l: T "# +" 4 # panjang pertandingan untuk regex `# +`
                   q4 # jika ada 4 kelompok hash, ini adalah pit line
 m # memetakan garis pit untuk ...
  / \ # Terjadinya spasi di ..
   .sssd \ \ # \ # ... garis pit yang dilucuti (lihat penjelasan di atas)
s # Jumlah semua jumlah ruang dalam lubang

Denker
sumber
5

Retina , 70

  • 25 byte disimpan berkat @FryAmTheEggman dan @randomra
T` `i` (? <= # + # +) * (? = # + + #)
T` `f` # + #
saya
13 $ * iff
((i) | (f) | \ W) +
$ # 2 $ # 3

Cobalah online.

Trauma Digital
sumber
1
Entah apakah itu akan membantu tetapi saya mendapat 90 byte menggunakan $*... masih terasa sangat golf meskipun ...
FryAmTheEggman
2
@FryAmTheEggman Ohh, Anda dapat menggunakan literal dengan $*_? Itu bagus. Saya berhasil mendapatkan 70 byte .
randomra
1
@randomra ya, itu benar-benar akan menggunakan "token", dan sangat bagus! Saya telah mencoba untuk datang dengan skema yang sama, tetapi saya terus terjebak dengan harus melakukan parsing tambahan, menggunakan kembali fsangat pintar! Sayang sekali "argumen" yang tepat $*hanya bisa berupa karakter dan bukan token ... mungkin jenis pengganti lain untuk masa depan? : 0
FryAmTheEggman
@randomra sangat keren - terima kasih!
Trauma Digital
3

Python, 141 119 byte

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
sumber
1
Selamat Datang di Programming Puzzles & Code Golf! Jika Anda mendefinisikan sdengan s=str.strip, tubuh loop bisa menjadi x=s(s(x),'#');y=s(x);o+=l(x)-l(y);i+=l(s(y,'#')). Juga, ada ruang non-fungsional di baris terakhir.
Dennis
ahh saya bahkan tidak tahu Anda bisa melakukan itu, terima kasih :)
mtp