Największe i najmniejsze wartości ze skonkatowanych liczb całkowitych

14

Ten problem pochodzi z Pięciu problemów programistycznych, które każdy inżynier oprogramowania powinien być w stanie rozwiązać w czasie krótszym niż 1 godzina, co samo w sobie jest interesującą lekturą. Pierwsze kilka problemów jest banalnych, ale czwarty może być nieco bardziej interesujący.

Biorąc pod uwagę listę liczb całkowitych oddzielonych pojedynczą spacją na standardowym wejściu, wydrukuj największe i najmniejsze wartości, które można uzyskać, łącząc liczby całkowite razem w ich własnym wierszu.

Na przykład:

Wejście:

5 56 50

Wynik:

50556
56550

Różne punkty zamówienia:

  • Kolejność wyników jest najmniejsza niż największa.
  • Można drukować tylko najmniejsze i największe wartości (powtarzanie wszystkich odmian i ich drukowanie jest nieprawidłowe).
  • Na liście zawsze będą dwie lub więcej liczb całkowitych.
  • Możliwe, że największe i najmniejsze wyniki będą takie same. W przypadku wprowadzenia 5 55numer 555należy wydrukować dwukrotnie.
  • Liczby całkowite niekoniecznie są różne. 5 5jest poprawnym wejściem.
  • Wiodące 0s na liczbach całkowitych nie są prawidłowym wejściem. Będziesz nie należy uwzględnić 05 55.

Ponieważ jest to kod golfowy, wygrywa najkrótszy wpis.


źródło
Jeśli jedna z liczb wejściowych zawiera początkowe 0 (jak 05), czy uważamy to za, 05czy po prostu 5?
Optymalizator
Zero wiodące @Optimizer nie są prawidłowymi danymi wejściowymi.
Czy wyjściowe zera są dozwolone?
Tim
@Tim Skąd one pochodzą, jeśli na wejściu nie ma zer wiodących?
Martin Ender,
@ MartinBüttner o tak, głupie!
Tim

Odpowiedzi:

8

CJam, 14 13 bajtów

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

Całkiem prosto. Tak to działa:

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'

Wypróbuj online tutaj

Optymalizator
źródło
1
Ok, poddaję się. Nie e!istniałem (nawet jeszcze nie pojawia się na wiki).
Dennis
5
@ Dennis , proszę bardzo
Optymalizator
1
Słodka lektura. Wiele przydatnych nowych rzeczy.
Dennis
Przydatne może być zaktualizowanie Wskazówki dotyczące gry w golfa w CJam za pomocą tych dodatkowych sztuczek.
1
Wskazówki @MichaelT na ogół nie powinny zawierać odpowiedzi wyjaśniających wbudowane funkcje języka. Kilka odpowiedzi może wymagać aktualizacji, ponieważ mogą one skorzystać z tych nowych funkcji.
Optymalizator
5

Pyth, 14 13 bajtów

hJSmsd.pcz)eJ

Generuje wszystkie permutacje i sortuje je, drukując pierwszy i ostatni element.

orlp
źródło
Przypisywanie Jinline:hJSmsd.pcz)eJ
isaacg
@isaacg Dobry! Po prostu wiedziałem, że nie będziemy gorsi od tego brudnego, brudnego CJama!
orlp
4

Python 2, 104 99 bajtów

Tak.

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

Edycja: dzięki xnor za -5 bajtów!

sirpercival
źródło
1
Rozumienie wewnątrz sorteddziała bez nawiasów, ale możesz także uniknąć sortowania i po prostu weź mini max.
xnor
hah tak. Dziękuję Ci!
sirpercival
3

Mathematica, 64 58 bajtów

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

Definiuje to nienazwaną funkcję pobierającą ciąg znaków i wypisującą dwie linie. To całkiem proste jak pozostałe: uzyskaj wszystkie permutacje, połącz je razem, posortuj je i wydrukuj pierwszy i ostatni wynik.

Sześć bajtów zaoszczędzonych dzięki alephalpha.

