串联整数的最大和最小值


14

这个问题来自于每个软件工程师应该在不到1小时的时间内解决的五个编程问题,这本身就是一个有趣的阅读。前几个问题很简单,但第四个问题可能会更有趣。

给定在标准输入上用单个空格分隔的整数列表,请打印出可以通过将整数在自己的行上连接在一起而获得的最大值和最小值。

例如:

输入:

5 56 50

输出:

50556
56550

各种程序点:

  • 结果的顺序从小到大。
  • 只能打印出最小值和最大值(对所有变化进行迭代,然后将它们打印出来是无效的)。
  • 列表中将始终有两个或多个整数。
  • 最大和最小结果可能相同。在输入的情况下5 55,该数字555应打印两次。
  • 整数不一定是不同的。5 5是有效的输入。
  • 领先0于整数s是不是有效的输入。你会不会需要考虑05 55

因为这是代码高尔夫,所以最短的入场券获胜。


如果输入数字之一包含前导0(例如05),我们将其视为05还是简单地5
Optimizer

@Optimizer前导零是无效输入。

输出中是否允许前导0?
蒂姆(Tim)

@Tim如果输入中没有前导零,那些从何而来?
马丁·恩德

@MartinBüttner哦,是的,很傻!
蒂姆(Tim)2015年

Answers:


8

CJam,14 13字节

qS/e!:s$(N@W=

非常简单。它是这样工作的:

qS/                  e# Split the input on spaces
   e!                e# Get all permutations of the input numbers
     :s              e# Join each permutation order into a single string
       $             e# Sort them. This sorts the strings based on each digit's value
        (N@W=        e# Choose the first and the last out of the array separated by '\n'

在这里在线尝试


1
好我放弃 我现在不e!存在(甚至还没有出现在Wiki中)。
丹尼斯

5
@Dennis 您去了
Optimizer

1
甜蜜的阅读。很多有用的新东西。
丹尼斯

使用这些其他技巧来更新CJam中的高尔夫技巧可能会很有用。

1
@MichaelT提示通常不应包含解释语言的内置功能的答案。不过,可能需要更新几个答案,因为它们可能会从这些新功能中受益。
优化器

5

Pyth,14 13字节

hJSmsd.pcz)eJ

生成所有排列并对它们进行排序,并打印第一个和最后一个元素。


分配J内联:hJSmsd.pcz)eJ
2015年

@isaacg好人!我只是知道我们不会逊色于那肮脏的CJam!
orlp 2015年

4

Python 2 2,104 99字节

是的

from itertools import*;z=[''.join(x)for x in permutations(raw_input().split())];print min(z),max(z)

编辑:感谢xnor -5个字节!


1
内部的理解sorted无需括号即可,但您也可以避免排序,而只需取minmax
xnor 2015年

哈哈,是的。谢谢!
sirpercival

3

Mathematica,64 58字节

