Encontre a substring musical mais longa


9

Uma corda musical é qualquer corda que pode ser tocada em um teclado de piano.

Para aqueles de nós que não fomos forçados a aprender piano quando crianças, aqui está a aparência do teclado.

piano

Portanto, a corda feed a dead cabbageé uma corda musical porque cada letra corresponde a um desses pontos.

Seu desafio é escrever um programa que use uma string como entrada do STDIN e encontre a substring musical mais longa. Em seguida, seu programa deve imprimir a substring e seu comprimento. Aqui estão algumas entradas / saídas de amostra.

Entrada: "ME ALIMENTE! Estou com fome!"

Saída: alimentação 4


Entrada: Não, não, não, musistrin!

Ouput: 0


Entrada: "A **bad** !!!fAd82342"

Saída: abadfad 7


Entrada: "Bom golfe!"

Saída: dg 2

Regras

  • Sua saída pode ser maiúscula ou minúscula, mas não deve haver pontuação ou espaços.

  • Haverá letras maiúsculas e pontuação na string de entrada, mas isso não afeta se uma substring é considerada "musical" ou não.

  • Deve haver um espaço entre a subcadeia musical e o número.


11
Somente programas completos, sem funções?
Alex A.

@AlexA sim, programa completo.
James

A saída pode ser mista?
Ndscore # 19/15

@nderscore sim, pode ser.
James

Respostas:


4

Pitão, 25 23 bytes

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

2 bytes salvos graças ao @Jakube.

Demonstração. Equipamento de teste.

Explicação:

  • rz0: A entrada, em minúsculas.
  • @Grz0: Tira todos os caracteres não alfabéticos.
  • .:@Grz0): Gere todas as substrings.
  • +k.:@Grz0): Adicione a string vazia.
  • f ... +k.:@Grz0): Filtre essas strings.
  • -T<G7: Filtre cada sequência para caracteres não musicais.
  • !-T<G7: Negue o resultado. Isto é Truese e somente se a corda foi musical.
  • f!-T<G7+k.:@Grz0): Filtre as cordas musicais.
  • ef!-T<G7+k.:@Grz0): Pegue a última dessas cordas. .:ordena substrings por tamanho, portanto, esse também é o substring musical mais longo.
  • Jef!-T<G7+k.:@Grz0): Atribua o resultado a J.
  • pdJ: Imprime J, com d, espaço, como o caractere final.
  • lJ: Em seguida, imprima o comprimento de J.

2

Ruby, 83 75 caracteres

Bastante auto-explicativo.

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

Aproveita o fato de que Ruby pode dividir cadeias de caracteres em regex ( .split(/[^a-g]/)).


1

Perl, 58

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

Usar:

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

ou

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

Expandido:

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 bytes

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

Ungolfed + explicação:

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

Sugestões são bem-vindas!

Nota: A saída agora está em maiúsculas e minúsculas, o que é permitido pela edição do OP. Isso salvou 4 bytes.


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)

A primeira vez que a força minúsculas, em seguida, tira espaços caracteres que não sejam letras, em seguida, remover todas as letras não musicais na entrada (entrada padrão). Depois, digitalizo cada palavra restante e comparo seu comprimento antes de gerar o maior e o comprimento (stdout). Provavelmente existe uma maneira mais curta de fazer o loop, mas no momento é isso que eu tenho.

Um código Lua não destruído seria

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.