Tìm chuỗi con âm nhạc dài nhất


9

Một chuỗi âm nhạc là bất kỳ chuỗi nào có thể được chơi trên bàn phím piano.

Đối với những người trong chúng ta không bắt buộc phải học piano khi còn nhỏ, đây là bàn phím trông như thế nào.

đàn piano

Vì vậy, chuỗi feed a dead cabbagelà một chuỗi âm nhạc bởi vì mỗi chữ cái tương ứng với một trong những lưu ý này.

Thử thách của bạn là viết một chương trình lấy một chuỗi làm đầu vào từ STDIN và tìm chuỗi con âm nhạc dài nhất. Sau đó, chương trình của bạn phải in chuỗi con và độ dài của nó. Dưới đây là một số mẫu đầu vào / đầu ra.

Đầu vào: "FEED ME! Tôi đói!"

Đầu ra: thức ăn 4


Đầu vào: Không không không, không có musistrin!

Ouput: 0


Đầu vào: "A **bad** !!!fAd82342"

Đầu ra: abadfad 7


Đầu vào: "Chơi golf tốt!"

Đầu ra: dg 2

Quy tắc

  • Đầu ra của bạn có thể là chữ hoa hoặc chữ thường, nhưng không được có dấu câu hoặc dấu cách.

  • Sẽ viết hoa và chấm câu trong chuỗi đầu vào, nhưng điều này không ảnh hưởng đến việc một chuỗi con có được coi là "âm nhạc" hay không.

  • Phải có một khoảng cách giữa chuỗi con âm nhạc và số.


1
Chỉ toàn chương trình, không có chức năng?
Alex A.

@AlexA có, chương trình đầy đủ.
James

Đầu ra có thể được trộn lẫn trường hợp?
nderscore

@nderscore vâng, nó có thể.
James

Câu trả lời:


4

Bình thường, 25 23 byte

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

Lưu 2 byte nhờ @Jakube.

Trình diễn. Khai thác thử nghiệm.

Giải trình:

  • rz0: Đầu vào, viết thường.
  • @Grz0: Loại bỏ bất kỳ ký tự không chữ nào.
  • .:@Grz0): Tạo tất cả các chuỗi con.
  • +k.:@Grz0): Thêm vào chuỗi trống.
  • f ... +k.:@Grz0): Lọc qua các chuỗi này.
  • -T<G7: Lọc từng chuỗi cho các ký tự không âm nhạc.
  • !-T<G7: Phủ định kết quả. Đây là Truenếu và chỉ khi chuỗi là âm nhạc.
  • f!-T<G7+k.:@Grz0): Lọc ra các chuỗi âm nhạc.
  • ef!-T<G7+k.:@Grz0): Lấy chuỗi cuối cùng như vậy. .:đặt hàng các chuỗi con theo kích thước, vì vậy đây cũng là chuỗi con âm nhạc dài nhất.
  • Jef!-T<G7+k.:@Grz0): Gán kết quả cho J.
  • pdJ: In J, với d, khoảng trắng, là ký tự kết thúc.
  • lJ: Sau đó, in độ dài của J.

2

Ruby, 83 75 ký tự

Khá tự giải thích.

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

Lợi dụng thực tế là Ruby có thể phân tách chuỗi trên regex ( .split(/[^a-g]/)).


1

Perl, 58

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

Sử dụng:

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

hoặc là

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

Mở rộng:

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)

Ungolfed + giải thích:

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

Đề nghị được chào đón!

Lưu ý: Đầu ra bây giờ là trường hợp hỗn hợp, được phép theo chỉnh sửa của OP. Điều này đã lưu 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)

Trước tiên tôi buộc chữ thường, sau đó loại bỏ khoảng trắng các ký tự không phải chữ cái, sau đó xóa tất cả các chữ cái không có nhạc trên đầu vào (stdin). Sau đó tôi quét qua từng từ còn lại và so sánh độ dài của nó trước khi xuất ra từ lớn nhất và độ dài (stdout). Có lẽ có một cách ngắn hơn để thực hiện vòng lặp, nhưng tại thời điểm này đây là những gì tôi đã có.

Một mã Lua không được mã hóa sẽ là

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.