@@ -153,3 +153,48 @@ const isPalindrome = function (nr) {
153153 return true ;
154154 }
155155} ;
156+
157+ // another
158+
159+ /**
160+ * @param {string } left
161+ * @param {string } right
162+ * @return {number }
163+ */
164+ const superpalindromesInRange = function ( left , right ) {
165+ let ans = 9 >= left && 9 <= right ? 1 : 0
166+
167+ const isPal = ( str ) => {
168+ for ( let i = 0 , j = str . length - 1 ; i < j ; i ++ , j -- )
169+ if ( str . charAt ( i ) !== str . charAt ( j ) ) return false
170+ return true
171+ }
172+
173+ for ( let dig = 1 ; dig < 10 ; dig ++ ) {
174+ let isOdd = dig % 2 && dig !== 1 ,
175+ innerLen = ( dig >> 1 ) - 1 ,
176+ innerLim = Math . max ( 1 , 2 ** innerLen ) ,
177+ midPos = dig >> 1 ,
178+ midLim = isOdd ? 3 : 1
179+ for ( let edge = 1 ; edge < 3 ; edge ++ ) {
180+ let pal = new Uint8Array ( dig )
181+ ; ( pal [ 0 ] = edge ) , ( pal [ dig - 1 ] = edge )
182+ if ( edge === 2 ) ( innerLim = 1 ) , ( midLim = Math . min ( midLim , 2 ) )
183+ for ( let inner = 0 ; inner < innerLim ; inner ++ ) {
184+ if ( inner > 0 ) {
185+ let innerStr = inner . toString ( 2 ) . padStart ( innerLen , '0' )
186+ for ( let i = 0 ; i < innerLen ; i ++ )
187+ ( pal [ 1 + i ] = innerStr [ i ] ) , ( pal [ dig - 2 - i ] = innerStr [ i ] )
188+ }
189+ for ( let mid = 0 ; mid < midLim ; mid ++ ) {
190+ if ( isOdd ) pal [ midPos ] = mid
191+ let palin = ~ ~ pal . join ( '' ) ,
192+ square = BigInt ( palin ) * BigInt ( palin )
193+ if ( square > right ) return ans
194+ if ( square >= left && isPal ( square . toString ( ) ) ) ans ++
195+ }
196+ }
197+ }
198+ }
199+ return ans
200+ }
0 commit comments