@@ -153,3 +153,48 @@ const isPalindrome = function (nr) {
153
153
return true ;
154
154
}
155
155
} ;
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