Giá trị lớn nhất và nhỏ nhất từ ​​các số nguyên được nối


14

Vấn đề này xuất phát từ Năm vấn đề lập trình mà mỗi Kỹ sư phần mềm sẽ có thể giải quyết trong vòng chưa đầy 1 giờ mà bản thân nó là một bài đọc thú vị. Một vài vấn đề đầu tiên là tầm thường, nhưng vấn đề thứ tư có thể thú vị hơn một chút.

Đưa ra một danh sách các số nguyên được phân tách bằng một khoảng trắng trên đầu vào tiêu chuẩn, in ra các giá trị lớn nhất và nhỏ nhất có thể thu được bằng cách ghép các số nguyên lại với nhau trên dòng riêng của chúng.

Ví dụ:

Đầu vào:

5 56 50

Đầu ra:

50556
56550

Điểm khác nhau của thứ tự:

  • Thứ tự của kết quả là nhỏ nhất sau đó lớn nhất.
  • Chỉ các giá trị nhỏ nhất và lớn nhất mới có thể được in ra (lặp qua tất cả các biến thể và in chúng ra là không hợp lệ).
  • Sẽ luôn có hai hoặc nhiều số nguyên trong danh sách.
  • Có thể cho kết quả lớn nhất và nhỏ nhất là như nhau. Trong trường hợp đầu vào 5 55, số 555phải được in hai lần.
  • Các số nguyên không nhất thiết phải khác biệt. 5 5là đầu vào hợp lệ.
  • 0S hàng đầu trên số nguyên không phải là đầu vào hợp lệ. Bạn sẽ không cần phải tính đến 05 55.

Vì đây là mã golf, chiến thắng ngắn nhất.


Nếu một trong các số đầu vào chứa 0 (như 05) hàng đầu , chúng ta sẽ xem nó là 05hay đơn giản 5?
Trình tối ưu hóa

Số không hàng đầu @Optimizer không phải là đầu vào hợp lệ.

Là số 0 hàng đầu được phép trong đầu ra?
Tim

@Tim Những người đó sẽ đến từ đâu nếu không có số 0 đứng đầu trong đầu vào?
Martin Ender

@ MartinBüttner ồ, thật là ngớ ngẩn!
Tim

Câu trả lời:


8

CJam, 14 13 byte

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

Khá thẳng về phía trước. Đây là cách nó hoạt động:

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'

Dùng thử trực tuyến tại đây


1
Được tôi từ bỏ. Bây giờ tôi không e!tồn tại (thậm chí chưa xuất hiện trong wiki).
Dennis

5
@Dennis bạn đi
Optimizer

1
Đọc ngọt ngào. Rất nhiều công cụ mới hữu ích.
Dennis

Có thể hữu ích khi cập nhật Mẹo chơi golf trong CJam với các thủ thuật bổ sung này.

1
Các mẹo @MichaelT thường không được phép chứa câu trả lời giải thích các tính năng được xây dựng của ngôn ngữ. Một vài câu trả lời có thể cần cập nhật vì chúng có thể được hưởng lợi từ các tính năng mới này.
Tối ưu hóa

5

Bình thường, 14 13 byte

hJSmsd.pcz)eJ

Tạo tất cả các hoán vị và sắp xếp chúng, in phần tử đầu tiên và cuối cùng.


Chỉ định Jnội tuyến:hJSmsd.pcz)eJ
isaacg

@isaacg Tốt nhất! Tôi chỉ biết rằng chúng tôi sẽ không thua kém gì với CJam bẩn thỉu bẩn thỉu đó!
orlp

4

Python 2, 104 99 byte

Vâng.

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

Chỉnh sửa: nhờ xnor cho -5 byte!


1
Sự hiểu biết bên trong sortedcác tác phẩm không có dấu ngoặc, nhưng bạn cũng có thể tránh sắp xếp và chỉ lấy minmax.
xnor

hah cảm ơn bạn!
sirpercival

3

Toán học, 64 58 byte

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

Điều này xác định một hàm không tên lấy một chuỗi và in hai dòng. Điều này khá đơn giản như những người khác: nhận được tất cả các hoán vị, nối chúng lại với nhau, sắp xếp chúng và in kết quả đầu tiên và cuối cùng.

