Shortlex에서 그 숫자는 무엇입니까?


15

대부분의 컴퓨터는 정수를 이진수로 저장하지만 십진수로 출력합니다. 그러나 십진수는 단지 하나의 표현 일뿐입니다.

이 문제는 정수 값을 shortlex decimal 로 출력하는 코드를 작성하는 것 입니다.

그게 뭐야?
http://en.wikipedia.org/wiki/Shortlex_order

Shortlex는 일련의 숫자 길이를 기본 값으로 사용합니다. 0을 나타내는 빈 문자열에서 시작하는 시퀀스는 다음과 같습니다.

ε,0,1,...,8,9,00,01,...98,99,000,001,...,998,999,0000,...

(Excel 열을 생각하지만 십진수 만 사용하십시오.)

정수를 허용하고 위에서 설명한대로 해당 정수의 shortlex-decimal 표현에 해당하는 문자열을 리턴하는 프로그램 또는 함수를 작성하십시오.

시험 값 :

0 → ""(빈 문자열)
1 → "0"
10 → "9"
11 → "00"
42 → "31"
100 → "89"
800 → "689"
1060 → "949"
10270 → "9159"
100501 → "89390"


2
19, 20, 21, 2210 진수로 된 시퀀스 는 짧은 것으로 매핑 된다는 점에 유의해야합니다 08, 09, 10, 11. 그렇기 때문에 내가 혼동했습니다 100 -> 89!
Sean Latham


6
당신이 숫자의 "짧은 십진수"라고 부르는 것은 또한 기호 {0,1,2,3,4,5,6,7,8,9}로 대체 된 bijective base-ten 숫자입니다. 일반적인 숫자 {1,2,3,4,5,6,7,8,9, A}. 예를 들어, 일반적인 bijective base-ten 표기법에서 2014 년은 1A14이고, 짧은 십진수에서는 0903입니다.
res

답변:


34

자바 스크립트 (ES6) 42 74

n=>(n-~(n+'').replace(/./g,8)+'').slice(1)

FireFox 콘솔에서 테스트

;[0,1,10,11,42,100,800,1060,10270,100501]
.forEach(x => console.log(x +" -> '" + S(x) + "'"))

산출

0 -> ''
1 -> '0'
10 -> '9'
11 -> '00'
42 -> '31'
100 -> '89'
800 -> '689'
1060 -> '949'
10270 -> '9159'
100501 -> '89390'

나는 이것을 어떻게 생각 했습니까?

숫자가 고정되어 있으면 출력 시퀀스가 ​​오름차순이므로 입력과 출력 사이에 고정 델타가 있습니다. 보세요 :

  1..10 -> 0..9 (delta -1)
 11..110 -> 00..99 (delta -11)
111..1110 -> 000..999 (delta -111) mmm there's a pattern here...

그러나 선행 0은 관리하기가 어렵 기 때문에 표준 트릭을 가지고 첫 번째 숫자를 추가하고 모듈로 작업합니다 (즉, 첫 번째 숫자를 출력으로 자릅니다). 그런 다음 -1-> +9, -11-> +89, -111-> +889 등입니다.
마지막 단계 : 첫 번째 숫자가 무엇인지 상관하지 않으므로 iinput 번호가 <또는> 111인지 여부를 확인할 필요가 없습니다 (정직하게 시행 착오로 찾았습니다)

테스트

var F=
n=>(n-~(n+'').replace(/./g,8)+'').slice(1)

function update()
{
  var i=+I.value
  O.textContent = F(i)
}


update()
<input id=I value=99 type=number oninput='update()'><pre id=O></pre>


8
왜 이것이 작동하는지 모르겠습니다.
Martin Ender

n-~(n+'')그냥 대신 n-~n합니까?
Claudiu

@Claudiu (n+'').replace(...), 바꾸기는 숫자가 아닌 문자열에서 작동합니다.
edc65

@ edc65 : 죄송합니다. 방금 괄호와 일치하지 않습니다. Dayum 이것은 매우 훌륭하다
Claudiu

3
@Dennis는 자유롭게 포팅 할 수 있습니다. 이미
이겼습니다

13

Marbelous 177 173 170

@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0

Marbelous는 8 비트 언어이므로 256 미만의 값에 대해서만 작동합니다.

작동 원리

