Видаліть цифри, зберігаючи більшу кількість


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 завжди буде більше нуля і нижче x .

Щоб уникнути строгого формату введення, ви можете використовувати значення: y n xтак, як вам зручніше: як параметри у функції, необроблений вхід чи будь-який інший дійсний спосіб. Просто не забудьте сказати, як ви це зробили у своїй відповіді.

Вихід повинен бути результатом.

Це , найкоротша відповідь у байтах виграє.

Приклад введення та виведення

Знову ж таки: не потрібно бути занадто суворим :)

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

Редагувати

Я змінив порядок введення, щоб відобразити той факт, що для вирішення проблеми деяким з вас може не знадобитися значення x . 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

EDIT : Спробуйте в Інтернеті! (код у посиланні 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 Haha. Що ж, з новими вимогами до входу він втратив 6 байтів і отримав ... безмовлення
Луїс Мендо

3

Pyth - 11 9 8 байт

eS.cz-QE

Тестовий сюїт .


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

@Lui о, не бачив, що це було таке суворе, фіксуюче.
Мальтісен

Досить справедливо, схоже, що в коментарях до самого питання є деякі дискусії про це, але це не вирішено.
Луї

@L виправлено. ПРОСТАВНИЦЯ.
Мальтісен

Виглядає краще, але я думаю, що на вході також є 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.

Оскільки ОП зменшило обмеження на 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"...]))))

Це функція, яка приймає три значення як параметри і повертає ціле число.

Безголівки:

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




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.