Заливаємо озера


19

З огляду на топографію земель у форматі зображення ASCII, з’ясуйте, куди йдуть озера та заповнюйте їх. Припустіть нескінченну кількість дощу.

приклад

вхід

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

вихід

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

Вхід буде містити лише пробіли та #позначки. Кожен рядок буде однакової довжини. Вихід повинен бути ідентичним #малюнком з просторами, де б накопичувалася вода, заповнена @знаками.

У нижньому вхідному рядку завжди будуть усі # позначки. У землі не буде ні дірок, ні перекриттів. Найкоротший код виграє.


Це здається трохи легким. Я думаю, нам також слід було б відобразити кількість @заповнених озерних одиниць .
mellamokb

1
@mellamokb: Це було б приблизно ([char[]]"$a"-eq'@').Countтут. Не так вже й багато. Однак, погодившись із цим, було занадто просто. Хоча це не потрапляє у сферу того, що я б сказав.
Джої

3
Пов’язані з переповненням стека: Код Golf: проточна вода . Я думав, що одна з кращих LiraNuna.
dmckee

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

@dmckee: Хоча це було не так просто, як це.
Джої

Відповіді:


8

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

24 (27):

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

27 (30):

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

Конкурує з кращими двома рішеннями Perl


#|@була б на одну чару коротша
ВИ

2
Ви повинні додати 3 до числа для прапора -r. Ви можете відрізати дві з видалення es, а іншу із пропозиції С.Марка повернутися до 27, хоча.
Набб

@Nabb дякую, виявив щось із порожньою міткою
asoundmove

Я раніше спробував sed, але не вдалося
Мінг-Тан

@Keith, дякую за нагороду
asoundmove

7

Перл, 25

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

Я додав кількість символів. Будь ласка, подивіться, чи це насправді правильно, оскільки може знадобитися включити деякі прапори інтерпретатора ( -pможливо?).
Joey

Я не знаю мови перла, але я можу відчути її силу :)
Мураха

Насправді йому потрібно `-pe`, щоб функціонувати на моїй коробці, так що це має бути додаткові 4 символи. Або eне враховується, і, отже, потрібні лише 3 додаткові символи?
asoundmove

Не потрібні е, як я вже згадував, з тих же причин. :)
Роберт П

6

1
За винятком того, що якщо Nabb правильний, вам потрібно порахувати `-p` як 3 знаки, доведення вашої загальної суми до 27. І це насправді вимагає . I don't know the full rules about flags, so not sure the підрахунку` -pe e`.
asoundmove

Насправді не потрібен е, якщо ви просто натисніть клавішу Enter і введіть її згодом або введіть код у файл і запустіть його. Тож -е насправді не потрібно. :)
Роберт П


2

Сітківка , 10 байт

Сітківка (набагато) новіша, ніж ця проблема. Але це рішення занадто охайне, щоб не публікувати його:

T` `@`#.*#

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

Це просто етап транслітерації, який замінює пробіли @, але операція обмежується відповідниками #.*#, тобто символами, які оточені землею з обох сторін.


1

Рубін 1,8, 30 символів

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

Якщо хтось має уявлення, чому це не працює в Ruby 1.9 (тестується з 1.9.2p0 та 1.9.2p204), хоча документація говорить, що це має працювати , дайте мені знати!


Це дійсно дивно, але додавання $_=$_.до початку другого рядка змушує його працювати в 1.9.2, тому це щось робити Kernel.gsub. Рубіній також провалюється без явного додавання $_.
Nemo157

Відповідно до журналу 1.9.1 NEWS, Kernel # getc, #gsub, #sub застаріло.
ВИ

1
Я думаю, ви можете порахувати це як 30 (27 + 3 за необхідність -pпрапора). Хеш-баш та ім’я перекладача не враховуються.
Калеб

1

Пітон, 95 92 байти

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 байт

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

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

Пояснення:

|            # 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 байт

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

Безголівки:

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

Я рекомендую вам (1) опублікувати нормально відформатовану версію своєї відповіді, щоб її було легше читати і слідувати за нею і (2) заглянути в ES6 ... це може заощадити багато символів з вашими функціями.
SirPython

Я опублікую звичайну версію, але я не людина типу ES6.
BobTheAwesome

@BobTheAwesome Чому ти щойно запропонував це редагування?
Тім

Боже, я намагався виправити помилку в тестовому випадку, але в мене є це розширення увімкнено в хромі, якщо ви знаєте xkcd. Вибач за це.
BobTheAwesome

Крім того, матеріал ES6: вам не потрібно пробіл після коми, вам не потрібно простір після другої return, і ви можете видалити два з коми, і це може бути просто function f(x)...чиf=function(x)...
Захарі

0

Пітон, 108 106 92 байт

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


0

Піп , 15 байт

aR:`#.*#`_TRs'@

Вводиться як багаторядковий рядок через аргумент командного рядка: Спробуйте це в Інтернеті! (По черзі вкажіть -rnпрапори та змініть перший aнаg , і ви можете надати вхід через stdin: Спробуйте в Інтернеті! )

Та сама ідея, що і у відповіді Retina: замініть кожну відповідність регулярного виразу #.*#результатом транслітерації пробілу на @матч. Піп не може зрівнятися з терміновістю Ретіни з чистою проблемою з регулярними виразками - але, зрештою, ви можете зв'язати з Джеллі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.