Go: package main

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

var scanner = bufio.NewScanner(os.Stdin)

func cipher(text string, direction int, int_shift int) string {
	shift, offset := rune(int_shift), rune(26)
	runes := []rune(text)
	for index, char := range runes {
		switch direction {
		case 1:
			if char >= 'a' && char <= 'z'-shift || char >= 'A' && char <= 'Z'-shift {
				char = char + shift
			} else if char > 'z'-shift && char <= 'z' || char > 'Z'-shift && char <= 'Z' {
				char = char + shift - offset
			}
		case -1:
			if char >= 'a'+shift && char <= 'z' || char >= 'A'+shift && char <= 'Z' {
				char = char - shift
			} else if char >= 'a' && char < 'a'+shift || char >= 'A' && char < 'A'+shift {
				char = char - shift + offset
			}
		}
		runes[index] = char
	}
	return string(runes)
}

func main() {
	for scanner.Scan() {
		infos := strings.Split(scanner.Text(), " ")
		plain := make([]string, len(infos))
		// fmt.Println(infos)
		Decryption:
			for i := 0; i < 26; i++ {
				for j := range infos {
					plain[j] = cipher(infos[j], 1, i)
				}
				for j := range plain {
					if plain[j] == "this" || plain[j] == "that" || plain[j] == "the" {
						break Decryption
					}
				}
			}
			fmt.Println(strings.Join(plain, " "))
	}
}

C++: #include <iostream>
#include <string>
using namespace std;
int main()
{
	string str;int n=0; bool flag=false;
	getline(cin,str);
	for(int k=0;k<26;k++)
	{
		int i=0;
		for(i=0;i<str.size();i++)
		{
				if(str[i]-'a'<0 || str[i]-'z'>0) continue;
				else
				{
					str[i]++;
					if(str[i]-'z'>0) str[i]-=26;
				}
		};
		string ptr=""; string qtr="";
		for(i=0;i<str.size();i++)
		{
			if(i+4<str.size()) ptr=str.substr(i,4);
			if(i+3<str.size()) qtr=str.substr(i,3);
			if(ptr=="this" || ptr=="that" || qtr=="the") {flag=true; break;}
		};
		if(flag==true) break;
	};
	cout << str << endl ;
}

C++: #include <stdio.h>
#include <math.h>
#include <ctype.h>

char buf[128];

int main(void)
{
	int i, j, flag = 0;
	scanf("%[^\n]s", buf);
	
	for (i = 'a'; i <= 'z' && flag == 0; i++){
		//check
		for (j = 0; j < 80; j++){
			if (buf[j] == 't' && buf[j + 1] == 'h'){
				if ((buf[j + 2] == 'i' && buf[j + 3] == 's') || (buf[j + 2] == 'a' && buf[j + 3] == 't') || (buf[j+2]=='e')){
					//this	that	the
					flag = 1;
				}
			}
		}

		//add 1
		if (flag == 0){
			for (j = 0; j < 80; j++){
				if (isalpha(buf[j])){
					if (buf[j] == 'z'){
						buf[j] = 'a';
					}
					else{
						buf[j]++;
					}
				}
			}
		}
	}

	for (i = 0; i < 80; i++){
		printf("%c", buf[i]);
	}
	return 0;
}

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

void coding(){
  string s;
  int cnt=0;

  while(getline(cin, s)){


    while(true){
      bool flag=false;
      
      for(int i=0;i<s.length();i++){
	string key1 = s.substr(i,3);
	string key2 = s.substr(i,4);
	if(key1 == "the" || key2 == "this" || key2 == "that"){
	  flag = true;
	  break;
	}
      }
      
      if(flag){
	cout << s << endl;
	break;
      }
    
      for(int i=0;i<s.length();i++){
	if(s[i] > 'a' && s[i] < 'z'){
	  s[i] -= 'a';
	  s[i] += 1;
	  s[i] = s[i]%('A'-'a');
	  s[i] += 'a';
	}
      }
    }
  }
}


int main(){
  coding();
}

C++: #include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <algorithm>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;


int main(){
	string tmp;
	string key[] = {"the","this","that"};
	int alfabet;
	bool clearFlag;
	while(getline(cin,tmp)){
		clearFlag = false;
		alfabet = 26;
		while(alfabet--){

			for(string::iterator it = tmp.begin(); it != tmp.end(); it++){
				if(*it == '\n'){
					it = tmp.erase(it);
				}
				if(*it >= 'a' && *it <= 'z'){
					(*it)++;
					if(*it >= 'z'){
						*it = 'a';
					}
				}
			}
			for(int j = 0; j < 3; j++){
				if(tmp.find(key[j]) != string::npos){
					cout << tmp << endl;
					clearFlag = true;
					break;
				}
			}

			if(clearFlag == true){
				break;
			}

		}

	}
	return 0;
}

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

