Nilai terbesar dan terkecil dari bilangan bulat bersambung

14

Masalah ini berasal dari Lima masalah pemrograman yang harus diselesaikan oleh setiap Insinyur Perangkat Lunak dalam waktu kurang dari 1 jam yang merupakan bacaan yang menarik. Beberapa masalah pertama sepele, tetapi yang keempat bisa sedikit lebih menarik.

Diberikan daftar bilangan bulat yang dipisahkan oleh ruang tunggal pada input standar, cetak nilai terbesar dan terkecil yang dapat diperoleh dengan menggabungkan bilangan bulat bersama-sama pada baris mereka sendiri.

Sebagai contoh:

Memasukkan:

5 56 50

Keluaran:

50556
56550

Berbagai poin pesanan:

  • Urutan hasil terkecil dan terbesar.
  • Hanya nilai terkecil dan terbesar yang dapat dicetak (iterasi semua variasi dan mencetaknya tidak valid).
  • Akan selalu ada dua atau lebih bilangan bulat dalam daftar.
  • Dimungkinkan untuk hasil terbesar dan terkecil untuk menjadi sama. Dalam hal input 5 55, nomor 555harus dicetak dua kali.
  • Bilangan bulat tidak harus berbeda. 5 5adalah input yang valid.
  • Leading 0s on integer bukan input yang valid. Anda tidak perlu menghitung 05 55.

Karena ini adalah golf kode, entri terpendek menang.


sumber
Jika salah satu nomor input berisi 0 (seperti 05) utama, apakah kita menganggapnya 05sederhana 5?
Pengoptimal
@Optimizer nol awal bukan input yang valid.
Apakah memimpin 0s diperbolehkan dalam output?
Tim
@ Tim Dari mana mereka berasal jika tidak ada nol terkemuka di input?
Martin Ender
@ MartinBüttner oh ya, konyol!
Tim

Jawaban:

8

CJam, 14 13 byte

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

Cukup lurus ke depan. Begini Cara kerjanya:

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'

Cobalah online di sini

Pengoptimal
sumber
1
Oke, saya menyerah. Saya sekarang tidak e!ada (bahkan belum muncul di wiki).
Dennis
5
@Dennis ada Anda pergi
Optimizer
1
Baca manis. Banyak hal baru yang bermanfaat.
Dennis
Mungkin bermanfaat untuk memperbarui Tips untuk bermain golf di CJam dengan trik tambahan ini.
1
Kiat @MichaelT umumnya tidak seharusnya berisi jawaban yang menjelaskan fitur bawaan dari suatu bahasa. Beberapa jawaban mungkin perlu diperbarui karena mereka mungkin mendapat manfaat dari fitur-fitur baru ini.
Pengoptimal
5

Pyth, 14 13 byte

hJSmsd.pcz)eJ

Menghasilkan semua permutasi dan mengurutkannya, mencetak elemen pertama dan terakhir.

orlp
sumber
Tetapkan Jinline:hJSmsd.pcz)eJ
isaacg
@isaacg Bagus! Aku hanya tahu kita tidak akan kalah dengan CJam kotor yang kotor!
orlp
4

Python 2, 104 99 byte

Ya.

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

Sunting: terima kasih kepada xnor untuk -5 byte!

Sirpercival
sumber
1
Pemahaman di dalam sortedberfungsi tanpa tanda kurung, tetapi Anda juga dapat menghindari penyortiran dan hanya mengambil mindan max.
xnor
hah ya Terima kasih!
sirpercival
3

Mathematica, 64 58 byte

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

Ini mendefinisikan fungsi tanpa nama yang mengambil string dan mencetak dua baris. Ini cukup mudah seperti yang lain: dapatkan semua permutasi, bergabung bersama, urutkan dan cetak hasil pertama dan terakhir.

Enam byte disimpan berkat alephalpha.

