Giriş
Geçmişte burada birkaç temel dönüşüm zorluğumuz var, ancak rastgele uzunluk sayılarını (yani, tamsayı veri türünü aşacak kadar uzun olan sayıları) ele almak için tasarlanmamış pek çok şey yok ve bunlardan çoğu, karmaşık. Bunun gibi bir baz kod değişikliğini nasıl golf oynayabileceğini merak ediyorum.
Meydan okuma
Seçtiğiniz dilde, bir tabandaki bir dizeyi başka bir tabandaki dizeye dönüştürebilen bir program veya işlev yazın. Girdi, dönüştürülecek sayı (dize), tabandan (taban-10 sayı), tabana (taban-10 sayı) ve karakter kümesi (dize) olmalıdır. Çıktı dönüştürülen sayı (dize) olmalıdır.
Bazı detaylar ve kurallar aşağıdaki gibidir:
- Dönüştürülecek sayı negatif olmayan bir tamsayı olacaktır (çünkü karakter kümesinde olabilir
-
ve.
olabilir). Çıktı da öyle olacak. - Baştaki sıfırlar (karakter kümesindeki ilk karakter) kesilmelidir. Sonuç sıfırsa, tek bir sıfır basamağı kalmalıdır.
- Desteklenen minimum taban aralığı, yazdırılabilir ascii karakterlerden oluşan 2 ila 95 arasındadır.
- Dönüştürülecek sayının girdisi, karakter kümesi ve çıktının tümü dizgi veri türünden olmalıdır. Bazlar, base-10 tamsayı veri tipinden (veya tamsayı yüzer) olmalıdır.
- Giriş numarası dizesinin uzunluğu çok büyük olabilir. Makul bir minimum ölçmek zordur, ancak en az 1000 karakteri işleyebilmesini ve iyi bir makinede 10 saniyeden daha kısa sürede 100 karakter girdisini tamamlamasını bekleyebilirsiniz (bu tür bir sorun için çok cömert, ancak istemiyorum hız odak).
- Yerleşik temel değişikliği işlevlerini kullanamazsınız.
- Karakter seti girişi, sadece tipik 0-9a-z ... vb. Değil, herhangi bir düzenlemede olabilir.
- Yalnızca geçerli girdinin kullanılacağını varsayın. Hata işleme konusunda endişelenmeyin.
Kazanan, kriterleri yerine getiren en kısa kodla belirlenir. Bunlar en az 7 baz-10 gün içinde veya yeterli sayıda başvuru olduğunda / olduğunda seçilecektir. Beraberlik durumunda, daha hızlı çalışan kod kazanan olacaktır. Hız / performansta yeterince yakınsa, daha önce gelen cevap kazanır.
Örnekler
Kodunuzun işleyebilmesi için birkaç giriş ve çıkış örneği:
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
? Özellikle, girdiyi ara tabana dönüştürmek için yerleşik bir yöntem kullanabilir miyim? Daha sonra hedef tabana dönüştürmek için yerleşik bir yöntem kullanabilir miyim? Bir şey ister 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
misiniz?