Temukan substring musik terlama


9

Sebuah tali musik adalah string yang dapat dimainkan pada keyboard piano.

Bagi kita yang tidak dipaksa untuk belajar piano sebagai anak-anak, inilah keyboardnya.

piano

Jadi senar feed a dead cabbageadalah senar musik karena setiap huruf sesuai dengan salah satu dari ini.

Tantangan Anda adalah menulis program yang mengambil string sebagai masukan dari STDIN, dan menemukan substring musik terlama. Maka program Anda harus mencetak substring, dan panjangnya. Berikut adalah beberapa contoh input / output.

Input: "PAKAN SAYA! Aku lapar!"

Keluaran: pakan 4


Input: Tidak, tidak, tidak, musistrin!

Ouput: 0


Memasukkan: "A **bad** !!!fAd82342"

Keluaran: abadfad 7


Input: "Golf yang bagus!"

Output: dg 2

Aturan

  • Output Anda mungkin huruf besar atau kecil, tetapi tidak boleh ada tanda baca atau spasi.

  • Akan ada huruf besar dan tanda baca dalam string input, tetapi ini tidak mempengaruhi apakah substring dianggap "musikal" atau tidak.

  • Harus ada ruang antara substring musikal, dan angka.


1
Program lengkap saja, tidak ada fungsi?
Alex A.

@ Alex ya, program lengkap.
James

Bisakah output menjadi case campuran?
nderscore

@nderscore ya, bisa jadi.
James

Jawaban:


4

Pyth, 25 23 byte

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

2 byte disimpan berkat @Jakube.

Demonstrasi. Uji harness.

Penjelasan:

  • rz0: Input, dalam huruf kecil.
  • @Grz0: Strip setiap karakter non-alfabet.
  • .:@Grz0): Hasilkan semua substring.
  • +k.:@Grz0): Tambahkan string kosong.
  • f ... +k.:@Grz0): Filter lebih dari string ini.
  • -T<G7: Saring setiap string untuk karakter non musik.
  • !-T<G7: Negasikan hasilnya. Ini adalah Truejika dan hanya jika senarnya adalah musikal.
  • f!-T<G7+k.:@Grz0): Saring string musik.
  • ef!-T<G7+k.:@Grz0): Ambil string yang terakhir. .:memesan substring berdasarkan ukuran, jadi ini juga substring musik terlama.
  • Jef!-T<G7+k.:@Grz0): Tetapkan hasilnya ke J.
  • pdJ: Cetak J, dengan d, spasi, sebagai karakter akhir.
  • lJ: Lalu, cetak panjangnya J.

2

Ruby, 83 75 karakter

Cukup jelas.

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

Mengambil keuntungan dari kenyataan bahwa Ruby dapat membagi string pada regex ( .split(/[^a-g]/)).


1

Perl, 58

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

Menggunakan:

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

atau

$ 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

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

Diperluas:

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 byte

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

Penjelasan + tidak dikumpulkan:

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

Saran dipersilahkan!

Catatan: Outputnya sekarang adalah case campuran, yang diizinkan per edit OP. Ini menyimpan 4 byte.


0

golflua , 84 85 84 byte

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

Saya pertama-tama memaksa huruf kecil, kemudian menghapus spasi karakter non-huruf, kemudian menghapus semua huruf non-musik pada input (stdin). Saya kemudian memindai setiap kata yang tersisa dan membandingkan panjangnya sebelum menghasilkan yang terbesar dan panjang (stdout). Mungkin ada cara yang lebih pendek untuk melakukan loop, tetapi saat ini adalah apa yang saya dapatkan.

Kode Lua yang ungolfed akan menjadi

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.