Marbelous는 8 비트 구슬로 표현 된 값을 가진 2D 언어로, 일부 장치가 넘어지지 않도록하지 않는 한 각 진드기마다 한 셀 아래로 떨어집니다. 이 놀라운 프로그램은 3 개의 보드로 구성됩니다. 가장 쉬운 것으로 시작합시다.

:O
}0
+Z
+C
{0

:O보드의 이름입니다 (정확히 말하면 O는 이름입니다. : :이 줄이 이름임을 해석합니다. 보드에 이름을 부여하면 다른 보드 }0가 입력 장치 일 수 있음) 이 함수의 인수.이 셀이 함수가 호출되는 입력 대리석 (값)로 대체 얻을 것이다는. +Z. 그것을 통해 가을 위로 통과 할 수있는 대리석으로 35을 추가 +C동일하지 만 (12)가 추가 {0출력 세포입니다 , 대리석이이 셀에 도달하면 함수가 종료되고이 출력 장치의 값을 반환합니다.

따라서이 보드는 하나의 가치를 취한 다음 47을 더합니다. 우리에게 이것은 하나의 숫자가 숫자 -1의 ASCII 코드로 바뀐다는 것을 의미합니다 (물론 10도 가능합니다).

:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //

이 보드는 조금 더 복잡해 보입니다. :I보드 이름 으로 식별 할 수 있어야하며 일부 입력 및 출력 장치를 발견했습니다. 당신은 우리가 두 개의 서로 다른 입력 장치가있는 것을 알, 수 있습니다 }0}1. 이것은이 기능이 2 개의 입력을 받는다는 것을 의미합니다. 또한 }1장치의 두 인스턴스가 있음을 알 수 있습니다 . 함수를 호출하면 두 셀 모두 동일한 값을 포함합니다. }0입력 장치들은 직접 위에 \/이것은 휴지통 역할 바로 그 위에 떨어지는 모든 대리석 제거 장치.

}1입력 장치 가 보드에 넣은 구슬 중 하나에 어떤 일이 발생하는지 살펴 보겠습니다 .

}1
=9 &1
&0
{>

첫 번째 틱에서 떨어지고 =9장치를 누르십시오 . 이것은 구슬의 값을 9와 비교하고 문장이 =9평가 되면 구슬이 빠지게 합니다. 그렇지 않으면 대리석이 오른쪽으로 밀려납니다. &0그리고 &1동기화 자입니다. 그들은 다른 모든 &n동기화 장치가 채워질 때까지 구슬에 붙습니다 . 예상대로, 이것은 보드의 다른 부분에서 조건 적으로 다른 동작을 트리거합니다.

}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //

이것이 ++증분 장치라고 말하면 이미 다른 동기화 프로그램으로 채워지는 것을 말할 수 있어야합니다. 왼쪽 &1에는 입력 값 }1+ 1 이 포함되고 그 &0옆에는 0이 포함됩니다 ( 0016 진수로 표시되는 언어 리터럴 임). 두 번째 &1는 값 1을 포함하고 오른쪽 &0은으로 채워 F7지며 Marbelous의 덧셈은 모듈로 256이므로 값에서 9를 뺍니다.

// 디플렉터 장치로, 대리석을 떨어 뜨리지 않고 왼쪽으로 밀어냅니다.

