İstedikleri herhangi bir formatı kullanarak sahip oldukları herhangi bir sayıyı hızlı bir şekilde kendi sayı tabanlarına dönüştürmek isteyen güçler.
Giriş
Programınız 3 parametre kabul etmelidir.
- Sayı: Dönüştürülecek dize numarası
- InputFormat: Numaranın bulunduğu dizge
- OutputFormat: Sayının dönüştürüleceği temel dize.
Çıktı
Programınız Number
eski sayı tabanından InputFormat
yeni sayı tabanına dönüştürülmeliOutputFormat
Örnekler
("1","0123456789","9876543210") = "8"
("985724","9876543210","0123456789ABCDEF") = "37C3"
("FF","0123456789ABCDEF","0123456789") = "255"
("FF","0123456789ABCDEF","01234567") = "377"
("18457184548971248772157", "0123456789","Aa0Bb1Cc2Dd3Ee4Ff5Gg6Hh7Ii8Jj9Kk,Ll.Mm[Nn]Oo@Pp#Qq}Rr{Ss-Tt+Uu=Vv_Ww!Xx%Yy*Zz") = ",sekYFg_fdXb"
Ek
Yeni taban 77 testi, eğer çalışırsa
- Eğer bir numaraya dönüştürmek zorunda olduğunuz ve 32Bit içinde kilitli kaldığınız bir dilde bunu atlayabilirsiniz.
- ek bir test olduğu gibi.
Tüm örnekler PHP 7.2 tarafından aşağıdaki kodu kullanarak bcmath uzantılı olarak üretildi (dakika olarak değişir, ancak kod formatlandı). Muhtemelen daha kısa bir yol olacak. Bu, sadece bununla birlikte yapmam gereken sistem için geldiğim yolun, eğer daha kısa bir versiyonun gelip gelmeyeceğini görmek güzel olurdu.
PHP 7.2 (bcmath - uzantı) 614 bayt
<?php
function f($a, $b, $c)
{
$d= str_split($b,1);
$e= str_split($c,1);
$f= str_split($a,1);
$g=strlen($b);
$h=strlen($c);
$k=strlen($a);
$r='';
if ($c== '0123456789')
{
$r=0;
for ($i = 1;$i <= $k; $i++)
$retval = bcadd($retval, bcmul(array_search($f[$i-1], $d),bcpow($g,$k-$i)));
return $r;
}
if ($b!= '0123456789')
$l=f($a, $b, '0123456789');
else
$l= $a;
if ($l<strlen($c))
return $e[$l];
while($l!= '0')
{
$r= $e[bcmod($l,$h)].$r;
$l= bcdiv($l,$h,0);
}
return $r;
}
puanlama
Bu kod golf; en kısa kod kazanır. Standart boşluklar uygulanır.
["zX", "tXdsyqzSDRP02", "brFNC02bc"] => "cb"
. (ya da her ne olursa olsun, eğer doğru değilse,)