Find palindromic numbers in both binary and ternary bases: Difference between revisions

Add Swift
(Added 11l)
(Add Swift)
Line 2,436:
5415589 101012010210101 10100101010001010100101
90396755477 22122022220102222022122 1010100001100000100010000011000010101</pre>
 
=={{header|Swift}}==
 
{{trans|C}}
 
<lang swift>import Foundation
 
func isPalin2(n: Int) -> Bool {
var x = 0
var n = n
 
guard n & 1 != 0 else {
return n == 0
}
 
while x < n {
x = x << 1 | n & 1
n >>= 1
}
 
return n == x || n == x >> 1
}
 
func reverse3(n: Int) -> Int {
var x = 0
var n = n
 
while n > 0 {
x = x * 3 + (n % 3)
n /= 3
}
 
return x
}
 
func printN(_ n: Int, base: Int) {
var n = n
 
print(" ", terminator: "")
 
repeat {
print("\(n % base)", terminator: "")
 
n /= base
} while n > 0
 
print("(\(base))", terminator: "")
}
 
func show(n: Int) {
print(n, terminator: "")
printN(n, base: 2)
printN(n, base: 3)
print()
}
 
private var count = 0
private var lo = 0
private var (hi, pow2, pow3) = (1, 1, 1)
 
show(n: 0)
 
while true {
var n: Int
 
for i in lo..<hi {
n = (i * 3 + 1) * pow3 + reverse3(n: i)
 
guard isPalin2(n: n) else {
continue
}
 
show(n: n)
count += 1
 
guard count < 7 else {
exit(0)
}
}
 
if hi == pow3 {
pow3 *= 3
} else {
pow2 *= 4
}
 
while true {
while pow2 <= pow3 {
pow2 *= 4
}
 
let lo2 = (pow2 / pow3 - 1) / 3
let hi2 = (pow2 * 2 / pow3 - 1) / 3 + 1
let lo3 = pow3 / 3
let hi3 = pow3
 
if lo2 >= hi3 {
pow3 *= 3
} else if lo3 >= hi2 {
pow2 *= 4
} else {
lo = max(lo2, lo3)
hi = min(hi2, hi3)
break
}
}
}</lang>
 
{{out}}
 
<pre>0 0(2) 0(3)
1 1(2) 1(3)
6643 1100111110011(2) 100010001(3)
1422773 101011011010110110101(2) 2200021200022(3)
5415589 10100101010001010100101(2) 101012010210101(3)
90396755477 1010100001100000100010000011000010101(2) 22122022220102222022122(3)
381920985378904469 10101001100110110110001110011011001110001101101100110010101(2) 2112200222001222121212221002220022112(3)</pre>
 
=={{header|Tcl}}==