이 모든 것을 합치면 다음과 같은 결과를 얻을 수 있습니다. 구슬 }1이 9이면 &0동기화 장치가 채워집니다. 이로 인해 값 0이 {0출력 으로 떨어지고 F7(또는 -9) 출력 으로 떨어집니다 {1. }19가 아닌 경우 + 1 {0로 채워지고 }11 {0을 포함합니다. {>장치 도 있습니다. 이것은 보드 대신 대리석을 보드 옆에 출력하는 특수 출력입니다. }19와 같으면 채워집니다 .

@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO

자 이제 큰 것입니다. 이 보드는 파일의 메인 보드이므로 명시적인 이름이 없습니다. 내재 된 이름은 Mb입니다. 일부 셀을 인식 할 수 있어야합니다. 입력 장치, 일부 언어 리터럴 ( 00FF)이 있습니다. 싱크로 나이저와 디플렉터가 있습니다. 이 조각을 단계별로 살펴 보겠습니다.

@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4

따라서 입력 값 (이것이 메인 보드이므로 명령 행 입력)은 두 번째 셀에서 위치의 맨 위에서 시작합니다 }0. 넘어져서 >0다른 비교 장치 인 장치에 도달합니다 . 0보다 큰 구슬은 쓰러지고 다른 구슬은 오른쪽으로 밀립니다. (Marbelous 변수는 부호가 없으므로 정확히 0 만 오른쪽으로 푸시됩니다). 이 제로 값 대리석은 @6장치에 부딪칩니다 . 이것은 포털이며 대리석을 다른 해당 포털 (이 경우 바로 위)로 전송합니다. 그런 다음 0 구슬은 &0동기화 장치에 도달하여 다른 곳을 트리거합니다.

대리석이 0이 아닌 경우, 그것은 아래로 폭포에 의해 오른쪽으로 편향됩니다 \\안타 --하나를 감소시키고 그 다음에 하강 /\하는 클론 업체입니다. 이 장치는 대리석을 가져 와서 사본 하나를 오른쪽으로, 하나는 왼쪽으로 출력합니다. 왼쪽 하나는 다른 쪽 위로 @0올라 가면서 대리석이 다시 같은 순서로 진행됩니다. 왼쪽은 다른 곳으로 가져갑니다. 이것은 루프를 제공하여 루프 당 한 번 명령 행 입력을 감소시키고 0에 도달 할 때까지 모든 루프에서 일부 동작을 트리거합니다. 그런 다음 다른 동작을 트리거합니다.

@4각 루프에 구슬이 밀려 났을 때 어떤 일이 발생하는지 살펴 보겠습니다 .

@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO

여기에는 3 개의 언어 리터럴이 있으며 ( FF) 즉시 포털에 포함됩니다. 이 포털은 3 개의 II장치로 연결됩니다. 파일을 더 정의한 II보드를 나타냅니다 :I. :I2 개의 개별 입력 장치가 있기 때문에 다른 보드의 표현은 2 셀 너비 여야합니다. II우리는를 포함하는 6 개의 셀을 가지고 있기 때문에 , 우리는이 함수의 인스턴스가 3 개 있다고 보드에 알려줍니다.

FF(또는 256 -1 당신이 할 경우) 구슬이의 입력 셀에 앉을 :I전까지가 충분한 입력 대리석 석재가 기능을 시작 대기 기능 (하나입니다). 그것이 바로 @4포털이 들어오는 곳 입니다. 감소 된 명령 행 입력의 사본은 각 루프에 있습니다. 가장 왼쪽 :I보드 가 트리거됩니다 . 값 256 (또는 -1) 및 명령 행 입력이 -1 인 모든 값으로 초기화합니다. 왼쪽 대리석은 보드 의 }0장치에, 오른쪽 대리석은에 있습니다 . 이 게시판이 무엇을했는지 기억한다면, 그 결과가 무엇인지 알 수 있습니다. 왼쪽 출력에 오른쪽 입력의 증분 버전을 출력하고 (9가 10이 아닌 0으로 바)) 오른쪽에 1 또는 -9를 출력합니다.:I}1

증가 된 값은 포털에서 오른쪽 입력 셀로 바로 가져 오며 오른쪽의 값은 동기화 프로그램에 속합니다. 싱크로 나이저가 이미 구슬을 가지고 있다면 두 구슬이 충돌합니다. 충돌하는 구슬은 모듈로 256에 합쳐집니다. 따라서 싱크로 라이저의 값은 다음을 수행합니다. 다시 1 (247이 모듈로 256에 추가되기 때문에).

입력 값이 다시 0으로 루프 될 때 구슬이 오른쪽으로 출력된다는 것을 기억할 수도 있습니다. :I보드가 서로 바로 옆에 있기 때문에 보드가 오른쪽으로 한 번 트리거됩니다. 이렇게하면 세 개의 동기화 프로그램이 명령 줄 입력의 단순 표현보다 값이 1보다 높은 값으로 채워집니다.이 시간은 0으로 줄어 듭니다.

:O함수가 값을 숫자 -1을 나타내는 숫자의 ASCII 값으로 변환 한다는 것을 기억할 수도 있습니다 . 이 OO셀 의 출력은 보드에서 떨어져 해당 ASCII 문자를 STDOUT에 인쇄합니다.

00 00 00 @5
&0 &0 &0
&3
\/ &2
   \/ &1 !!
      @5