Martin Ender
źródło
{#&@@#,Last@#}=>#[[{1,-1}]]
alephalpha
@alephalpha Czasami prostsze jest lepsze. Dzięki! : D
Martin Ender
2

JavaScript (ES6) 54 72 85

To łatwiejsze niż się wydaje. Po prostu posortuj je leksykograficznie. Dobra wiadomość: dokładnie tak działa sortowanie w javascript. Cóż ... nie, to źle ... wciąż (bardziej skomplikowane) porównanie leksykografów może wykonać zadanie.

Uwaga: mając wartość liczbową aib, a + [b] jest skrótem do znaku + '' + b, ponieważ potrzebujemy konkatenacji łańcucha, a nie sumy.
Uwaga 2: nowa linia wewnątrz `` jest znacząca i należy ją policzyć

Edytuj Nie kłóć się z moderatorem (... tylko żartuję)

Edit2 Naprawiono format we / wy za pomocą wyskakujących okienek (patrz Domyślne dla Code Golf: Metody wejścia / wyjścia )

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

Przetestuj w konsoli 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

edc65
źródło
1
Myślę, że twój format wejściowy jest nieprawidłowy. Powinno to być „liczby całkowite oddzielone pojedynczym odstępem na standardowym wejściu”.
nimi
@nimi masz rację. Naprawiono
edc65
2

J, 34 36 , 42 bajtów

prosta brutalna siła:

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

h 5 50 56
50556 
56550

h 50 2 1 9
12509
95021
Eelvex
źródło
1

Haskell, 98 bajtów

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

Podziel ciąg wejściowy w spacjach, połącz każdą kombinację i sortuj. Wydrukuj pierwszy i ostatni element.

nimi
źródło
1

Julia, 77 bajtów

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

Tworzy to nienazwaną funkcję, która przyjmuje wektor jako dane wejściowe i drukuje minimum i maksimum permutacji połączonych elementów. Aby to nazwać, nadaj mu nazwę, np f=v->....

Niegolfowane + wyjaśnienie:

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

Sugestie są mile widziane!

Alex A.
źródło
1

JavaScript ( ES6 ) 134

Niestety w JS nie ma wbudowanej funkcji permutacji :(

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
źródło
1

R, 59 bajtów

write(range(combinat:::permn(scan(),paste,collapse="")),"")
flodel
źródło
1
Dobra robota. Możesz jednak zapisać bajt, używając tylko dwóch dwukropków, tj combinat::permn.
Alex A.
Myślałem, że ::wymaga załadowania pakietu (przez librarylub require), ale nie :::. Mogę się mylić; muszę przeczytać o tym trochę więcej. Dzięki.
flodel
Jeśli biblioteka jest załadowana, dwukropki wcale nie są potrzebne; możesz po prostu wywołać funkcję bezpośrednio, ponieważ pakiet jest dołączony do przestrzeni nazw. Jeśli pakiet jest zainstalowany, ale nie załadowany, możesz odwoływać się do funkcji w konkretnym pakiecie za pomocą dwóch dwukropków.
Alex A.,
Tak może być 58. Nie pozwoliłbym sobie na używanie permnbezpośrednio bez library(combinat).
flodel
Tak, ponieważ musisz załadować bibliotekę, library(combinat)zanim będziesz mógł z niej korzystać permn. ;)
Alex A.
1

Ruby 75

Nie w moim „ojczystym” języku, ale w tym, o którym pomyślałem, że spróbuję… dlatego może (ewentualnie) skorzystać z kilku wskazówek golfowych. Mimo to niezły uczestnik.

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

Nie powiedziałbym, że to eleganckie, że wszystko jest wbudowane w język. Powinno być dość oczywiste, jak to działa.


źródło
Można wymienić {|x|x.join}z (&:join)na 3 oszczędności bajtowych.
Andrew
Jeszcze kilka rubinowych skrótów dla 48 bajtów:puts$<.read.split.permutation.map(&:join).minmax
blutorange
gets jest jeszcze krótszy do odczytu danych wejściowych: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]

Zadzwoń z echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. Kara za +2 bajty -an. Wstyd o długości nazwy modułu ...

Alexander-Brett
źródło
0

JavaScript (ES6), 85 bajtów

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

stosowanie:

F("50 2 1 9")
/*
    12509
    95021
*/
royhowie
źródło
1
Nie zakochuj się w ciągach szablonów. a + `` + b jest krótszy niż `$ {a} $ {b}`
edc65