Наибольшие и наименьшие значения из объединенных чисел


14

Эта проблема связана с пятью проблемами программирования, которые должен решить каждый инженер-программист менее чем за 1 час, что само по себе интересно. Первые несколько проблем тривиальны, но четвертая может быть немного интереснее.

Учитывая список целых чисел, разделенных одним пробелом на стандартном вводе, выведите наибольшее и наименьшее значения, которые можно получить путем объединения целых чисел в отдельной строке.

Например:

Входные данные:

5 56 50

Выход:

50556
56550

Различные пункты заказа:

  • Порядок результатов наименьший, чем наибольший.
  • Могут быть распечатаны только самые маленькие и самые большие значения (итерации по всем вариантам и их распечатка недопустимы).
  • В списке всегда будет два или более целых числа.
  • Возможно, что самые большие и самые маленькие результаты будут одинаковыми. В случае ввода 5 55номер 555должен быть напечатан дважды.
  • Целые числа не обязательно различны. 5 5допустимый вход.
  • Ведущие 0с целыми числами не являются допустимыми входными данными. Вам не нужно будет учитывать 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
@ Денис, вот и все
Оптимизатор

1
Сладко читать. Много полезного нового.
Деннис

Возможно, было бы полезно обновить Советы по игре в гольф в CJam с помощью этих дополнительных приемов.

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

5

Pyth, 14 13 байтов

hJSmsd.pcz)eJ

Генерирует все перестановки и сортирует их, печатая первый и последний элемент.


Назначить в JhJSmsd.pcz)eJ
строке

@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

ах да Спасибо!
sirpercival

3

Mathematica, 64 58 байт

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

Это определяет безымянную функцию, принимающую строку и печатающую две строки. Это довольно просто, как и другие: получить все перестановки, объединить их, отсортировать и распечатать первый и последний результат.

Шесть байтов спасены благодаря алефальфе.


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

@alephalpha Иногда проще, тем лучше. Благодарность! : D
Мартин Эндер

2

JavaScript (ES6) 54 72 85

Это проще, чем кажется. Просто рассортируйте их лексикографически. Хорошая новость в том, что именно так работает обычная сортировка javascript. Ну ... нет, это неправильно ... все же (более запутанное) сравнение лексикографов может сделать эту работу.

Примечание: имея числа a и b, a + [b] является сокращением для a + '' + 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

2

J, 34, 36 , 42 байта

простая грубая сила:

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->... .

Ungolfed + объяснение:

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), но нет :::. Я могу ошибаться; нужно прочитать немного больше об этом. Благодарю.
flodel

Если библиотека загружена, вам вообще не нужны двоеточия; Вы можете просто вызвать функцию напрямую, так как пакет присоединен к пространству имен. Если пакет установлен, но не загружен, вы можете ссылаться на функции в определенном пакете двумя двоеточиями.
Алекс А.

Так что 58 это может быть. Я бы не позволил себе использовать permnнапрямую без library(combinat).
flodel

Да, потому что вам нужно загрузить библиотеку, 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.