명령 행 입력 대리석이 0에 도달하여 &0동기화 프로그램을 채우면 어떻게됩니까? 글쎄, 약간의 0 값 구슬이 떨어지고 보드 하단에 단수의 자릿수 (+ 1)를 보유하고있는 세 개의 동기화 장치를 트리거합니다. &3가장 중요한 숫자가 포함되어 있기 때문에 먼저 트리거 &2됩니다 &1. 그런 다음이 구슬 @5!!셀에 부딪 치기 전에 다른 장치로 순간 이동 하여 보드를 종료합니다.


4
이 코드도 유효한 Perl 코드 인 것처럼 보입니다.
Doorknob

12

CJam, 14 11 바이트

l40f-Ab)s1>

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

작동 원리

이 접근법은 edc65의 답변 ( 명백한 허가 ) 에 크게 의존합니다 .

" Read a line L from STDIN. ";

l

" edc65's answer now forms an integer N by replacing each digit in L by an 8 and computes
  L - ~N = L + N + 1. Instead of adding L and N, we subtract 40 from each char code of L.
  Since the char code of the digit `D` is `D + 48`, this basically adds 8 to each digit.  ";

40f-

" Turn the resulting array into an integer by considering its elements a base 10 number.
  This is implemented as A ↦ A[-1] + 10 * A[-2] + 100 * A[-3] + ⋅⋅⋅, so it won't choke
  on digits greater than the base.                                                        ";

Ab

" Increment the integer on the stack to complete the calculation of L + N + 1.            ";

)

" Push the integers string representation and discard its first character.                ";

s1>

예제 실행

$ for i in 0 1 10 11 42 100 800 1060 10270 100501
> do echo $i: $(cjam <(echo 'l40f-Ab)s1>') <<< $i)
> done
0:
1: 0
10: 9
11: 00
42: 31
100: 89
800: 689
1060: 949
10270: 9159
100501: 89390

1
이것은 외설이다
Claudiu

3
더 단축하는 방법을 찾는 +1
edc65

6

파이썬 2 (38) (43)

f=lambda n:n*'_'and f(~-n/10)+`~-n%10`

문자 대체가 아니라 산술입니다.

언 골프 드 :

def f(n):
    if n==0: return ''
    else: return f((n-1)//10) + str((n-1)%10)

재귀가 작동하는 이유는 없지만이 패턴을 값 목록에 맞 춥니 다. 각각 n-1을로 변경 n하면 일반 숫자 표시가 나타납니다.

골프의 경우, 또는 보다 높은 우선 순위 ~-n로 계산 n-1하여 괄호를 절약하는 데 사용합니다. 은 단지 빈 문자열 때 생산하는 것입니다 그렇지 않으면 다른 문자열입니다. 는 이 목적을 위해 임의의 문자열이 될 수 있습니다./10%10n*'_'n=0'_'


4

루비, 70 68 66 64 57 바이트

f=->n{i=-1;n-=10**i while n>=10**i+=1;i<1?'':"%0#{i}d"%n}

처럼 호출 될 함수를 정의합니다 f[42]. 알고리즘의 대략적인 분석은 다음과 같습니다.

  • 0별도로 취급하십시오 .
  • 다음 10의 거듭 제곱이 더 이상 숫자에 맞지 않을 때까지 10의 거듭 제곱을 뺍니다.
  • 숫자를 왼쪽에 0으로 채워진 문자열로 바꿉니다.

형식 문자열을 사용한다는 아이디어는 Falko로갑니다!


또는 edc65의 접근 방식을 사용하십시오.

f=->n{"#{n-~n.to_s.tr('^.',?8).to_i}"[1..-1]}

그것은 45 바이트 이며 나는 그것을 포함하지 않기 때문에 그것을 포함하고 있습니다. ;)


확실한. 나는 긴 파이썬 코드로 어쨌든 당신을 붙 잡지 않을 것이라고 생각합니다. ;)
Falko

누군가가 골프의 언어 중 하나에이 방법을 사용하면 확실 해요 @Optimizer 그들은 (그 존재가 내가 아주 현재 45 ... 그 접근 방식 루비 (44)에 도달 할 수없는 말했다) (20) 아래로 얻을 것
마틴 Ender

2
@Optimizer 나는 그것에 동의하지 않습니다. 우선 J와 APL은 골프 언어가 아니며 GolfScript와 CJam만큼 자주 승리합니다. 그러나 골프는 녹색 체크 표시가 아니라 "리그에서"제출을 치는 것에 관한 것입니다. 내가 4 가지 언어를 능가하는 루비 제출을 작성한다면, 나는 그것에 대해 매우 기뻐할 수 있고, 더 자세한 언어로 골프를 즐기기 위해 그것들을 금지 할 필요는 없다. 실제로, edc와 같은 "정상적인"언어의 영리한 골프는 골프 언어의 순진한 (그러나 더 짧은) 구현보다 훨씬 많은 공감을 얻습니다.
Martin Ender

