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
) .
전체 프로그램 또는 기능을 작성할 수 있으며 일반적인 채널에서 입력 및 출력을 제공 할 수 있습니다.
이것은 code-golf 이므로 답이 짧을수록 좋습니다.
답변
자바 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=0
및 i++<1?49:i<3?51:i<4?57:i+61
행 i=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
답변
파이썬 3 , 103 99 91 바이트
Lynn 덕분에 4 바이트.
ov 덕분에 8 바이트
def f(n,s="|",b=0):c=('139'+chr(b+62)*b)[b];return n and f(-~n//3,[s,s+c,c+s][n%3],b+1)or s
논리에 대한 xnor의 크레딧 .
답변
자바 스크립트 (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로 시작 합니다. k 가 9 보다 작은 동안 각 반복마다 두 번 증가시키고 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'
... | ... | ... | ... | ...
답변
답변
펄 6 , 80 바이트
{map({|(1,3,9,|('A'..'Z'))[grep :k,*%3==$^v,($_,-+^*div 3...0)]},1,2).join.flip}
구분자가 없습니다. xnor의 답변을 기반으로 합니다.
답변
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
답변
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
사용할 수 없으므로이 느슨한 답변이 있습니다.