import java.util.ArrayList; import java.util.List; public final class CyclopsNumbers { public static void main(String[] args) { List cyclops = new ArrayList(); List primeCyclops = new ArrayList(); List blindPrimeCyclops = new ArrayList(); List palindromicPrimeCyclops = new ArrayList(); List> ranges = List.of( List.of( 0, 0), List.of( 101, 909), List.of( 11011, 99099 ), List.of( 1110111, 9990999 ), List.of( 111101111, 119101111 ) ); for ( List range : ranges) { for ( int i = range.getFirst(); i <= range.getLast(); i++ ) { String value = String.valueOf(i); if ( isCyclopsNumber(value) ) { cyclops.addLast(i); if ( isPrime(i) ) { primeCyclops.addLast(i); if ( isBlind(value) ) { blindPrimeCyclops.addLast(i); } if ( isPalindromic(value) ) { palindromicPrimeCyclops.addLast(i); } } } } } System.out.println("The first 50 Cyclops numbers:"); for ( int i = 0; i < 50; i++ ) { System.out.print(String.format("%6s%s", cyclops.get(i), ( i % 10 == 9 ? "\n" : "" ))); } System.out.println(); int firstIndex = firstIndex(cyclops); System.out.println("The first cyclops number greater than ten million is " + cyclops.get(firstIndex) + " at zero based index " + firstIndex); System.out.println(); System.out.println("The first 50 prime Cyclops numbers:"); for ( int i = 0; i < 50; i++ ) { System.out.print(String.format("%7s%s", primeCyclops.get(i), ( i % 10 == 9 ? "\n" : "" ))); } System.out.println(); firstIndex = firstIndex(primeCyclops); System.out.println("The first prime cyclops number greater than ten million is " + primeCyclops.get(firstIndex) + " at zero based index " + firstIndex); System.out.println(); System.out.println("The first 50 blind prime Cyclops numbers:"); for ( int i = 0; i < 50; i++ ) { System.out.print(String.format("%7s%s", blindPrimeCyclops.get(i), ( i % 10 == 9 ? "\n" : "" ))); } System.out.println(); firstIndex = firstIndex(blindPrimeCyclops); System.out.println("The first blind prime cyclops number greater than ten million is " + blindPrimeCyclops.get(firstIndex) + " at zero based index " + firstIndex); System.out.println(); System.out.println("The first 50 palindromic prime Cyclops numbers:"); for ( int i = 0; i < 50; i++ ) { System.out.print( String.format("%9s%s", palindromicPrimeCyclops.get(i), ( i % 10 == 9 ? "\n" : "" ))); } System.out.println(); firstIndex = firstIndex(palindromicPrimeCyclops); System.out.println("The first palindromic prime cyclops number greater than ten million is " + palindromicPrimeCyclops.get(firstIndex) + " at zero based index " + firstIndex); System.out.println(); } private static int firstIndex(List numbers) { int start = 0; int end = numbers.size() - 1; while ( start <= end ) { final int mid = start + ( end - start ) / 2; if ( numbers.get(mid) <= 10_000_000 ) { start = mid + 1; } else { end = mid - 1; } } return start; } private static boolean isCyclopsNumber(String text) { return text.charAt(text.length() / 2) == '0' && text.indexOf('0') == text.lastIndexOf('0'); } private static boolean isPalindromic(String text) { for ( int i = 0; i < text.length() / 2; i++ ) { if ( text.charAt(i) != text.charAt(text.length() - 1 - i) ) { return false; } } return true; } private static boolean isBlind(String text) { final int middle = text.length() / 2; final String withoutZero = text.substring(0, middle) + text.substring(middle + 1); return isPrime(Integer.valueOf(withoutZero)); } private static boolean isPrime(int number) { if ( number < 2 ) { return false; } if ( number % 2 == 0 ) { return number == 2; } if ( number % 3 == 0 ) { return number == 3; } int k = 5; while ( k * k <= number ) { if ( number % k == 0 ) { return false; } k += 2; if ( number % k == 0 ) { return false; } k += 4; } return true; } }