Điền vào hồ


19

Với địa hình của đất ở định dạng hình ảnh ASCII, hãy tìm ra nơi các hồ sẽ đi và lấp chúng vào. Giả sử lượng mưa vô hạn.

thí dụ

đầu vào

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

đầu ra

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

Đầu vào sẽ chỉ chứa khoảng trắng và #dấu. Mỗi dòng sẽ có cùng độ dài. Đầu ra phải là #mô hình giống hệt nhau với các không gian nơi nước sẽ tích tụ đầy @dấu.

Hàng đầu vào phía dưới sẽ luôn là tất cả các dấu #. Sẽ không có lỗ hoặc nhô ra trong đất. Mã ngắn nhất sẽ thắng.


Điều này có vẻ hơi dễ dàng. Tôi nghĩ rằng chúng ta cũng phải hiển thị số lượng đơn vị hồ @đã được điền vào.
mellamokb

1
@mellamokb: Đây sẽ là khoảng một ([char[]]"$a"-eq'@').Countở đây. Không có quá nhiều thêm. Đồng ý rằng điều này là một chút quá dễ dàng, mặc dù. Mặc dù vậy, không rơi vào vương quốc của những gì tôi downvote.
Joey

3
Liên quan đến Stack Overflow: Code Golf: Running Water . Một trong những điều tốt hơn của LiraNuna, tôi nghĩ.
dmckee

1
Vì vậy, chúng ta cũng phải xử lý hang động ngầm, có thể có không khí trên mực nước như câu đố Running Water? Điều đó làm cho mọi thứ khó khăn hơn một chút và tôi nghĩ chắc chắn nên là một trường hợp sử dụng ví dụ.
mellamokb

@dmckee: Điều đó không dễ như thế này.
Joey

Câu trả lời:


8

sed -r, 27 24 (27 với -r)

24 (27):

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

27 (30):

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

Soạn thảo với hai giải pháp perl tốt hơn


#|@sẽ là một char ngắn hơn
BẠN

2
Bạn nên thêm 3 vào số đếm cho cờ -r. Bạn có thể cắt bỏ hai từ loại bỏ es và một cái khác từ đề xuất của S.Mark để quay lại 27 mặc dù.
Nabb

@Nabb cảm ơn, đã phát hiện ra một cái gì đó với nhãn trống
asoundmove

Tôi đã thử sed trước đó, nhưng không thành công
Ming-Tang

@Keith, cảm ơn vì giải thưởng.
asoundmove

7

Perl, 25

s/# +#/$_=$&;y| |@|;$_/ge

Tôi đã thêm một số lượng nhân vật. Vui lòng xem liệu nó có thực sự chính xác không, vì có thể cần bao gồm một số cờ thông dịch viên ( -pcó thể?).
Joey

Tôi không biết ngôn ngữ perl, nhưng tôi có thể cảm nhận được sức mạnh của nó :)
Ant's

Trên thực tế, nó cần `-pe` để hoạt động trên hộp của tôi, vì vậy đó phải là thêm 4 ký tự. Hoặc ekhông được tính và do đó chỉ cần thêm 3 ký tự?
asoundmove

Đừng cần e, như tôi đã đề cập ở nơi khác, vì những lý do tương tự. :)
Robert P

6

Perl (> = v5.9.5), 24 ký tự

Chạy với perl -p:

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

Điều này đòi hỏi Perl 5.9.5 trở lên để sử dụng lối thoát đặc biệt \K.


1
Ngoại trừ việc nếu Nabb đúng, bạn cần tính `-p` là 3 ký tự, nâng tổng số của bạn lên 27. Và nó thực sự đòi . I don't know the full rules about flags, so not sure the hỏi` -pe e`.
asoundmove

Sẽ không thực sự cần e, nếu bạn chỉ cần nhấn enter và nhập mã sau đó, hoặc đặt mã vào một tệp và chạy nó. Vì vậy - không thực sự cần thiết. :)
Robert P

3

Windows PowerShell, 36 74 138

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

2

Võng mạc , 10 byte

Retina là (nhiều) mới hơn so với thách thức này. Nhưng giải pháp này quá gọn gàng để không đăng nó:

T` `@`#.*#

Hãy thử trực tuyến.

Đây chỉ đơn giản là một giai đoạn chuyển ngữ thay thế các khoảng trắng @, nhưng thao tác bị giới hạn ở các kết quả khớp #.*#, tức là các ký tự được bao quanh bởi đất ở cả hai bên.


1

Ruby 1.8, 30 ký tự

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

Nếu bất cứ ai có ý tưởng tại sao điều này không hoạt động trong Ruby 1.9 (được thử nghiệm với 1.9.2p0 và 1.9.2p204), mặc dù tài liệu nói rằng nó sẽ hoạt động , hãy cho tôi biết!


Điều đó thực sự kỳ lạ, việc thêm vào $_=$_.đầu dòng thứ hai làm cho nó hoạt động trong 1.9.2 vì vậy đó là điều cần làm Kernel.gsub. Rubinius cũng thất bại mà không thêm rõ ràng $_.
Nemo157

Theo nhật ký TIN TỨC 1.9.1, Kernel # getc, #gsub, #sub không được dùng nữa.
BẠN NGÀY

1
Tôi nghĩ bạn có thể tính số này là 30 (27 + 3 khi cần -pcờ). Hàm băm và tên của trình thông dịch không được tính.
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:]

1

05AB1E , 17 16 byte

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

Hãy thử trực tuyến.

Giải trình:

|            # 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

0

Javascript, 107 byte

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

Ung dung:

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

Tôi khuyên bạn (1) đăng một phiên bản được định dạng bình thường cho câu trả lời của bạn để dễ đọc và làm theo hơn và (2) xem xét ES6 ... nó có thể giúp bạn tiết kiệm rất nhiều ký tự với các chức năng của mình.
SirPython

Tôi sẽ đăng một phiên bản bình thường, nhưng tôi không phải là người kiểu ES6.
BobTheAwgie

@BobTheAwgie Tại sao bạn chỉ đề xuất chỉnh sửa này ?
Tim

Ôi trời, tôi đã cố sửa lỗi test-case nhưng tôi có cái này bật tiện ích mở rộng trong chrome, nếu bạn biết xkcd. Xin lỗi vì điều đó.
BobTheAwgie

Ngoài nội dung ES6: bạn không cần khoảng trắng sau dấu phẩy, bạn không cần khoảng trống sau lần thứ hai return , và bạn có thể xóa hai dấu chấm phẩy, và nó chỉ có thể function f(x)...hoặcf=function(x)...
Zachary

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


0

Đường ống , 15 byte

aR:`#.*#`_TRs'@

Đưa đầu vào dưới dạng một chuỗi nhiều dòng thông qua đối số dòng lệnh: Hãy thử trực tuyến! (Cách khác, chỉ định các -rncờ và thay đổi đầu tiên athành gvà bạn có thể cung cấp đầu vào qua stdin: Hãy thử trực tuyến! )

Ý tưởng tương tự như câu trả lời của Retina: thay thế mọi trận đấu của biểu thức chính quy #.*#bằng kết quả chuyển từ không gian thành @trong trận đấu. Pip không thể phù hợp với sự căng thẳng của Retina cho một vấn đề regex thuần túy - nhưng rốt cuộc, không phải hàng ngày bạn có thể ràng buộc với Jelly.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.