Giới thiệu
Trước đây, chúng tôi đã có một vài thách thức chuyển đổi cơ sở ở đây, nhưng không có nhiều thách thức được thiết kế để giải quyết các số có độ dài tùy ý (nghĩa là các số đủ dài để chúng vượt qua kiểu dữ liệu số nguyên) và trong số đó, hầu hết đều cảm thấy một chút phức tạp. Tôi tò mò làm thế nào để giảm bớt sự thay đổi của mã cơ sở như thế này.
Thử thách
Viết chương trình hoặc hàm bằng ngôn ngữ bạn chọn có thể chuyển đổi một chuỗi của một cơ sở thành một chuỗi của một cơ sở khác. Đầu vào phải là số được chuyển đổi (chuỗi), từ cơ sở (số cơ sở 10), sang cơ sở (số cơ sở 10) và bộ ký tự (chuỗi). Đầu ra phải là số chuyển đổi (chuỗi).
Một số chi tiết và quy tắc khác như sau:
- Số cần chuyển đổi sẽ là số nguyên không âm (vì
-
và.
có thể nằm trong bộ ký tự). Vì vậy, cũng sẽ là đầu ra. - Các số 0 đứng đầu (ký tự đầu tiên trong bộ ký tự) nên được cắt bớt. Nếu kết quả bằng 0, một chữ số 0 duy nhất sẽ vẫn còn.
- Phạm vi cơ sở được hỗ trợ tối thiểu là từ 2 đến 95, bao gồm các ký tự ascii có thể in được.
- Đầu vào cho số được chuyển đổi, bộ ký tự và đầu ra đều phải là kiểu dữ liệu chuỗi. Các cơ sở phải là kiểu dữ liệu số nguyên cơ sở 10 (hoặc số nguyên nổi).
- Độ dài của chuỗi số đầu vào có thể rất lớn. Thật khó để định lượng mức tối thiểu hợp lý, nhưng hy vọng nó có thể xử lý ít nhất 1000 ký tự và hoàn thành 100 ký tự trong chưa đầy 10 giây trên một máy tốt (rất hào phóng cho loại vấn đề này, nhưng tôi không muốn tốc độ để trở thành trọng tâm).
- Bạn không thể sử dụng các chức năng thay đổi cơ sở tích hợp.
- Đầu vào bộ ký tự có thể được sắp xếp theo bất kỳ cách nào, không chỉ là 0-9a-z ... vv.
- Giả sử rằng chỉ có đầu vào hợp lệ sẽ được sử dụng. Đừng lo lắng về việc xử lý lỗi.
Người chiến thắng sẽ được xác định bởi mã ngắn nhất hoàn thành các tiêu chí. Họ sẽ được chọn trong ít nhất 7 cơ sở-10 ngày, hoặc nếu / khi đã có đủ bài nộp. Trong trường hợp hòa, mã chạy nhanh hơn sẽ là người chiến thắng. Nếu đủ gần về tốc độ / hiệu suất, câu trả lời đến sớm hơn sẽ thắng.
Ví dụ
Dưới đây là một vài ví dụ về đầu vào và đầu ra mà mã của bạn sẽ có thể xử lý:
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
? Cụ thể, tôi có thể sử dụng tích hợp để chuyển đổi đầu vào thành cơ sở trung gian không? Sau đó tôi có thể sử dụng tích hợp để chuyển đổi sang cơ sở đích không? Sẽ như thế 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
nào?