// Safaa_Eek 305073363 Enas_Bisharat 200686129
package main
import (
"fmt"
)
//we define an array of elems, each elem is a struct and has two fields:
//one for the letter and the second is for the instances.
type elem struct {
index byte
n int
}
//this function recieve "byte"(a letter)and return the lower case of the letter
func ToLower( c byte) byte{
if c >= 'A' && c<='Z'{
return c-'A'+'a'
}
return c
}
//this function recieve "byte"(a letter)and return the upper case of the letter
func ToUpper( c byte) byte{
if c >= 'a' && c<='z'{
return c-'a'+'A'
}
return c
}
func main() {
var c byte
var count [26]elem
var temp elem
//define the array of elems, the index field has the letter,(sorted
//from a to z) and the instances field is 0 at the beggining and then
//it will be the number of the instances of each letter
for i := 0; i<26; i++ {
count[i].index = byte('a'+i)
count[i].n = 0
}
//recieve letters until "enter" is recieved for the first time
for {
fmt.Scanf("%c",&c)
if c == '\n' { break }
c = ToLower(c)
//get the lower case of the letter and we see if it is legal
//(between a and z)
if c>='a' && c<='z' {
//update our array in the right place.. we add 1 the instances field
count[c-'a'].n +=1
}
}
//and now we sort our array, by finding the maximum in each iteration
//and put it in the right place (replace elems)
for i:=0; i<26 ; i++ {
for j:=i+1; j<26 ; j++{
if count[i].n < count[j].n {
temp = count[i]
count[i]=count[j]
count[j]=temp
}
}
}
//print the unempty places in our array(the letters that have been recieved)
for i:=0 ; i<26 ; i++ {
if count[i].n != 0{
fmt.Println(string(count[i].index), "/",string(ToUpper(count[i].index)),
" ", count[i].n)
}
}
}
Ly8gU2FmYWFfRWVrIDMwNTA3MzM2MyBFbmFzX0Jpc2hhcmF0IDIwMDY4NjEyOSAKcGFja2FnZSBtYWluCiAKaW1wb3J0ICgKCSJmbXQiCgkpCgkKLy93ZSBkZWZpbmUgYW4gYXJyYXkgb2YgZWxlbXMsIGVhY2ggZWxlbSBpcyBhIHN0cnVjdCBhbmQgaGFzIHR3byBmaWVsZHM6Ci8vb25lIGZvciB0aGUgbGV0dGVyIGFuZCB0aGUgc2Vjb25kIGlzIGZvciB0aGUgaW5zdGFuY2VzLgp0eXBlIGVsZW0gc3RydWN0IHsKICAgICAgICBpbmRleCBieXRlCiAgICAgICAgbiBpbnQKfQoKLy90aGlzIGZ1bmN0aW9uIHJlY2lldmUgImJ5dGUiKGEgbGV0dGVyKWFuZCByZXR1cm4gdGhlIGxvd2VyIGNhc2Ugb2YgdGhlIGxldHRlciAKZnVuYyBUb0xvd2VyKCBjIGJ5dGUpIGJ5dGV7CgkJaWYgYyA+PSAnQScgJiYgYzw9J1onewoJCQlyZXR1cm4gYy0nQScrJ2EnCgkJfQoJCXJldHVybiBjCn0KCi8vdGhpcyBmdW5jdGlvbiByZWNpZXZlICJieXRlIihhIGxldHRlcilhbmQgcmV0dXJuIHRoZSB1cHBlciBjYXNlIG9mIHRoZSBsZXR0ZXIgCmZ1bmMgVG9VcHBlciggYyBieXRlKSBieXRlewoJCWlmIGMgPj0gJ2EnICYmIGM8PSd6J3sKCQkJcmV0dXJuIGMtJ2EnKydBJwoJCX0KCQlyZXR1cm4gYwoKfSAKIAoKCmZ1bmMgbWFpbigpIHsKICAgICAgICB2YXIgYyBieXRlCiAgICAgICAgdmFyIGNvdW50IFsyNl1lbGVtICAgICAgICAKCQl2YXIgdGVtcCBlbGVtCgkJCgkJLy9kZWZpbmUgdGhlIGFycmF5IG9mIGVsZW1zLCB0aGUgaW5kZXggZmllbGQgaGFzIHRoZSBsZXR0ZXIsKHNvcnRlZCAKCQkvL2Zyb20gYSB0byB6KSBhbmQgdGhlIGluc3RhbmNlcyBmaWVsZCBpcyAwIGF0IHRoZSBiZWdnaW5pbmcgYW5kIHRoZW4gCgkJLy9pdCB3aWxsIGJlIHRoZSBudW1iZXIgb2YgdGhlIGluc3RhbmNlcyBvZiBlYWNoIGxldHRlcgoJCWZvciBpIDo9IDA7IGk8MjY7IGkrKyB7CgkJY291bnRbaV0uaW5kZXggPSBieXRlKCdhJytpKQoJCWNvdW50W2ldLm4gPSAwCgkJfQkKCiAgICAgICAgLy9yZWNpZXZlIGxldHRlcnMgdW50aWwgImVudGVyIiBpcyByZWNpZXZlZCBmb3IgdGhlIGZpcnN0IHRpbWUKICAgIAlmb3IgewoJCWZtdC5TY2FuZigiJWMiLCZjKQoJCWlmIGMgPT0gJ1xuJyB7IGJyZWFrIH0KCQljID0gVG9Mb3dlcihjKQoJCS8vZ2V0IHRoZSBsb3dlciBjYXNlIG9mIHRoZSBsZXR0ZXIgYW5kIHdlIHNlZSBpZiBpdCBpcyBsZWdhbAoJCS8vKGJldHdlZW4gYSBhbmQgeikKCQlpZiBjPj0nYScgJiYgYzw9J3onIHsKCQkvL3VwZGF0ZSBvdXIgYXJyYXkgaW4gdGhlIHJpZ2h0IHBsYWNlLi4gd2UgYWRkIDEgdGhlIGluc3RhbmNlcyBmaWVsZCAKCQkJCWNvdW50W2MtJ2EnXS5uICs9MQkKCQkJCQoJCQl9CgkJfSAgICAgICAgCgkgICAgCgkvL2FuZCBub3cgd2Ugc29ydCBvdXIgYXJyYXksIGJ5IGZpbmRpbmcgdGhlIG1heGltdW0gaW4gZWFjaCBpdGVyYXRpb24gCiAgICAvL2FuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0IHBsYWNlIChyZXBsYWNlIGVsZW1zKSAKCWZvciBpOj0wOyBpPDI2IDsgaSsrIHsKCQlmb3Igajo9aSsxOyBqPDI2IDsgaisrewoJCQlpZiBjb3VudFtpXS5uIDwgY291bnRbal0ubiB7CgkJCQl0ZW1wID0gY291bnRbaV0KCQkJCWNvdW50W2ldPWNvdW50W2pdCgkJCQljb3VudFtqXT10ZW1wCgkJCX0KCQl9Cgl9CQoJLy9wcmludCB0aGUgdW5lbXB0eSBwbGFjZXMgaW4gb3VyIGFycmF5KHRoZSBsZXR0ZXJzIHRoYXQgaGF2ZSBiZWVuIHJlY2lldmVkKQogCWZvciBpOj0wIDsgaTwyNiA7IGkrKyB7CQoJCWlmIGNvdW50W2ldLm4gIT0gMHsJCgkJZm10LlByaW50bG4oc3RyaW5nKGNvdW50W2ldLmluZGV4KSwgIi8iLHN0cmluZyhUb1VwcGVyKGNvdW50W2ldLmluZGV4KSksCgkJCSIgICAgIiwgY291bnRbaV0ubikKCQl9Cgl9Cn0K