湖を埋める


19

ASCIIの画像形式の土地の地形を考慮して、湖の行き先を特定し、それらを埋めます。無限の雨量を想定します。

入力

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

出力

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

入力にはスペースと#マークのみが含まれます。各行は同じ長さになります。出力は#、水が溜まるスペースが@マークで満たされた同一パターンでなければなりません。

一番下の入力行は常にすべて#マークになります。土地に穴や張り出しはありません。最短のコードが優先されます。


これは少し簡単に思えます。@埋められた湖のユニットの数も表示する必要があると思います
。– mellamokb

1
@mellamokb:これはおおよそ([char[]]"$a"-eq'@').Countここになります。それほど追加しません。しかし、これは少し簡単すぎることに同意しました。とはいえ、私が下票を投じるという領域には入らない
ジョーイ

3
Stack Overflow:Code Golf:Running Waterに関連します。LiraNunaの良い方の1つだと思いました。
dmckee

1
では、地下水の洞窟も処理する必要がありますか?それは物事をもう少し難しくし、間違いなくユースケースの例であるべきだと思います。
mellamokb

@dmckee:それはこれほど簡単ではありませんでした。
ジョーイ

回答:


8

sed -r、27 24(27あり-r

24(27):

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

27(30):

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

2つのperlソリューションの良い方と競合する


#|@1文字短くなります
-YOU

2
-rフラグのカウントに3を追加する必要があります。es を削除することで2つ、27に戻るというS.Markの提案から別のものを削除できます。
ナブ

@Nabbありがとう、空のラベルを持つ何かを発見しました
-asoundmove

私は前にsedを試みたが、失敗した
明唐

@キース、賞をありがとう。
asoundmove

7

Perl、25

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

文字数を追加しました。インタープリターフラグを含める必要があるかもしれないので(実際に-p?)
ジョーイ

私はperl言語を知らないが、その力を感じることができる:)
Antの

実際、私のボックスで機能するには `-pe`が必要なので、追加の4文字にする必要があります。または、eカウントしないので、必要な追加文字は3つだけですか?
asoundmove

同じ理由で、他の場所で述べたように、eは必要ありません。:)
ロバートP

6

Perl(> = v5.9.5)、24文字

で実行perl -p

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

これには、Perl 5.9.5以降で特別なエスケープを使用する必要があり\Kます。


1
Nabbが正しい場合を除き、 `-p`を3文字としてカウントする必要があり、合計は27に. I don't know the full rules about flags, so not sure the なります。実際には` -pe e`カウントが必要です。
asoundmove

Enterキーを押して後で入力するか、コードをファイルに入れて実行する場合、実際にはeは必要ありません。したがって、-eは実際には必要ありません。:)
ロバートP


2

網膜、10バイト

網膜は、この課題よりも(ずっと)新しいです。しかし、この解決策はあまりにもきちんとしていて、投稿することはできません。

T` `@`#.*#

オンラインでお試しください。

これは単にスペースを@に置き換える音訳段階ですが、操作はの一致#.*#、つまり両側が土地に囲まれている文字に制限されています。


1

Ruby 1.8、30文字

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

Ruby 1.9(1.9.2p0および1.9.2p204でテスト済み)でこれが機能しない理由を誰かが知っている場合は、ドキュメントでは機能するはずだと言われていますが、教えてください!


それは本当に奇妙です$_=$_.。2行目の先頭に追加すると、1.9.2で機能するようになりますKernel.gsub。Rubiniusもを明示的に追加せずに失敗します$_
Nemo157

1.9.1 NEWSログによると、Kernel#getc、#gsub、#subは非推奨です。
YOU

1
これを30(-pフラグが必要な場合は27 + 3 )とカウントできると思います。ハッシュバッシュとインタープリターの名前はカウントされません。
カレブ

1

Python、95 92バイト

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

1

05AB1E17 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を知っていれば、この拡張機能をChromeで有効にしています。ごめんなさい
BobTheAwesome

ES6のもののほかに:あなたは、カンマの後にスペースを必要としない、あなたは、第二の後にスペースを必要としないreturn、あなたは2つのセミコロンを削除することができ、そしてそれだけで可能function f(x)...f=function(x)...
ザカリー

0

Python、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フラグを指定し、最初のフラグをに変更するag、stdin経由で入力できます:オンラインで試してみてください!

Retinaの回答と同じ考え:正規表現のすべての一致を、一致する#.*#スペースを音訳した結果に置き換え@ます。Pipは、純粋な正規表現の問題に対するRetinaの簡潔さに匹敵することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.