소개
과거에는 몇 가지 기본 변환 문제가 있었지만 임의 길이의 숫자 (즉, 정수 데이터 유형을 오버플로하기에 충분히 긴 숫자)를 다루기 위해 설계된 것은 많지 않았습니다. 복잡한. 이와 같은 기본 코드 변경을 어떻게 해결할 수 있는지 궁금합니다.
도전
한베이스의 문자열을 다른베이스의 문자열로 변환 할 수있는 프로그램 또는 함수를 선택한 언어로 작성하십시오. 입력 할 수는 변환 할 숫자 (문자열), 기본 (기본 10 숫자), 기본 (기본 10 숫자) 및 문자 집합 (문자열)이어야합니다. 출력은 변환 된 숫자 (문자열) 여야합니다.
추가 세부 사항 및 규칙은 다음과 같습니다.
- 수는 음이 아닌 정수 것이다 변환한다 (사람
-및.문자 세트 일 수있다). 출력도 마찬가지입니다. - 선행 0 (문자 세트의 첫 번째 문자)은 다듬어야합니다. 결과가 0이면 하나의 0 자리 숫자가 남아 있어야합니다.
- 지원되는 최소 기본 범위는 2-95이며 인쇄 가능한 ASCII 문자로 구성됩니다.
- 변환 할 숫자 입력, 문자 세트 및 출력은 모두 문자열 데이터 유형이어야합니다. 밑은 10 이하의 정수 데이터 유형이어야합니다 (또는 정수 부동 소수점).
- 입력 숫자 문자열의 길이는 매우 클 수 있습니다. 현명한 최소값을 정량화하는 것은 어렵지만, 최소한 1000자를 처리하고 적절한 기계에서 10 초 이내에 100 개의 문자 입력을 완료 할 수있을 것으로 기대합니다 (이런 종류의 문제에는 매우 관대하지만, 원하지 않습니다) 초점).
- 내장 된 기본 기능 변경 기능을 사용할 수 없습니다.
- 문자 세트 입력은 일반적인 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입니까?