3

하스켈, 67 바이트

n('9':x)='0':n x
n(c:x)=succ c:x
n""="0"
f x=reverse$iterate n""!!x

이 솔루션은 기본적으로 단수 표기법으로 주어진 횟수만큼 1을 더합니다.

용법:

>f 9
"8"
>f 100
"89"

3

CJam, 16 바이트

li_)9*,{`1>}%_&=

온라인으로 사용해보십시오. 최소 O (n) 시간 및 메모리가 필요하므로 100501을 오프라인 통역사에게 맡기십시오.

작동 원리

이 방법의 기본 개념은 자연 순서대로 최소 N 개의 짧은 십진수를 계산하고 N 번째를 제외한 모든 것을 버리는 것입니다. 매우 효율적이지 않지만 짧습니다.

li                " Read an integer N from STDIN.                                   ";
  _)9*            " Push M := (N + 1) * 9.                                          ";
      ,           " Push A := [ 0 1 ... M - 1 ].                                    ";
       {   }%     " For each I ∊ A:                                                 ";
       {`1>}%     " Push its string representation and discard the first character. ";
             _&   " Remove duplicates from the resulting array.                     ";
               =  " Retrieve the Nth element.                                       ";

예제 실행

$ for i in 0 1 10 11 42 100 800 1060 10270 100501
> do echo $i: $(cjam <(echo 'li_)9*,{`1>}%_&=') <<< $i)
> done
0:
1: 0
10: 9
11: 00
42: 31
100: 89
800: 689
1060: 949
10270: 9159
100501: 89390

3

Bash + coreutils, 27 바이트

@Dennis 의 개선 사항 과 함께 @ edc65의 영리한 답변 포트 :

