Znajdź najdłuższy podkład muzyczny


9

Ciąg muzyczny to dowolny ciąg, który można odtwarzać na klawiaturze fortepianu.

Dla tych z nas, którzy nie byli zmuszeni do nauki gry na pianinie jako dzieci, oto jak wygląda klawiatura.

fortepian

Tak więc struna feed a dead cabbagejest struną muzyczną, ponieważ każda pojedyncza litera odpowiada jednemu z tych znaków.

Wyzwanie polega na napisaniu programu, który pobiera ciąg znaków jako dane wejściowe ze STDIN i znajdzie najdłuższy podkład muzyczny. Następnie twój program musi wydrukować podciąg i jego długość. Oto kilka przykładowych wejść / wyjść.

Wejście: „FEED ME! Jestem głodny!”

Wyjście: feed 4


Wejście: Nie nie nie, nie musistrin!

Ouput: 0


Wejście: "A **bad** !!!fAd82342"

Wyjście: abadfad 7


Dane wejściowe: „Dobry golf!”

Wyjście: dg 2

Zasady

  • Dane wyjściowe mogą być pisane wielkimi lub małymi literami, ale nie może być interpunkcji ani spacji.

  • W łańcuchu wejściowym będzie występować wielkie litery i interpunkcja, ale nie ma to wpływu na to, czy podciąg jest uznawany za „muzyczny”, czy nie.

  • Musi być spacja między podkładem muzycznym a liczbą.


1
Tylko pełne programy, brak funkcji?
Alex A.

@AlexA tak, pełny program.
James

Czy wyjście może być mieszane?
nderscore

@nderscore tak, może być.
James

Odpowiedzi:


4

Pyth, 25 23 bajtów

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

2 bajty zapisane dzięki @Jakube.

Demonstracja. Uprząż testowa.

Wyjaśnienie:

  • rz0: Dane wejściowe pisane małymi literami.
  • @Grz0: Usuń wszystkie znaki niealfabetyczne.
  • .:@Grz0): Wygeneruj wszystkie podciągi.
  • +k.:@Grz0): Dodaj pusty ciąg.
  • f ... +k.:@Grz0): Filtruj te ciągi.
  • -T<G7: Filtruj każdy ciąg pod kątem znaków niemuzycznych.
  • !-T<G7: Neguj wynik. Dzieje się tak Truewtedy i tylko wtedy, gdy struna ma charakter muzyczny.
  • f!-T<G7+k.:@Grz0): Odfiltruj struny muzyczne.
  • ef!-T<G7+k.:@Grz0): Weź ostatni taki ciąg. .:sortuje podciągi według rozmiaru, więc jest to również najdłuższy podciąg muzyczny.
  • Jef!-T<G7+k.:@Grz0): Przypisz wynik do J.
  • pdJ: Drukuj J, dspacją, jako znak końcowy.
  • lJ: Następnie wydrukuj długość J.

2

Ruby, 83 75 znaków

Dość oczywiste.

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

Wykorzystuje fakt, że Ruby może dzielić łańcuchy na regex ( .split(/[^a-g]/)).


1

Perl, 58

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

Posługiwać się:

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

lub

$ 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

Java, 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;}}}

Rozszerzony:

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 98 bajtów

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

Niegolfowane + wyjaśnienie:

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

Sugestie są mile widziane!

Uwaga: Dane wyjściowe są teraz wieloznaczne, co jest dozwolone na podstawie edycji OP. To zaoszczędziło 4 bajty.


0

golflua , 84 85 84 bajtów

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

Najpierw wymuszam małe litery, następnie usuwam spacje ze znaków niebędących literami, a następnie usuwam wszystkie niemuzyczne litery z wejścia (standardowe wejście). Następnie skanuję każde pozostałe słowo i porównuję jego długość przed wypisaniem największej i długiej (standardowej). Prawdopodobnie istnieje krótszy sposób wykonania pętli, ale w tej chwili mam to.

Byłby nie golfowym kodem 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.