Удалить цифры, сохранив большее число


22

Введение

Эта задача состоит в том, чтобы найти наибольшее число, удалив y цифр из исходного числа n, которое имеет x цифр.

Предполагая y=2 n=5263 x=4, что возможные числа, удаляющие y = 2 цифры:

[52, 56, 53, 26, 23, 63]

Таким образом, наибольшее число 63должно быть выходом для этого примера.


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

Используя, y=3 n=76751432 x=8чтобы объяснить:

y=3
76751432
-^------ remove 6 because right next 7 is greater

y=2
7751432
---^--- remove 1 because right next 4 is greater

y=1
775432
-----^ the search failed, then remove last y digits

result = 77543

Оба метода, описанные выше, работают .. конечно, вы можете использовать и другой метод :)

Вызов

Число n не будет иметь более 8 цифр, а у всегда будет больше нуля и меньше х .

Чтобы избежать строгого формата ввода, вы можете использовать значения: y n xпо своему усмотрению: в качестве параметров в функции, необработанного ввода или любым другим допустимым способом. Только не забудьте сказать, как вы это сделали в своем ответе.

На выходе должен быть номер результата.

Это , выигрывает самый короткий ответ в байтах.

Пример ввода и вывода

Опять же: не нужно быть слишком строгим :)

4 1789823 7 -> 983
1 54132 5   -> 5432
3 69314 5   -> 94
2 51794 5   -> 794

редактировать

Я изменил порядок ввода, чтобы отразить тот факт, что некоторым из вас может не понадобиться значение x для решения проблемы. х теперь является необязательным значением.


2
Пожалуйста, разрешите более общий ввод и вывод, требуя определенного формата строки, как правило, плохая идея .
xnor

1
@ LuisMendo Я бы не отказался от редактирования ввода / вывода в моем. ¯ \ _ (ツ) _ / ¯
Алекс А.

4
-1 из-за строгих требований к вводу / выводу, +1 за интересную задачу. В целом, солидное мнение.
Мего

1
Формат ввода слишком строг, как говорили другие, особенно учитывая, что xэто какая-то бесполезная информация.
Роковая

1
@Fatalize На самом деле, я думаю, что в зависимости от подхода, который вы используете, xвход в качестве кода может сократить код. (Показательный пример: мой ответ Юлии.)
Алекс А.

Ответы:


3

A-Ray , 9 7 байтов

Мой новый язык! Согласно мета, это разрешено, но если это не принято, то я его удалю.

pM:i-II

Объяснение:

  :i-II       Gets all permutations possible for the given number converted to an array,
                      with the length of y-x, which is the -II part
 M            Gets the maximum of the result above
p             Prints the resulting array above, with no separators

Пример ввода (число, х, у):

1736413 7 4

Выход:

764

Вы можете проверить это с помощью файла .jar, указанного в ссылке на github.


4

MATL , 10 байт

-jowXncUX>

При этом используется версия (9.2.1) языка / компилятора, которая является более ранней, чем эта проблема.

Он принимает три входа из stdin в следующем порядке: длина строки, количество удаленных символов, строка.

пример

>> matl
 > -jowXncUX>
 > 
> 7
> 4
> 1789823
983

РЕДАКТИРОВАТЬ : попробуйте это онлайн! (код в ссылке XNвместо того, Xnчтобы соответствовать изменениям в языке после этого вызова; также oбольше не нужен)

объяснение

(Это по-прежнему стоит на 2 байта больше, чем следовало бы из-за nchoosekразличий в функциях Octave и Matlab . Исправлено в следующей версии компилятора.)

-        % implicitly input two numbers, and subtract them
jo       % input string, and convert to ASCII codes
wXn      % swap inputs. Generate all combinations, each in a row
c        % convert to char array
U        % convert each row to a number
X>       % get maximum. Implicitly display

Ответ на оригинальный запрос (более строгие требования к вводу): 16 байт

jYbZ)b-wowXncUX>

Использует текущую версию (9.2.1) языка / компилятора.

пример

>> matl jYbZ)b-wowXncUX>
> 4 1789823 7
983

объяснение

(Это должно было быть на 4 байта меньше, но мне это нужно, wow...cпотому что nchoosekфункция Octave , в отличие от функции Matlab, не работает с вводом символов. Будет исправлена ​​в следующем выпуске компилятора.)

j              % input string
YbZ)           % split at spaces into strings
b-             % subtract first and third (1-digit) strings
wow            % convert middle string into ASCII codes
Xn             % get all combinations, each in a row
c              % convert to char array
U              % convert each row to a number
X>             % get maximum. Implicitly display

3
wowВаш код поражен своей собственной короткостью;)
ETHproductions

3
@ETHproductions Ха-ха. Ну, с новыми требованиями к вводу он потерял 6 байтов и потерял дар речи
Луис Мендо

3

Pyth - 11 9 8 байт

eS.cz-QE

Тестовый пакет .


Хороший гольф, но не придерживается форматирования ввода?
Луи

@Lui о, не видел, что это было так строго, исправление.
Maltysen

Справедливо, похоже, что в комментариях к самому вопросу есть некоторые обсуждения по этому поводу, но это не решено.
Луи

@L исправлено. SPACE FILLER.
Maltysen

Выглядит лучше, но я думаю, что у ввода также есть x в той же строке, где x - это число цифр в основном целом числе? то есть: 2 5263 4.
Луи

