package wordScratch;
import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream;
public class WordFu {
public static void main(String[] args) throws IOException {
System.out.println("Loading words");
final Set<String> words = getWords().collect(Collectors.toSet());
System.out.println("Scanning words for forwards rot13s");
{
List<String> list = Files.lines(FileSystems.getDefault().getPath("/usr/share/dict/words")).filter(s -> words.contains(rot13(s))).collect(Collectors.toList());
List<CharSequence> rot13 = list.stream().map(s -> rot13(s)).collect(Collectors.toList());
System.out.println(list);
System.out.println(rot13);
}
System.out.println("Scanning words for backwards rot13s");
{
List<String> list = getWords().filter(s -> words.contains(new StringBuffer(rot13(s)).reverse().toString())).collect(Collectors.toList());
List<CharSequence> rot13 = list.stream().map(s -> rot13(s)).collect(Collectors.toList());
System.out.println(list);
System.out.println(rot13);
}
System.out.println("Scanning words for forwards opposites");
{
List<String> list = getWords().filter(s -> words.contains(opposite(s))).collect(Collectors.toList());
List<CharSequence> rot13 = list.stream().map(s -> rot13(s)).collect(Collectors.toList());
System.out.println(list);
System.out.println(rot13);
}
System.out.println("Scanning words for backwards opposites");
{
List<String> list = getWords().filter(s -> words.contains(new StringBuffer(opposite(s)).reverse().toString())).collect(Collectors.toList());
List<CharSequence> rot13 = list.stream().map(s -> rot13(s)).collect(Collectors.toList());
System.out.println(list);
System.out.println(rot13);
}
}
public static final Stream<String> getWords() throws IOException {
return Files.lines(FileSystems.getDefault().getPath("/usr/share/dict/words"));
}
public static final CharSequence rot13(CharSequence in) {
return in.codePoints().map(c -> rot13(c)).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();
}
public static final char rot13(int c) {
return rot13((char) c);
}
public static final char rot13(char c) {
if(c >= 'a' && c <= 'm') {
c += 13;
} else if(c >= 'A' && c <= 'M') {
c += 13;
} else if(c >= 'n' && c <= 'z') {
c -= 13;
} else if(c >= 'N' && c <= 'Z') {
c -= 13;
}
return c;
}
public static final CharSequence opposite(CharSequence in) {
return in.codePoints().map(c -> opposite(c)).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();
}
public static final char opposite(int c) {
return opposite((char) c);
}
public static final char opposite(char c) {
if(c >= 'a' && c <= 'm') {
int pos = c - 'a';
c = (char) ('z' - pos);
} else if(c >= 'A' && c <= 'M') {
int pos = c - 'A';
c = (char) ('Z' - pos);
} else if(c >= 'n' && c <= 'z') {
int pos = 'z' - c;
c = (char) ('a' + pos);
} else if(c >= 'N' && c <= 'Z') {
int pos = 'Z' - c;
c = (char) ('A' + pos);
}
return c;
}
}