Rellena los lagos


19

Dada la topografía de la tierra en formato de imagen ASCII, averigüe dónde irían los lagos y complételos. Suponga una cantidad infinita de lluvia.

ejemplo

entrada

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

salida

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

La entrada contendrá solo espacios y # marcas. Cada línea tendrá la misma longitud. El resultado debe ser el mismo #patrón con espacios donde el agua se acumularía llena de @marcas.

La fila de entrada inferior siempre serán todas las marcas #. No habrá agujeros ni salientes en la tierra. El código más corto gana.


Esto parece un poco fácil. Creo que también hay que tener para mostrar el número de unidades lacustres @que se llenaron en.
mellamokb

1
@mellamokb: Esto sería aproximadamente un ([char[]]"$a"-eq'@').Countaquí. No es demasiado agregar. Sin embargo, coincidió en que esto es un poco demasiado fácil. Sin embargo, no cae en el ámbito de lo que yo votaría negativamente.
Joey

3
Relacionado con Stack Overflow: Code Golf: Running Water . Una de las mejores de LiraNuna, pensé.
dmckee

1
Entonces, ¿también tenemos que manejar cavernas subterráneas, que pueden tener aire por encima del nivel del agua como el rompecabezas del Agua Corriente? Eso hace que las cosas sean un poco más desafiantes y creo que definitivamente debería ser un ejemplo de uso.
mellamokb

@dmckee: Sin embargo, esa no fue tan fácil como esta.
Joey

Respuestas:


8

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

24 (27):

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

27 (30):

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

Compite con la mejor de las dos soluciones perl


#|@sería un char más corto
USTED

2
Debe agregar 3 al recuento de la bandera -r. Sin eembargo, puede cortar dos para eliminar el s, y otro de la sugerencia de S.Mark para volver al 27.
Nabb

@Nabb, gracias, descubrí algo con la etiqueta vacía
asoundmove

Intenté sed antes, pero fallé
Ming-Tang

@Keith, gracias por el premio.
asoundmove

7

Perl, 25

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

Agregué un recuento de caracteres. Observe si es realmente correcto, ya que podría necesitar incluir algunos indicadores de intérprete ( -p¿tal vez?).
Joey

no sé el idioma perl, pero puedo sentir su poder :)
Ant's

En realidad, necesita `-pe` para funcionar en mi caja, por lo que debería haber 4 caracteres adicionales. ¿O eno cuenta y, por lo tanto, solo se requieren 3 caracteres adicionales?
asoundmove

No necesito la e, como mencioné en otra parte, por las mismas razones. :)
Robert P

6

Perl (> = v5.9.5), 24 caracteres

Correr con perl -p:

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

Esto requiere Perl 5.9.5 o posterior para usar el escape especial \K.


1
Excepto que si Nabb es correcto, debe contar `-p` como 3 caracteres, lo que lleva su total a 27. Y en realidad requiere . I don't know the full rules about flags, so not sure the recuentos` -pe e`.
asoundmove

En realidad, no necesitaría la e, si simplemente presiona enter y la escribe luego, o si coloca el código en un archivo y lo ejecuta. Entonces, no es realmente necesario. :)
Robert P

3

Windows PowerShell, 36 74 138

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

2

Retina , 10 bytes

La retina es (mucho) más nueva que este desafío. Pero esta solución es demasiado ordenada para no publicarla:

T` `@`#.*#

Pruébalo en línea.

Esta es simplemente una etapa de transliteración que reemplaza espacios con @, pero la operación está restringida a coincidencias de #.*#, es decir, personajes que están rodeados por tierra en ambos lados.


1

Ruby 1.8, 30 caracteres

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

Si alguien tiene una idea de por qué esto no funciona en Ruby 1.9 (probado con 1.9.2p0 y 1.9.2p204), a pesar de que la documentación dice que debería funcionar , ¡hágamelo saber!


Eso es realmente extraño, agregar $_=$_.al comienzo de la segunda línea hace que funcione en 1.9.2, por lo que es algo que tiene que ver Kernel.gsub. Rubinius también falla sin agregar explícitamente $_.
Nemo157

De acuerdo con 1.9.1 NEWS log, Kernel # getc, #gsub, #sub están en desuso.
USTED

1
Creo que puedes contar esto como 30 (27 + 3 por necesitar la -pbandera). El hash-bash y el nombre del intérprete no cuentan.
Caleb

1

Python, 95 92 bytes

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 bytes

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

Pruébalo en línea.

Explicación:

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

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

Sin golf:

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

Le recomiendo que (1) publique una versión con formato normal de su respuesta para que sea más fácil de leer y seguir y (2) mirar ES6 ... podría ahorrarle muchos caracteres con sus funciones.
SirPython

Publicaré una versión normal, pero no soy una persona de tipo ES6.
BobTheAwesome

@BobTheAwesome ¿Por qué acabas de sugerir esta edición?
Tim

Oh Dios mío, estaba intentando arreglar el error del caso de prueba pero tengo esta extensión habilitada en Chrome, si conoces xkcd. Lo siento por eso.
BobTheAwesome

Además de las cosas de ES6: no necesita el espacio después de la coma, no necesita el espacio después del segundo return, y puede eliminar los dos puntos y comas, y puede ser simplemente function f(x)...of=function(x)...
Zacharý 01 de

0

Python, 108 106 92 bytes

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


0

Pip , 15 bytes

aR:`#.*#`_TRs'@

Toma datos como una cadena multilínea a través del argumento de la línea de comandos: ¡ Pruébelo en línea! (Alternativamente, especifique los -rnindicadores y cambie el primero aa g, y puede dar entrada a través de stdin: ¡ Pruébelo en línea! )

La misma idea que la respuesta de Retina: reemplace cada coincidencia de la expresión regular #.*#con el resultado de transliterar el espacio @en la coincidencia. Pip no puede igualar la brevedad de Retina para un problema de expresión regular pura, pero no todos los días se puede vincular con Jelly, después de todo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.