Riempi i laghi


19

Data la topografia della terra in formato immagine ASCII, scopri dove andrebbero i laghi e riempili. Supponi una quantità infinita di pioggia.

esempio

ingresso

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

produzione

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

L'input conterrà solo spazi e #segni. Ogni riga avrà la stessa lunghezza. L'output dovrebbe essere lo stesso #modello con spazi in cui si accumulerebbe l'acqua riempito con @segni.

La riga di input in basso avrà sempre tutti i segni #. Non ci saranno buchi o sporgenze nella terra. Il codice più corto vince.


Questo sembra un po 'facile. Penso che dovremmo anche visualizzare il numero di unità lacustri @che sono state compilate.
mellamokb,

1
@mellamokb: questo sarebbe più o meno ([char[]]"$a"-eq'@').Countqui. Non troppo aggiungere. D'accordo, però, è un po 'troppo facile. Tuttavia, non rientra nel regno di ciò che avrei votato.
Joey,

3
Correlato a StackTranslate.it: Code Golf: Acqua corrente . Una delle migliori di LiraNuna, ho pensato.
dmckee,

1
Quindi dobbiamo anche gestire caverne sotterranee, che possono avere aria sopra il livello dell'acqua come il puzzle di Running Water? Questo rende le cose un po 'più difficili e penso che dovrebbe essere sicuramente un caso d'uso di esempio.
mellamokb,

@dmckee: Quello non è stato facile come questo però.
Joey,

Risposte:


8

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

24 (27):

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

27 (30):

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

Fa concorrenza al meglio delle due soluzioni perl


#|@sarebbe un carattere più corto
TU

2
Dovresti aggiungere 3 al conteggio per il flag -r. Puoi tagliare due dalla rimozione della es e un altro dal suggerimento di S.Mark di tornare a 27.
Nabb,

@Nabb grazie, ho scoperto qualcosa con l'etichetta vuota
asoundmove

Ho provato sed, ma non ci sono riuscito
Ming-Tang,

@Keith, grazie per il premio.
asoundmove,

7

Perl, 25 anni

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

Ho aggiunto un conteggio dei personaggi. Verifica se è effettivamente corretto, poiché potrebbe essere necessario includere alcuni flag di interprete ( -pforse?).
Joey,

non conosco il linguaggio Perl, ma ne sento il potere :)
Ant's,

In realtà ha bisogno di `-pe` per funzionare sulla mia scatola, quindi dovrebbero essere 4 caratteri aggiuntivi. O il enon conta e quindi sono richiesti solo 3 caratteri aggiuntivi?
asoundmove,

Non ho bisogno della e, come ho già detto altrove, per le stesse ragioni. :)
Robert P,

6

Perl (> = v5.9.5), 24 caratteri

Esegui con perl -p:

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

Ciò richiede che Perl 5.9.5 o successivo utilizzi la fuga speciale \K.


1
Tranne che se Nabb è corretto, devi contare `-p` come 3 caratteri, portando il totale a 27. E in realtà richiede i . I don't know the full rules about flags, so not sure the conteggi` -pe e`.
asoundmove,

In realtà non sarebbe necessario l'e, se si preme semplicemente invio e lo si digita in seguito, o si inserisce il codice in un file ed eseguirlo. Quindi non è davvero necessario. :)
Robert P,

3

Windows PowerShell, 36 74 138

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

2

Retina , 10 byte

Retina è (molto) più recente di questa sfida. Ma questa soluzione è troppo chiara per non pubblicarla:

T` `@`#.*#

Provalo online.

Questa è semplicemente una fase di traslitterazione che sostituisce gli spazi con @, ma l'operazione è limitata alle partite di #.*#, cioè i personaggi che sono circondati da terra su entrambi i lati.


1

Ruby 1.8, 30 caratteri

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

Se qualcuno ha idea del perché questo non funziona in Ruby 1.9 (testato con 1.9.2p0 e 1.9.2p204), anche se la documentazione dice che dovrebbe funzionare , fammelo sapere!


È davvero strano, aggiungere $_=$_.all'inizio della seconda riga fa funzionare in 1.9.2, quindi ha a che fare con Kernel.gsub. Anche Rubinio fallisce senza aggiungere esplicitamente $_.
Nemo157,

Secondo il registro 1.9.1 NEWS, il kernel # getc, #gsub, #sub sono obsoleti.
TU

1
Penso che tu possa contare questo come 30 (27 + 3 per aver bisogno della -pbandiera). L'hash-bash e il nome dell'interprete non contano.
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,

Provalo online.

Spiegazione:

|            # 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("@")+"#";})};

Ungolfed:

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

Ti consiglio di (1) pubblicare una versione normalmente formattata della tua risposta in modo che sia più facile da leggere e seguire e (2) esaminare ES6 ... potrebbe farti risparmiare molti personaggi con le tue funzioni.
SirPython

Pubblicherò una versione normale, ma non sono una persona di tipo ES6.
BobTheAwesome

@BobTheAwesome Perché hai appena suggerito questa modifica?
Tim,

Oddio, stavo tentando di correggere l'errore del test case, ma questa estensione è abilitata in Chrome, se conosci xkcd. Mi dispiace per quello.
BobTheAwesome

Oltre alla roba ES6: non hai bisogno dello spazio dopo la virgola, non hai bisogno dello spazio dopo il secondo return, e puoi rimuovere i due punti e virgola, e può essere solo function f(x)...of=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


0

Pip , 15 byte

aR:`#.*#`_TRs'@

Accetta input come stringa multilinea tramite argomento della riga di comando: provalo online! (In alternativa, specifica i -rnflag e modifica il primo ain g, e puoi dare input tramite stdin: provalo online! )

Stessa idea della risposta Retina: sostituisci ogni partita della regex #.*#con il risultato della traslitterazione dello spazio @nella partita. Pip non può eguagliare la terseness di Retina per un puro problema di regex - ma non è tutti i giorni che puoi legare con Jelly, dopo tutto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.