Isi danau

19

Mengingat topografi tanah dalam format gambar ASCII, cari tahu ke mana danau akan pergi dan mengisinya. Asumsikan jumlah hujan yang tak terbatas.

contoh

memasukkan

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

keluaran

         #               
         ##              
      #@####             
#@@@@#########           
##@@###########          
##@#############@@@####  
##@##############@@##### 
#################@#######
#########################
#########################

Input hanya akan berisi spasi dan #tanda. Setiap baris akan memiliki panjang yang sama. Outputnya harus #pola yang identik dengan ruang di mana air akan terakumulasi diisi dengan @tanda.

Baris input bawah akan selalu menjadi semua # tanda. Tidak akan ada lubang atau overhang di tanah. Kode terpendek menang.

Keith Randall
sumber
Ini sepertinya agak mudah. Saya pikir kita juga harus menampilkan jumlah unit danau @yang terisi.
mellamokb
1
@ellamokb: Ini kira-kira di ([char[]]"$a"-eq'@').Countsini. Tidak terlalu banyak menambahkan. Setuju pada hal ini menjadi agak terlalu mudah. Namun, tidak jatuh ke ranah apa yang saya turunkan.
Joey
3
Terkait dengan Stack Overflow: Code Golf: Running Water . Salah satu yang lebih baik dari LiraNuna, pikirku.
dmckee
1
Jadi apakah kita juga harus menangani gua-gua bawah tanah, yang mungkin memiliki udara di atas permukaan air seperti puzzle Running Water? Itu membuat hal-hal sedikit lebih menantang dan saya pikir harus menjadi contoh use case.
mellamokb
@ dmckee: Yang itu tidak semudah ini.
Joey

Jawaban:

8

sed -r, 27 24 (27 dengan -r)

24 (27):

:;s/(#|@) ( *#)/\1@\2/;t

27 (30):

:e;s/([#@]) ( *#)/\1@\2/;te

Bersaing dengan yang terbaik dari dua solusi perl

pindahkan
sumber
#|@akan menjadi satu char lebih pendek
ANDA
2
Anda harus menambahkan 3 ke hitungan untuk tanda -r. Anda dapat memotong dua dari menghapus es, dan satu lagi dari saran S.Mark untuk kembali ke 27.
Nabb
@Nabb terima kasih, menemukan sesuatu dengan label kosong
asoundmove
Saya mencoba sed sebelumnya, tetapi gagal
Ming-Tang
@Keith, terima kasih atas penghargaannya.
asoundmove
7

Perl, 25

s/# +#/$_=$&;y| |@|;$_/ge
Ming-Tang
sumber
Saya menambahkan jumlah karakter. Silakan lihat apakah itu benar, karena mungkin perlu menyertakan beberapa tanda penerjemah ( -pmungkin?).
Joey
saya tidak tahu bahasa perl, tetapi saya bisa merasakan kekuatannya :)
Semut
Sebenarnya perlu `-pe` untuk berfungsi di kotak saya, sehingga seharusnya menjadi tambahan 4 karakter. Atau etidakkah dihitung dan dengan demikian hanya diperlukan 3 karakter tambahan?
asoundmove
Tidak perlu e, seperti yang saya sebutkan di tempat lain, untuk alasan yang sama. :)
Robert P
6

Perl (> = v5.9.5), 24 karakter

Jalankan dengan perl -p:

1while s/#.*\K (?=\S)/@/

Ini membutuhkan Perl 5.9.5 atau lebih baru untuk menggunakan pelarian khusus \K.

yibe
sumber
1
Kecuali jika Nabb benar, Anda perlu menghitung `-p` sebagai 3 karakter, sehingga total Anda menjadi 27. Dan itu sebenarnya membutuhkan jumlah` -pe . I don't know the full rules about flags, so not sure the e`.
asoundmove
Tidak akan benar-benar membutuhkan e, jika Anda cukup tekan enter dan ketik setelahnya, atau masukkan kode dalam file dan jalankan. Jadi -e tidak benar-benar dibutuhkan. :)
Robert P
3

Windows PowerShell, 36 74 138

$input-replace'(?<!^ *) (?! *$)','@'
Joey
sumber
2

Retina , 10 byte

Retina (jauh) lebih baru dari tantangan ini. Tetapi solusi ini terlalu rapi untuk tidak mempostingnya:

T` `@`#.*#

Cobalah online.

Ini hanyalah tahap transliterasi yang menggantikan ruang dengan @, tetapi operasi terbatas pada kecocokan #.*#, yaitu karakter yang dikelilingi oleh tanah di kedua sisi.

Martin Ender
sumber
1

Ruby 1,8, 30 karakter

#!ruby -p
gsub(/# +#/){$&.tr" ","@"}

Jika ada yang tahu mengapa ini tidak berhasil di Ruby 1.9 (diuji dengan 1.9.2p0 dan 1.9.2p204), meskipun dokumentasi mengatakan itu harus bekerja , beri tahu saya!

Ventero
sumber
Itu benar-benar aneh, menambahkan $_=$_.awal baris kedua membuatnya bekerja di 1.9.2 sehingga ada hubungannya dengan Kernel.gsub. Rubinius juga gagal tanpa menambahkan secara eksplisit $_.
Nemo157
Menurut 1.9.1 NEWS log, Kernel # getc, #gsub, #sub sudah tidak digunakan lagi.
ANDA
1
Saya pikir Anda dapat menghitung ini sebagai 30 (27 + 3 karena membutuhkan -pbendera). Bash hash dan nama penerjemah tidak masuk hitungan.
Caleb
1

Python, 95 92 byte

for s in S.split('\n'):b=s.find('#');e=s.rfind('#');print s[:b]+s[b:e].replace(' ','@')+s[e:]
0b1t
sumber
1

05AB1E , 17 16 byte

|εγć?D¨ð'@:sθJJ,

Cobalah online.

Penjelasan:

|            # Take all input-lines as list
 ε           # For each line:
  γ          #  Split the line into chunks of consecutive equal characters
             #   i.e. " ##   # " → [' ','##','   ','#',' ']
   ć         #  Split into head and the rest of the list
             #   i.e. [' ','##','   ','#',' '] → ['##','   ','#',' '] and ' '
    ?        #  Print this head
   D         #  Duplicate the rest of the list
    ¨        #  Remove the last element
             #   i.e. ['##','   ','#',' '] → ['##','   ','#']
     ð'@:    #  Replace every space with a "@"
             #   i.e. ['##','   ','#'] → ['##','@@@','#']
     sθ      #  Swap so the duplicated list is at the top, and take the last item as is
             #   i.e. ['##','   ','#',' '] → ' '
         JJ  #  Join the lists and individual items in the list together to a single string
             #   i.e. ['##','@@@','#'] and ' ' → "##@@@# "
           , #  Print with trailing new-line
Kevin Cruijssen
sumber
0

Javascript, 107 byte

var f=function(x){return x.replace(/# +#/g, function(x){return "#"+new Array(x.length-1).join("@")+"#";})};

Tidak Disatukan:

var f = function(x) {
    return x.replace(/# +#/g, function(x){
        return "#" + new Array(x.length - 1).join("@") + "#";
    })
};
BobTheAwesome
sumber
Saya sarankan Anda (1) memposting versi jawaban yang biasanya diformat sehingga lebih mudah untuk membaca dan mengikuti dan (2) melihat ke ES6 ... itu bisa menghemat banyak karakter dengan fungsi Anda.
SirPython
Saya akan memposting versi normal, tapi saya bukan tipe orang ES6.
BobTheAwesome
@BobTheAwesome Mengapa Anda menyarankan suntingan ini ?
Tim
Ya ampun, saya mencoba untuk memperbaiki kesalahan test case tetapi ekstensi ini saya aktifkan di chrome, jika Anda tahu xkcd. Maaf soal itu.
BobTheAwesome
Selain hal-hal ES6: Anda tidak perlu ruang setelah koma, Anda tidak perlu ruang setelah yang kedua return, dan Anda dapat menghapus dua titik koma, dan itu bisa saja function f(x)...atauf=function(x)...
Zacharý
0

Python, 108 106 92 byte

import re
n=1
while n: S,n=re.subn('# +#',lambda m:'#'+'@'*len(m.group(0)[2:])+'#',S)
print S
0b1t
sumber
0

Pip , 15 byte

aR:`#.*#`_TRs'@

Mengambil input sebagai string multiline melalui argumen baris perintah: Cobalah online! (Bergantian, menentukan -rnbendera dan mengubah pertama auntuk g, dan Anda dapat memberikan masukan melalui stdin: Cobalah secara online )

Ide yang sama dengan jawaban Retina: ganti setiap pertandingan regex #.*#dengan hasil transliterasi ruang ke @dalam pertandingan. Pip tidak bisa menandingi ketegaran Retina untuk masalah regex murni - tapi tidak setiap hari Anda bisa mengikat dengan Jelly.

DLosc
sumber