주문 번호 기초 변환기


30

자신이 원하는 숫자를 원하는 형식을 사용하여 자신의 숫자 기반으로 신속하게 변환 할 수있는 기능.

입력

프로그램은 3 개의 매개 변수를 승인해야합니다.

  1. 숫자 : 변환 할 문자열 번호
  2. InputFormat : 숫자가 현재있는 기본 문자열
  3. OutputFormat : 숫자를 변환 할 기본 문자열입니다.

산출

프로그램은 Number이전 숫자베이스 InputFormat에서 새로운 숫자베이스 로 변환해야합니다OutputFormat

("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"

추가

새로운 기본 77 테스트는 작동하는 경우 소품이 필요하지 않습니다.

  1. 먼저 숫자로 변환해야하고 32 비트 내에 잠겨있는 언어라면 건너 뛸 수 있습니다.
  2. 추가 테스트이므로

모든 예제는 다음 코드 (vars mins이지만 코드 형식)를 사용하여 bcmath 확장명을 가진 PHP 7.2에서 생성되었습니다. 아마도 이것이 내가 이것을 위해 필요한 시스템을 위해 생각해 낸 방법 일 것입니다 더 짧은 방법이있을 것입니다 누군가가 더 짧은 버전을 생각 해낼 수 있다면 좋을 것입니다.

PHP 7.2 (bcmath-확장) 614 바이트

<?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;
}

온라인으로 사용해보십시오

채점

이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다. 표준 허점이 적용됩니다.


5
@WindmillCookies 형식 문자열에있는 모든 문자
Adám

6
좋은 첫 질문! :-)
Giuseppe


2
"고유 한"기반에 대한 테스트 사례를 추가하는 것이 ["zX", "tXdsyqzSDRP02", "brFNC02bc"] => "cb"좋습니다. (또는 그것이 정확하지 않은 경우, 실제로해야 할 일)
Fund Monica의 소송

2
36 자 이상의 형식을 가진 테스트 케이스를 제안하여 기본 36까지만 제공되는 내장 기능을 사용하는 사람을 잡을 수 있습니다.
Jo King

답변:


13

....................... 알다시피, Za기본 변환은했지만 matl.doc의 문서는 기본 문자를 받아 들였다는 것이 확실하지 않습니다. 그래서 나는 그것을 시도하지 않았다. 찢어 줘!
주세페

@ 주세페 하하 (Giuseppe Haha), 나는 영리한 핵에서 사용하기에 잘 익은 명령처럼 보였기 때문에 그것을 기억했다. 내가 처음으로 사용하는 것이 곧은 기본 답변이라는 것은 아이러니하다. :)
sundar-복원 모니카

1
내가 "Za"를 보았을 때의 나의 첫번째 생각은 "주님, 해리 드레스덴"이었습니다. +1.
기금 모니카의 소송

8

R , 124 바이트

function(n,s,t,T=L(t),N=(match(!n,!s)-1)%*%L(s)^(L(n):1-1))intToUtf8((!t)[N%/%T^rev(0:log(N,T))%%T+1])
"!"=utf8ToInt
L=nchar

온라인으로 사용해보십시오!

어이, 이것은 멍청한 짓이었습니다. R에는 일반적인 기본 변환 트릭을 ​​사용하지만 R의 문자열 조작은 여전히 ​​엉망입니다!


불행히도 이것은 n = "0"에서 작동하지 않습니다 ... 2 바이트를 추가해야 log(N+1,T)하지만 때로는 0을 발생시키는 경우가 있습니다. 예를 들어 31을 기본 10에서 기본 2로 변환 할 때 :(
digEmAll

0을 선도하지 않고 로그에 "제로 문제"를 방지하기 위해, 당신이 할 수있는 ... 다른 솔루션을 많이 볼 수 없습니다 log(N+!N,T)사용 물론 !원래의 의미를
digEmAll

@digEm 모든 OP의 의견은 여전히 ​​명확하지 않지만 0을 지원할 필요는 없습니다.
주세페

오 잘 .. 그럼 괜찮아 :)
digEmAll

7

APL (Dyalog Unicode) , 22 바이트

익명의 람다. InputFormat왼쪽 인수와 OutputFormat오른쪽 인수로 취하고 Numberstdin에서 프롬프트합니다 . ⎕IO( i ndex O rigin)을 0많은 시스템에서 기본값 이라고 가정 합니다.

{⍵[(≢⍵)⊥⍣¯1⊢(≢⍺)⊥⍺⍳⎕]}

온라인으로 사용해보십시오!

{} "dfn"; 왼쪽 인수, 오른쪽 인수
(니모닉 : 그리스 알파벳의 왼쪽 및 오른쪽 끝)

