前書き
過去にいくつかの基本変換の課題がありましたが、任意の長さの数値(つまり、整数データ型をオーバーフローさせるほど長い数値)に取り組むように設計されたものは多くありませんでした。複雑です。このように基本コードの変更をどのように実行できるか興味があります。
チャレンジ
あるベースの文字列を別のベースの文字列に変換できるプログラムまたは関数を選択した言語で記述します。入力は、変換される数値(文字列)、from-base(10進数)、to-base(10進数)、および文字セット(string)である必要があります。出力は、変換された数値(文字列)でなければなりません。
いくつかの詳細と規則は次のとおりです。
- 変換される数値は負でない整数になり(以降
-
と.
文字セットであってもよいです)。出力も同様です。 - 先行ゼロ(文字セットの最初の文字)は削除する必要があります。結果がゼロの場合、単一のゼロ桁が残るはずです。
- サポートされる最小ベース範囲は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
ですか?