Wypełnij jeziora

19

Biorąc pod uwagę topografię terenu w formacie obrazu ASCII, dowiedz się, dokąd pójdą jeziora i wypełnij je. Załóż nieskończoną ilość deszczu.

przykład

Wejście

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

wynik

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

Dane wejściowe będą zawierać tylko spacje i #znaki. Każda linia będzie tej samej długości. Wyjście powinno mieć identyczny #wzór ze spacjami, w których gromadziłaby się woda wypełnionymi @znakami.

Dolny wiersz wejściowy zawsze będzie oznaczony # znakami. Na ziemi nie będzie dziur ani nawisów. Najkrótszy kod wygrywa.

Keith Randall
źródło
To wydaje się trochę łatwe. Myślę, że powinniśmy również wyświetlić liczbę jednostek jezior, @które zostały wypełnione.
mellamokb
1
@mellamokb: To byłoby mniej więcej ([char[]]"$a"-eq'@').Counttutaj. Nie za bardzo dodaj. Zgodził się jednak, że jest to trochę zbyt łatwe. Jednak nie mieści się w sferze tego, co głosowałem.
Joey
3
Powiązane z przepełnieniem stosu: Kod Golf: Bieżąca woda . Jedna z lepszych od LiraNuna, pomyślałem.
dmckee
1
Czy zatem musimy również radzić sobie z podziemnymi jaskiniami, w których może znajdować się powietrze powyżej poziomu wody, tak jak puzzle bieżącej wody? To sprawia, że ​​jest to trochę trudniejsze i myślę, że zdecydowanie powinien być przykładem użycia.
mellamokb
@dmckee: To nie było jednak takie proste.
Joey,

Odpowiedzi:

8

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

24 (27):

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

27 (30):

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

Konkuruje z lepszym z dwóch rozwiązań perla

asoundmove
źródło
#|@byłby o jeden char krótszy
TY
2
Powinieneś dodać 3 do liczby dla flagi -r. Możesz odciąć dwa od usunięcia es, a drugi od sugestii S. Mark, aby wrócić do 27.
Nabb
@Nabb dzięki, odkryłem coś z pustą etykietą
asoundmove
Próbowałem już wcześniej, ale mi się nie udało
Ming-Tang
@ Keith, dzięki za nagrodę.
asoundmove
7

Perl, 25

s/# +#/$_=$&;y| |@|;$_/ge
Ming-Tang
źródło
Dodałem liczbę znaków. Sprawdź, czy rzeczywiście jest poprawny, ponieważ może być konieczne dołączenie niektórych flag tłumacza ( -pmoże?).
Joey
Nie znam języka Perla, ale czuję jego moc :)
Ant
Właściwie potrzebuje `-pe`, aby działać na moim pudełku, więc powinny to być dodatkowe 4 znaki. Czy też się enie liczy, a zatem wymagane są tylko 3 dodatkowe znaki?
asoundmove
Nie potrzebuję e, jak wspomniałem gdzie indziej, z tych samych powodów. :)
Robert P
6

Perl (> = v5.9.5), 24 znaki

Biegnij z perl -p :

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

Wymaga to Perla 5.9.5 lub nowszego, aby skorzystać ze specjalnej ucieczki \K.

yibe
źródło
1
Tyle że jeśli Nabb ma rację, musisz policzyć `-p` jako 3 znaki, co daje w sumie 27. I tak naprawdę to . I don't know the full rules about flags, so not sure the liczy się` -pe e`.
asoundmove
Nie potrzebowałbym e, jeśli po prostu naciśniesz enter i wpisz go później lub umieścisz kod w pliku i uruchomisz. Więc -e nie jest tak naprawdę potrzebne. :)
Robert P
3

Windows PowerShell, 36 74 138

$input-replace'(?<!^ *) (?! *$)','@'
Joey
źródło
2

Siatkówka , 10 bajtów

Siatkówka jest (znacznie) nowsza od tego wyzwania. Ale to rozwiązanie jest zbyt fajne, aby go nie opublikować:

T` `@`#.*#

Wypróbuj online.

Jest to po prostu etap transliteracji, który zastępuje spacje @, ale operacja jest ograniczona do dopasowań #.*#, tj. Znaków otoczonych lądem po obu stronach.

Martin Ender
źródło
1

Ruby 1.8, 30 znaków

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

Jeśli ktoś ma pomysł, dlaczego to nie działa w Ruby 1.9 (testowane z 1.9.2p0 i 1.9.2p204), nawet jeśli dokumentacja mówi, że powinno działać , daj mi znać!

Ventero
źródło
To naprawdę dziwne, dodanie $_=$_.na początku drugiej linii sprawia, że ​​działa ona w wersji 1.9.2, więc ma to coś wspólnego Kernel.gsub. Rubinius również zawiedzie bez wyraźnego dodania $_.
Nemo157,
Zgodnie z dziennikiem NEWS 1.9.1, jądro # getc, #gsub, #sub są przestarzałe.
TY
1
Myślę, że możesz policzyć to jako 30 (27 + 3 za potrzebę posiadania -pflagi). Hash-bash i nazwa tłumacza się nie liczą.
Caleb
1

Python, 95 92 bajtów

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

05AB1E , 17 16 bajtów

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

Wypróbuj online.

Wyjaśnienie:

|            # 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
źródło
0

JavaScript, 107 bajtów

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

Nie golfowany:

var f = function(x) {
    return x.replace(/# +#/g, function(x){
        return "#" + new Array(x.length - 1).join("@") + "#";
    })
};
BobTheAwesome
źródło
Zalecam (1) opublikowanie normalnie sformatowanej wersji odpowiedzi, aby ułatwić czytanie i śledzenie oraz (2) zajrzenie do ES6 ... może zaoszczędzić wiele znaków dzięki twoim funkcjom.
SirPython
Opublikuję normalną wersję, ale nie jestem osobą typu ES6.
BobTheAwesome
@BobTheAwesome Dlaczego właśnie zaproponowałeś edycję?
Tim
O Boże, próbowałem naprawić błąd w przypadku testowym, ale mam włączone to rozszerzenie w chrome, jeśli znasz xkcd. Przepraszam za to.
BobTheAwesome
Oprócz rzeczy ES6: nie trzeba miejsca po przecinku, nie trzeba przestrzeń po drugim return, można usunąć dwa średniki, a to może być tylko function f(x)...albof=function(x)...
Zachary
0

Python, 108 106 92 bajtów

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

Pip , 15 bajtów

aR:`#.*#`_TRs'@

Pobiera dane wejściowe jako ciąg wielowierszowy za pomocą argumentu wiersza polecenia: Wypróbuj online! (Alternatywnie, określ -rnflagi i zmień pierwszy ana g, a możesz podać dane wejściowe za pośrednictwem stdin: Wypróbuj online! )

Ten sam pomysł, co odpowiedź Retina: zamień każde dopasowanie wyrażenia regularnego #.*#wynikiem transliteracji spacji do @w dopasowaniu. Pip nie może dorównać zwięzłości Retiny z powodu czystego problemu wyrażenia regularnego - ale przecież nie codziennie można związać się z Galaretką.

DLosc
źródło