Найбільші та найменші значення зв'язаних цілих чисел


14

Ця проблема пов'язана із п’ятьма проблемами програмування, які кожен інженер-програміст повинен мати можливість вирішити менше ніж за одну годину, що саме по собі є цікавим для читання. Перші кілька проблем тривіальні, але четверта може бути трохи цікавішою.

Давши список цілих чисел, розділених єдиним пробілом на стандартному вході, роздрукуйте найбільші та найменші значення, які можна отримати, об'єднавши цілі числа разом у свій власний рядок.

Наприклад:

Вхід:

5 56 50

Вихід:

50556
56550

Різні пункти замовлення:

  • Порядок результатів найменший, а потім найбільший.
  • Можна роздрукувати лише найменші та найбільші значення (повторення над усіма варіантами та їх друк недійсне).
  • У списку завжди буде два чи більше цілих чисел.
  • Можливо, щоб найбільші та найменші результати були однаковими. У випадку введення 5 55номер 555слід надрукувати двічі.
  • Цілі числа не обов'язково відрізняються. 5 5правильний вхід.
  • Провідні 0s для цілих чисел не є дійсним введенням. Вам не потрібно буде обліковувати 05 55.

Оскільки це кодовий гольф, виграє найкоротший запис.


Якщо одне з вхідних чисел містить провідні 0 (як 05), чи вважаємо ми це як 05чи просто 5?
Оптимізатор

@Optimizer ведучі нулі не є дійсним введенням.

Чи дозволені провідні 0 у виході?
Тім

@Tim Звідки вони беруться, якщо вхідних нулів немає на вході?
Мартін Ендер

@ MartinBüttner о так, будучи дурним!
Тім

Відповіді:


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!існував (ще навіть не з’являється у вікі).
Денніс

5
@Dennis there you go
Оптимізатор

1
Солодке читання. Багато корисних новинок.
Денніс

Може бути корисним оновити поради щодо гольфу в CJam за допомогою цих додаткових хитрощів.

1
Підказки @MichaelT, як правило, не повинні містити відповіді, які пояснюють вбудовані особливості мови. Пару відповідей може знадобитися оновлення, оскільки вони можуть отримати користь від цих нових функцій.
Оптимізатор

5

Pyth, 14 13 байт

hJSmsd.pcz)eJ

Створює всі перестановки та сортує їх, друкуючи перший та останній елемент.


Призначте Jinline:hJSmsd.pcz)eJ
isaacg

@isaacg Хороший! Я просто знав, що ми не будемо поступатися тому брудному брудному CJam!
orlp

4

Python 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працює без дужок, але ви також можете уникнути сортування та просто взяти minта max.
xnor

га, так. Дякую!
серперцивал

3

Математика, 64 58 байт

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

Це визначає неназвану функцію, яка бере рядок і друкує два рядки. Це досить просто, як і інші: отримайте всі перестановки, з'єднайте їх, сортуйте їх та надрукуйте перший та останній результат.

Шість байтів збережено завдяки алефальфі.


{#&@@#,Last@#}=>#[[{1,-1}]]
алефальфа

@alephalpha Іноді простіше - краще. Спасибі! : D
Мартін Ендер

2

JavaScript (ES6) 54 72 85

Це простіше, ніж здається. Просто сортуйте їх лексикографічно. Хороша новина: саме так працює звичайний сортування JavaScript. Ну ... ні, це неправильно ... все-таки (більш складне) порівняння лексикографа може зробити цю роботу.

Примітка: маючи число a і b, a + [b] - це ярлик для + '' + b, оскільки нам потрібна конкатенація рядків, а не сума.
Примітка 2: новий рядок всередині `` є значущим і його потрібно рахувати

Редагувати Не сперечайтеся з модератором (... просто жартую)

Edit2 Фіксований формат вводу / виводу за допомогою спливаючих вікон (див. За замовчуванням для 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 ви маєте рацію. Виправлено
edc65


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

На жаль, в 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 байт

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

1
Хороша робота. Можна зберегти байт, скориставшись лише двома двокрапками, тобто combinat::permn.
Олексій А.

Я думав, що ::потрібно завантажити пакет (через libraryабо require), але ні :::. Я можу помилитися; потрібно прочитати трохи більше про це. Спасибі.
флодель

Якщо бібліотека завантажена, то вам не потрібні двокрапки; ви можете просто зателефонувати до функції безпосередньо, оскільки пакет приєднаний до простору імен. Якщо пакет встановлений, але не завантажений, ви можете посилатися на функції у певному пакеті з двома двокрапками.
Олексій А.

Так 58 це може бути. Я б не дозволив собі permnбезпосередньо використовувати без library(combinat).
флодель

Так, тому що вам доведеться завантажити бібліотеку, library(combinat)перш ніж ви зможете користуватися permn. ;)
Олексій А.

1

Рубін 75

Не моя "рідна" мова, але я подумав, що спробую спробувати ... таким чином, це може (можливо) використати кілька порад щодо гольфу. Все-таки не поганий абітурієнт.

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

Я б не сказав, що це елегантно інше, що все вбудовано в мову. Має бути досить очевидно, як саме це працює.


Ви можете замінити {|x|x.join}з в (&:join)протягом 3 -х економії байт.
Андрій

Ще кілька рубінових ярликів на 48 байт:puts$<.read.split.permutation.map(&:join).minmax
blutorange


puts gets.split.permutation.map(&:join).minmax
get

1

Perl, 79 70B (68 + 2)

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

Подзвоніть з echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. Існує +2 байт штрафу за -an. Ганьба щодо довжини назви модуля ...


0

JavaScript (ES6), 85 байт

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

використання:

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

1
Не закохуйтеся в рядки шаблону. a + `` + b коротше, ніж `$ {a} $ {b}`
edc65
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.