Sáu byte được lưu nhờ alephalpha.


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

@alephalpha Đôi khi đơn giản hơn là tốt hơn. Cảm ơn! : D
Martin Ender

2

JavaScript (ES6) 54 72 85

Điều đó dễ dàng hơn dường như. Chỉ cần sắp xếp chúng theo từ vựng. Tin tốt là: đó chính xác là cách sắp xếp javascript đơn giản. Chà ... không, điều đó sai ... vẫn là một phép so sánh từ vựng (phức tạp hơn) có thể thực hiện công việc.

Lưu ý: có số a và b, a + [b] là lối tắt cho a + '' + b, vì chúng ta cần nối chuỗi chứ không phải tổng.
Lưu ý 2: dòng mới bên trong `` rất quan trọng và phải được tính

Chỉnh sửa Đừng tranh cãi với người điều hành (... chỉ đùa thôi)

Edit2 Đã sửa lỗi định dạng I / O bằng cửa sổ bật lên (xem Mặc định cho Code Golf: Phương thức nhập / xuất )

// 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(''))

Kiểm tra trong bảng điều khiển 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
Tôi nghĩ định dạng đầu vào của bạn là sai. Phải là "số nguyên cách nhau bởi một khoảng trắng trên đầu vào tiêu chuẩn".
nimi

@nimi bạn nói đúng. Đã kết hợp
edc65

2

J, 34 36 , 42 byte

lực lượng vũ phu đơn giản:

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 byte

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

Tách chuỗi đầu vào tại các khoảng trắng, nối từng phép hoán vị và sắp xếp. In phần tử đầu tiên và cuối cùng.


1

Julia, 77 byte

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

Điều này tạo ra một hàm không tên, chấp nhận một vectơ làm đầu vào và in tối thiểu và tối đa các hoán vị của các phần tử được nối. Để gọi nó, đặt tên cho nó, vd f=v->....

Ungolfed + giải thích:

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

Đề nghị được chào đón!


1

Javascript ( ES6 ) 134

Đáng buồn thay, không có hàm hoán vị tích hợp trong 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 byte

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

1
Công việc tốt đẹp. Bạn có thể lưu một byte bằng cách chỉ sử dụng hai dấu hai chấm combinat::permn.
Alex A.

Tôi nghĩ ::yêu cầu gói phải được tải (thông qua libraryhoặc require) nhưng không :::. Tôi có thể sai; cần đọc thêm một chút về nó Cảm ơn.
flodel 11/05/2015

Nếu thư viện được tải, bạn hoàn toàn không cần dấu hai chấm; bạn chỉ có thể gọi hàm trực tiếp vì gói được gắn vào không gian tên. Nếu gói được cài đặt nhưng không được tải, bạn có thể tham chiếu các hàm trong một gói cụ thể có hai dấu hai chấm.
Alex A.

Vì vậy, 58 nó có thể được. Tôi sẽ không cho phép mình sử dụng permntrực tiếp mà không có a library(combinat).
flodel 11/05/2015

Vâng, bởi vì bạn phải tải thư viện library(combinat)trước khi bạn có thể sử dụng permn. ;)
Alex A.

1

Ruby 75

Không phải ngôn ngữ 'bản địa' của tôi, nhưng ngôn ngữ mà tôi nghĩ tôi sẽ thử ... vì vậy điều này có thể (có thể) sử dụng một số mẹo chơi gôn. Tuy nhiên, không phải là một người xấu.

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

Tôi sẽ không nói rằng nó thanh lịch khác rằng mọi thứ được xây dựng theo ngôn ngữ. Nó nên khá rõ ràng chính xác làm thế nào điều này hoạt động.


Bạn có thể thay thế {|x|x.join}bằng (&:join)để tiết kiệm 3 byte.
Andrew

Một vài phím tắt ruby ​​nữa cho 48 byte:puts$<.read.split.permutation.map(&:join).minmax
blutorange


thậm chí còn ngắn hơn để đọc đầu vào: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]

Gọi với echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. Có một hình phạt +2 byte cho -an. Xấu hổ về độ dài của tên mô-đun ...


0

JavaScript (ES6), 85 byte

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

sử dụng:

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

1
Đừng yêu chuỗi mẫu. a + `` + b ngắn
hơn`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.