Potęgi, które chcą być w stanie szybko przekonwertować dowolną liczbę, którą mają, na własną bazę liczbową, przy użyciu dowolnego formatu, jaki chcą.
Wkład
Twój program musi zaakceptować 3 parametry.
- Numer: numer ciągu do konwersji
- InputFormat: ciąg podstawowy, w którym aktualnie znajduje się liczba
- OutputFormat: ciąg podstawowy, na który ma zostać przekonwertowana liczba.
Wydajność
Twój program musi przekonwertować Number
ze starej bazy numerów InputFormat
na nową bazę numerówOutputFormat
Przykłady
("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"
Dodatkowy
Nowy test 77 podstawy nie jest wymagany, jeśli działa
- jeśli jesteś w języku, w którym musisz najpierw przekonwertować numer i jesteś zamknięty w 32Bit, możesz go pominąć.
- ponieważ jest to dodatkowy test.
Wszystkie przykłady zostały wygenerowane przez PHP 7.2 z rozszerzeniem bcmath przy użyciu następującego kodu (vars min, ale sformatowany kod). prawdopodobnie będzie krótsza droga, to jest właśnie sposób, w jaki wymyśliłem system, z którym musiałem to zrobić, fajnie byłoby sprawdzić, czy ktoś mógłby wymyślić krótszą wersję.
PHP 7.2 (bcmath - rozszerzenie) 614 bajtów
<?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;
}
Punktacja
To jest kod golfowy; najkrótszy kod wygrywa. Obowiązują standardowe luki.
źródło
["zX", "tXdsyqzSDRP02", "brFNC02bc"] => "cb"
. (lub cokolwiek to właściwie powinno być, jeśli jest to nieprawidłowe)Odpowiedzi:
MATL , 2 bajty
Wypróbuj online!
Wszystkie przypadki testowe.
Dla pana Za !
źródło
Za
konwersja bazowa, ale dokumenty na matl. nigdy nie było jasne, że akceptuje postacie bazy, więc nie spróbowałem. Rozpruć mnie!R , 124 bajty
Wypróbuj online!
Ugh, to było doozy. Używam typowych lewych sztuczek konwersji dla R, ale manipulacje ciągami w R są nadal nieuporządkowane!
źródło
log(N+1,T)
ale czasami powodując zera wiodące, np. Podczas konwersji 31 z bazy 10 na bazę 2 :(log(N+!N,T)
oczywiście użyć!
oryginalnego znaczeniaAPL (Dyalog Unicode) , 22 bajty
Anonimowy przyrostek lambda. Przyjmuje
InputFormat
jako lewy argument iOutputFormat
jako prawy argument i monituje oNumber
podanie ze standardowego wejścia. Przyjmuje się⎕IO
( I ndex O rigin)0
, co jest domyślne w wielu systemach.Wypróbuj online!
{
…}
„Dfn”;⍺
jest lewym argumentem,⍵
prawym argumentem(mnemoniczny: lewy i prawy koniec alfabetu greckiego)
⍵[
…]
Indeksuj format wyjściowy w następujący sposób:⎕
monit o wprowadzenie⍺⍳
Pliki tych znaków w formacie wejściowym(
…)⊥
Oceniamy jako będące w następującej bazie:≢⍺
długość formatu wejściowego⊢
dochód, (wydzielane¯1
z(≢⍺)
)(
…)⊥⍣¯1
Przekonwertuj na następującą bazę:≢⍺
długość formatu wyjściowegoźródło
Japt, 5 bajtów
Z powrotem w golfa po 2 tygodniowej przerwie
Spróbuj
Wyjaśnienie
źródło
C (gcc), 79 + 46 = 125 bajtów
Musi to zostać skompilowane z
flaga. (Tak, jest to niezwykle szkicowe, dlatego poniżej trzymam moją starą odpowiedź.) To definiuje makro,
f
które wysyła odpowiedź do STDOUT.Wypróbuj online!
C (gcc),
133131 bajtówWypróbuj online!
Definiuje funkcję,
f
która wysyła odpowiedź do STDOUT.źródło
putchar
zamiastwrite
i nieznacznie zmieniając pętlę dekodującą: Wypróbuj online!index
funkcja uratowała mi również jeden bajt przy moim podejściu, nie wiedziałam o tym;)05AB1E , 5 bajtów
Wypróbuj online!
To nie działa w starszej wersji 05AB1E. Działa tylko w nowej wersji, przepisz Elixir.
Jak to działa
źródło
MATL , 5 bajtów
sundar znalazł wbudowane narzędzie, aby to zrobić! Idź upvot tę odpowiedź zamiast mojej głupiej :-(
Wypróbuj online!
źródło
Węgiel drzewny , 5 bajtów
Wypróbuj online!Link jest do pełnej wersji kodu. Wyjaśnienie:
BaseString
Funkcja automatycznie konwertuje między liczbą i łańcucha w zależności od typu pierwszego parametru.źródło
Python 2 ,
132129122121 bajtówWypróbuj online!
Funkcja anonimowa (dzięki, Erik the Outgolfer !), Która konwertuje pierwotną liczbę na liczbę całkowitą podstawową 10, a następnie przekazuje liczbę całkowitą i nowy ciąg bazowy do funkcji g (), która rekurencyjnie przekształca się w nową bazę. Teraz przekazuje długość OutputFormat jako parametr do g ().
Zaktualizowano g () dla niższej liczby bajtów. (dzięki, Dennis !)
Zamieniono index () na find (). (dzięki, panie Xcoder !)
Niegolfowane Objaśnienie:
źródło
f=
, anonimowe funkcje są domyślnie dozwolone.g=lambda n,c:c[n:n+1]or g(n/len(c),c)+c[n%len(c)]
.lambda n,a,b:g(sum(len(a)**i*a.find(j)for i,j in enumerate(n[::-1])),b,len(b))
.Galaretka , 11 bajtów
Wypróbuj online!
Kolejność argumentów: InputFormat, Number, OutputFormat. Pamiętaj, aby zacytować argumenty z odpowiednią ucieczką!
źródło
Pyth, 21 bajtów
Zestaw testowy
Wyjaśnienie:źródło
Haskell , 119 bajtów
Wypróbuj online!
źródło
Perl 6 ,
10097 bajtówWypróbuj online!
Anonimowy blok kodu, który przyjmuje 3 ciągi w kolejności, dane wejściowe, format wejściowy i format wyjściowy, a następnie zwraca ciąg
Wyjaśnienie:
źródło
VBA, 182 bajty
Zadeklarowany podprogram, który pobiera dane wejściowe
n
w językuy
i wyświetla je w językuz
.źródło
JavaScript (ES6),
9086 bajtówPobiera dane wejściowe jako
(input_format)(output_format)(number)
.Wypróbuj online!
źródło
C (gcc) ,
130129 bajtówWypróbuj online!
-1 bajt za pomocą
index
zamiaststrchr
.Jest to proste podejście iteracyjne, polegające na ponownym wykorzystaniu niektórych zmiennych (a tym samym nadużyciu
sizeof(int) == sizeof(char *)
w TIO) w celu zaoszczędzenia bajtów.Wkład:
i
numer wejściowys
źródłowe postacie bazowet
docelowe postacie podstawoweWydajność:
r
numer wyniku (wskaźnik do bufora)Wyjaśnienie:
źródło
bcopy(r,r+1,++i)
zamiastmemmove(r+1,r,++i)
Python 2 ,
9795 bajtówDzięki Chas Brown za -2 bajty.
Wypróbuj online!
źródło
Java 10, 131 bajtów
Lambda przyjmująca parametry w kolejności jako łańcuchy i zwracająca łańcuch.
Wypróbuj online
Bez golfa
źródło