Найдите самую длинную музыкальную подстроку

9

Музыкальная строка является любой строкой , которая может быть воспроизведена на клавиатуре пианино.

Для тех из нас, кто не был вынужден учиться играть на фортепиано в детстве, вот как выглядит клавиатура.

пианино

Таким образом, строка feed a dead cabbageявляется музыкальной строкой, потому что каждая отдельная буква соответствует одному из этих узлов.

Ваша задача - написать программу, которая принимает строку в качестве входных данных из STDIN и находит самую длинную музыкальную подстроку. Тогда ваша программа должна напечатать подстроку, и ее длину. Вот несколько примеров входов / выходов.

Вход: «ПОДАРОК ​​МНЕ! Я голоден!»

Выход: подача 4


Вход: нет, нет, нет, musistrin!

Ouput: 0


Входные данные: "A **bad** !!!fAd82342"

Выход: abadfad 7


Вход: "Хороший гольф!"

Выход: дг 2

правила

  • Ваш вывод может быть в верхнем или нижнем регистре, но не должно быть знаков препинания или пробелов.

  • Во входной строке будут прописные буквы и знаки препинания, но это не влияет на то, считается ли подстрока «музыкальной» или нет.

  • Между музыкальной подстрокой и номером должен быть пробел.

Джеймс
источник
1
Только полные программы, без функций?
Алекс А.
@AlexA да, полная программа.
Джеймс
Может ли вывод быть смешанным регистром?
nderscore
@nderscore да, это может быть.
Джеймс

Ответы:

4

Pyth, 25 23 байта

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

2 байта сохранены благодаря @Jakube.

Демонстрация. Тестовый жгут.

Объяснение:

  • 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.
isaacg
источник
2

Рубин, 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
nutki
источник
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;}}}

Expanded:

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;
            }
        }
    }
}
Ypnypn
источник
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
Мин-Tang
источник
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)

Ungolfed + объяснение:

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

Предложения приветствуются!

Примечание: вывод теперь в смешанном регистре, что допускается при редактировании ОП. Это сэкономило 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)

Сначала я вводю строчные буквы, затем убираю пробелы, не являющиеся буквами, а затем удаляю все немузыкальные буквы на входе (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
Кайл Канос
источник