pi에서 첫 번째로 자릿수 정렬


17

음수가 아닌 숫자가 주어지면 pi 에서 첫 번째로 n숫자를 정렬하십시오.n .

함수 cli 인수 또는 STDIN을 통해 입력하거나 문자열, char [] 또는 정수로 입력 할 수 있습니다. 리턴 값, 종료 상태 또는 STDOUT을 통해 출력 할 수 있습니다.



입력과 출력을 문자열이나 숫자 배열로 취할 수 있습니까?
ETHproductions

@ETHproductions가 명확 해졌습니다.
Roman Gräf

19
몇 가지 테스트 사례가 좋을 것입니다.
Dennis

1
이제 12 가지 답변이 이미 있으며 모두 동일한 결과를 나타냅니다. 무엇을 요청했는지 여전히 확실하지 않은 경우 질문의 문제가 아닙니다.
Leaky Nun

답변:


14

Pyth, 8 6 바이트

ox+.n0

여기에서 시도하십시오.

Leaky Nun 덕분에 -1 : 0필요한 경우 입력이 제공 됩니다. Jakube
덕분에 사소한 -1 덕분에 백틱이 필요하지 않았습니다 (아, 어떻게 그리웠습니까?


Woohoo, 이것은 심지어 05AB1E를 능가합니다! 편집 : 그것은 05AB1E를 이기지 않으며, 훔치고 싶지 않습니다 :(
Out the Outgolfer Erik

3
찾았어요. 0끝에는 필요하지 않습니다 . 입력이있는 경우 0는이 0입력에 의해 제공 될 것이다; 입력 값에가 0없으면 중요하지 않습니다.
Leaky Nun

3
@LeakyNun 그리고 당신은 심지어 역행을 저장할 수 있습니다 :ox+.n0
Jakube

좋아, 첫 번째 의견을 무시하고 LeakyNun과 Jakube 덕분에 다시 05AB1E를 이겼습니다. 이번에는 좋기를 바랍니다.
Outgolfer Erik

1
그것은 암묵적인 입력의 아름다운 양입니다.
isaacg


18

05AB1E , 10 9 7 바이트

중복 필터링이 불필요하다는 Leaky Nun 덕분에 1 바이트가 절약 되었습니다. Adnan
덕분에 2 바이트를 절약했습니다 .

žqRvy†J

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

설명

žq       # push pi to 15 decimals (contains all digits but 0)
  R      # reverse
   vy    # for each char in pi
     †J  # move it's occurrences in the input to the front

13žsRvy†J9 바이트 동안
Leaky Nun

@LeakyNun : 예, 중복은 중요하지 않습니다. 감사합니다 :)
Emigna

3
žq대신 사용할 수 있습니까 13žs?
Adnan

@Adnan 작동하지 않는 것 같습니다.
Outgolfer Erik

2
@Adnan : 물론입니다. 나는 또 다른 파이 상수가 있다는 것을 몰랐습니다 :)
Emigna

8

젤리 , 10 바이트

“ṀSṪw’ṾiµÞ

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

입력을 문자열로 취합니다.

@ETHproductions 덕분에 -3 바이트

설명

“ṀSṪw’ṾiµÞ
        µ  - Separate chain into function “ṀSṪw’Ṿi and sort atom Þ.
         Þ - Sort the input by
       i   - Each digit's index in: 
“ṀSṪw’     - the literal 3145926870 ...
      Ṿ    - transformed into the list 3,1,4,5,9,2,6,8,7,0

31459268704 자리 base-250 문자열로 표현 될 수 있다고 생각 하지만 (10 바이트 대신 6 바이트가 소요됨) 압축 방법을 잘 모르겠습니다.
ETHproductions

젤리는 파이를 내장하지 않습니까?
math junkie

@mathjunkie 그러나 젤리는 문자열 조작에 매우 효율적이지 않습니다
Leaky Nun

@mathjunkie 예, 그러나 목록에 대한 조작에는 너무 많은 바이트가 필요합니다
fireflame241

“ṀSṪw’당신에게 줄 것이다 3145926870.
Leaky Nun

8

Japt , 10 9 바이트

8 바이트 코드, -P플래그는 +1

–!bMP+U

온라인으로 사용해보십시오! 입력을 문자열로받습니다.

설명

–!bMP+'0  // Implicit input

¬          // Split the input into chars.
 ñ         // Sort each char in the resulting list by
  !b       //   its index in
    MP+U   //     Math.PI + the input.
-P         // Join the result back into a single string.
           // Implicit: output result of last expression

7

자바 스크립트 (ES6), 54 바이트