⍵[] 다음을 사용하여 출력 형식을 색인화하십시오.

   입력 프롬프트

  ⍺⍳format 입력 형식의 문자들

  ()⊥ 다음과 같은 기준으로 평가합니다.

   ≢⍺ 입력 형식의 길이

   그 수율 (분리형 ¯1에서 (≢⍺))

  ()⊥⍣¯1 다음 기준으로 변환하십시오.

  ≢⍺ 출력 형식의 길이


7

apt, 5 바이트

2 주 휴식 후 골프로 돌아 오기

nV sW

시도 해봐


설명

           :Implicit input of U=Number, V=InputFormat & W=OutputFormat
 nV        :Convert U from base V to decimal
    sW     :Convert to base W string

7

C (gcc), 79 + 46 = 125 바이트

char*O;l,n;g(n){n/l&&g(n/l);write(1,O+n%l,1);}

이것으로 컴파일해야합니다

-Df(s,i,o)=for(n=l=0;n=n*strlen(i)+index(i,s[l])-i,s[++l];);l=strlen(O=o);g(n)

깃발. (예, 이것은 엄청나게 스케치하기 때문에 이전 답변을 아래에 유지하는 이유입니다.) 이것은 fSTDOUT에 답변을 출력 하는 매크로 를 정의합니다 .

온라인으로 사용해보십시오!

C (gcc), 133131 바이트

char*O;l;g(n){n/l&&g(n/l);write(1,O+n%l,1);}f(s,i,o,n)char*s,*i,*o;{for(n=0,l=strlen(O=o);n=n*strlen(i)+index(i,*s)-i,*++s;);g(n);}

온라인으로 사용해보십시오!

fSTDOUT에 대한 답변을 출력 하는 함수 를 정의합니다 .

char*O;           // declare variable to store output charset
l;                // will be set to length of O
g(n){             // helper function to print the result
  n/l&&g(n/l);    // recursively calls itself if there are more digits
  write(1,        // output to stdout...
   O+n%l,1);      // the byte at (n mod output base) in O
}
f(s,i,o,n)        // main function
char*s,*i,*o;{    // declare string inputs
for(n=0,          // initialize n to 0
l=strlen(O=o);    // assign output charset so we don't have to pass it to g
n=n*strlen(i)     // repeatedly multiply n by input base...
+index(i,*s)-i,   // ... add the index of the digit in input charset...
*++s;);           // and move to the next digit until there's none left
g(n);             // call the helper function on the resulting integer
}

디코딩 루프를 약간 변경하는 putchar대신 대신 사용하여 2 바이트를 절약 할 수 있습니다 . write
ErikF

index기능은 그것에 대해 알지 못했다, 내 접근뿐만 아니라 나에게 한 바이트를 저장)
펠릭스 Palmen을에게

6

05AB1E , 5 바이트

ÅβIÅв

온라인으로 사용해보십시오!

기존 버전의 05AB1E 에서는 작동 하지 않습니다 . 새 버전 인 Elixir 재 작성에서만 작동합니다.

작동 원리

ÅβIÅв – 전체 프로그램.
Åβ – 커스텀베이스에서 10 진수로 변환합니다.
  I – 세 번째 입력을 누릅니다.
   Åв – 10 진수에서 커스텀베이스로 변환합니다. 

05AB1E v2에서만 작동하지만 (올바른 버전 번호인지 확실하지는 않습니다.) TIO 링크를 제공했습니다. 엘릭서 버전이 이미 TIO에 있습니까?! : S 아니면 대부분의 테스트 사례에서 작동하지만 새 버전에서만 작동하는 경우가 있습니까?
Kevin Cruijssen

2
05AB1E v2가 이제 TIO에서 사용 가능합니다. 05AB1E (레거시) (티오 바에서 검색)는 이전 05AB1E의 이름이고 05AB1E는 새 이름입니다. 나는 당신이 이미 대화방에서 그것을 보았지만 다른 사용자를위한 참고로 여기에 남겨 둘 것입니다.
Mr. Xcoder

5

MATL , 5 바이트

