introduzione
Abbiamo avuto alcune sfide di conversione di base qui in passato, ma non molte progettate per affrontare numeri di lunghezza arbitraria (vale a dire numeri che sono abbastanza lunghi da superare il tipo di dati intero), e di questi, la maggior parte si è sentita un po ' complicato. Sono curioso di sapere come può arrivare un cambiamento di codice base come questo.
Sfida
Scrivi un programma o una funzione nella lingua che preferisci in grado di convertire una stringa di una base in una stringa di un'altra base. L'input deve essere il numero da convertire (stringa), dalla base (numero base-10), alla base (numero base-10) e il set di caratteri (stringa). L'output dovrebbe essere il numero convertito (stringa).
Alcuni ulteriori dettagli e regole sono i seguenti:
- Il numero da convertire sarà un numero intero non negativo (poiché
-
e.
potrebbe essere nel set di caratteri). Così sarà anche l'output. - Gli zeri iniziali (il primo carattere nel set di caratteri) devono essere tagliati. Se il risultato è zero, dovrebbe rimanere una singola cifra zero.
- L'intervallo di base minimo supportato è compreso tra 2 e 95, costituito dai caratteri ASCII stampabili.
- L'input per il numero da convertire, il set di caratteri e l'output devono essere tutti del tipo di dati stringa. Le basi devono essere del tipo di dati intero base-10 (o numeri interi float).
- La lunghezza della stringa del numero di input può essere molto grande. È difficile quantificare un minimo ragionevole, ma mi aspetto che sia in grado di gestire almeno 1000 caratteri e completare l'inserimento di 100 caratteri in meno di 10 secondi su una macchina decente (molto generoso per questo tipo di problema, ma non voglio velocità per essere al centro).
- Non è possibile utilizzare le funzioni di cambio di base integrate.
- L'input del set di caratteri può essere in qualsiasi disposizione, non solo nel tipico 0-9a-z ... ecc.
- Supponiamo che verrà utilizzato solo un input valido. Non preoccuparti della gestione degli errori.
Il vincitore sarà determinato dal codice più breve che soddisfa i criteri. Saranno selezionati in almeno 7 giorni base-10 o se / quando ci sono stati abbastanza contributi. In caso di pareggio, il codice che corre più veloce sarà il vincitore. Se abbastanza vicino in termini di velocità / prestazioni, la risposta che è arrivata prima vince.
Esempi
Ecco alcuni esempi di input e output che il tuo codice dovrebbe essere in grado di gestire:
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
? In particolare, è possibile utilizzare un built-in per convertire l'input in una base intermedia? Posso quindi utilizzare un built-in per convertire nella base di destinazione? Ti piacerebbe qualcosa 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
?