f=
s=>[...s].sort((a,b)=>k[a]-k[b],k=`9150236874`).join``
<input oninput=o.textContent=f(this.value)><pre id=o>

I / O에 문자열을 사용합니다.


7

젤리 ,  8  7 바이트

Dennis 덕분에 -1 바이트 (기존 0의 입력에 사용하십시오 )

ØP;ṾiµÞ

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

어떻게?

ØP;ṾiµÞ - Main link: string s (char list)
     µÞ - sort the characters, c, of s by:
    i   -   first index of c in:
ØP      -     pi yield: 3.141592653589793
  ;     -     concatenate with left: [3.141592653589793, c]
   Ṿ    -     un-evaluate: "3.141592653589793,c" (a char list with the digit character c)
                                if any c is 0 ^ it will then be to the right of all others

... 그리고 거기에 내가 사각형을 검색했다 - 3820009(의 SQRT는 14592468760081) 아직 3기지에 자리 250.
Jonathan Allan

당신의 설명에가 잘못됩니다.
Outgolfer Erik

@EriktheOutgolfer-감사합니다.
Jonathan Allan

6

CJam , 15 12 10 8 바이트

r{P`#c}$

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

-3 : P리터럴 대신 pi 변수를 기반으로하는 문자열을 사용하십시오 .
-2 : 인덱스를 찾는 것이 어쨌든 첫 번째 항목을 취하기 때문에 유니 균등화 할 필요가 없다고 결정했습니다. -2 : x mod 65536을 사용한 흥미로운 접근법에 대해 jimmy23013 에게 감사합니다 .

설명:

r {P` # c} $ e # 입력 토큰을받습니다
re # 정수를 문자열로 취하십시오.
 {P` # c} e # 정렬 키 :
  P e # P를 누릅니다 (기본값은 3.141592653589793).
   `e # 문자열 표현으로 변환
    우리가 만든 문자열에서 char의 인덱스를 찾으십시오.
         e # A '.' 정수에서 찾을 수 없지만 시프트는 이상적인 정렬을 유지하므로 중요하지 않습니다.
         e # '0'은 -1로 색인됩니다.
     ce # 인덱스를 char로 변환
         e # 먼저 인덱스 % 65536을 계산 한 다음 char로 변환합니다. 그렇지 않으면 0이 -1, 즉 가장 작은 인덱스로 인덱스되기 때문에 이것이 필요합니다.
         e # 사전 정렬을 사용할 수 있으므로 정수로 다시 변환 할 필요가 없습니다.
       $ e # 키로 정렬


1
예, MATL을
이겼습니다


와우 영리 해요. int (x) % 65536에 내장 된 것과 거의 같으며 ci정수로 다시 변환 할 수도 있습니다.
아웃 골퍼 Erik 11

5

PHP, 71 바이트

정규식 솔루션은 짧은

for(;~$c=_3145926870[$i++];)echo str_repeat($c,substr_count($argn,$c));

또는

for(;~$c=_3145926870[$i++];)echo str_pad("",substr_count($argn,$c),$c);

온라인 버전

PHP, 78 바이트

for(;~$c=$argn[$i++];)$j[strpos("3145926870",$c)].=$c;ksort($j);echo join($j);

PHP, 112 바이트

$a=str_split($argn);usort($a,function($x,$y){return strpos($d="3145926870",$x)<=>strpos($d,$y);});echo join($a);

온라인 버전


69 바이트 솔루션을 추가했습니다 . 어쩌면 우리는 함께 66 바이트로 줄일 수 있습니다.)
Christoph



3

MATL , 14 바이트

YP99Y$uj!y=sY"

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

예를 들어 설명

이 기호 ;는 행렬에서 행 구분 기호 로 사용됩니다. 따라서 [1 2 3]행 벡터이고, [1; 2; 3]열 벡터이고, [1 2; 3 4]정방 행렬이다. 후자는 또한 명확성을 위해 다음과 같이 표현 될 수있다.

[1 2;
 3 4]

2325예를 들어 입력 을 고려하십시오 .

YP     % Push approximation of pi as a double (predefined literal)
       % 3.14159265358979
99Y$   % Variable-precision arithmetic with 99 digits. Gives a string.
       % The input 3.14159265358979 is recognized as representing pi
       % STACK: '3.141592653589793238462 ··· 707'
u      % Unique entries, keeping order of their first appearance
       % STACK: '3.145926870'
j      % Input line as a string
       % STACK: '3.145926870', '2352'
!      % Transpose
       % STACK: '3.145926870', ['2'; '3';'5'; '2']
y      % Duplicate the second-top element in the stack
       % STACK: '3.145926870', ['2'; '3';'5'; '2'], '3.145926870'
=      % Test for equality, with broadcast. This gives a matrix with
       % all pairwise comparisons)
       % STACK: '3.145926870', [0 0 0 0 0 0 1 0 0 0 0;
       %                        1 0 0 0 0 0 0 0 0 0 0;
       %                        0 0 0 0 1 0 0 0 0 0 0;
       %                        0 0 0 0 0 0 1 0 0 0 0]
