109 lines
2.4 KiB
Bash
109 lines
2.4 KiB
Bash
#!/bin/ksh
|
|
|
|
# Cyclops numbers (odd number of digits that has a zero in the center)
|
|
# - first 50 cyclops numbers
|
|
# - first 50 prime cyclops numbers
|
|
# - first 50 blind prime cyclops numbers
|
|
# - first 50 palindromic prime cyclops numbers
|
|
|
|
# # Variables:
|
|
#
|
|
integer MAXN=50
|
|
|
|
# # Functions:
|
|
#
|
|
|
|
# # Function _isprime(n) return 1 for prime, 0 for not prime
|
|
#
|
|
function _isprime {
|
|
typeset _n ; integer _n=$1
|
|
typeset _i ; integer _i
|
|
|
|
(( _n < 2 )) && return 0
|
|
for (( _i=2 ; _i*_i<=_n ; _i++ )); do
|
|
(( ! ( _n % _i ) )) && return 0
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# # Function _iscyclops(n) - return 1 for cyclops number
|
|
#
|
|
function _iscyclops {
|
|
typeset _n ; integer _n=$1
|
|
|
|
(( ! ${#_n}&1 )) && return 0 # must have odd number of digits
|
|
(( ${_n:$((${#_n}/2)):1} )) && return 0 # must have center zero
|
|
[[ $(_blind ${_n}) == *0* ]] && return 0 # No other zeros
|
|
|
|
return 1
|
|
}
|
|
|
|
# # Function _blind(n) - return a "blinded" cyclops number
|
|
#
|
|
function _blind {
|
|
typeset _n ; _n="$1"
|
|
|
|
echo "${_n:0:$((${#_n}/2))}${_n:$((${#_n}/2+1)):$((${#_n}/2))}"
|
|
}
|
|
|
|
# # Function _ispalindrome(n) - return 1 for palindromic number
|
|
#
|
|
function _ispalindrome {
|
|
typeset _n ; _n="$1"
|
|
typeset _flippedn
|
|
|
|
_flippedn=$(_flipit ${_n:$((${#_n}/2+1)):$((${#_n}/2))})
|
|
[[ ${_n:0:$((${#_n}/2))} != ${_flippedn} ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
# # Function _flipit(string) - return flipped string
|
|
#
|
|
function _flipit {
|
|
typeset _buf ; _buf="$1"
|
|
typeset _tmp ; unset _tmp
|
|
|
|
for (( _i=$(( ${#_buf}-1 )); _i>=0; _i-- )); do
|
|
_tmp="${_tmp}${_buf:${_i}:1}"
|
|
done
|
|
|
|
echo "${_tmp}"
|
|
}
|
|
######
|
|
# main #
|
|
######
|
|
|
|
integer cy=prcy=blprcy=palprcy=0 # counters
|
|
typeset -a cyarr prcyarr blprcyarr palprcyarr
|
|
|
|
for i in {101..909} {11011..99099} {1110111..9990999}; do
|
|
_iscyclops ${i} ; (( ! $? )) && continue
|
|
(( ++cy <= MAXN )) && cyarr+=( ${i} )
|
|
|
|
_isprime ${i} ; (( ! $? )) && continue
|
|
(( ++prcy <= MAXN )) && prcyarr+=( ${i} )
|
|
|
|
if (( blprcy < MAXN )); then
|
|
_isprime $(_blind ${i})
|
|
(( $? )) && { (( blprcy++ )) ; blprcyarr+=( ${i} ) }
|
|
fi
|
|
|
|
if (( palprcy < MAXN )); then
|
|
_ispalindrome ${i}
|
|
(( $? )) && { (( palprcy++ )) ; palprcyarr+=( ${i} ) }
|
|
fi
|
|
|
|
(( palprcy >= MAXN && blprcy >= MAXN && prcy >= MAXN && cy >= MAXN )) && break
|
|
done
|
|
|
|
print "First $MAXN cyclops numbers:"
|
|
print ${cyarr[@]}
|
|
|
|
print "\nFirst $MAXN prime cyclops numbers:"
|
|
print ${prcyarr[@]}
|
|
|
|
print "\nFirst $MAXN blind prime cyclops numbers:"
|
|
print ${blprcyarr[@]}
|
|
|
|
print "\nFirst $MAXN palindromic prime cyclops numbers:"
|
|
print ${palprcyarr[@]}
|