Знайдіть найдовший музичний підряд


9

Музична рядок є будь-рядком , яка може бути відтворена на клавіатурі піаніно.

Для тих із нас, хто не був змушений вивчати фортепіано як діти, ось як виглядає клавіатура.

фортепіано

Отже, струна feed a dead cabbage- це музична струна, тому що кожна окрема літера відповідає одній із цих приміток.

Ваше завдання полягає в тому, щоб написати програму, яка приймає рядок як вхід з STDIN і знаходить найдовшу музичну підрядку. Тоді ваша програма повинна надрукувати підрядку, і це довжина. Ось кілька зразків входів / виходів.

Вхід: "ЗВОРИМ МЕНЕ! Я голодний!"

Вихід: подача 4


Вхідні дані: Ні, ні ні, ні мустрістрин!

Вихід: 0


Вхід: "A **bad** !!!fAd82342"

Вихід: абадфад 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.

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

Перл, 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)

Пропозиції вітаються!

Примітка. Вихід тепер є змішаним регістром, що дозволено в редагуванні ОП. Це зберегло 4 байти.


0

гольфлуа , 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.