[JS] HackerRank : Powerful digit counts

Aiya Aiyara
2 min readAug 20, 2023

--

Project Euler #63

Photo by 🇸🇮 Janko Ferlič on Unsplash

“The 5 digits number, 16807 = 7⁵, is also a fifth power.”

“ตัวเลข 5 หลัก 16807 มีค่าเท่ากับ 7⁵ ซึ่งเป็นเลขยกกำลังห้าเช่นกัน”

“Similarly, the 9-digit number, 134217728 = 8⁹, is a ninth power.”

“ตัวเลข 9 หลัก 134217728 มีค่าเท่ากับ 8⁹ ซึ่งเป็นเลขยกกำลังเก้าเช่นกัน”

โจทย์จะให้ค่า n มาให้เราหาค่าทั้งหมดที่มี digit เป็นจำนวน n เมื่อ n เป็นเลขยกกำลัง

ตัวอย่าง

n = 2

1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16 <-- มี 2 digits
5^2 = 25 <-- มี 2 digits
6^2 = 36 <-- มี 2 digits
7^2 = 49 <-- มี 2 digits
8^2 = 64 <-- มี 2 digits
9^2 = 81 <-- มี 2 digits

ที่ชี้คือที่ต้องแสดงออกมา

มาเขียน function กัน ผมจะเริ่มจากให้แสดง 1–9 ยกกำลัง n แบบนี้

ผมประกาศเป็น BigInt ไปเลยเพราะเห็นว่า n ไปได้ถึง 19 (9 ยกกำลัง 19 ก็นู้นยาววว) เมื่อได้ค่ามาครบคราวนี้ก็จับย่อยใส่ array เพื่อหา length ของมัน ซึ่งจริงๆมีหลายวิธีแต่ผมชอบวิธีนี้

ตรวจสอบ spreadArr.length ว่าเท่ากับ input ไหม ถ้าเท่าก็จับรวมแล้ว log ออกมา แบบนี้

แม้ logic และผลลัพท์จะถูกแต่ถ้านำ Code นี้ไป Run ผลลัพท์

Function ของเราไม่แสดงผลอะไรออกไปเลยเพราะผมลืมทำสิ่งที่สำคัญที่สุดที่เป็นพื้นฐานก่อนทำ Hackerrank สิ่งนั้นคือ …

function processData(input) {
console.log(input)
console.log(typeof input)
}

ผลลัพท์

ผมไม่ได้ตรวจสอบชนิดของ Parameter ที่ส่งเข้ามา ไม่ว่า Logic จะดีเยี่ยมแค่ไหน ก็ตกม้าตายได้ ถ้าไปทำเทสที่มีเวลาจำกัดเท่ากับที่ทำมาทั้งหมดสูญเปล่า ต้องแก้ไขเป็นแบบนี้

function processData(input) {
input = parseInt(input)
var tempInt = BigInt(0)
var concatNumber = BigInt(0)
var spreadArr = []
for(var i = BigInt(1);i <= 9;i++) {
tempInt = i ** BigInt(input)
spreadArr = [...tempInt.toString()].map(Number)
if (spreadArr.length === input) {
concatNumber = parseInt(spreadArr.join(''))
console.log(concatNumber)
}
}
}

เอาไป Run

ได้ 66.67 คะแนน

--

--