Skip to content

Instantly share code, notes, and snippets.

@RoxasShadow
Last active December 16, 2015 23:29
Show Gist options
  • Save RoxasShadow/5514148 to your computer and use it in GitHub Desktop.
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.
#!/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