บทนำ
เรามีความท้าทายในการแปลงฐานสองสามที่นี่ในอดีต แต่ไม่มากที่ออกแบบมาเพื่อจัดการกับความยาวโดยพลการ ซับซ้อน. ฉันอยากรู้ว่าการเปลี่ยนแปลงของรหัสฐานแบบนี้จะเป็นอย่างไร
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นในภาษาที่คุณเลือกซึ่งสามารถแปลงสตริงของฐานหนึ่งเป็นสตริงของฐานอื่นได้ อินพุตควรเป็นตัวเลขที่จะถูกแปลง (สตริง), จากฐาน (หมายเลขฐาน 10), เป็นฐาน (หมายเลขฐาน 10) และชุดอักขระ (สตริง) เอาต์พุตควรเป็นตัวเลขที่แปลง (สตริง)
รายละเอียดและกฎเพิ่มเติมบางประการมีดังนี้:
- จำนวนที่จะแปลงจะเป็นจำนวนเต็มไม่เป็นลบ (ตั้งแต่
-
และ.
อาจอยู่ในชุดอักขระ) ดังนั้นก็จะเป็นผลลัพธ์ - เลขศูนย์นำหน้า (อักขระแรกในชุดอักขระ) ควรถูกตัดออก หากผลลัพธ์เป็นศูนย์เลขศูนย์จะยังคงอยู่
- ช่วงฐานขั้นต่ำที่รองรับคือ 2 ถึง 95 ซึ่งประกอบด้วยอักขระ ascii ที่พิมพ์ได้
- อินพุตสำหรับหมายเลขที่จะถูกแปลงชุดอักขระและเอาต์พุตทั้งหมดต้องเป็นประเภทข้อมูลสตริง ฐานจะต้องเป็นประเภทข้อมูลจำนวนเต็มฐาน 10 (หรือจำนวนเต็มลอย)
- ความยาวของสตริงหมายเลขอินพุตอาจมีขนาดใหญ่มาก เป็นการยากที่จะนับจำนวนขั้นต่ำที่เหมาะสม แต่คาดว่าจะสามารถจัดการอย่างน้อย 1,000 ตัวอักษรและป้อนตัวอักษร 100 ตัวในเวลาน้อยกว่า 10 วินาทีในเครื่องที่เหมาะสม (ใจกว้างมากสำหรับปัญหาแบบนี้ แต่ฉันไม่ต้องการ ความเร็วในการโฟกัส)
- คุณไม่สามารถใช้ฟังก์ชั่นการเปลี่ยนฐานได้
- อินพุตชุดอักขระสามารถอยู่ในการจัดการใด ๆ ไม่ใช่แค่แบบทั่วไป 0-9a-z ... ฯลฯ
- สมมติว่าจะใช้อินพุตที่ถูกต้องเท่านั้น ไม่ต้องกังวลกับการจัดการข้อผิดพลาด
ผู้ชนะจะถูกกำหนดโดยรหัสที่สั้นที่สุดที่บรรลุเกณฑ์ พวกเขาจะถูกเลือกในอย่างน้อย 7 ฐาน -10 วันหรือถ้า / เมื่อมีการส่งที่เพียงพอ ในกรณีที่เสมอกันรหัสที่ทำงานเร็วกว่าจะเป็นผู้ชนะ หากใกล้เพียงพอในความเร็ว / ประสิทธิภาพคำตอบที่มาก่อนหน้านี้จะชนะ
ตัวอย่าง
นี่คือตัวอย่างของอินพุตและเอาต์พุตที่โค้ดของคุณควรสามารถจัดการได้:
F("1010101", 2, 10, "0123456789")
> 85
F("0001010101", 2, 10, "0123456789")
> 85
F("85", 10, 2, "0123456789")
> 1010101
F("1010101", 10, 2, "0123456789")
> 11110110100110110101
F("bababab", 2, 10, "abcdefghij")
> if
F("10", 3, 2, "0123456789")
> 11
F("<('.'<)(v'.'v)(>'.'>)(^'.'^)", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> !!~~~~~~~!!!~!~~!!!!!!!!!~~!!~!!!!!!~~!~!~!!!~!~!~!!~~!!!~!~~!!~!!~~!~!!~~!!~!~!!!~~~~!!!!!!!!!!!!~!!~!~!~~~~!~~~~!~~~~~!~~!!~~~!~!~!!!~!~~
F("~~~~~~~~~~", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> ~
F("9876543210123456789", 10, 36, "0123456789abcdefghijklmnopqrstuvwxyz")
> 231ceddo6msr9
F("ALLYOURBASEAREBELONGTOUS", 62, 10, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
> 6173180047113843154028210391227718305282902
F("howmuchwoodcouldawoodchuckchuckifawoodchuckcouldchuckwood", 36, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> o3K9e(r_lgal0$;?w0[`<$n~</SUk(r#9W@."0&}_2?[n
F("1100111100011010101010101011001111011010101101001111101000000001010010100101111110000010001001111100000001011000000001001101110101", 2, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> this is much shorter
You cannot use built in change-of-base functions to convert the entire input string/number at once
ไหม? โดยเฉพาะฉันสามารถใช้บิวด์อินเพื่อแปลงอินพุตเป็นเบสระดับกลางได้หรือไม่? ฉันจะใช้บิวท์อินเพื่อแปลงเป็นฐานเป้าหมายได้หรือไม่ จะเป็นconvert input with canonical form for given base; convert to base 10; convert to target base; convert back to specified character set with string replacement
อย่างไร