Go: package main

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

var scanner = bufio.NewScanner(os.Stdin)

func nextString() string {
	scanner.Scan()
	return scanner.Text()
}

func incrementByte(b byte) byte {
	if b >= 97 && b < 122 {
		return b + 1
	} else if b == 122 {
		return 97
	}
	return b
}

func main() {
	scanner.Split(bufio.ScanLines)

	for {
		line := nextString()
		if len(line) == 0 {
			break
		}
		for i := 0; i <= 26; i++ {
			decoded := []byte{}
			for j := 0; j < len(line); j++ {
				decoded = append(decoded, incrementByte(line[j]))
			}
			line = string(decoded)
			if strings.Contains(line, "the") || strings.Contains(line, "this") || strings.Contains(line, "that") {
				fmt.Println(line)
				break
			}
		}
	}
}

C++: #include <stdio.h>
#include <string.h>
int main(void){
	int i = 0;
	int j;
	int k = 0;
	char s[41][81] = {};

	while (scanf("%s ", s[i]) != EOF)
		i++;

		while (1) {
			for (j = 0; j < i; j++)
				if (strcmp(s[j], "the") == 0 || strcmp(s[j], "this") == 0 || strcmp(s[j], "that") == 0)
					break;

			if (strcmp(s[j], "the") == 0 || strcmp(s[j], "this") == 0 || strcmp(s[j], "that") == 0)
				break;
			if (strcmp(s[j--], "the.") == 0 || strcmp(s[j], "this.") == 0 || strcmp(s[j], "that.") == 0)
				break;

			for (j = 0; j < i; j++) {
				k = 0;
				while (s[j][k]){
					if (s[j][k] == 'z')
						s[j][k] = 'a';
					else if (s[j][k] == '.')
						;
					else s[j][k]++;
					k++;
				}
			}
		}

	for (j = 0; j < i; j++)
		printf("%s ", s[j]);

	putchar('\n');

	return 0;
}

C++: #include <iostream>
#include <string>

#define SIZE 3

using namespace std;

int main() {
	string str, value[SIZE] = {"the", "this", "that"};
	bool judge;
	while (getline(cin, str)) {
		judge = false;
		for (;;) {
			for (int j = 0; j < str.size(); j++) {
				if ('a' <= str[j] && str[j] <= 'y') {
					str[j]++;
				}
				else if (str[j] == 'z') {
					str[j] = 'a';
				}
			}

			for (int j = 0; j < SIZE; j++) {
				if (str.find(value[j]) != str.npos) {
					judge = true;
				}
			}

			if (judge) {
				cout << str << endl;
				break;
			}
		}
	}

	return 0;
}

C++: #include <iostream>
#include <list>
using namespace std;

int main(void)
{
    list<string> input;
    int dec = 0;
    string s;
    while (cin >> s)
    {
        input.push_back(s);

        if (dec == 0)
        {
            int d;
            d = s[0] - 't';

            string t = "";
            for (int i = 0; i < s.length(); i++)
                t += s[i] - d;

            if (t == "the" || t == "this" || t == "that")
                dec = d;
        }
    }
    for (list<string>::iterator i = input.begin(); i != input.end(); i++)
    {
        string out = *i;
        for (int j = 0; j < out.length(); j++)
        {
            if (out[j] != '.')
            {
                cout << (char)(out[j] - dec);
            }
            else
            {
                cout << '.';
            }
        }
        cout << ' ';
    }

    cout << endl;
    return 0;
}

C++: #include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>

//メイン関数
int main()
{
  char str[81];
   while(fgets(str,sizeof(str),stdin)!=NULL){
  // while(scanf("%[^/n]s",str)!=EOF){

    //strstrで探索
  if((strstr(str,"the")) || (strstr(str,"this")) || (strstr(str,"that"))){
    puts(str);
    continue;
  }
  int len=strlen(str);
    for(int i=1;i<=26;i++){
      for(int j=0;j<len;j++){
	if(str[j]>='a' && str[j]<='z'){       
	  str[j]++;
	  if(str[j]=='{'){
	    str[j]='a';
	  }
	}
      }
      //strstrで探索
      if((strstr(str,"the")) || (strstr(str,"this")) || (strstr(str,"that")))break;
    }
    printf("%s",str);
  }
   return 0;
}

C++: //include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <queue>
#include <iterator>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>

using namespace std;

//conversion
//------------------------------------------
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

//math
//-------------------------------------------
template<class T> inline T sqr(T x) {return x*x;}

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef long long LL;

//container util
//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())

//repetition
//------------------------------------------
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

//constant
//--------------------------------------------
const double EPS = 1e-10;
const double PI  = acos(-1.0);

//clear memory
#define CLR(a) memset((a), 0 ,sizeof(a))

//debug
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

int gcd(int a, int b){
   int tmp;
   while(a%b==0){
      tmp=a%b;
      a=b;
      b=tmp;
   }
}

int lcm(int a,int b){
   return a*b/gcd(a,b);
}

bool prime_number(int n){
   if(n < 2){
      return false;
   }
   else if(n == 2){
      return true;
   }
   if(n % 2 == 0){
      return false;
   }
   for(int i=3;i<=n/i;i+=2){
      if(n % i == 0) return false;
      return true;
   }
}

int main(){
   vector<string> a;
   string b;
   int x=0;

   while(cin>>b){
      if(!x){
         if(b.size()==3&&b[0]-'t'==b[1]-'h'&&b[1]-'h'==b[2]-'e')
            x=b[0]-'t';
         else if(b.size()==4&&b[0]-'t'==b[1]-'h'&&b[1]-'h'==b[2]-'i'
            &&b[2]-'i'==b[3]-'s') x=b[0]-'t';
         else if(b.size()==4&&b[0]-'t'==b[1]-'h'&&b[1]-'h'==b[2]-'a'
            &&b[2]-'a'==b[3]-'t') x=b[0]-'t';     
      }
      a.PB(b);
   }
   REP(i,a.size()){
      REP(j,a[i].size()) if(a[i][j]>='a'&&a[i][j]<='z') a[i][j]-=x;
   }
   REP(i,a.size()){
      cout << a[i];
      if(i!=a.size()-1) cout << " ";
   }
   cout << endl;
   return 0;
}

C++: #include <iostream>
#include <string>
#include <cassert>
using namespace std;

bool IncludeKeyWords(const string& Sentence)
{
	if(Sentence.find("the")  <= 80) return true;
	if(Sentence.find("this") <= 80) return true;
	if(Sentence.find("that") <= 80) return true;
	return false;
}

string OneShift(string Sentence)
{
	for(int i = 0; i < Sentence.size(); i++){
		if(97 < Sentence[i] && Sentence[i] < 123){
			Sentence[i] --;
		}else if(Sentence[i] == 97){
			Sentence[i] = 122;
		}
	}
	return Sentence;
}

string Decrypt(string Sentence)
{
	int RoopCount = 0;
	while(IncludeKeyWords(Sentence) == false){
		assert(RoopCount < 26);
		Sentence = OneShift(Sentence);
		RoopCount++;
	}
	return Sentence;
}

int main()
{
	while(true){
		string Sentence;
		getline(cin, Sentence);
		if(cin.eof() == true) break;
		string DecryptedSentence = Decrypt(Sentence);
		cout << DecryptedSentence << endl;
	}
	return 0;
}