Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
		"reflect"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	// 上面の色を固定してから、左右方向に回転して一致するものがあるかを調べる
	round := [][]int{
		{1,2,3,4,5,6}, {1,3,5,2,4,6}, {1,4,2,5,3,6}, {1,5,4,3,2,6}, // c1を上面に固定して回転
		{2,6,3,4,1,5}, {2,3,1,6,4,5}, {2,1,4,3,6,5}, {2,4,6,1,3,5}, // c2を上面に固定して回転
		{3,1,2,5,6,4}, {3,2,6,1,5,4}, {3,5,1,6,2,4}, {3,6,5,2,1,4}, // c3を上面に固定して回転
		{4,1,5,2,6,3}, {4,2,1,6,5,3}, {4,5,6,1,2,3}, {4,6,2,5,1,3}, // c4を上面に固定して回転
		{5,1,3,4,6,2}, {5,3,6,1,4,2}, {5,4,1,6,3,2}, {5,6,4,3,1,2}, // c5を上面に固定して回転
		{6,2,4,3,5,1}, {6,3,2,5,4,1}, {6,5,3,4,2,1}, {6,4,5,2,3,1}, // c6を上面に固定して回転

	}
	for scanner.Scan() {
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		cubes := make([][]string, n)
		for i := 0; i < n; i++ {
			scanner.Scan()
			cubes[i] = strings.Split(scanner.Text(), " ")
		}
		check := func(a, b int) bool {
			tmp := make([]string, 6)
			for i := 0; i < 24; i++ {
				for j := 0; j < 6; j++ {
					tmp[j] = cubes[b][round[i][j]-1]
				}
				if reflect.DeepEqual(tmp, cubes[a]) {
					return true
				}
			}
			return false
		}
		tbl := make([]int, n)
		// 全ての組み合わせを調べる
		for i := 0; i < n; i++ {
			if tbl[i] == 1 {
				continue
			}
			for j := i+1; j < n; j++ {
				if check(i, j) {
					tbl[j] = 1
				}
			}
		}
		fmt.Println(sum(tbl))
	}
}

func sum(a []int) int {
	ret := 0
	for _, v := range a {
		ret += v
	}
	return ret
}

C++: #include<stdio.h>
#include<string.h>
#include<math.h>
int main(void)
{
	int a,s[31][7],d[31],f[31],g,h,i,j,k,l,o,x;
	char z[31][7][10];
	while(1){
		scanf("%d",&a);
		if(a==0) break;
		for(i=0;i<a;i++){
			for(j=0;j<6;j++){
				scanf("%s",z[i][j]);
				if(z[i][j][0]=='R') s[i][j]=0;
				if(z[i][j][0]=='Y') s[i][j]=1;
				if(z[i][j][0]=='B') s[i][j]=2;
				if(z[i][j][0]=='M') s[i][j]=3;
				if(z[i][j][0]=='G') s[i][j]=4;
				if(z[i][j][0]=='C') s[i][j]=5;
			}
		}
		for(i=0;i<a;i++) f[i]=0;
		g=0;
		for(i=0;i<a-1;i++){
			if(f[i]==0){
				for(j=i+1;j<a;j++){
					x=0;
					for(o=0;o<6;o++){
						if(s[i][o]!=s[j][o]) break;
						else x++;
					}
					if(x==6){
						f[j]=1;
						g++;
					}
					if(f[j]==0){
						for(k=0;k<4;k++){
							x=0;
							h=s[j][1];
							s[j][1]=s[j][0];
							s[j][0]=s[j][4];
							s[j][4]=s[j][5];
							s[j][5]=h;
							for(l=0;l<4;l++){
								x=0;
								h=s[j][1];
								s[j][1]=s[j][3];
								s[j][3]=s[j][4];
								s[j][4]=s[j][2];
								s[j][2]=h;
								//if(s[i][0]==s[j][0]) for(o=0;o<6;o++) printf("%d %d\n",s[i][o],s[j][o]);
								for(o=0;o<6;o++){
									if(s[i][o]!=s[j][o]) break;
									else x++;
								}
								if(x==6){
									f[j]=1;
									g++;
									break;
								}
							}
							if(f[j]==1) break;
						}
						if(f[j]==0){
							h=s[j][2];
							s[j][2]=s[j][5];
							s[j][5]=s[j][3];
							s[j][3]=s[j][0];
							s[j][0]=h;
							for(l=0;l<4;l++){
								x=0;
								h=s[j][1];
								s[j][1]=s[j][3];
								s[j][3]=s[j][4];
								s[j][4]=s[j][2];
								s[j][2]=h;
								//if(s[i][0]==s[j][0])	for(o=0;o<6;o++) printf("%d %d\n",s[i][o],s[j][o]);
								for(o=0;o<6;o++){
									if(s[i][o]!=s[j][o]) break;
									else x++;
								}
								if(x==6){
									f[j]=1;
									g++;
								}
							}
							h=s[j][2];
							s[j][2]=s[j][0];
							s[j][0]=s[j][3];
							s[j][3]=s[j][5];
							s[j][5]=h;

							if(f[j]==0){
								h=s[j][3];
								s[j][3]=s[j][5];
								s[j][5]=s[j][2];
								s[j][2]=s[j][0];
								s[j][0]=h;
							//	if(s[i][0]==s[j][0])for(o=0;o<6;o++) printf("%d %d\n",s[i][o],s[j][o]);
								for(l=0;l<4;l++){
									x=0;
									h=s[j][1];
									s[j][1]=s[j][3];
									s[j][3]=s[j][4];
									s[j][4]=s[j][2];
									s[j][2]=h;
									for(o=0;o<6;o++){
										if(s[i][o]!=s[j][o]) break;
										else x++;
									}
									if(x==6){
										f[j]=1;
										g++;
									}
								}
								h=s[j][2];
								s[j][2]=s[j][5];
								s[j][5]=s[j][3];
								s[j][3]=s[j][0];
								s[j][0]=h;
							}
						}
					}
				}
			}
		}
		printf("%d\n",g);
	}
	return 0;
}

C++: #include<stdio.h>
char t[30][100];
int main(){
	int a;
	while(scanf("%d",&a),a){
		for(int i=0;i<a;i++)
			for(int j=0;j<6;j++)
				scanf("%s",t[i]+j);
		int ret=0;
		for(int i=0;i<a;i++){
			bool ok=true;
			char p[4];
			p[0]=t[i][1];
			p[1]=t[i][2];
			p[2]=t[i][4];
			p[3]=t[i][3];
			char q[4];
			for(int j=0;j<i;j++){
				if(t[i][0]==t[j][0]){
					q[0]=t[j][1];
					q[1]=t[j][2];
					q[2]=t[j][4];
					q[3]=t[j][3];
				}
				if(t[i][0]==t[j][1]){
					q[0]=t[j][5];
					q[1]=t[j][2];
					q[2]=t[j][0];
					q[3]=t[j][3];
				}
				if(t[i][0]==t[j][2]){
					q[0]=t[j][5];
					q[1]=t[j][4];
					q[2]=t[j][0];
					q[3]=t[j][1];
				}
				if(t[i][0]==t[j][3]){
					q[0]=t[j][5];
					q[1]=t[j][1];
					q[2]=t[j][0];
					q[3]=t[j][4];
				}
				if(t[i][0]==t[j][4]){
					q[0]=t[j][0];
					q[1]=t[j][2];
					q[2]=t[j][5];
					q[3]=t[j][3];
				}
				if(t[i][0]==t[j][5]){
					q[0]=t[j][4];
					q[1]=t[j][2];
					q[2]=t[j][1];
					q[3]=t[j][3];
				}
				for(int k=0;k<4;k++){
					bool OK=true;
					for(int l=0;l<4;l++){
						if(p[l]!=q[(k+l)%4])OK=false;
					}
					if(OK)ok=false;
				}
			}
			if(!ok)ret++;
		}
		printf("%d\n",ret);
	}
}

C++: #include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    while(cin >> n, n){
        vector<vector<string>> v;
        vector<string> c(6);
        for(int j=0; j < n; j++){
            for(int i=0; i< 6; i++){
                cin >> c[i];
            }
            string a, b, d;
            a = c[0].substr(0,1) + c[5].substr(0,1); b = c[1].substr(0,1) + c[4].substr(0,1); d = c[2].substr(0,1) + c[3].substr(0,1);
            vector<string> p(3);
            sort(a.begin(), a.end());
            sort(b.begin(), b.end());
            sort(d.begin(), d.end());
            p[0] = a; p[1] = b; p[2] = d;
            sort(p.begin(), p.end());
            bool is = false;
            for(int i=0; i < v.size(); i++){
                bool b = true;
                for(int j=0; j < 3; j++) if(v[i][j] != p[j])b = false;
                if(b){is = true; break;}
            }
            if(!is)v.push_back(p);
        }
        cout << n-v.size() << endl;
    }
}

C++: #include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    while(cin >> n, n){
        vector<vector<string>> v;
        for(int j=0; j < n; j++){
            vector<string> c(6);
            for(int i=0; i< 6; i++){
                cin >> c[i];
            }
            string a, b, d;
            a = c[0] + c[5]; b = c[1] + c[4]; d = c[2] + c[3];
            sort(a.begin(), a.end());
            sort(b.begin(), b.end());
            sort(d.begin(), d.end());
            vector<string> p(3);
            p[0] = a; p[1] = b; p[2] = d;
            sort(p.begin(), p.end());
            bool is = false;
            for(int i=0; i < v.size(); i++) if(v[i] == p) is = true;
            if(!is)v.push_back(p);
        }
        cout << n-v.size() << endl;
    }
}