로마 제 3 기


23

n ≥ 0의 정수가 주어지면 숫자 139ABCDE…와 1 문자 구분 기호를 사용하여 위치가 아닌 base-3 표기법으로 출력하십시오 . 모든 숫자는 연속 3의 거듭 제곱이고 분리기의 왼쪽에있는 숫자는 무시됩니다. 예 : A931 | B → 81− (1 + 3 + 9 + 27) → 41 . 숫자는 한 번만 나타날 수 있습니다.

엄격하게 숫자의 값은 다음과 같습니다.

  • 숫자가 1, 3 또는 9 인 경우 값
  • 숫자가 27이면 A
  • 숫자 바로 앞에있는 숫자의 3 배 B..Z

출력은 합 (오른쪽의 자릿수 값)을 충족해야합니다 .-합 (왼쪽의 자릿수 값 ) == 입력|| .

input     output
----------------
0         |
1         |1
7         3|91
730       |D1
9999      FEDC|GA9

공백이 아닌 다른 문자를 구분 기호로 사용할 수 있습니다 . 또한 구분 기호를 사용할 수 없으며,이 경우 가장 큰 숫자는 양수 시퀀스를 시작합니다. 2 32 −1 보다 큰 것을 처리 할 필요가 없습니다 (PMIGDCBA9|RQNLH3 ) .

전체 프로그램 또는 기능을 작성할 수 있으며 일반적인 채널에서 입력 및 출력을 제공 할 수 있습니다.

이것은 이므로 답이 짧을수록 좋습니다.


2
(관련은 복제, 진정을 의미하지 않습니다)
Leaky Nun

8
내가 여기서 무엇을 묻고 있는지 전혀 모르는 유일한 사람인가?
얽히고 설킨

3
@Shaggy 입력을 3의 거듭 제곱과 음의 합으로 표현합니다. 네거티브는 왼쪽에 |, 포지티브는 오른쪽에 둡니다 .
Martin Ender

2
@KevinCruijssen "아니요, 주문은 무료입니다." - OP
user202729

3
@ user202729 아, 그 의견을 놓쳤다. 감사. 규칙이 챌린지로 편집되지 않고 주석에있을 때 이런 일이 발생합니다 .. ( FrownyFrog , 챌린지 에 해당 규칙을 추가 할 수 있습니까 : 구분자의 양쪽에있는 순서는 괜찮습니까?)
Kevin Cruijssen

답변:


5

자바 10 120 113 112 109 107 102 바이트

n->{var r="|";for(char c=49;n++>0;c=(char)(c+=c>64?1:c*4%22%9),n/=3)r=n%3<1?c+r:n%3>1?r+c:r;return r;}

-3 트릭 부분하여 바이트 @Arnauld 의 자바 스크립트 (ES6) 답을 ,
변경 i=0i++<1?49:i<3?51:i<4?57:i+61i=4++i>9?i+55:i>8?57:++i+43. @Arnauld
덕분에 -6 바이트 덕분 에i .

출력 순서 : 최고에서 최저, |분리 문자, 최저에서 최고.

설명:

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

n->{              // Method with integer parameter and String return-type
  var r="|";      //  Result-String, starting at the delimiter "|"
  for(char c=49;  //  Character, starting at '1'
      n++>0       //  Loop as long as `n` is larger than 0
                  //  Increasing it by 1 with `n++` at the start of every iteration
      ;           //    After every iteration:
       c=(char)(  //     Change character `c` to:
          c+=c>64?//      If the current `c` is an uppercase letter:
              1   //       Simpy go to the next letter using `c+1`
             :    //      Else:
              c*4%22%9),
                  //       Change '1' to '3', '3' to '9', or '9' to 'A' 
       n/=3)      //     Integer-divide `n` by 3
     r=           //     Change the result to:
       n%3<1?     //      If `n` modulo-3 is 0:
        c+r       //       Prepend the character to the result
       :n%3>1?    //      Else-if `n` modulo-3 is 2:
        r+c       //       Append the character to the result
       :          //      Else:
        r;        //       Leave `r` unchanged
   return r;}     //  Return the result-String

1
나는 이것이 작동한다고 생각한다 : 103 바이트
Arnauld

@Arnauld 좋은 하나! 그리고 r루프 본문 을 넣어서 -1 바이트 더 . 감사!
Kevin Cruijssen

