Last active
December 16, 2015 23:29
-
-
Save RoxasShadow/5514148 to your computer and use it in GitHub Desktop.
Scrivere un programma che legga da tastiera due interi N e K e una sequenza di N stringhe e che stampi le K stringhe più frequenti in essa contenute. Queste K stringhe devono essere stampate in ordine lessicografico.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
=begin | |
#Scrivere un programma che legga da tastiera due interi N e K e una sequenza di N stringhe e che stampi le K stringhe più frequenti in essa contenute. Queste K stringhe devono essere stampate in ordine lessicografico. | |
Si può assumere che: | |
- non esistano due stringhe con la stessa frequenza; | |
- il valore di K sia minore o uguale al numero di stringhe distinte; | |
- le stringhe contengono soltanto caratteri alfanumerici (a − z minuscoli e maiuscoli o numeri, nessuno spazio o punteggiatura) e sono lunghe al più 100 caratteri ciascuna. | |
Input: | |
- la prima riga contiene la dimensione N dell'array; | |
- la seconda stringa contiene il valore K, che indica il numero di stringhe più frequenti da selezionare | |
- le righe successive contengono gli elementi dell'array, una stringa per riga. | |
Output: | |
Le K stringhe più frequenti, ordinate lessicograficamente, stampate una per riga. | |
=end | |
class Array | |
def alphanumeric? | |
self.each { |s| return false unless s.match(/^[[:alpha:]]+$/) } | |
return true | |
end | |
def length_overflow?(n) | |
self.each { |s| return true if s.length > n } | |
return false | |
end | |
def has_duplicates? | |
occurrency = Hash.new(0) | |
self.each { |s| occurrency[s] += 1 } | |
return occurrency.values.uniq.length != occurrency.values.length | |
end | |
def most_frequent(n) | |
occurrency = Hash.new(0) | |
self.each { |s| occurrency[s] += 1 } | |
occurrency.sort_by { |s, n| !n }.last(n).sort_by { |s, n| n } | |
end | |
end | |
#n = 6 | |
#k = 2 | |
#strings = [ 'minnie', 'pluto', 'paperino', 'pluto', 'paperino', 'pluto' ] | |
print "n = " | |
n = gets.to_i | |
print "k = " | |
k = gets.to_i | |
strings = [].tap { |ary| n.times { |i| print "string ##{i+1} = "; ary << gets.chomp } } | |
abort 'k must be <= n' unless k <= n | |
abort 'strings must be [a-zA-Z0-9]' unless strings.alphanumeric? | |
abort 'strings length must be < 100' if strings.length_overflow? 100 | |
abort 'strings with same frequency not allowed' if strings.has_duplicates? | |
p strings.most_frequent(k) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment