가장 큰 자릿수로 정렬


23

도전:

정수 목록이 주어지면 가장 큰 단일 숫자로 내림차순으로 정렬하십시오. 가장 큰 자릿수를 가진 숫자의 순서는 두 번째로 큰 자릿수 등으로 정렬됩니다
. 숫자의 중복 자릿수는 무시합니다. 숫자의 모든 숫자가 동일하면 목록에서 해당 숫자의 순서는 원하는 방식으로 지정할 수 있습니다.

예:

Input:            [123, 478, -904, 62778, 0, -73, 8491, 3120, 6458, -7738, 373]
Possible outputs: [8491, -904, 62778, 478, -7738, 6458, 373, -73, 3120, 123, 0]
                  [8491, -904, 62778, 478, -7738, 6458, -73, 373, 3120, 123, 0]

왜? 숫자를 정렬 한 관련 숫자는 다음과 같습니다.

Output:
[8491,  -904,  62778,   478,     -7738,   6458,  373,   -73,   3120,      123,     0  ]

Relevant digits they were sorted on:
[[9,8], [9,4], [8,7,6], [8,7,4], [8,7,3], [8,6], [7,3], [7,3], [3,2,1,0], [3,2,1], [0]]

도전 규칙 :

  • 우리는 중복 된 숫자를 무시하므로 478-7738같은 명령을 받게됩니다 478, -7738가장 큰 자리이기 때문에, [8,7,4]그리고 [8,7,3], 그리고 [8,7,4]그리고 [8,7,7,3].
  • 여러 숫자가 같은 숫자를 가지면 순서는 어느 쪽이든 될 수 있습니다. 그래서 373-73같이 분류 할 수 있습니다 모두 373, -73또는 -73, 373(자리가 [7,3]이 번호 모두).
  • 숫자에 더 이상 확인할 숫자가 없으면 해당 숫자의 뒷면에 배치됩니다. 그래서 1233120같이 정렬됩니다 3120, 123가장 큰 숫자가 있기 때문에, [3,2,1]동일하지만 0전에 온다 none.
  • 입력의 모든 숫자가 범위 내에 있다고 가정 할 수 있습니다 [-999999,999999].
  • 결과적으로 가능한 출력 중 하나만으로 충분하지만 원하는 경우 하위 목록이 순열에있을 수있는 모든 가능한 출력을 출력 할 수 있습니다 (물론 모든 언어로 바이트를 절약 할 수는 없지만).

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 링크를 추가하십시오 (예 : TIO ).
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

Input:            [123, 478, -904, 62778, 0, -73, 8491, 3120, 6458, -7738, 373]
Possible outputs: [8491, -904, 62778, 478, -7738, 6458, 373, -73, 3120, 123, 0]
                  [8491, -904, 62778, 478, -7738, 6458, -73, 373, 3120, 123, 0]

Input:            [11, -312, 902, 23, 321, 2132, 34202, -34, -382]
Possible outputs: [902, -382, 34202, -34, -312, 321, 2132, 23, 11]
                  [902, -382, 34202, -34, 2132, -312, 321, 23, 11]
                  etc. The sublist [-312, 321, 2132] can be in any permutation

Input:            [9, 44, 2212, 4, 6, 6, 1, 2, 192, 21, 29384, 0]
Possible outputs: [29384, 192, 9, 6, 6, 4, 44, 2212, 21, 2, 1, 0]
                  [29384, 192, 9, 6, 6, 44, 4, 2212, 21, 2, 1, 0]
                  etc. The sublists [4, 44] and [2212, 21] can be in any permutation

Input:            [44, -88, 9, 233, -3, 14, 101, 77, 555, 67]
Output:           [9, -88, 67, 77, 555, 14, 44, 233, -3, 101]

답변:



7

R , 97 95 바이트

function(x)x[rev(order(sapply(Map(sort,Map(unique,strsplit(paste(x),"")),T),Reduce,f=paste0)))]

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

이 과제는 R에 비관적 인 것으로 보입니다. 원본 버전에 대한 설명 (1에서 시작하여 해결) :

f <- function(x) {
  x[                                                  # 8. Input vector in
    rev(                                              # 7. Reversed
        order(                                        # 6. Lexicographical order
              sapply(                                 # 5. Paste....
                     Map(sort,                        # 4. Sort each using...
                              Map(unique,             # 3. Deduplicate each
                                  strsplit(           # 2. Split each string into characters
                                           paste(x),  # 1. Coerce each number to string
                                           "")),      
                         T),                          # 4. ...descending sort.
                     paste,collapse="")               # 5. ...back into strings
              )
        )
    ]
}

6

펄 6 , 36 34 33 31 바이트

Jo King 덕분에 -1 바이트
Phil H 덕분에 -2 바이트

*.sort:{sort 1,|set -<<m:g/\d/}

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

설명

       {                      }  # Map each number, e.g. -373
                       m:g/\d/  # Extract digits: (3, 7, 3)
                    -<<  # Negate each digit: (-3, -7, -3)
                set  # Convert to set to remove duplicates
               |  # Pass as list of pairs: (-3 => True, -7 => True)
             1,  # Prepend 1 for "none": (1, -3 => True, -7 => True)
        sort  # Sort (compares 1 and pair by string value): (-7 => True, -3 => True, 1)
*.sort:  # Sort lexicographically

1
좋은! 교환을 m:g/\d./위한 -2 바이트 .abs.comb: tio.run/…
Phil H

6

파이썬 2 , 60 55 54 바이트

Jonas Ausevicius 덕분에 -1 바이트 .

def f(l):l.sort(cmp,lambda n:sorted(set(`n`))[::-1],1)

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


언 골프

def f(l):
  l.sort(        # Sort the list in place
    cmp = cmp,   # ... compare with the builtin function cmp
    key = k,     # ... on the function k
    reverse = 1  # ... in reverse
  )              # As the arguments are used in the right order, no names are necessary.

k = lambda n:sorted( # sort  
  set(`n`)           # ... the set of digits
  )[::-1]            # reverse the result
                     # As '-' is smaller than the digits,
                     # it will be sorted to the back and ignored for sorting

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


5
None기능 cmp에서 대체 될 수 있음sort
Jonas Ausevicius

[::-1]은 이중 부정으로 교환 될 수 있다고 생각합니다.
DonQuiKong

@DonQuiKong은 숫자가 모두 문자열이기 때문에 조금 더 길어지기 때문에 int로 변환해야합니다.
ovs

@JonasAusevicius 감사합니다.
ovs


5

Brachylog , 9 바이트

{ȧdṫo₁}ᵒ¹

참고 : brachylog에서 주문이 작동하는 방식으로 인해 숫자에서 올바르게 작동하지 않습니다. 이것은 1 바이트의 비용으로 숫자를 문자열 ( )로 캐스팅하여 수정됩니다 .

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


2
" 부적절한 주문 방식으로 인해 의도 한대로 작동하지 않습니다. "는 무엇을 의미합니까? 나는 네 가지 테스트 사례를 모두 시도했지만 올바른 결과를 제공합니다 (실수로 뭔가 과거를 보지 않는 한).
케빈 크루이 ssen

@KevinCruijssen (문자열로) 문제를 해결합니다. 숫자 내림차순으로 숫자를 정렬하면 다음과 같이 작동합니다. 가장 작은 것부터 가장 큰 것까지 순서를 바꾼다. 문제는 수가 있다는 것입니다 3120최소에서 최대 규모로 주문 0123에 동일한되는 123것입니다 반전하는 321하지3210
Kroppeb

2
아 좋아요, toString ( ) 이 추가되어 현재 코드가 작동하고 있습니다. @Arnauld가 언급했듯이 귀하의 의견은 현재 코드가 작동하지 않는다고 생각했습니다. 처럼 말할 것도 좋을 것 : " 이것은 제거하여 8 바이트 수 있었다 (toString)을하지만, 의도 한대로 인한 Brachylog에서 주문 작동 방식에 작업을하지 않는 불행하게도. "
케빈 Cruijssen

내가 쓴 것을 보면 뇌가 산만 해져있는 것 같습니다. 고쳤다.
Kroppeb

5

Pyth, 7 6 바이트

@Sok에 의해 -1 바이트

_o_{S`

인쇄 가능한 ASCII 만 사용하는 Pyth는 약간의 단점이 있습니다. 최적으로 인코딩 된 6*log(95)/log(256) = 4.927바이트는 05AB1E입니다.

설명 :

 o              Sort the implicit input by lambda N:
  _               reversed
   {               uniquified
    S               sorted
     '               string representation [of N]
_               then reverse the result.

여기에서 시도 하십시오 .


2
후행 N은 1 바이트를 절약하기 위해 생략 될 수 있습니다. 모든 람다 유형 함수는 인수가 누락 된 경우 기본 람다 변수의 존재를 유추합니다. 예를 들어 m유추 d, f유추 T, u유추 등이 있습니다 G.
Sok

4

젤리 , 8 바이트

ADṢUQµÞU

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

작동 원리

ADṢUQµÞU  Main link (monad). Input: integer list
     µÞU  Sort by (reversed):
AD        Absolute value converted to decimal digits
  ṢUQ     Sort, reverse, take unique values

2
방금 이것을 구현하고 귀하의 게시물을 찾았습니다. 나는 upends보다는 정상적인 반전으로 갔다 U. 그러나 Dsince sort는 필요하지 않습니다 . 내부 호출 로 구현됩니다 iterable(z, make_digits=True). 그래서 그것은 AṢQṚµÞṚ7시 였습니다 .
Jonathan Allan

3

MathGolf , 7 6 바이트

áÉ░▀zx

온라인으로 사용해보십시오! 또는 테스트 스위트로 .

설명

Emigna의 05AB1E 솔루션을 살펴본 후 절대 연산자가 필요하지 않다는 것을 알았습니다 (이 연산자 때문에 이전 답변이 실제로 잘못되었습니다). 이제 주요 차이점은 05AB1E에서 1 바이트 연산자를 사용하는 대신 문자열로 변환하고 고유 한 문자를 얻는다는 것입니다.

áÉ      Sort by the value generated from mapping each element using the next 3 instructions
  ░     Convert to string
   ▀    Get unique characters
    z   Sort reversed (last instruction of block)
     x  Reverse list (needed because I don't have a sort-reversed by mapping)


3

하스켈 , 54 52 바이트

import Data.List
f=r.sortOn(r.sort.nub.show);r=reverse

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


정의 r=reverse하면 2 바이트가 절약됩니다. 우리는 또한 익명의 기능을 허용하므로 f=계산할 필요가 없습니다.
Laikoni

import와 f =를 TIO 헤더로 옮겼습니다. 그 확인은?
Martin Lütke

동일한 바이트 수이지만 관심이있을 수 f=r$r id.nub.show;r=(reverse.).sortOn있습니다.
Laikoni

1
실제로 수입을 계산해야합니다.
Laikoni

2
당신은 우리의에보고하도록 할 수 있습니다 하스켈에서 규칙을 골프에 가이드 .
Laikoni

3

Stax , 6 7 바이트

èó≥ü≤♥¥

실행 및 디버깅


잘못된 결과가 나타납니다. 예를 들어, TIO의 테스트 케이스 -904 8491 478 62778 6458 -7738 -73 373 123 3120 0에서는 의도 한 8491 -904 62778 478 -7738 6458 373 -73 3120 123 0또는 대신에 출력 합니다 8491 -904 62778 478 -7738 6458 -73 373 3120 123 0. 이 테스트 사례는 예제에서도 사용되며 규칙을 설명하기 위해 더 잘 이해하기 위해 살펴 보겠습니다. 다른 규칙없이 단일 숫자로 한 번만 정렬하는 것 같습니다.
Kevin Cruijssen

@KevinCruijssen : 예, 사과드립니다. 문제 진술을 잘못 읽었습니다. 명시된 요구 사항을 처리하도록 프로그램을 조정했습니다. 이 프로그램은 입력 정수를 따옴표로 묶은 문자열로 받아들입니다. 일반적으로 허용되지만 그렇지 않은 경우 다른 바이트를 추가해야 할 수도 있습니다.
재귀

나에게서 +1, 이제 좋아 보인다. 그리고 네, 문자열로 입력하는 것은 완전히 좋습니다.
케빈 크루이 ssen

3

APL (Dyalog Extended) , 19 바이트

{⍵[⍒∪¨(∨'¯'~⍨⍕)¨⍵]}

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

OP 덕분에 +2 바이트의 비용으로 수정되었습니다.


나는 당신이 어딘가에 '고유 한'을 놓치고 있다고 생각합니까? 예를 들어 TIO에서 예제 테스트 사례를 시도하면 ¯7738앞에 배치 478되지만 그 뒤에 있어야합니다. 자리 [8,7,4]는 자리 앞에옵니다 [8,7,3].
케빈 크루이 ssen

감사합니다, @KevinCruijssen
Zacharý

3

C (GCC) , 114 (111) 109 바이트

a;v(n){n=n<0?-n:n;for(a=0;n;n/=10)a|=1<<n%10;n=a;}c(int*a,int*b){a=v(*a)<v(*b);}f(a,n)int*a;{qsort(a,n,4,c);}

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

설명:

f ()는 qsort ()를 사용하여 제공된 배열을 정렬합니다. 비교 함수 c ()를 사용하여 v ()를 사용하여 숫자를 평가하는 숫자를 비교합니다. v ()는 매개 변수에 더 큰 숫자가 있으면 더 높은 숫자를 계산합니다.

[편집 1] 3 바이트 향상되었습니다. Kevin에게 2 바이트 크레딧 감사

[Edit 2] 2 바이트 더 향상되었습니다. gastropner 에의 크레딧. 감사


1
당신 은 당신의 방법의 루프에서 생각 골프 n>0를 할 수 있습니다 . nv
케빈 크루이 ssen

f ()의 인수 목록 int*a,n은로 단축 될 수 있습니다 int*a.
gastropner

1
for(a=0;n=abs(n);대신 추천n=n<0?-n:n;for(a=0;n;
천장 고양이

2

J , 17 바이트

{~[:\:~.@\:~@":@|

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

설명:

                @|    - find the absolute value and
             @":      - convert to string and
         @\:~         - sort down and
       ~.             - keep only the unique symbols
    \:                - grade down the entire list of strings   
  [:                  - function composition
{~                    - use the graded-down list to index into the input   

2

자바 스크립트 (SpiderMonkey) , 68 바이트

SpiderMonkey가 안정적인 정렬을 사용하므로 -4 바이트를 제거한다는 것을 다시 상기시켜 주신 @Arnauld에게 감사드립니다 ||-1.

A=>A.sort((x,y,F=n=>[...new Set(""+n)].sort().reverse())=>F(x)<F(y))

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

자바 스크립트 (Node.js) , 72 바이트

A=>A.sort((x,y,F=n=>[...new Set(""+n)].sort().reverse())=>F(x)<F(y)||-1)

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


또는 SpiderMonkey의 경우 68 바이트 입니다.
Arnauld

1
@Arnauld oh 안정적인 정렬 다시; P
Shieru Asakoto

10

1
@Arnauld V8은 Chrome 70 이전에 빠른 정렬을 사용합니다. 빠른 정렬 알고리즘은 배열 크기가 충분히 작 으면 삽입 정렬을 수행합니다. 최신 Chrome은 다른 브라우저 (IE / Firefox / Safari) 동작과 일치하도록 안정적인 정렬로 변경되었습니다.
tsh

2

자바 (JDK) , 98 바이트

l->l.sort((a,b)->{int r=0,i=58;for(;r==0&i-->48;)r=(b.indexOf(i)>>9)-(a.indexOf(i)>>9);return r;})

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

설명

l->                           // Consumer<List<String>>
 l.sort(                      //  Use the incorporated sort method which uses a...
  (a,b)->{                    //   Comparator of Strings
   int r=0,                   //    define r as the result, initiated to 0
       i=58;                  //           i as the codepoint to test for.
   for(;r==0&i-->48;)         //    for each digit codepoint from '9' to '0',
                              //     and while no difference was found.
    r=                        //     set r as the difference between
     (b.indexOf(i)>>9)-       //      was the digit found in b? then 0 else -1 using the bit-shift operator
     (a.indexOf(i)>>9);       //      and was the digit found in a? then 0 else -1.
   return r;                  //    return the comparison result.
  }
 )

노트 :

숫자를 0/1또는 에 매핑하는 방법이 필요했습니다 0/-1.

indexOf-1찾을 수없는 문자를 일관되게 반환한다는 멋진 속성이 있습니다 . -1어떤 숫자로든 오른쪽 이동은 항상 -1입니다. 충분히 큰 숫자로 오른쪽 이동 된 양수는 항상을 생성 0합니다.

그래서 여기 있습니다 :

input        input.indexOf('9')      input.indexOf('9')>>9
"999"        0                       0
"111119"     5                       0
"123456"     -1                      -1

1
아 그래, 그게 내 뜻이야 ; p 제한된 수의 범위 때문에 >>9대신 에 사용 하는 멋진 골프 >>32.
케빈 크루이 ssen




1

APL (NARS), 366 자, 732 바이트

_gb←⍬

∇a _s w;t
t←_gb[a]⋄_gb[a]←_gb[w]⋄_gb[w]←t
∇

∇(_f _q)w;l;r;ls;i
(l r)←w⋄→0×⍳l≥r⋄l _s⌊2÷⍨l+r⋄ls←i←l⋄→3
  →3×⍳∼0<_gb[i]_f _gb[l]⋄ls+←1⋄ls _s i
  →2×⍳r≥i+←1
l _s ls⋄_f _q l(ls-1)⋄_f _q(ls+1)r
∇

∇r←(a qsort)w
r←¯1⋄→0×⍳1≠⍴⍴w⋄_gb←w⋄a _q 1(↑⍴w)⋄r←_gb
∇

f←{∪t[⍒t←⍎¨⍕∣⍵]}

∇r←a c b;x;y;i;m
x←f a⋄y←f b⋄r←i←0⋄m←(↑⍴x)⌊(↑⍴y)⋄→3
→0×⍳x[i]<y[i]⋄→3×⍳∼x[i]>y[i]⋄r←1⋄→0
→2×⍳m≥i+←1⋄r←(↑⍴x)>(↑⍴y)
∇

qsort 연산자의 경우 APL에서 139 페이지 K & R Linguaggio C의 한 traslation입니다. 포인터가있는 C로 데이터를 사용하고 있다고 생각합니다 ... 테스트

 c qsort 123, 478, ¯904, 62778, 0, ¯73, 8491, 3120, 6458, ¯7738, 373 
8491 ¯904 62778 478 ¯7738 6458 ¯73 373 3120 123 0 
 c qsort 11, ¯312, 902, 23, 321, 2132, 34202, ¯34, ¯382 
902 ¯382 34202 ¯34 321 ¯312 2132 23 11 
 c qsort 9, 44, 2212, 4, 6, 6, 1, 2, 192, 21, 29384, 0 
29384 192 9 6 6 4 44 2212 21 2 1 0 
 c qsort 44, ¯88, 9, 233, ¯3, 14, 101, 77, 555, 67 
9 ¯88 67 77 555 14 44 233 ¯3 101 

1

파워 쉘, 44 바이트

$args|sort{$_-split'(.)'-ne'-'|sort -u -d}-d

테스트 스크립트 :

$f = {

$args|sort{$_-split'(.)'-ne'-'|sort -u -d}-d

}

@(
    ,( (123, 478, -904, 62778, 0, -73, 8491, 3120, 6458, -7738, 373),
       (8491, -904, 62778, 478, -7738, 6458, 373, -73, 3120, 123, 0),
       (8491, -904, 62778, 478, -7738, 6458, -73, 373, 3120, 123, 0) )

    ,( (11, -312, 902, 23, 321, 2132, 34202, -34, -382),
       (902, -382, 34202, -34, -312, 321, 2132, 23, 11),
       (902, -382, 34202, -34, 2132, -312, 321, 23, 11) )

    ,( (9, 44, 2212, 4, 6, 6, 1, 2, 192, 21, 29384, 0),
       (29384, 192, 9, 6, 6, 4, 44, 2212, 21, 2, 1, 0),
       (29384, 192, 9, 6, 6, 44, 4, 2212, 21, 2, 1, 0),
       (29384, 192, 9, 6, 6, 44, 4, 21, 2212, 2, 1, 0) )

    ,( (44, -88, 9, 233, -3, 14, 101, 77, 555, 67),
       ,(9, -88, 67, 77, 555, 14, 44, 233, -3, 101) )
) | % {
    $a, $expected = $_
    $result = &$f @a
    $true-in($expected|%{"$result"-eq"$_"})
    "$result"
}

산출:

True
8491 -904 62778 478 -7738 6458 -73 373 3120 123 0
True
902 -382 34202 -34 2132 -312 321 23 11
True
29384 192 9 6 6 44 4 21 2212 2 1 0
True
9 -88 67 77 555 14 44 233 -3 101

1

PHP, 87 86 84 바이트

while(--$argc)$a[_.strrev(count_chars($n=$argv[++$i],3))]=$n;krsort($a);print_r($a);

온라인으로 실행 -nr하거나 사용해보십시오 .

교체 ++$i$argc(1 바이트) 통지를 억제하기 위해 (그리고 렌더링-n obosolete).

고장

while(--$argc)  # loop through command line arguments
    $a[                             # key=
        _.                              # 3. prepend non-numeric char for non-numeric sort
        strrev(                         # 2. reverse =^= sort descending
        count_chars($n=$argv[++$i],3)   # 1. get characters used in argument
        )
    ]=$n;                           # value=argument
krsort($a);     # sort by key descending
print_r($a);    # print

- 숫자보다 "작은"이므로 정렬에 영향을 미치지 않습니다.


1

공통 리스프, 88 바이트

(sort(read)'string> :key(lambda(x)(sort(remove-duplicates(format()"~d"(abs x)))'char>)))

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

오래되고 장황한 일반적인 Lisp!

설명:

(sort                   ; sort
 (read)                 ; what to sort: a list of numbers, read on input stream 
 'string>               ; comparison predicate (remember: this is a typed language!)
 :key (lambda (x)       ; how to get an element to sort; get a number
       (sort (remove-duplicates  ; then sort the unique digits (characters) 
               (format() "~d" (abs x))) ; from its string representation
             'char>)))  ; with the appropriate comparison operator for characters

1

C # (Visual C # 대화 형 컴파일러) , 75 74 바이트

감사합니다 -ASCII 전용

x=>x.OrderByDescending(y=>String.Concat((y+"").Distinct().OrderBy(z=>-z)))

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

C #에서 문자열은 문자의 "열거 가능 항목"으로 간주됩니다. 먼저 각 숫자를 문자열로 변환하여 이것을 유리하게 사용합니다. 그런 다음 LINQ를 사용하여 고유 문자 (숫자)를 역순으로 정렬합니다. 정렬 된 각 문자 배열을 다시 문자열로 변환하고 정렬 키로 사용하여 전체 목록을 정렬합니다.


추가하지 않고 도망 갈 수있는 -것처럼 보이며 순서가 중요하지 않은 것처럼 보입니까?
ASCII 전용

이 없으면 -테스트 사례 # 2가 ... 321 2132 ...잘못 표시됩니까?
dana

nah, 예제를보다 자세히 읽으십시오
ASCII 전용

알았어-네 생각이 맞아 팁 고마워!
dana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.