按最大数字排序


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]这些数字都是数字)。
  • 如果一个数字不再包含要检查的数字,它将被放置在相关数字的后面。因此,123并且3120将被排序为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]

Answers:



7

R97 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

Perl 6的36 34 33 31个字节

-1字节感谢Jo King
--2字节感谢Phil H

*.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
真好!-2字节用于交换m:g/\d./.abs.combtio.run/...
菲尔ħ

6

Python 2中60 55 54字节

-1个字节,感谢Jonas Ausevicius

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可以被替换cmpsort功能
乔纳斯Ausevicius

我认为[::-1]可以交换为双重否定。
DonQuiKong

@DonQuiKong会更长一些,因为数字都是字符串,为此需要将其转换为int。
ovs

@JonasAusevicius非常感谢。
ovs


5

Brachylog,9个字节

{ȧdṫo₁}ᵒ¹

注意:由于排序在brachylog中的工作方式,因此无法正确处理数字。通过将数字强制转换为字符串来解决此问题()来解决此问题,代价是1个字节。

在线尝试!


2
您的意思是“ 由于排序在brachylog中是如何工作的,因此无法按预期工作。 ”?我已经尝试了所有四个测试用例,并且给出了正确的结果(除非我不小心看到了一些东西)。
凯文·克鲁伊森

@KevinCruijssen (字符串)可解决此问题。降序排列数字的顺序如下。顺序从最小到最大然后颠倒。问题在于,3120从最小到最大的数字顺序0123等于或不是123反向顺序3213210
Kroppeb

2
好的,由于添加了toString(),因此您当前的代码可以正常工作。正如@Arnauld所提到的,我认为您的评论意味着您当前的代码不起作用。最好这样说:“ 通过删除(toString),本来可以是8个字节,但是不幸的是,由于Brachylog中的排序方式,它无法按预期工作。
Kevin Cruijssen

看着我写的东西,似乎我的大脑分散了句子的注意力。固定它。
Kroppeb

5

Pyth,7个 6字节

-1字节@Sok

_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个字节-如果末尾缺少任何参数,则所有lambda类型的函数都会推断主要lambda变量的存在。例子包括m推断df推断Tu推断G...
Sok 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
我刚刚实现了这一点,然后找到了您的帖子。我接受了正常的逆转,而不是逆转U。但是请注意,您无需使用Dsince排序,因为它是通过iterable(z, make_digits=True)内部调用实现的。所以这是AṢQṚµÞṚ对7
乔纳森·艾伦

3

MathGolf7 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

Haskell54 52字节

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

在线尝试!


定义可r=reverse节省两个字节。我们还允许使用匿名函数,因此f=不需要计数。
Laikoni

我将导入和f =移到了TIO标头中。这可以吗?
马丁·吕特克(MartinLütke)'18年

相同的字节数,但也许有些兴趣:f=r$r id.nub.show;r=(reverse.).sortOn
Laikoni '18

1
实际需要计算导入次数。
Laikoni '18


3

Stax6个 7 字节

èó≥ü≤♥¥

运行并调试


这似乎给出了错误的结果。例如,在您的TIO的测试用例中,它输出-904 8491 478 62778 6458 -7738 -73 373 123 3120 0而不是预期的8491 -904 62778 478 -7738 6458 373 -73 3120 123 08491 -904 62778 478 -7738 6458 -73 373 3120 123 0。示例中还使用了该测试用例,并解释了规则,因此,我将对其进行研究以更好地理解它。看来您只按一次最大的一位进行排序,而没有其他任何规则?
凯文·克鲁伊森

@KevinCruijssen:是的,我很抱歉。我看错了问题说明。我已经对该程序进行了调整,可以满足规定的要求。该程序接受输入整数作为带引号的字符串。通常这是可以接受的,但是如果不能,我可能需要添加另一个字节。
递归

现在看起来不错,我+1。是的,作为字符串输入完全可以。
凯文·克鲁伊森


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个字节。2个字节的信用给Kevin。谢谢

[编辑2]改进了2个字节。归功于gastropner。谢谢


1
您可以打高尔夫球n>0n,我认为你的方法循环v
凯文·克鲁伊森

f()的参数列表int*a,n可以缩短为int*a
gastropner

1
建议for(a=0;n=abs(n);而不是n=n<0?-n:n;for(a=0;n;
ceilingcat '18

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

JavaScript(SpiderMonkey),68字节

感谢@Arnauld再次提醒我SpiderMonkey使用稳定排序,因此-4个字节用于删除||-1

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

在线尝试!

JavaScript(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再次稳定排序; P
Shieru Asakoto

实际上,我认为V8使用了至少2种不同的排序算法。如果数组的大小小于或等于,则看起来很稳定10
Arnauld

1
@Arnauld V8在Chrome 70之前使用快速排序。当数组大小足够小时,快速排序算法将执行插入排序。最新的Chrome已更改为稳定类型,以匹配其他浏览器(IE / Firefox / Safari)的行为。
tsh

2

Java(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因为数字范围有限,所以使用代替。
凯文·克鲁伊森




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运算符,这是算法页面139 K&R Linguaggio C的APL中的一种转换。我认为其中使用指针将数据用作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

Powershell,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过时)。

分解

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

通用Lisp,88个字节

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

在线尝试!

好老冗长的Common 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字节

-1感谢@ ASCII-only

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

在线尝试!

在C#中,字符串被视为字符的“可枚举”。首先将每个数字转换为字符串,以此来发挥我的优势。然后利用LINQ获得以相反顺序排序的唯一字符(数字)。我将每个排序的字符数组都转换回字符串,然后将其用作排序键来对整个列表进行排序。


看起来您无需添加就可以摆脱困境-,看起来这些命令的顺序真的没关系吗?
的纯ASCII码

如果没有-,则测试用例#2返回的值... 321 2132 ...似乎不正确?
dana

不,请更仔细地阅读该示例
ASCII格式,仅适用

好的-我认为您的权利。谢谢你的提示!
dana
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.