找到最长的音乐子串


9

一个音乐弦线是可以在钢琴键盘上播放任何字符串。

对于那些没有被迫在小时候学习钢琴的人来说,这就是键盘的样子。

钢琴

所以该字符串feed a dead cabbage是一个音乐字符串,因为每个单个字母都对应于其中一个。

您的挑战是编写一个程序,该程序将一个字符串作为来自STDIN的输入,并找到最长的音乐子字符串。然后,您的程序必须打印子字符串及其长度。这是一些示例输入/输出。

输入:“喂我!我饿了!”

输出:提要4


输入:不不不,没有musistrin!

输出:0


输入: "A **bad** !!!fAd82342"

输出:abadfad 7


输入:“打高尔夫球好!”

输出:dg 2

规则

  • 您的输出可以是大写或小写字母,但不能有标点或空格。

  • 输入字符串中会有大写和标点符号,但这并不影响子字符串是否被视为“音乐”。

  • 音乐子字符串和数字之间必须有一个空格。


1
仅完整程序,没有功能?
Alex A.

@AlexA是的,完整程序。
詹姆斯

输出可以混合使用吗?
nderscore 2015年

@nderscore是的,可以。
詹姆斯

Answers:


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
  • pdJJd,空格作为结束字符打印。
  • lJ:然后,打印的长度J

2

Ruby,83个 75个字符

相当不言自明。

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

利用了Ruby可以在regex(.split(/[^a-g]/))上分割字符串这一事实。


1

Perl,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

Perl 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

golflua84 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)

我第一力小写,然后剥离空格非字母字符,然后删除该输入(stdin)所有非音乐字母。然后,我扫描剩余的每个单词,并比较其长度,然后输出最大的单词和长度(stdout)。可能有一种更短的循环方法,但是目前这就是我所拥有的。

一个非高尔夫Lua代码将是

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.