Print/@Sort[""<>#&/@Permutations@StringSplit@#][[{1,-1}]]&

这定义了一个未命名的函数,该函数使用字符串并打印两行。与其他排列非常简单:获取所有排列,将它们连接在一起,对其进行排序,并打印第一个和最后一个结果。

感谢alephalpha,节省了六个字节。


{#&@@#,Last@#}=>#[[{1,-1}]]
alephalpha

@alephalpha有时越简单越好。谢谢!:D
马丁·恩德

2

JavaScript(ES6)54 72 85

这比看起来容易。只是按字典顺序对它们进行排序。好消息是:这正是纯JavaScript排序的工作方式。好吧……不,那是错的……一个(更复杂的)词典词典比较仍然可以完成这项工作。

注意:具有a和b数字,a + [b]是a +''+ b的快捷方式,因为我们需要字符串连接而不是求和。
注2:``中的换行符很重要,必须计算在内

编辑不要与主持人争吵(...只是在开玩笑)

Edit2使用弹出窗口的固定I / O格式(请参阅Code Golf的默认值:输入/输出方法

// Complete program with I/O
// The sorting function is shorter as input are strings

alert((l=prompt().split(' ')).sort((a,b)=>a+b>b+a).join('')+`
`+l.reverse().join(''))

// Testable function (67 chars)
// With an integer array parameter, the sorting function must convert to string 

F=l=>(l.sort((a,b)=>a+[b]>b+[a]).join('')+`
`+l.reverse().join(''))

在Firefox / FireBug控制台中测试

F([50, 2, 1, 9])
F([5,56,50])
F([52,36,526])
F([52,36,525])
F([52,36,524]

12509
95021

50556
56550

3652526
5265236

3652525
5255236

3652452
5252436


1
我认为您的输入格式错误。应为“在标准输入上以单个空格分隔的整数”。
nimi 2015年

@nimi你是对的。固定
edc65

2

Ĵ,34 3642个字节

简单的蛮力:

h=:3 :'0 _1{/:~;"1":&.>y A.~i.!#y'

h 5 50 56
50556 
56550

h 50 2 1 9
12509
95021

1

Haskell,98个字节

import Data.List
g=sort.map concat.permutations.words
h i=unlines[g i!!0,last$g i]
main=interact h

在空格处分割输入字符串,连接每个排列和排序。打印第一个和最后一个元素。


1

朱莉娅77字节

v->(Q=extrema([int(join(x)) for x in permutations(v)]);print(Q[1],"\n",Q[2]))

这将创建一个未命名的函数,该函数接受矢量作为输入,并打印所连接元素的排列的最小和最大。要给它起个名字,例如f=v->...

取消+说明:

function f(v)
    # Create an integer vector of the joined permutations using comprehension,
    # then get the minimum and maximum as a tuple using extrema().

    Q = extrema([int(join(x)) for x in permutations(v)])

    # Print the minimum and the maximum, separated by a newline.
    print(Q[1], "\n", Q[2])
end

欢迎提出建议!


1

Javascript (ES6) 134

Sadly, there's no built-in permutation function in JS :(

f=(o,y,i,a)=>y?o.concat(a[1]?a.filter((k,j)=>j^i).reduce(f,[]).map(z=>y+z):y):(q=o.split(' ').reduce(f,[])).sort().shift()+`
`+q.pop()
<!-- Snippet Demo (Firefox only) -->

<input id="input" value="5 56 50" />
<input type="button" onclick="output.innerHTML=f(input.value)" value="Run" />
<pre id="output"></pre>


1

R, 59 bytes

write(range(combinat:::permn(scan(),paste,collapse="")),"")

1
Nice work. You can save a byte by using just two colons though, i.e. combinat::permn.
Alex A.

I thought :: required the package to be loaded (via library or require) but not :::. I could be wrong; need to read a little more about it. Thanks.
flodel

If the library is loaded, you don't need the colons at all; you can just call the function directly since the package is attached to the namespace. If the package is installed but not loaded, you can reference functions in a particular package with two colons.
Alex A.

So 58 it can be. I would not allow myself using permn directly without a library(combinat).
flodel

Yeah, because you have to load the library with library(combinat) before you could use permn anyway. ;)
Alex A.

1

Ruby 75

Not my 'native' language, but one I thought I'd give a try at... thus this could (possibly) use some golfing tips. Still, not a bad entrant.

puts STDIN.read.split(" ").permutation.map{|x|x.join}.sort.values_at(0,-1)

I wouldn't say it is elegant other that everything is built in to the language. It should be fairly obvious exactly how this works.


You can replace {|x|x.join} with (&:join) for a 3 byte savings.
Andrew

A few more ruby shortcuts for 48 bytes: puts$<.read.split.permutation.map(&:join).minmax
blutorange


gets is even shorter for reading input: puts gets.split.permutation.map(&:join).minmax
blutorange

1

Perl, 79 70B (68+2)

use Math::Combinatorics;say for(sort map{join'',@$_}permute@F)[0,-1]

Call with echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. There's a +2 byte penalty for -an. Shame about the length of the module name...


0

JavaScript (ES6), 85 bytes

F=a=>(c=a.split(" ").sort((b,a)=>b+a-(a+b)),`${c.join("")}
${c.reverse().join("")}`)

usage:

F("50 2 1 9")
/*
    12509
    95021
*/

1
Don't fall in love with template strings. a+` `+b is shorter than `${a} ${b}`
edc65
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.