1

Japt, 19 байт

Vs ¬àW-U m¬mn n!- g

Попробуйте онлайн!

Как это работает

        // Implicit: U = y, V = n, W = x
Vs ¬    // Convert V into a string, then split into an array of chars.
àW-U    // Generate all combinations of length W-U.
m¬mn    // Join each pair back into a string, then convert each string to a number.
n!-     // Sort by backwards subtraction (b-a instead of a-b; highest move to the front).
g       // Get the first item in this list.
        // Implicit: output last expression

1

Брахилог , 30 байт

,{,[N:Y].hs?lL,Nl-Y=L}?:1forh.

Так как OP ослабил ограничения на IO, он ожидает [Number, NumberOfDigitsRemoved]ввода и возвращает ответ в качестве вывода, например brachylog_main([1789823,4], Z)..

объяснение

,{                   }?:1f     § Declare sub-predicate 1 and find all inputs which satisfy
                               § this sub-predicate with output = Input of the main predicate
                               § (i.e. [Number, Number of digits to remove])

                               § -- Sub-predicate 1 --
  ,[N:Y].                      § Output = [N, Y]
         hs?                   § Input = a subset of N
            lL,Nl-Y=L          § Length of Input = Length of N - Y

                          orh. § Order the list of answers, reverse it an return the first
                               § element (i.e. the biggest number of the list)

1

Python 3, 69 байт

Это определяет анонимную функцию, принимающую все три аргумента. Воспользовавшись в полной мере правилом «вы можете использовать значения: y n xтак, как вы предпочитаете», я решил принимать yи xкак целые числа, и nкак строку. Возвращаемое значение является строкой.

from itertools import*
lambda y,n,x:''.join(max(combinations(n,x-y)))

На всякий случай, если кто-то считает, что это слишком сильно расширяет правила, эта версия принимает все входные данные как целые числа и составляет 74 байта.

from itertools import*
lambda y,n,x:''.join(max(combinations(str(n),x-y)))

И просто для удовольствия, я также написал версию с двумя аргументами, взяв yи nиз командной строки и напечатав результат в STDOUT. Это 92 байта.

import sys,itertools as i
_,y,n=sys.argv
print(*max(i.combinations(n,len(n)-int(y))),sep='')

1

ES6, 70 байт

r=(y,n)=>y?r(y-1,Math.max(...`${n}`.replace(/./g," $`$'").split` `)):n

Возвращает числовой результат, если yне ложно и не nявляется строкой. Я убедил себя, что выполнение рекурсии неправильным способом все еще работает (мое решение не применимо к выполнению правильной рекурсии).

Также мой первый кодовый гольф, где я использую все три знака кавычек (хотя не все как кавычки), что помешало мне тривиально вычислить длину.


1

Юлия, 128 95 байтов

f(y,n,x)=maximum(i->parse(join(i)),filter(k->endof(k)==x-y,reduce(vcat,partitions(["$n"...]))))

Это функция, которая принимает три значения в качестве параметров и возвращает целое число.

Ungolfed:

function f{T<:Integer}(y::T, n::T, x::T)
    # Get all ordered partitions of the digits of n
    p = reduce(vcat, partitions(["$n"...]))

    # Filter to groups of size x-y
    g = filter(k -> endof(k) == x - y, p)

    # Get the maximum resulting number
    return maximum(i -> parse(join(i)), g)
end

1

Haskell, 64 байта

import Data.List
y#x=maximum.filter((==x-y).length).subsequences

Пример использования: (4#7)"1789823"-> "983".

Оригинальный номер nпринимает в качестве строки. (Не уверен, что я переусердствую в правиле «без строгого формата ввода», но в первой версии требовался ввод строки (!)).

Как это работает: составьте список всех подпоследовательностей n, сохраните их с длиной x-yи выберите максимум.


1

Рубин, 40 байт

->y,n,x{n.chars.combination(x-y).max*''}

Это анонимная функция, которая принимает yи xкак целые числа, и nкак строку, и возвращает строку. Вы можете назвать это, например, так

->y,n,x{n.chars.combination(x-y).max*''}[2,"5263",4]

и он вернется "63".


1

MATLAB 40 байтов

@(n,y)max(str2num(nchoosek(n,nnz(n)-y)))

Тест:

ans('76751432',3)
ans = 77543


0

JavaScript (ES6), 78

Рекурсивная функция с 2 аргументами y и d. yможет быть числовым или строковым, dдолжно быть строковым

r=(y,d)=>y?Math.max(...[...d].map((x,i)=>r(y-1,d.slice(0,i)+d.slice(i+1)))):+d

До изменения задачи было 107 - ... со всеми странностями ввода / вывода ...

x=>(r=(n,d)=>n?Math.max(...[...d].map((x,i)=> r(n-1,d.slice(0,i)+d.slice(i+1)))):+d)(...x.match(/\d+/g))+'\n'

Тест

r=(y,d)=>y?Math.max(...[...d].map((x,i)=>r(y-1,d.slice(0,i)+d.slice(i+1)))):+d

function test() {
  [a,b]=I.value.match(/\d+/g)
  O.textContent=r(a,b)
}

test()
y,n: <input id=I value='4 1789823' oninput="test()">
<pre id=O></pre>


Опечатка: n-1должно быть y-1.
Нил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.