int main(){
	char input[100],str[50][100];
	const char cmp[3][5]={"that","this","the"};
	int pos=0,last_pos=0,i,j,k,diff,n;
	bool flag;

		while(fgets(input,100,stdin)!=NULL){;
		for(i=0;input[i]!='\0';i++){
			if(input[i]==' ' || input[i]=='.' || input[i]=='\n'){
				for(j=last_pos;j<i;j++){
					str[pos][j-last_pos]=input[j];
				}
				str[pos][j-last_pos]='\0';
				pos++;
				last_pos=i+1;
			}
		}

		n=0;
		flag=false;
		while(++n){
			for(i=0;i<pos;i++){
				for(j=0;str[i][j]!='\0';j++){
					str[i][j]+=1;
					if('a'>str[i][j]){
						str[i][j]+='z'-'a'+1;
					}else if('z'<str[i][j]){
						str[i][j]+='a'-'z'-1;
					}
				}
			}

			for(i=0;i<pos;i++){
				for(j=0;j<3;j++){
					if(strcmp(str[i],cmp[j])==0){
						flag=true;
                        j=3;i=pos;
					}
				}
			}
			if(flag) break;
		}

		int temp;
		for(i=0;input[i]!='\0';i++){
			if(input[i]!='.' && input[i]!=' ' && input[i]!='\n'){
				temp=input[i]+n;
				if('a'>temp){
					input[i]=temp+'z'-'a'+1;
				}else if('z'<temp){
					input[i]=temp+'a'-'z'-1;
				}else{
					input[i]=temp;
				}
			}
		}
		printf("%s",input);
		}

	return 0;
}

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

using namespace std;

string str;

bool caesar()
{
	bool flag = false;

	for (int i=0; i<(int)str.size() - 2; i++)
	{
		if(str[i] == 't' && str[i+1] == 'h') {
			if(str[i+2] == 'e' && (str[i+3] == ' ' || str[i+3] == '\0' || str[i+3] == '.')) {
				flag = true;
				break;
			}
			if(str[i+2] == 'i' && str[i+3] == 's' && (str[i+4] == ' ' || str[i+4] == '\0' || str[i+4] == '.')) {
				flag = true;
				break;
			}
			if(str[i+2] == 's' && str[i+3] == 't' && (str[i+4] == ' ' || str[i+4] == '\0' || str[i+4] == '.')) {
				flag = true;
				break;
			}
		}
	}

	return flag;
}


int main()
{
	while(getline(cin, str))
	{
		for (int i=0; i<26; i++)	//26文字ずれるまで繰り返す
		{
			if(caesar()) {
				cout << str << endl;
			}

			//cout << str << endl;	//Debug

			for (int j=0; str[j] != '\0'; j++) {
				if(str[j] != ' ' && str[j] != '.') {
					if(str[j] == 'z') {
						str[j] = 'a';
					}
					else {
						str[j]++;
					}
				}
			}
		}
	}

	return 0;
}

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

void decodeOneChar(string& str) {
    for (int i = 0; i < (int)str.length(); i++) {
        if ('a' <= str[i] && str[i] < 'z') {
            str[i]++;
        } else if (str[i] == 'z') {
            str[i] = 'a';
        }
    }
}

int main() {
    string input;
    while (getline(cin, input)) {
        while (input.find("the") == string::npos && input.find("this") == string::npos && input.find("that") == string::npos) {
            decodeOneChar(input);
        }
        cout << input << endl;
    }
}

C++: #include<iostream>
#include<string>
using namespace std;
int main(){
  int ans=-1,len=0;
  string s;
  while(getline(cin,s)){
    //getline(cin,s);
    //if(s==EOF) break;
    while(1/*len<30*/){
      ans = s.find("the");
      if(ans!=-1)break;
      ans = s.find("this");
      if(ans!=-1)break;
      ans = s.find("that");
      if(ans!=-1)break;
      for(int i=0;i<s.size();i++){
	if(s[i]=='z') s[i]='a';
	else if(s[i]>='a' && s[i]<'z') s[i]++;
      }
      //len++;
    }
    cout << s << endl;
  }
}

C++: #include<bits/stdc++.h>
using namespace std;
int main(){
	string s,t;
	getline(cin,s);t=s;
	for(int i=0;i<26;i++){
		s=t;
		for(int j=0;j<s.size();j++){
			for(int k=0;k<i;k++){
				s[j]++;
				if(s[j]>'z')s[j]-=26;
			}
		}
		if(s.find("the")!=s.npos||s.find("this")!=s.npos||s.find("that")!=s.npos)break;
	}
	cout<<s<<endl;
}