Finden Sie den längsten musikalischen Teilstring

9

Eine Musiksaite ist eine beliebige Saite, die auf einer Klaviertastatur gespielt werden kann.

Für diejenigen von uns, die als Kinder nicht gezwungen waren, Klavier zu lernen, sieht die Tastatur folgendermaßen aus.

Klavier

Die Saite feed a dead cabbageist also eine musikalische Saite, weil jeder einzelne Buchstabe einem dieser Nots entspricht.

Ihre Herausforderung besteht darin, ein Programm zu schreiben, das eine Zeichenfolge als Eingabe von STDIN verwendet und die längste musikalische Teilzeichenfolge findet. Dann muss Ihr Programm den Teilstring und seine Länge drucken. Hier sind einige Beispieleingänge / -ausgänge.

Eingabe: "FÜTTER MICH! Ich habe Hunger!"

Ausgabe: Vorschub 4


Eingabe: Nein, nein, nein, kein Musistrin!

Ausgabe: 0


Eingang: "A **bad** !!!fAd82342"

Ausgabe: abadfad 7


Eingabe: "Gutes Golfen!"

Ausgabe: dg 2

Regeln

  • Ihre Ausgabe kann in Groß- oder Kleinschreibung erfolgen, es dürfen jedoch keine Satzzeichen oder Leerzeichen vorhanden sein.

  • Die Eingabezeichenfolge wird groß geschrieben und interpunktiert. Dies hat jedoch keinen Einfluss darauf, ob eine Teilzeichenfolge als "musikalisch" eingestuft wird oder nicht.

  • Zwischen dem musikalischen Teilstring und der Nummer muss ein Leerzeichen stehen.

James
quelle
1
Nur vollständige Programme, keine Funktionen?
Alex A.
@AlexA ja, volles Programm.
James
Kann die Ausgabe in Groß- und Kleinschreibung erfolgen?
Nderscore
@nderscore ja, das kann sein.
James

Antworten:

4

Pyth, 25 23 Bytes

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

2 Bytes dank @Jakube gespeichert.

Demonstration. Kabelbaum prüfen.

Erläuterung:

  • rz0: Die Eingabe in Kleinbuchstaben.
  • @Grz0: Entfernen Sie alle nicht alphabetischen Zeichen.
  • .:@Grz0): Generiere alle Teilzeichenfolgen.
  • +k.:@Grz0): Fügen Sie die leere Zeichenfolge hinzu.
  • f ... +k.:@Grz0): Filtern Sie über diese Zeichenfolgen.
  • -T<G7: Filtern Sie jede Zeichenfolge nach nicht musikalischen Zeichen.
  • !-T<G7: Negiere das Ergebnis. Dies ist Truegenau dann der Fall, wenn die Saite musikalisch war.
  • f!-T<G7+k.:@Grz0): Filtern Sie die Musiksaiten heraus.
  • ef!-T<G7+k.:@Grz0): Nehmen Sie die letzte solche Zeichenfolge. .:ordnet Teilzeichenfolgen nach Größe an, daher ist dies auch die längste musikalische Teilzeichenfolge.
  • Jef!-T<G7+k.:@Grz0): Ordnen Sie das Ergebnis zu J.
  • pdJ: Drucken Sie Jmit dLeerzeichen als Endzeichen.
  • lJ: Dann drucken Sie die Länge von J.
isaacg
quelle
2

Ruby, 83 75 Zeichen

Ziemlich selbsterklärend.

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

Nutzt die Tatsache, dass Ruby Strings auf Regex ( .split(/[^a-g]/)) teilen kann .

Türknauf
quelle
1

Perl, 58

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

Verwenden:

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

oder

$ 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
quelle
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;}}}

Erweitert:

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
quelle
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
Ming-Tang
quelle
0

R 98 94 Bytes

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

Ungolfed + Erklärung:

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

Vorschläge sind willkommen!

Hinweis: Die Ausgabe erfolgt jetzt in Groß- und Kleinschreibung, was gemäß der Bearbeitung des OP zulässig ist. Dies sparte 4 Bytes.

Alex A.
quelle
0

Golflua , 84 85 84 Bytes

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

I erste Kraft Klein, dann strippen Räume nicht-Buchstabenzeichen entfernen dann alle nichtmusikalischen Buchstaben auf dem Eingang (stdin). Ich scanne dann jedes verbleibende Wort durch und vergleiche seine Länge, bevor ich das größte und die größte Länge (stdout) ausgebe. Es gibt wahrscheinlich einen kürzeren Weg, um die Schleife zu machen, aber im Moment ist es das, was ich habe.

Ein ungolfed Lua Code wäre

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
Kyle Kanos
quelle