sundar는 이것을하기 위해 실제 내장을 발견했습니다! 내 멍청한 사람 대신 그 대답을 찬성해라 :-(

ZAwYA

온라인으로 사용해보십시오!

          % implicit input N, the number, and S, the digits of the Source base
ZA        % base2dec, convert string N using S as digits into a base 10 integer
w         % swap stack elements, with implicit input T, the digits of the Target base
YA        % dec2base, reverse the ZA operation with digits coming from T instead.

4

, 5 바이트

⍘⍘SSS

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

  S     Input the "number"
   S    Input the input format
 ⍘      Convert to number using that format
    S   Input the output format
⍘       Convert to string using that format
        Implicitly print

BaseString함수는 첫 번째 매개 변수의 유형에 따라 숫자와 문자열을 자동으로 변환합니다.


3

파이썬 (2) , 132 (129) 122 121 바이트

lambda n,a,b:g(sum(len(a)**i*a.find(j)for i,j in enumerate(n[::-1])),b)
g=lambda n,c:c[n:n+1]or g(n/len(c),c)+c[n%len(c)]

온라인으로 사용해보십시오!

익명의 함수 ( Erik the Outgolfer ! 덕분에 )는 원래 숫자를 기본 10 정수로 변환 한 다음 정수와 새 기본 문자열을 함수 g ()로 전달하여 새 기본으로 재귀 적으로 변환합니다. 이제 OutputFormat의 길이를 매개 변수로 g ()에 전달합니다.

더 낮은 바이트 수를 위해 g ()가 업데이트되었습니다. (감사합니다, 데니스 !)

index ()를 find ()로 대체했습니다. (감사합니다, Xcoder 씨 !)

풀리지 않은 설명 :

def f(n, a, b):
    # reverse the string to that the least significant place is leftmost
    # Ex: 985724 -> 427589
    n = n[::-1]
    # get the value of each place, which is its index in the InputFormat, times the base to the power of the place
    # Ex: 427589, 9876543210 -> 5*10^0, 7*10^1, 2*10^2, 4*10^3, 1*10^4, 0*10^5 -> [5,70,200,4000,10000,0]
    n = [a.find(j)*len(a)**i for i,j in enumerate(n)]
    # add all of the values together to bet the value in base 10
    # Ex: (5 + 70 + 200 + 4000 + 10000 + 0) = 14275
    n = sum(n)

    # call the convert to base function
    return g(n, b)

def g(n, c):
    # string slice, which will return an empty string if n:n+1 is not in range
    # an empty string is falsey
    if c[n:n+1]:
        return c[n:n+1]
    else:
        # get current least significant digit
        rem = c[n%len(c)]
        # get the rest of the integer
        div = n/len(c)

        # get the converted string for the rest of the integer, append the calculated least significant digit
        return g(div,c)+rem

1
f=익명 기능은 기본적으로 허용 되지 않습니다 .
Outgolfer Erik

@ Outgolfer @Ek 익명 함수가 다른 함수를 호출 할 때 허용됩니까?
Triggernometry

바이트 수에 다른 항목을 포함시키는 한 변수를 정의하고 모듈을 가져올 수 있습니다.
아웃 골퍼 Erik

1
도우미 기능이 될 수 있습니다 g=lambda n,c:c[n:n+1]or g(n/len(c),c)+c[n%len(c)].
Dennis

1
그리고 주요한 것은 될 수 있습니다 lambda n,a,b:g(sum(len(a)**i*a.find(j)for i,j in enumerate(n[::-1])),b,len(b)) .
Mr. Xcoder

2

젤리 , 11 바이트

iⱮ’ḅL{ṃ⁵ṙ1¤

온라인으로 사용해보십시오!

인수 순서 : InputFormat, Number, OutputFormat. 적절한 이스케이프를 사용하여 인수를 인용하십시오!


내가 매개 변수의 순서를 명시 적으로 언급했는지 잘 모르겠다 ...
Martin Barker

@MartinBarker 매개 변수는 여기에서 2, 1, 3 순서로 가져옵니다. 챌린지에서 특정 주문에 대한 요구 사항을 볼 수 없으므로 권장하지 않습니다.
Outgolfer Erik

3
@MartinBarker Pro 팁 : 그런 것들에 유연 해지십시오.
Xcoder

어쨌든 지금 테스트하려고 노력하고 있습니다.
마틴 바커

2

Pyth, 21 바이트

s@LeQjimx@Q1dhQl@Q1le

테스트 스위트

설명:
s@LeQjimx@Q1dhQl@Q1le  | Code
s@LeQjimx@Q1dhQl@Q1leQ |  with implicit variables
       m               | Map the function
        x   d          |   index of d in
         @Q1           |    the second string in the input
             hQ        |  over the first string in the input
      i                | Convert the resulting list to int from base
               l@Q1    |  length of the second string in the input
     j                 | Convert the int into a list in base
                   leQ |  length of the last string in the input
 @LeQ                  | Turn each number in the list into the character from the numbers index in the last string in the input
s                      | Concatenate the strings in to one string
                       | Implicit print


2

펄 6 , 100 97 바이트

{$^c.comb[(":"~$^b.chars~[$^a.comb>>.&{index $b,$_}].perl).EVAL.polymod($c.chars xx*)].join.flip}

온라인으로 사용해보십시오!

순서대로 3 개의 문자열, 입력, 입력 형식 및 출력 형식을 취한 다음 문자열을 반환하는 익명 코드 블록

설명:

{  # Anonymous code block
  $^c.comb[  # Split the output format into characters
           (":"~$^b.chars~[$^a.comb>>.&{index $b,$_}].perl) # The radix syntax in a string e.g ":3[1,2,3]"
           .EVAL  # Eval'ed to produce the base 10 version
           .polymod($c.chars xx*)  # Converted to a list in the output base (reversed)
          ] # Convert the list into indexes of the output format
           .join  # Join the characters to a string
           .flip  # And unreversed
}

2

VBA, 182 바이트

n언어로 입력 을 받아 언어 y로 프로젝트를 선언하는 선언 된 서브 루틴 z.

Sub f(n,y,z)
l=Len(n)
For i=-l To-1
v=v+(InStr(1,y,Mid(n,-i,1))-1)*Len(y)^(l+i)
Next
l=Len(z)
While v
v=v-1
d=v Mod l+1
v=v\l
If d<0Then v=v+1:d=d-l
o=Mid(z,d+1,1)&o
Wend
n=o
End Sub

2

자바 스크립트 (ES6), 90 86 바이트

다음과 같이 입력을받습니다. (input_format)(output_format)(number) 받습니다.

s=>d=>g=([c,...n],k=0)=>c?g(n,k*s.length+s.search(c)):k?g(n,k/(l=d.length)|0)+d[k%l]:n

온라인으로 사용해보십시오!


문자열의 입력 형식을 CLI 입력을 통해 수행 할 수없는 배열로 변경하면 유효하지 않습니다. 프로그래밍해야하며 첫 번째 매개 변수가 유효하려면 문자열을 배열로 분할해야합니다.
Martin Barker

@MartinBarker 어떤 규칙을 말하는거야? 어쨌든 3 개의 문자열을 사용하도록 업데이트되었습니다.
Arnauld

입력 매개 변수 중 3 개 모두 "문자열"이라고 C ++로 문자열을 직접 읽을 수 있고 Javascript를 사용할 수없는 배열로 사용할 수 있습니다.
Martin Barker

1

C (GCC) , 130 (129) 바이트

v;c(r,i,s,t)char*r,*i,*t;{for(r[1]=v=0;*i;v=v*strlen(s)+index(s,*i++)-s);for(s=strlen(t),i=1;*r=t[v%s],v/=s;memmove(r+1,r,++i));}

온라인으로 사용해보십시오!

index대신에 -1 바이트 사용strchr .

이것은 sizeof(int) == sizeof(char *)바이트를 절약하기 위해 일부 변수를 재사용 하여 TIO에서 남용하는 간단한 반복적 접근 방식 입니다.

입력:

  • i 입력 번호
  • s 소스 기본 문자
  • t 대상 기본 문자

산출:

  • r 결과 번호 (버퍼에 대한 포인터)

설명:

v;                                        // value of number
c(r,i,s,t)char*r,*i,*t;{
    for(r[1]=v=0;                         // initialize value and second
                                          // character of output to 0
        *i;                               // loop while not at the end of
                                          // input string
         v=v*strlen(s)+index(s,*i++)-s);  // multiply value with source base
                                          // and add the value of the current
                                          // digit (position in the base string)
    for(s=strlen(t),i=1;                  // initialize s to the length of the
                                          // target base string, length of
                                          // result to 1
        *r=t[v%s],v/=s;                   // add character for current digit
                                          // (value modulo target base) and
                                          // divide value by target base until
                                          // 0 is reached
        memmove(r+1,r,++i));              // move result string one place to
                                          // the right
}

bcopy(r,r+1,++i)대신 제안memmove(r+1,r,++i)
ceilingcat


1

자바 10, 131 바이트

매개 변수를 문자열로 받아 문자열을 반환하는 람다.

(i,f,o)->{int n=0,b=o.length();var r="";for(var c:i.split(r))n=n*f.length()+f.indexOf(c);for(;n>0;n/=b)r=o.charAt(n%b)+r;return r;}

온라인으로 사용해보십시오

언 골프

(i, f, o) -> {
    int n = 0, b = o.length();
    var r = "";
    for (var c : i.split(r))
        n = n * f.length() + f.indexOf(c);
    for (; n > 0; n /= b)
        r = o.charAt(n % b) + r;
    return r;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.