เพื่อหาสิ่งที่มีความแข็งดิจิตอลของจำนวนเต็มใช้แทน binary ของตนและนับจำนวนครั้งทั้งชั้นนำและต่อท้ายสามารถลบออกได้จนกว่าจะมีทั้งการเริ่มต้นหรือลงท้ายด้วย
1
0
จำนวนบิตทั้งหมดที่ถูกลบคือความแข็งแบบดิจิตอล
นั่นเป็นคำอธิบายที่ค่อนข้างใช้คำพูด - งั้นมาลองดูตัวอย่างที่ทำงานกันดีกว่า
สำหรับตัวอย่างนี้เราจะใช้หมายเลข 3167 ในระบบเลขฐานสองนี่คือ:
110001011111
(โปรดทราบว่าในระหว่างการแปลงเป็นไบนารีคุณควรตรวจสอบให้แน่ใจว่าได้ตัดส่วนนำศูนย์)
มันไม่ได้เริ่มต้นหรือลงท้ายด้วย0
ดังนั้นเราจึงลบบิต 1 คู่:
1 1000101111 1
เเละอีกอย่าง:
11 00010111 11
แต่ตอนนี้มี 0 ที่จุดเริ่มต้นดังนั้นเราจึงไม่สามารถลบ1
คู่ได้อีก โดยรวมแล้ว 4 บิตที่เราลบออกและดังนั้น4คือความแข็งแบบดิจิตอลที่3167
อย่างไรก็ตามสำหรับตัวเลขที่สามารถเขียนเป็น2 n -1สำหรับบวกn (เช่นมีเฉพาะ1
ในการเป็นตัวแทนไบนารี) 0 จะไม่ถึงและดังนั้นบิตทั้งหมดสามารถลบออกได้ ซึ่งหมายความว่าค่าความแข็งเป็นเพียงความยาวบิตของจำนวนเต็ม
ความท้าทาย
งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นซึ่งกำหนดจำนวนเต็มไม่เป็นลบn >= 0
กำหนดความแข็งแบบดิจิตอล
คุณสามารถส่งโปรแกรมเต็มรูปแบบซึ่งดำเนินการ I / O หรือฟังก์ชั่นที่ส่งกลับผลลัพธ์ การส่งของคุณควรทำงานกับค่าที่n
อยู่ในช่วงจำนวนเต็มมาตรฐานของภาษาของคุณ
กรณีทดสอบ
โปรดแจ้งให้ฉันทราบหากสิ่งเหล่านี้ไม่ถูกต้องหรือหากคุณต้องการแนะนำกรณีขอบที่จะเพิ่ม
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
ต่อไปนี้เป็นวิธี Python ของ ungolfed ที่ฉันใช้สร้างกรณีทดสอบเหล่านี้ (ไม่รับประกันว่าจะไม่มีข้อผิดพลาด):
def hardness(num) -> int:
binary = bin(num)[2:]
if binary.count('0') == 0:
return num.bit_length()
revbin = binary[::-1]
return min(revbin.find('0'), binary.find('0')) * 2
1
คืนค่า 1 ได้อย่างไรเมื่อไม่มี0
ในนั้น? ฉันหมายความว่าคุณอาจไม่สามารถลบ 1 ออกจากสตริงเพื่อให้เริ่มต้นหรือสิ้นสุด0
ได้