2014-09-01 33 views
6

Tôi đang cố gắng tạo một chương trình Ruby đếm số lần hai chữ cái xuất hiện cùng nhau. Đây là những gì được viết trong file tôi đang đọc:Đếm số lần hai chữ cái xuất hiện cùng nhau

hola 
chau 

Và đây là những gì tôi đang cố gắng để có được:

ho;ol;la;ch;ha;au; 
1;1;1;1;1;1; 

tôi không thể làm cho nó hoạt động đúng. Đây là mã của tôi cho đến nay:

file = File.read(gets.chomp) 
todo = file.scan(/[a-z][a-z]/).each_with_object(Hash.new(0)) { 
    |a, b| b[a] += 1 
} 

keys = '' 
values = '' 

todo.each_key { 
    |key| keys += key + ';' 
} 
todo.each_value { 
    |value| values += value.to_s + ';' 
} 

puts keys 
puts values 

Đây là kết quả tôi nhận được:

ho;la;ch;au; 
1;1;1;1; 

Tại sao tôi không nhận được mọi sự kết hợp của các nhân vật? Tôi nên quảng cáo gì với regex của mình để nó sẽ tính mọi kết hợp của các ký tự?

Trả lời

9

Vì các ký tự bị chồng chéo, bạn cần sử dụng một cái nhìn để nắm bắt các ký tự chồng chéo.

(?=([a-z][a-z])) 

DEMO

+1

Rất có tính hướng dẫn, Avinash. Trước đây tôi chưa từng thấy một nhóm chụp bên trong một nhóm nhìn chung. Rất mạnh. –

+0

Thay vào đó, bạn có thể sử dụng cái nhìn tích cực phía sau (? <= ([A-z] [a-z])) ', mà bạn đã ám chỉ trong một nhận xét mà bạn đã xóa. Tôi nghĩ nó xứng đáng được đề cập đến. –

2

Đây là một cách.

def char_pairs(str) 
    str.split(/\s+/).flat_map { |w| w.chars.each_cons(2).map(&:join) } 
        .each_with_object({}) { |e,h| h[e] = (h[e] ||= 0) + 1 } 
end 

char_pairs("hello jello") 
    #=> {"he"=>1, "el"=>2, "ll"=>2, "lo"=>2, "je"=>1} 

char_pairs("hello yellow jello") 
    #=> {"he"=>1, "el"=>3, "ll"=>3, "lo"=>3, "ye"=>1, "ow"=>1, "je"=>1} 

Có hàm băm, dễ dàng chuyển đổi nó sang bất kỳ định dạng đầu ra nào bạn muốn.

Các vấn đề liên quan