Füllen Sie die Seen

19

Berechnen Sie anhand der Topografie des Landes im ASCII-Bildformat, wohin die Seen führen und füllen Sie sie aus. Nehmen Sie eine unendliche Menge Regen an.

Beispiel

Eingang

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

Ausgabe

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

Die Eingabe enthält nur Leerzeichen und #Markierungen. Jede Zeile hat die gleiche Länge. Die Ausgabe sollte das gleiche #Muster haben wie die Bereiche, in denen sich Wasser ansammeln würde, und mit @Markierungen gefüllt sein .

Die unterste Eingabezeile enthält immer alle # -Zeichen. Es wird keine Löcher oder Überhänge im Land geben. Kürzester Code gewinnt.

Keith Randall
quelle
Das scheint ein bisschen einfach zu sein. Ich denke, wir sollten auch die Anzahl der Seeeinheiten anzeigen müssen @, die ausgefüllt wurden.
mellamokb
1
@mellamokb: Das wäre ungefähr ein ([char[]]"$a"-eq'@').Counthier. Nicht zu viel hinzufügen. Einverstanden, dass dies etwas zu einfach ist. Fällt jedoch nicht in den Bereich dessen, was ich abgelehnt hätte.
Joey
3
In Verbindung mit Stack Overflow: Code Golf: Fließendes Wasser . Eine von LiraNunas besseren, dachte ich.
dmckee
1
Müssen wir also auch mit unterirdischen Kavernen umgehen, in denen sich möglicherweise Luft über dem Wasserspiegel befindet, wie beim Puzzle „Fließendes Wasser“? Das macht die Dinge etwas herausfordernder und ich denke, dies sollte definitiv ein Anwendungsfall sein.
Mellamokb
@dmckee: Das war allerdings nicht so einfach.
Joey

Antworten:

8

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

24 (27):

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

27 (30):

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

Konkurriert mit der besseren der beiden Perl-Lösungen

asoundmove
quelle
#|@wäre ein char kürzer
SIE
2
Sie sollten die Anzahl für das Flag -r um 3 erhöhen. Sie können zwei davon abschneiden, ewenn Sie das s entfernen , und ein weiteres aus S. Marks Vorschlag, auf 27 zurückzukehren.
Nabb
@Nabb danke, entdeckte etwas mit dem leeren Etikett
asoundmove
Ich habe es schon einmal mit sed versucht, aber es ist fehlgeschlagen
Ming-Tang
@Keith, danke für die Auszeichnung.
Asoundmove
7

Perl, 25

s/# +#/$_=$&;y| |@|;$_/ge
Ming-Tang
quelle
Ich habe eine Zeichenanzahl hinzugefügt. Bitte prüfen Sie, ob es tatsächlich korrekt ist, da möglicherweise einige Interpreter-Flags enthalten sein müssen ( -pvielleicht?).
Joey
Ich kenne Perl-Sprache nicht, aber ich kann seine Kraft fühlen :)
Ameisen
Eigentlich braucht es "-pe", um auf meiner Box zu funktionieren, das sollten also zusätzliche 4 Zeichen sein. Oder zählt das enicht und somit werden nur 3 zusätzliche Zeichen benötigt?
Asoundmove
Ich brauche das e aus den gleichen Gründen nicht, wie ich es an anderer Stelle erwähnt habe. :)
Robert P
6

Perl (> = 5.9.5), 24 Zeichen

Laufen mit perl -p:

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

Dies erfordert, dass Perl 5.9.5 oder höher das spezielle Escape verwendet \K.

Yibe
quelle
1
Mit der Ausnahme, dass, wenn Nabb korrekt ist, Sie `-p` als 3 Zeichen zählen müssen, was Ihre Gesamtsumme auf 27 bringt. Und es erfordert tatsächlich` -pe . I don't know the full rules about flags, so not sure the e` Zählungen.
Asoundmove
Wäre das e eigentlich nicht nötig, wenn Sie einfach die Eingabetaste drücken und es anschließend eingeben oder den Code in eine Datei einfügen und ausführen. Also -e wird nicht wirklich gebraucht. :)
Robert P
3

Windows PowerShell, 36 74 138

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

Retina , 10 Bytes

Retina ist (viel) neuer als diese Herausforderung. Aber diese Lösung ist zu ordentlich, um sie nicht zu posten:

T` `@`#.*#

Probieren Sie es online aus.

Dies ist einfach eine Transliterationsstufe, die Leerzeichen durch ersetzt @, die Operation ist jedoch auf Übereinstimmungen von #.*#Zeichen beschränkt , dh Zeichen, die auf beiden Seiten von Land umgeben sind.

Martin Ender
quelle
1

Ruby 1.8, 30 Zeichen

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

Wenn jemand eine Idee hat, warum dies in Ruby 1.9 (getestet mit 1.9.2p0 und 1.9.2p204) nicht funktioniert , lassen Sie es mich wissen , obwohl die Dokumentation besagt, dass es funktionieren sollte !

Ventero
quelle
Das ist wirklich seltsam, wenn $_=$_.man den Anfang der zweiten Zeile hinzufügt , funktioniert es in 1.9.2, also hat es etwas damit zu tun Kernel.gsub. Rubinius schlägt auch fehl, ohne es explizit hinzuzufügen $_.
Nemo157,
Laut 1.9.1 NEWS-Protokoll sind Kernel # getc, #gsub, #sub veraltet.
SIE
1
Ich denke, Sie können dies als 30 zählen (27 + 3 für das Benötigen der -pFlagge). Der Hash-Bash und der Name des Interpreters zählen nicht.
Caleb
1

Python, 95 bis 92 Bytes

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

05AB1E , 17 16 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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

Javascript, 107 Bytes

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("@") + "#";
    })
};
BobTheAwesome
quelle
Ich empfehle Ihnen, (1) eine normal formatierte Version Ihrer Antwort zu veröffentlichen, damit Sie sie leichter lesen und nachvollziehen können, und (2) ES6 zu Rate zu ziehen. Dies könnte Ihnen bei Ihren Funktionen viele Zeichen ersparen .
SirPython
Ich werde eine normale Version posten, aber ich bin keine Person vom Typ ES6.
BobTheAwesome
@BobTheAwesome Warum hast du gerade diese Änderung vorgeschlagen ?
Tim,
Oh Gott, ich habe versucht, den Testfallfehler zu beheben, aber ich habe diese Erweiterung in Chrom aktiviert, wenn Sie xkcd kennen. Das tut mir leid.
BobTheAwesome
Neben dem ES6-Zeug: Sie brauchen kein Leerzeichen nach dem Komma, Sie brauchen kein Leerzeichen nach dem zweiten return, und Sie können die beiden Semikolons entfernen, und es kann nur sein, function f(x)...oderf=function(x)...
Zacharý
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
0b1t
quelle
0

Pip , 15 Bytes

aR:`#.*#`_TRs'@

Nimmt die Eingabe als mehrzeilige Zeichenfolge über das Befehlszeilenargument entgegen: Probieren Sie es online aus! ( Geben Sie alternativ die -rnFlags an und ändern Sie die erste ain g, und Sie können Eingaben über stdin vornehmen: Probieren Sie es online aus! )

Gleiche Idee wie die Retina-Antwort: Ersetzen Sie jedes Match des Regex #.*#durch das Ergebnis des Transliterierens des Leerzeichens @in das Match. Pip kann nicht mit Retinas Knappheit mithalten, um ein reines Regex-Problem zu lösen - aber es ist nicht jeden Tag so, dass man sich mit Jelly anlegen kann.

DLosc
quelle