호수를 채우십시오


19

ASCII 그림 형식으로 된 지형의 지형을 고려하면 호수가 어디로 가서 호수를 채울지 알아 내십시오. 무한한 비가 내린다고 가정하십시오.

입력

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

산출

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

입력에는 공백과 #마크 만 포함됩니다 . 각 줄의 길이는 같습니다. 출력물은 #물이 쌓여서 @마크가 채워진 공간 과 동일한 패턴 이어야 합니다.

하단 입력 행은 항상 # 표시입니다. 땅에는 구멍이나 돌출부가 없을 것입니다. 가장 짧은 코드가 승리합니다.


조금 쉬워 보입니다. 또한 @채워진 호수 단위의 수를 표시해야한다고 생각합니다 .
mellamokb

1
@mellamokb : 대략 ([char[]]"$a"-eq'@').Count여기에 있을 것 입니다. 그다지 추가하지는 않습니다. 그래도이 작업이 너무 쉽다는 데 동의했습니다. 그래도 내가 공감 한 것의 영역에 빠지지는 않는다.
Joey

3
스택 오버플로 관련 : 코드 골프 : 흐르는 물 . LiraNuna의 더 좋은 것 중 하나라고 생각했습니다.
dmckee

1
우리는 지하수 동굴도 처리해야하는데, 지하수 동굴은 흐르는 물 퍼즐처럼 수위보다 높은 공기를 가지고 있을까요? 그로 인해 상황이 좀 더 어려워지고 분명히 사용 사례가되어야한다고 생각합니다.
mellamokb

@ dmckee : 그 하나는 쉽지 않았습니다.
Joey

답변:


8

sed -r, 27 24 (27 포함 -r)

24 (27) :

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

27 (30) :

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

두 가지 펄 솔루션 중 더 나은 제품과 경쟁


#|@문자 하나가 짧을 것입니다
당신은

2
-r 플래그의 수에 3을 추가해야합니다. 두 개의 es 를 제거 하고 다른 하나는 S.Mark의 제안에서 27로 돌아갈 수 있습니다.
Nabb

@Nabb 덕분에 빈 레이블이있는 무언가를 발견했습니다
asoundmove

나는 sed를 전에 시도했지만 실패했다
Ming-Tang

@Keith, 수상 해 주셔서 감사합니다.
asoundmove

7

펄, 25

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

문자 수를 추가했습니다. 일부 인터프리터 플래그를 포함해야 할 수도 있으므로 실제로 올바른지 확인하십시오 -p.
Joey

나는 펄 언어를 모른다. 그러나 나는 그것의 힘을 느낄 수있다 :)
Ant 's

실제로 내 상자에서 작동하려면`-pe '가 필요하므로 추가 4 자 여야합니다. 아니면 e계산 에 포함 되지 않으므로 3 개의 추가 문자 만 필요합니까?
asoundmove

다른 이유로 언급 한 것처럼 같은 이유로 e가 필요하지 않습니다. :)
Robert 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는 실제로 필요하지 않습니다. :)
Robert P

3

Windows PowerShell을, (36) (74) (138)

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

2

레티 나 , 10 바이트

레티 나 (Retina)는이 도전보다 훨씬 더 새롭습니다. 그러나이 솔루션은 게시하지 않는 것이 너무 깔끔합니다.

T` `@`#.*#

온라인으로 사용해보십시오.

이것은 단순히 음역을로 바꾸는 음역 단계 @이지만, 작업은 #.*#, 즉 양쪽의 육지로 둘러싸인 문자의 일치로 제한됩니다 .


1

루비 1.8, 30 자

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

Ruby 1.9에서 왜 이것이 작동하지 않는지 아는 사람이 있다면 (1.9.2p0 및 1.9.2p204로 테스트 됨) 문서에서 작동한다고 나와 있지만 알려주십시오!


정말 이상 $_=$_.합니다. 두 번째 줄의 시작 부분에 추가 하면 1.9.2에서 작동하므로와 관련이 Kernel.gsub있습니다. Rubinius도 명시 적으로 추가하지 않으면 실패합니다 $_.
Nemo157

1.9.1 NEWS 로그에 따르면 Kernel # getc, #gsub, #sub는 더 이상 사용되지 않습니다.
당신

1
나는 이것을 30으로 계산할 수 있다고 생각합니다 ( -p플래그 가 필요하면 27 + 3 ). 해시 bash와 인터프리터의 이름은 포함되지 않습니다.
Caleb

1

파이썬, 95 92 바이트

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 바이트

|εγć?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

자바 스크립트, 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 왜 당신은 단지 제안 않은 편집?
Tim

오, 맙소사, 테스트 사례 오류를 해결하려고 시도했지만 xkcd를 알고 있다면 크롬 에서이 확장을 사용하도록 설정했습니다. 미안합니다.
BobTheAwesome 0:07에

ES6 물건 외에도 : 당신은 두 번째 이후의 공간이 필요없는 쉼표 뒤에 공간이 필요하지 않습니다 return, 당신은 두 개의 세미콜론을 제거 할 수 있습니다, 그것은 단지가 될 수 function f(x)...또는f=function(x)...
재커리

0

파이썬 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플래그를 지정하고 첫 번째 a를로 변경하면 gstdin을 통해 입력 할 수 있습니다 : 온라인으로 시도하십시오! )

Retina 답변과 동일한 아이디어 : 정규 표현식의 모든 일치 항목을 일치하는 #.*#공간을 음역 한 결과로 바꿉니다 @. Pip은 순수한 정규식 문제에 대한 Retina의 간결함과 일치 할 수는 없지만 결국 젤리와 연결할 수있는 것은 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.