가장 긴 음악 하위 문자열 찾기


9

음악 문자열은 피아노 건반에서 연주 할 수있는 문자열입니다.

아이들처럼 피아노를 배우지 않아도 된 사람들에게는 키보드 모양이 있습니다.

피아노

따라서 feed a dead cabbage모든 단일 문자가이 중 하나에 해당하기 때문에 문자열 은 음악적 문자열입니다.

STDIN의 입력으로 문자열을 가져 와서 가장 긴 음악 하위 문자열을 찾는 프로그램을 작성하는 것이 어렵습니다. 그런 다음 프로그램은 부분 문자열을 인쇄해야하며 길이는 길어야합니다. 다음은 몇 가지 샘플 입력 / 출력입니다.

입력 : "FEED ME! 배고파요!"

출력 : 피드 4


입력 : 아니오 아니오 아니오, musistrin!

출력 : 0


입력: "A **bad** !!!fAd82342"

출력 : abadfad 7


입력 : "좋은 골프!"

출력 : dg 2

규칙

  • 출력은 대문자 또는 소문자 일 수 있지만 문장 부호 나 공백은 없어야합니다.

  • 입력 문자열에 대문자와 문장 부호가 있지만 하위 문자열이 "뮤지컬"인지 여부에 영향을 미치지 않습니다.

  • 음악 하위 문자열과 숫자 사이에 공백이 있어야합니다.


1
전체 프로그램 만, 기능이 없습니까?
Alex A.

@AlexA 예, 전체 프로그램.
James

출력이 대소 문자를 혼합 할 수 있습니까?
nderscore

@nderscore 예, 가능합니다.
제임스

답변:


4

Pyth, 25 23 바이트

pdJef!-T<G7+k.:@Grz0)lJ

@Jakube 덕분에 2 바이트가 절약되었습니다.

데모. 테스트 하니스.

설명:

  • rz0: 입력이 소문자입니다.
  • @Grz0: 알파벳이 아닌 문자를 제거하십시오.
  • .:@Grz0): 모든 하위 문자열을 생성합니다.
  • +k.:@Grz0): 빈 문자열을 추가하십시오.
  • f ... +k.:@Grz0):이 문자열을 필터링합니다.
  • -T<G7: 뮤지컬 문자가 아닌 각 문자열을 필터링합니다.
  • !-T<G7: 결과를 무효화합니다. 이다 True문자열이 음악이었다 경우에만합니다.
  • f!-T<G7+k.:@Grz0): 악보를 걸러냅니다.
  • ef!-T<G7+k.:@Grz0): 마지막 문자열을 가져옵니다. .:크기에 따라 하위 문자열을 주문하므로 가장 긴 음악 하위 문자열이기도합니다.
  • Jef!-T<G7+k.:@Grz0):에 결과를 할당합니다 J.
  • pdJ: 인쇄 J로, d끝 문자로, 공간,.
  • lJ: 그런 다음 길이를 인쇄하십시오 J.

2

루비, 83 75 자

상당히 자명하다.

puts"#{s=gets.gsub(/[^a-z]/i,'').split(/[^a-g]/i).max_by &:size} #{s.size}"

Ruby가 정규식 ( .split(/[^a-g]/)) 에서 문자열을 분할 할 수 있다는 사실을 이용합니다 .


1

펄, 58

#!perl -p
$\=0;map{$i++;$\="$& $i"if/[a-g]{$i}/i}(s/\W//gr)x y!!!cd

사용하다:

$ perl ~/mus.pl <<<"FEED ME! I'm hungry!"
FEED 4

또는

$ perl -pe'$\=0;map{$i++;$\="$& $i"if/[a-g]{$i}/i}(s/\W//gr)x y!!!cd' <<<"FEED ME! I'm hungry!"
FEED 4

0

자바, 268

class Z{public static void main(String[]a){String s=new java.util.Scanner(System.in).nextLine().toLowerCase().replaceAll("[^a-z]",""),t;for(int i=s.length();i-->0;)if(!(t=s.replaceFirst("^(.*)([a-g]{"+i+"})(.*)$","$2")).equals(s)){System.out.println(t+" "+i);break;}}}

넓히는:

class Z {
    public static void main(String[] a) {
        String s = new java.util.Scanner(System.in).nextLine().toLowerCase().replaceAll("[^a-z]", ""), t;
        for (int i = s.length(); i-- > 0;) {
            if (!(t = s.replaceFirst("^(.*)([a-f]{" + i + "})(.*)$", "$2")).equals(s)) {
                System.out.println(t + " " + i);
                break;
            }
        }
    }
}

0

펄 5 (106)

use List::Util reduce;$_=lc<>;s/[^a-z]//g;$_=reduce{length$a>length$b?$a:$b}m/[a-g]+/g;print"$_ ",0+length

0

R, 98 94 바이트

p=strsplit(gsub("[^a-z]","",readline(),T),"[^a-gA-G]+")[[1]];m=max(n<-nchar(p));cat(p[n==m],m)

언 골프 + 설명 :

# Read from STDIN and remove all non-alphabetic characters
r <- gsub("[^a-z]", "", readline(), ignore.case = TRUE)

# Split r into a vector of substrings on characters other than a-g
p <- strsplit(r, "[^a-g]+")[[1]]

# Get the number of characters in each substring
n <- nchar(p)

# Get the length of the longest substring
m <- max(n)

# Print the string and length
cat(p[n == m], m)

제안은 환영합니다!

참고 : 이제 출력이 대소 문자를 혼합하여 OP의 편집마다 허용됩니다. 이것은 4 바이트를 절약했습니다.


0

golflua , 84 85 84 바이트

B=I.r():g("%A",""):g("[^a-gA-G]"," ")M=0Q=""~@W B:gm("(%w+)")?#W>M M=#W Q=W$$w(Q,M)

내가 먼저 힘 소문자, 다음 제거 공백이 아닌 문자 문자가, 다음 입력 (표준 입력)에 모든 음악이 아닌 문자를 제거합니다. 그런 다음 나머지 각 단어를 스캔하고 길이를 비교하여 가장 큰 길이 (stdout)를 출력합니다. 루프를 수행하는 더 짧은 방법이있을 수 있지만 현재로서는 이것이 내가 얻은 것입니다.

ungolfed 루아 코드는

Line = io.read()                                  -- read stdin
NoSpaced = Line:gsub("%A","")                     -- strip non-letter chars
MusicalLetters = NoSpaced:gsub("[^a-gA-g]", " ")  -- remove non-musical letters
WordLen = 0, LongWord = ""                        -- helpers
for words in MusicalLetters:gmatch("(%w+)") do    -- scan for longest word
   if words:length() > WordLen then 
      WordLen = words:length()
      LongWord = words 
   end
end
print(LongWord, WordLen)                          -- output solution
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.