Gölleri doldurun


19

ASCII resim formatında topografya göz önüne alındığında, göllerin nereye gideceğini bulun ve doldurun. Sonsuz miktarda yağmur varsayın.

misal

giriş

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

çıktı

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

Giriş yalnızca boşluklar ve #işaretler içerecektir . Her satır aynı uzunlukta olacaktır. Çıktı, #suyun @işaretlerle dolu olarak birikeceği boşluklarla aynı desen olmalıdır .

Alttaki giriş satırı her zaman # işareti olacaktır. Arazide delik veya çıkıntı olmayacak. En kısa kod kazanır.


Bu biraz kolay görünüyor. Sanırım @doldurulmuş göl birimlerinin sayısını da göstermeliyiz .
mellamokb

1
@mellamokb: Bu kabaca ([char[]]"$a"-eq'@').Countburada olurdu . O kadar da eklemek değil. Yine de bunun biraz fazla kolay olduğunu kabul ettim. Yine de, aşağıya indirdiğim şeyin alanına düşmez.
Joey

3
Stack Overflow: Code Golf: Akan Su ile ilgili . LiraNuna'dan biri daha iyi, diye düşündüm.
dmckee

1
Peki Akan Su bulmacası gibi su seviyesinin üzerinde havaya sahip olabilecek yeraltı mağaralarını da ele almamız gerekiyor mu? Bu işleri biraz daha zorlaştırıyor ve bence kesinlikle örnek bir kullanım örneği olmalı.
mellamokb

@dmckee: Bu kadar kolay değildi.
Joey

Yanıtlar:


8

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

24 (27):

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

27 (30):

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

İki perl çözümünden daha iyisi ile rekabet eder


#|@bir karakter daha kısa olurdu
SİZ

2
-R bayrağı için sayıya 3 eklemelisiniz. eS'yi kaldırmaktan ikisini, S.Mark'ın da 27'ye geri dönme önerisinden birini kesebilirsiniz.
Nabb,

@Nabb teşekkürler, boş etiketle bir şeyler keşfetti
asoundmove

Sed'i daha önce denedim, ama başarısız oldum
Ming-Tang

@ Keith, ödül için teşekkürler.
asoundmove

7

Perl, 25

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

Bir karakter sayımı ekledim. Lütfen bazı doğrulayıcı bayraklarını ( -pbelki?) İçermesi gerekebileceğinden, gerçekten doğru olup olmadığına bakın .
Joey

perl dilini bilmiyorum, ama gücünü hissedebiliyorum :)
Ant

Aslında kutumda çalışması için `-pe` ye ihtiyacı var, bu yüzden ek 4 karakter olmalı. Yoksa esayılmaz ve bu nedenle sadece 3 ek karakter gerekir mi?
asoundmove

Aynı sebeplerden ötürü, başka yerlerde de belirttiğim gibi, e'ye ihtiyacınız yok. :)
Robert P

6

Perl (> = v5.9.5), 24 karakter

Şununla çalıştır perl -p:

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

Bu özel kaçış kullanmak için Perl 5.9.5 veya daha yenisini gerektirir \K.


1
Nabb doğruysa, toplamı 27'ye getiren `` p '' yi 3 karakter olarak saymanız gerekir. Ve aslında `-pe . I don't know the full rules about flags, so not sure the e` sayıları gerektirir .
asoundmove

Aslında e'ye ihtiyacınız olmaz, sadece enter tuşuna basarsanız ve daha sonra girerseniz veya kodu bir dosyaya koyar ve çalıştırırsanız. Yani -e gerçekten gerek yok. :)
Robert P

3

Windows PowerShell, 36 74 138

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

2

Retina , 10 bayt

Retina bu zorluktan çok daha yenidir. Ancak bu çözüm, yayınlamamak için çok temiz:

T` `@`#.*#

Çevrimiçi deneyin.

Bu basitçe boşlukların yerini alan bir harf çevirisi aşamasıdır @, ancak işlem eşleşmelerle sınırlıdır #.*#, yani her iki taraftaki karalarla çevrili karakterler.


1

Ruby 1.8, 30 karakter

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

Herhangi birinin bunun neden Ruby 1.9'da (1.9.2p0 ve 1.9.2p204 ile test edilmiş) işe yaramadığı hakkında bir fikri varsa, belgeler işe yarayacağını söylüyor olsa bile , bana bildirin!


Bu gerçekten garip, $_=$_.ikinci satırın başlangıcını eklemek 1.9.2'de çalışmasını sağlıyor, bu yüzden bununla ilgili bir şey Kernel.gsub. Rubinius ayrıca açıkça eklemeden başarısız olur $_.
Nemo157

1.9.1 HABER günlüğüne göre Çekirdek # getc, #gsub, #sub kullanımdan kaldırıldı.
SİZ

1
Sanırım bunu 30 olarak sayabilirsiniz ( -pbayrağa ihtiyaç duyduğunuz için 27 + 3 ). Hash-bash ve yorumlayıcının adı sayılmaz.
Caleb

1

Python, 95 92 bayt

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 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

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

Okumak ve takip etmek daha kolay ve (2) ES6'ya bakmak için (1) cevabınızın normal olarak biçimlendirilmiş bir versiyonunu göndermenizi tavsiye ederim ... fonksiyonlarınızla size çok fazla karakter kazandırabilir.
SirPython

Normal bir sürüm yayınlayacağım, ancak ES6 tipi biri değilim.
BobTheAwesome

@BobTheAwesome Neden bu düzenlemeyi önerdiniz ?
Tim

Aman tanrım, test-case hatasını düzeltmeye çalışıyordum ama xkcd biliyorsanız bu uzantıyı kromda etkinleştirdim. Bunun için üzgünüm.
BobTheAwesome

ES6 şeylerinin yanı sıra: virgülden sonra boşluğa ihtiyacınız yok, ikinciden sonra boşluğa ihtiyacınız yok returnve iki noktalı virgül kaldırabilirsiniz ve bu sadece olabilir function f(x)...veyaf=function(x)...
Zacharý

0

Piton, 108 106 92 bayt

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


0

Pip , 15 bayt

aR:`#.*#`_TRs'@

Komut satırı argümanı ile girdiyi çok satırlı bir dize olarak alır: Çevrimiçi deneyin! (Alternatif olarak, belirtmek -rnbayraklar ve ilk değiştirmek aiçin gve stdin'i aracılığıyla girdi verebilir: ! Çevrimiçi Deneyin )

Retina cevabı ile aynı fikir: Normal ifadenin her eşleşmesini #.*#, oyunda yer alan harf çevirisi sonucu ile değiştirin @. Pip, Retina'nın saflığını normal bir regex problemi ile eşleştiremez - ancak her şeyden önce Jelly ile bağlayabileceğiniz her gün değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.