s      % Sum of each column
       % STACK: '3.145926870', [1 0 0 0 1 0 2 0 0 0 0]
Y"     % Run-length decoding. Implicitly display
       % STACK: '3522'


2

C # 인터랙티브, 37 36 바이트

i.OrderBy(c=>"145926870".IndexOf(c))

실제로 적절한 결과를 얻으려면 C # 대화 형에서 이것을 실행해야하지만 종료 상태 와 관련이 있다고 생각 합니다 . 변수 i는 실제로 입력 변수 (예 : 문자열 일 수 있음)이므로 기본적으로 메소드 매개 변수입니다.

코드 자체는 매우 간단하다고 생각합니다.


어디있어 3?
Paul

1
@Paul 요소를 찾지 못하면 -1을 반환하므로 필요하지 않습니다.
MetaColon

이것은 단지 코드 스 니펫입니다. 대화식에서도 왜 i어딘가에 입력 해야 할지를 지정해야 합니다. 또한 C #을 말하는 경우 using System.Linq;바이트 수 에 포함시켜야 합니다. 그러나 이것이 대화 형인 경우 언어를 C #이 아닌 C # 대화 형으로 지정해야합니다.
TheLethalCoder

@ TheLethalCoder 나는 C # Interactive로 업데이트했습니다. 대화식에서는 자동으로 포함되므로 사용이 필요하지 않습니다.
MetaColon

2

05AB1E , 5 6 바이트 (비경쟁)

0표준 길이 pi 상수에는 존재하지 않는다는 것을 깨달았습니다 .

Σтžsyk

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

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi

이 비경쟁을 Σ도전보다 새로운 것으로 표시해야합니다.
Emigna

@Emigna가 감사를 표시했습니다. 그러나 필요한 수정 후 그것은 어쨌든 승리 답변보다 더 짧지 않습니다) :
kalsowerus

이 방법에는 0이 필요합니다. 적어도이 언어에 가장 적합해야합니다. 그 이상을 요청할 수 없습니다 :)
Emigna

2

PHP, 66 65 바이트

Titus 덕분에 1 바이트를 절약했습니다.

while(~$d=_3145926870[++$i])echo preg_filter("/[^$d]/",'',$argn);

1

자바 7, 110 바이트

String c(String s){String r="";for(char i:"3145926870".toCharArray())r+=s.replaceAll("[^"+i+"]","");return r;}

설명:

String c(String s){                       // Method with String parameter and String return-type
  String r="";                            //  Result String
  for(char i:"3145926870".toCharArray())  //  Loop over the characters of "3145926870"
    r+=s.replaceAll("[^"+i+"]","");       //   Append the result-String with all the occurrences of the current character
                                          //  End of loop (implicit / single-line body)
  return r;                               //  Return the result-String
}                                         // End of method

테스트 코드 :

여기에서 시도하십시오.

class M{
  static String c(String s){String r="";for(char i:"3145926870".toCharArray())r+=s.replaceAll("[^"+i+"]","");return r;}

  public static void main(String[] a){
    System.out.println(c("12345678908395817288391"));
  }
}

산출:

33311145599922688888770

1

클로저, 38 바이트

#(sort-by(zipmap"3145926870"(range))%)

문자열로 입력하고 일련의 문자를 반환합니다. zipmap함수 컨텍스트에서도 사용할 수있는 "사전"개체를 만듭니다.

(f "1234")
(\3 \1 \4 \2)

입력 숫자가 고유 한 것이 확실하다면 간단하게 할 수 #(filter(set %)"3145926870")있습니다.


1

PHP, 69 68

for(;(~$d=$argn[$j++])||~$c=_3145926870[$i+++$j=0];)$c==$d&&print$d;

여전히 preg_filter에 의해 맞았 지만 꽤 좋았다고 생각했습니다. 누군가가 몇 바이트를 골프를 칠 수 있습니다.


$c!=$d?:print$d대안으로 $c==$d&&print$d순간에
Jörg Hülsermann

1
_3145926870` "3145926870"대신 1 바이트를 절약
Jörg Hülsermann

for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);작동하는 대안도
요 르그 Hülsermann


0

k, 19 바이트

{x@<"3145926870"?x}

설명:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.