# Gemstones

See the original problem on HackerRank.

## Solutions

For each possible character, we can check if it’s present in all rocks.

A Python solution by Yuri Valentini.

  1 2 3 4 5 6 7 8 9 10 11  import sys from functools import reduce n = int(input().strip()) rock = [] rock_i = 0 for rock_i in range(n): rock_t = str(input().strip()) rock.append(frozenset(rock_t)) inters = reduce((lambda a,b: a & b), rock) print(len(inters)) 

Another one:

 1  print(len(set.intersection(*[set(input()) for _ in range(int(input()))]))) 

Another one in C#:

 1 2 3 4  Console.WriteLine( Enumerable.Range(0,int.Parse(Console.ReadLine())). Select(_ => Console.ReadLine().AsEnumerable()). Aggregate(Enumerable.Intersect).Count()); 

Another one in C++:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  int N; cin >> N; string s; map> occ; for (auto i=0; i> s; for (auto c : s) { if (occ[c].empty() || occ[c].back() != i) occ[c].push_back(i); } } cout << count_if(begin(occ), end(occ), [&](const pair>& p){ return p.second.size() == N; }); 

Alternative solution by Alessandro Pezzato

This read each character from input one by one, only once. It uses two array of length 26, one to flag characters found in a line, the other to count in how many lines each character has been set.

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  int main() { int n; scanf("%d", &n); char c; getchar(); int f; int e; memset(f, 0, sizeof(f)); for (int i = 0; i != n; ++i) { memset(e, 0, sizeof(e)); /* Read all the string once, flag character when found */ while (1) { c = getchar(); if (c == '\n' || c == EOF) break; e[c - 'a'] |= 1; } /* Increment count of each found character */ for (int i = 0; i != 26; ++i) { f[i] += e[i]; } } int count = 0; for (int i = 0; i != 26; ++i) { count += f[i] == n; } printf("%d", count); } 
We've worked on this challenge in these gyms: modena  padua  milan  turin