RosettaCodeData/Task/Brazilian-numbers/AWK/brazilian-numbers.awk
2023-07-01 13:44:08 -04:00

63 lines
1.3 KiB
Awk

# syntax: GAWK -f BRAZILIAN_NUMBERS.AWK
# converted from C
BEGIN {
split(",odd ,prime ",kinds,",")
for (i=1; i<=3; ++i) {
printf("first 20 %sBrazilian numbers:",kinds[i])
c = 0
n = 7
while (1) {
if (is_brazilian(n)) {
printf(" %d",n)
if (++c == 20) {
printf("\n")
break
}
}
switch (i) {
case 1:
n++
break
case 2:
n += 2
break
case 3:
do {
n += 2
} while (!is_prime(n))
break
}
}
}
exit(0)
}
function is_brazilian(n, b) {
if (n < 7) { return(0) }
if (!(n % 2) && n >= 8) { return(1) }
for (b=2; b<n-1; ++b) {
if (same_digits(n,b)) { return(1) }
}
return(0)
}
function is_prime(n, d) {
d = 5
if (n < 2) { return(0) }
if (!(n % 2)) { return(n == 2) }
if (!(n % 3)) { return(n == 3) }
while (d*d <= n) {
if (!(n % d)) { return(0) }
d += 2
if (!(n % d)) { return(0) }
d += 4
}
return(1)
}
function same_digits(n,b, f) {
f = n % b
n = int(n/b)
while (n > 0) {
if (n % b != f) { return(0) }
n = int(n/b)
}
return(1)
}