cut -b2-<<<$[$1-~${1//?/8}]

산출:

$ for n in 0 1 10 11 42 100 110 111 800 1060 1110 1111 10270 100501; do echo "./shortlex.sh $n = \"$(./shortlex.sh $n)\""; done
./shortlex.sh 0 = ""
./shortlex.sh 1 = "0"
./shortlex.sh 10 = "9"
./shortlex.sh 11 = "00"
./shortlex.sh 42 = "31"
./shortlex.sh 100 = "89"
./shortlex.sh 110 = "99"
./shortlex.sh 111 = "000"
./shortlex.sh 800 = "689"
./shortlex.sh 1060 = "949"
./shortlex.sh 1110 = "999"
./shortlex.sh 1111 = "0000"
./shortlex.sh 10270 = "9159"
./shortlex.sh 100501 = "89390"
$ 

이전 답변 :

Bash + coreutils, 71 54 바이트

약간 다른 방법이 있습니다.

jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-
  • jot 16 진 정수 증가 출력
  • tr 이것을 (0,1, ..., 8,9, b, ... f, 0a, 00,01, ..., 99,9b, ..., ff, 0aa, ..., 000으로 변환 , ...)
  • grep 단순히 숫자를 포함하는 모든 줄을 필터링하여 (0,1, ..., 8,9,00, ..., 99,000 ....)
  • sed n 번째 행을 제외한 모든 행을 삭제합니다.
  • STDERR은 버리기 파일 '-'로 리디렉션되어 0이 전달 될 때 단순히 빈 문자열을 얻습니다 ( sed1부터 시작하는 행 번호를 계산하므로 0이 전달되면 오류가 발생 함)
  • 로 숫자를 필터링 하므로 입력 숫자보다 / grep를 사용하여 더 많은 기본 11 정수를 생성해야합니다 . n의 숫자를 반복하면 충분합니다.seqdc

짧은 숫자가 인쇄되면 seq계속해서 숫자를 생성합니다. $1$1특히 큰 입력 숫자-O (n²)의 경우 속도가 느려집니다. seq7 바이트의 비용으로 인쇄 후 즉시 종료 하여 속도를 높일 수 있습니다 .

jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed -n $1{p\;q} 2>-

질문에 속도 요구 사항이 없으므로 기본 답변을 위해 더 짧은 버전으로 갈 것입니다.


@Optimizer nope : 시도하십시오 s='jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-'; echo ${#s}. "\\"를 하나의 문자로 취급하는 문자열 길이를 측정하기 위해 파이썬을 사용하고 있다고 생각합니다.
디지털 외상

2
내 대답은 지금까지 바뀌었지만 첫 번째 개정판에서 영리한 일을 한 경우 우연히 우연입니다. 그것은 edc65의 답변에 대한 직접적인 내용이었습니다. 8은 모두 그의 ...-보조 변수 $a는 불필요한 것 같습니다. cut -b2-<<<$[$1-~${1//?/8}]잘 작동합니다.
Dennis

1
@Dennis 맞습니다. 제안 해 주셔서 감사합니다!
Digital Trauma

2

파이썬 2-84, 70 66

n=input()
i=0
while n>=10**i:n-=10**i;i+=1
print"%%0%dd"%i%n*(i>0)

대체 방법 (같은 길이) :

n=input()
k=len(`9*(n+1)/10`)
print"%%0%dd"%k%(n-int('1'*k))*(n>0)

형식 문자열을 사용하는 것은 영리합니다! 나는 그것을 사용한다면 당신이 신경 쓰지 않기를 바랍니다. :)
Martin Ender

2

파이썬 3, 107 자

이것은 끝나지 않았지만 영리하다고 생각했습니다.

def G():yield'';yield from(r+c for r in G()for c in'0123456789')
S=lambda n:list(zip(range(n+1),G()))[n][1]

전체 시퀀스의 생성기를 64 자로 정의합니다. 불행히도, 발전기의 n 번째 요소를 얻으려면 약간의 왜곡을 거쳐야 S=lambda n:G()[n]합니다.


2

피 이스 , 12

@ edc65의 답변의 또 다른 포트는 명확한 승자 (IMO)입니다.

t`+hQv*l`Q\8

테스트 패키지 (@DigitalTrauama에게 감사드립니다) :

$ for n in 0 1 10 11 42 100 110 111 800 1060 1110 1111 10270 100501; do echo "shortlex.pyth $n = \"$(pyth programs/shortlex.pyth <<< $n)\""; done
shortlex.pyth 0 = ""
shortlex.pyth 1 = "0"
shortlex.pyth 10 = "9"
shortlex.pyth 11 = "00"
shortlex.pyth 42 = "31"
shortlex.pyth 100 = "89"
shortlex.pyth 110 = "99"
shortlex.pyth 111 = "000"
shortlex.pyth 800 = "689"
shortlex.pyth 1060 = "949"
shortlex.pyth 1110 = "999"
shortlex.pyth 1111 = "0000"
shortlex.pyth 10270 = "9159"
shortlex.pyth 100501 = "89390"

설명:

Q = eval(input())             Implicit.
t`                            All but the first digit of
  +hQ                         Q+1 + 
   v                          eval(
    *l`Q                      len(repr(Q)) * 
     \8                       "8"

CJam 대 피스; 전투는 계속됩니다. : P
Dennis

Pyth 에게이 도전에 대한 기회를 주려고했지만 List를 정수로 변환하는 방법을 찾을 수 없었습니다 (예 :) [8, 8, 9] -> 889. 어떻게합니까?
Dennis

@Dennis 목록에서 int로 가려면 기본적으로 문자열을 거쳐야합니다. jk목록을 문자열 v로 바꾸고 int로 바꿉니다. 그래서 vjk[8 8 9]수 889. 줄 것이다
isaacg

알았어 고마워. 안타깝게도 문자열 변환은 일부 트릭을 불가능하게 만듭니다. CJam / GolfScript 기본 변환 [2 -1] -> 19[1 11] -> 21.
Dennis

1
@Dennis 그래, Pyth에 기본 변환을 추가하면 작동합니다. 그러나 아직하지 않았습니다.
isaacg




0

엑셀, 37 바이트

@ edc65의 접근 방식 사용 :

=REPLACE(REPT(8,LEN(A1))+A1+1,1,1,"")

0

젤리 , 5 바이트

ḃ⁵ịØD

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

젤리를 처음 접했으므로 개선 할 수 있다면 의견을 말 해주세요!

설명:

ḃ⁵ịØD   Main link.
ḃ       Convert to bijective base ...
 ⁵      10.
  ị     Each number (1 - 10) is converted to the character at its index in the string...
   ØD   “0123456789” (digits)

(위의 res의 의견에 따르면, 문제는 숫자를 bijective base 10으로 변환하는 것과 같습니다)

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