@Arnauld 호기심으로,이 마지막 두 마법 숫자에 사용한 무차별 대변인은 어떻습니까 (여전히 사용 i하고 재사용 할 때 c)?
Kevin Cruijssen

1
나는 이미 그것을 버렸다 ... :-/ 그러나 여기에 마지막이 있습니다 있습니다. (매우 비효율적이지만, 그런 작은 값은 괜찮습니다.)
Arnauld

(또한, 코드가 더 나은 수식으로 이어지지 않더라도 코드에 p=1포함 *1되어 있는지 여부를 테스트해야합니다 .)
Arnauld


5

자바 스크립트 (ES6), 82 80 79 바이트

소문자로 출력됩니다.

f=(n,s=(k=4,'|'),c=++k>8?k.toString(36):++k-5)=>n?f(++n/3|0,[c+s,s,s+c][n%3]):s

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

Leaky "Ninja Master"Nun의 답변 과 유사 하며 또한 xnor의 답변을 합니다.

숫자 변환

k = 4로 시작 합니다. k9 보다 작은 동안 각 반복마다 두 번 증가시키고 5를 뺍니다 . 그 후, 우리는 그것을 한 번만 증가시키고 base-36으로 변환합니다.

  k  | ++k > 8       | k.toString(36) | ++k - 5  | result
-----+---------------+----------------+----------+--------
  4  | k=5  -> false |                | k=6 -> 1 | 1
  6  | k=7  -> false |                | k=8 -> 3 | 3
  8  | k=9  -> true  | '9'            |          | '9'
  9  | k=10 -> true  | 'a'            |          | 'a'
  10 | k=11 -> true  | 'b'            |          | 'b'
 ... | ...           | ...            | ...      | ...



2

Stax , 30 29 바이트

£└≤☻╘pÿ╖╡A[ô%æτ⌐}►ºôßHl4⌡π%^ 

실행 및 디버깅

Balanced Ternary Converter의 Stax 답변 포트 .

설명

압축이 풀린 버전을 사용하여 설명합니다.

