2013-03-27 1 views
2

여기가 문제입니다 (Codeforces에서)문자열에서 연속 된 문자를 모두 제거하는 루비 정규식

폴리 카프는 삶의 의미를 매우 자주 생각합니다. 에디터에서 타이핑 할 때도 그는 이것을 끊임없이합니다. 그가 우울하게하기 시작할 때마다 그는 한 번만 눌러야 할 열쇠를 더 이상 완전히 집중시키지 않고 반복적으로 누를 수 없습니다. 예를 들어 "어떻게 지내세요?"대신 "hhoow aaaare yyoouu"를 입력 할 수 있습니다.

Polycarp는 이러한 오류를 수정하는 프로세스를 자동화하기로 결정했습니다. 그는 텍스트 편집기에 플러그인을 작성하여 동일한 연속 된 문자 쌍 (텍스트가있는 경우)을 제거하기로 결정했습니다. 물론, 이것은 폴리 카프가 필요로하는 것과 정확히 똑같지는 않지만, 뭔가에서 시작해야합니다!

도움말 Polycarp를 사용하고 메인 플러그인 모듈을 작성하십시오. 프로그램은 문자열에서 동일한 문자의 모든 쌍을 연속적으로 제거해야합니다. 제거한 후에 새로운 쌍이 나타나면 프로그램에서이를 제거해야합니다. 전문적으로 그 작업은 다음과 동등해야합니다. 문자열에 연속되는 동일한 문자 쌍이 포함되어 있지만 쌍을 삭제해야합니다. 순서가 동일한 결과로 이어 지므로 연속 된 동일한 문자를 삭제하는 순서는 임의의 순서로 수행 할 수 있습니다.

여기 내 해결책이 있습니다. 어떤 이유로 굉장히 큰 테스트 케이스가 실패합니다. 내 것은 그것이 예상 한 것보다 더 많은 글자를 없애는 것 같습니다. 이 정규 표현식이 올바르지 않습니까?

str = gets.chomp 

while str =~ /(.)\1/ 
    str.gsub!(/(.)\1+/,'') 
end 

puts str 

EDIT -이 솔루션은 모든 연속적인 문자 그룹을 제거하기 때문에 작동하지 않습니다. 중복을 제거해야합니다.

str = gets.chomp 

while str =~ /(.)\1/ 
    str.gsub!(/(.)\1/,'') 
end 

puts str 
+0

정규식을 사용해야합니까? 짜내는 방법 어때요? http://www.ruby-doc.org/core-1.9.3/String.html#method-i-squeeze – squiguy

+0

잘 생겼지 만 복제본 중 하나만 삭제합니다. 중복을 모두 삭제하고 싶습니다. 따라서 "aab"은 "b"가됩니다 – ordinary

+0

하지만 'aaab'은 어떻게됩니까? 그것은 "ab"또는 "b"가되어야합니까? –

답변

0

헥타르, 내가 처음 읽을 때 내가 생각했던 것보다 더 열심히 : 나는 그것을 내가 시간 초과에 매우 큰 문자열, 올바른 것으로 믿지이 방법을 수행합니다. 약

s = "hhoow aaaareer yyoouu" 
while s.gsub!(/(.)\1+/, '') 
end 
puts s 

내가 문제를 올바르게 이해하면 s == 'w'을 남깁니다.

+0

하하 기다려 그게 내가 가진 것 같아 .. – ordinary

+0

적절한 출력이 "ab"일 때 "aaab"과 같은 문자열이 있기 때문에 "ab"가된다고 알았습니다. – ordinary

+0

질문에 대한 귀하의 의견에 "aab"이된다고 말하면 "b"가 맞습니다. 나는 당신의 의견이 잘못되었다고 생각합니다. – ThomasW

5

왜 정규 표현식이어야합니까?

'foobar'.squeeze 
=> "fobar" 

"hhoow aaaare yyoouu".squeeze 
=> "how are you" 

squeeze은 모든 문자 또는 특정 문자의 압축을 실행하는 데 유용한 도구입니다. 다음은 몇 가지 예 the documentation에서있다 : "AAB"는 "B"를하게되면

 
"yellow moon".squeeze     #=> "yelow mon" 
" now is the".squeeze(" ")   #=> " now is the" 
"putters shoot balls".squeeze("m-z") #=> "puters shot balls" 

, 당신은 "hhoow이"질문에 주어진 예를 다음과하지 않는 것은 "어떻게"로 바뀝니다. 귀하의 진술에 의해 그것은 "w"가 될 것이고, "yyoouu"는 ""될 것입니다. 나는 당신이 그것에 너무 많이 읽고 샘플 입력과 샘플 출력을 기반으로 문제를 이해하지 못하고 있다고 생각합니다.

+0

이것은 내가 코멘트에서 제안한 것입니다. 정확히 그가 원하는 것을 말하기는 어렵습니다. 나는 지금 연속적인 해결책을 생각해 내고있다. – squiguy

+0

아니요, 질문이 잘못 형성되었습니다. 실제 문제에서 인용 된 예는 내가 말하는 것과 일치합니다. http://codeforces.com/problemset/problem/81/A 링크입니다. – ordinary

관련 문제