En uzun müzikal alt dizeyi bulun


9

Bir müzikal dize bir piyano klavyede çalınabilir herhangi bir dizedir.

Piyanoyu çocuk olarak öğrenmeye zorlanmayanlarımız için klavyenin görünüşü şöyledir.

piyano

Dize feed a dead cabbagemüzikal bir dizedir, çünkü her harf bu notlardan birine karşılık gelir.

Zorluğunuz, bir dizeyi STDIN'den girdi olarak alan ve en uzun müzikal alt dizeyi bulan bir program yazmaktır. Ardından programınız alt dizeyi ve uzunluğunu yazdırmalıdır. İşte bazı örnek girişler / çıkışlar.

Girdi: "BESLEME! Açım!"

Çıktı: besleme 4


Girdi: Hayır hayır hayır, musistrin yok!

Çıkış: 0


Giriş: "A **bad** !!!fAd82342"

Çıktı: abadfad 7


Girdi: "Golf iyi!"

Çıktı: dg 2

kurallar

  • Çıktınız büyük veya küçük olabilir, ancak noktalama işareti veya boşluk olmamalıdır.

  • Giriş dizesinde büyük harf ve noktalama işaretleri bulunacaktır, ancak bu bir alt dizenin "müzikal" olarak kabul edilip edilmeyeceğini etkilemez.

  • Müzikal alt dize ve sayı arasında bir boşluk olmalıdır.


1
Yalnızca tam programlar, işlev yok mu?
Alex A.

@AlexA evet, tam program.
James

Çıktı karışık olabilir mi?
nderscore

@nderscore evet, olabilir.
James

Yanıtlar:


4

Pyth, 25 23 bayt

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

@ Jakube sayesinde 2 bayt kaydedildi.

Gösteri. Kablo demetini test edin.

Açıklama:

  • rz0: Küçük harfle giriş.
  • @Grz0: Alfabetik olmayan karakterleri kaldırın.
  • .:@Grz0): Tüm alt dizeleri oluşturur.
  • +k.:@Grz0): Boş dizeye ekleyin.
  • f ... +k.:@Grz0): Bu dizeleri filtreleyin.
  • -T<G7: Her dizeyi müzikal olmayan karakterler için filtreleyin.
  • !-T<G7: Sonucu ekleyin. Bu, Trueancak telin müzikal olmasıydı.
  • f!-T<G7+k.:@Grz0): Müzik dizelerini filtreleyin.
  • ef!-T<G7+k.:@Grz0): Bu son dizeyi al. .:alt dizeleri boyuta göre sıralar, bu da en uzun müzikal alt dize.
  • Jef!-T<G7+k.:@Grz0): Sonucu şuraya atayın J.
  • pdJ: Bitiş karakteri olarak boşlukla Jbirlikte yazdırın d.
  • lJ: Ardından, uzunluğunu yazdırın J.

2

Ruby, 83 75 karakter

Oldukça açıklayıcı.

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

Ruby'nin dizeleri regex ( .split(/[^a-g]/)) üzerinde bölebildiği gerçeğinden yararlanır .


1

Perl, 58

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

kullanın:

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

veya

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

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

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 bayt

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

Ungolfed + açıklaması:

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

Öneriler bekliyoruz!

Not: Çıktı artık OP'nin düzenlemesine göre izin verilen karışık durumdur. Bu 4 bayt tasarruf etti.


0

golflua , 84 85 84 bayt

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

Ben ilk kuvvet küçük, daha sonra şerit boşluk harf olmayan karakterleri, ardından girişi (stdin) üzerinde olmayan tüm müzikal harfleri çıkarın. Daha sonra kalan her kelimeyi tarar ve en büyük ve uzunluğu (stdout) çıkarmadan önce uzunluğunu karşılaştırırım. Döngüyü yapmanın muhtemelen daha kısa bir yolu var, ama şu anda sahip olduğum şey bu.

Çözülmemiş bir Lua kodu

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.