139$VA+cz{;3%+,^3/~;wY1|I@'|ay2|I@L
139$VA+c                               "139AB...Z", make a copy
        z                              Empty array to store the digits
          {         w                  Do the following until 0.
           ;3%+                           Append `b%3` to the digits
                                          Originally, `b` is the input
              ,^3/                        `b=(b+1)/3`
                  ~;                       Make a copy of `b` which is used as the condition for the loop

                     Y                 Save array of digits in `y` for later use
                      1|I              Find index of 1's
                         @             Find the characters in "139AB...Z" corresponding to those indices
                          '|           A bar
                            ay2|I@     Do the same for 2's
                                  L    Join the two strings and the bar and implicit output

1

C # .NET, 103 바이트

n=>{var r="|";for(var c='1';n++>0;c=(char)(c>64?c+1:c+c*4%22%9),n/=3)r=n%3<1?c+r:n%3>1?r+c:r;return r;}

내 Java 10 응답 포트 . 직접 포트 ( n->to 제외 n=>)가 가능하다면이 폴리 글롯으로 Java 응답을 편집했을 것입니다. 그러나 불행히도 C #에서는 c+=문자 또는 문자를 c=49사용할 수 없으므로이 느슨한 답변이 있습니다.

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




1

J , 129 바이트

f=:3 :0
a=.'139',u:65+i.26
s=.'|'while.y>0 do.if.1=c=.3|y do.s=.s,{.a end.y=.<.y%3
if.c=2 do.s=.s,~{.a 
y=.1+y end.a=.}.a end.s
)

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

특히 J 프로그램의 경우 너무 길다.

설명:

f =: 3 : 0
   a =. '139',u:65+i.26   NB. a list '139ABC...Z'
   s =. '|'               NB. initialize the list for the result  
   while. y>0 do.         NB. while the number is greater than 0
      c =. 3|y            NB. find the remainder (the number modulo 3)
      y =. <.y%3          NB. divide the number by 3 
      if. c = 1 do.       NB. if the remainder equals 1
         s =. s,{.a       NB. Append the current power of 3 to the result
      end.
      if. c = 2 do.       NB. if the remainder equals 2 
         s =. s,~{.a      NB. prepends the result with the current power of 3
         y =. 1+y         NB. and increase the number with 1
      end.
      a =. }.a            NB. next power of 3 
   end.
   s                      NB. return the result  
)

1

C, int: 138123 바이트, long: 152131 바이트

나는 최대 작업 입력에 대한 도전의 한계가 0x100000000약간 이상해 보였으므로 두 가지 버전을 만들었습니다 . 한 버전은 32 비트 정수 (명백한 이유로 제한에 실패)로 작동하고 다른 버전은 64 비트 ( 14 8 여분 바이트 의 비용으로 주어진 제한을 초과 함 )로 작동합니다.

32 비트 버전 :

char b[22],*r=b;f(v,l)char*l;{v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

64 비트 버전 :

char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

정수 변수를 long(리눅스에서는 64 비트)로 선언한다는 점을 제외하면 동일합니다 .

언 골프 long버전 :

char buffer[22],*result=buffer;
f(long value,char*letter){
    if(value%3>1){
        *result++=*letter,value++;
    }
    if(value){
        f(value/3,letter+1);
    }
    if(value%3){
        *result++=*letter;
    }
}
g(long value){
    f(value,"139ABCDEFGHIJKLMNOPQR");
    *result=0;
    result=buffer;
}

보시다시피, 이것은 재귀 괜찮은 방식으로 작동합니다. 나머지가 1이면 재귀 호출 후 각 문자가 출력 문자열에 추가됩니다. 나머지가 2이면 재귀하기 전에 출력이 수행됩니다. 이 경우 음수를 올바르게 처리하기 위해 값을 1 씩 증가시킵니다. 이것은 나머지를 0으로 변경하여 추가로 사용할 수 있다는 이점이 있습니다.value%3 재귀 후 조건의 조건 합니다.

변환 결과는 전역 버퍼에 배치됩니다. g()래퍼 제로의 작업이 제대로 결과 문자열을 종료하고 다시 설정하는 result방법도 인 (의 시작 포인터를g() "반환"결과를).

long이 코드로 버전을 테스트하십시오 .

#include <stdio.h>

char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

void printConversion(long value) {
    g(value);
    printf("%ld: %s\n", value, r);
}

int main() {
    for(long i = 0; i <= 40; i++) {
        printConversion(i);
    }
    printConversion(0x7fffffff);
    printConversion(0xffffffffu);
    printConversion(0x100000000);
}

추가적이지만 파괴적인 골프 :

  • -4 바이트 : 포인터 리셋을 제거하여 함수를 원샷으로 만듭니다. g() 만듭니다.

  • -5 바이트 : 호출자가 강제로 문자열 종료를 수행하고 종료없이 문자열을 반환하고에 문자열 buffer끝을 입력합니다 result.


1

, 36 바이트

NθF³⊞υ⟦⟧F⁺139α«⊞§υθι≔÷⊕θ³θ»F²«×|ι↑⊟υ

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

Nθ

값을 입력하십시오.

F³⊞υ⟦⟧

빈 목록 3 개를 사전 정의 된 빈 목록으로 푸시합니다.

F⁺139α«

문자 139와 대문자 알파벳을 반복합니다 .

⊞§υθι

값을 사용하여 목록 목록을 주기적으로 색인화하고 현재 문자를 목록으로 푸시하십시오.

≔÷⊕θ³θ»

값을 3으로 나누고 먼저 1을 더하여 반올림하십시오.

F²«×|ι

두 번 반복하십시오. 두 번째로을 인쇄합니다 |.

↑⊟υ

각 루프는 목록에서 마지막 항목을 팝합니다. 이것은 처음으로 우리에게 나머지의 2(균형 삼항 자릿수에 해당 -1) 항목을 제공하는 반면, 두 번째는 우리에게 균형 잡힌 삼항 숫자에 해당하는 항목을 제공합니다 1. 결과 배열은 일반적으로 세로로 인쇄되지만 인쇄 방향을 위로 회전하면 해당 배열이 취소됩니다.



0

펄 5 , 92 89 바이트

자바와 파이썬 답변에서 영감을 얻었습니다.

sub n{($n,$r,$c,@a)=(@_,'|',1,3,9,'A'..'Z');$n?n(int++$n/3,($c.$r,$r,$r.$c)[$n%3],@a):$r}

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

공백이있는 경우 :

sub n {
  ($n, $r, $c, @_) = (@_, "|", 1, 3, 9, 'A' .. 'Z');
  $n ? n( int++$n/3, ($c.$r, $r, $r.$c)[$n%3], @_)
     : $r
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.