Martin Ender
sumber
{#&@@#,Last@#}=>#[[{1,-1}]]
alephalpha
@alephalpha Terkadang lebih sederhana lebih baik. Terima kasih! : D
Martin Ender
2

JavaScript (ES6) 54 72 85

Itu lebih mudah dari yang terlihat. Cukup sortir secara leksikografis. Berita baiknya adalah: itulah cara kerja sortir javascript.Ya ... tidak, itu salah ... masih perbandingan lexicograph (lebih berbelit-belit) dapat melakukan pekerjaan.

Catatan: memiliki a dan b numerik, a + [b] adalah jalan pintas untuk + '' + b, karena kita membutuhkan penggabungan string dan bukan penjumlahan.
Catatan 2: baris baru di dalam `` adalah signifikan dan harus dihitung

Edit Jangan berdebat dengan moderator (... hanya bercanda)

Edit2 Memperbaiki format I / O menggunakan popup (lihat Default untuk Code Golf: Metode Input / Output )

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

Uji di Firefox / konsol 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

edc65
sumber
1
Saya pikir format input Anda salah. Harus "bilangan bulat dipisahkan oleh satu ruang pada input standar".
nimi
@nimi kau benar. Tetap
edc65
2

J, 34 36 , 42 byte

kekuatan kasar sederhana:

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

h 5 50 56
50556 
56550

h 50 2 1 9
12509
95021
Eelvex
sumber
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

Membagi string input di spasi, menggabungkan setiap permutasi dan mengurutkan. Cetak elemen pertama dan terakhir.

nimi
sumber
1

Julia, 77 byte

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

Ini menciptakan fungsi tanpa nama yang menerima vektor sebagai input dan mencetak minimum dan maksimum permutasi dari elemen yang digabungkan. Untuk menyebutnya, berikan nama, mis f=v->....

Penjelasan + tidak dikumpulkan:

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

Saran dipersilahkan!

Alex A.
sumber
1

Javascript ( ES6 ) 134

Sayangnya, tidak ada fungsi permutasi bawaan di 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>

nderscore
sumber
1

R, 59 byte

write(range(combinat:::permn(scan(),paste,collapse="")),"")
flodel
sumber
1
Kerja bagus. Anda dapat menyimpan byte dengan menggunakan hanya dua titik dua, yaitu combinat::permn.
Alex A.
Saya pikir ::diperlukan paket untuk dimuat (via libraryatau require) tetapi tidak :::. Saya bisa saja salah; perlu membaca lebih banyak tentang itu. Terima kasih.
flodel
Jika perpustakaan dimuat, Anda tidak memerlukan titik dua sama sekali; Anda cukup memanggil fungsi secara langsung karena paket terpasang ke namespace. Jika paket diinstal tetapi tidak dimuat, Anda dapat merujuk fungsi dalam paket tertentu dengan dua titik dua.
Alex A.
Jadi itu bisa terjadi. Saya tidak akan membiarkan diri saya menggunakan permnsecara langsung tanpa library(combinat).
goda
Ya, karena Anda harus memuat perpustakaan library(combinat)sebelum Anda dapat menggunakannya permn. ;)
Alex A.
1

Ruby 75

Bukan bahasa 'asli' saya, tapi saya pikir saya akan mencoba ... jadi ini bisa (mungkin) menggunakan beberapa tips golf. Tetap saja, bukan peserta yang buruk.

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

Saya tidak akan mengatakan itu elegan lain bahwa semuanya dibangun ke bahasa. Seharusnya cukup jelas bagaimana cara kerjanya.


sumber
Anda dapat mengganti {|x|x.join}dengan (&:join)untuk penghematan 3 byte.
Andrew
Beberapa pintasan ruby ​​lainnya untuk 48 byte:puts$<.read.split.permutation.map(&:join).minmax
blutorange
dapatkan bahkan lebih pendek untuk membaca 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]

Panggil dengan echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. Ada penalti +2 byte untuk -an. Malu tentang panjang nama modul ...

alexander-brett
sumber
0

JavaScript (ES6), 85 byte

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

pemakaian:

F("50 2 1 9")
/*
    12509
    95021
*/
royhowie
sumber
1
Jangan jatuh cinta dengan string template. a + `` + b lebih pendek dari `$ {a} $ {b}`
edc65