Usuń cyfry, zachowując większą liczbę


22

Wprowadzenie

Wyzwanie polega na znalezieniu największej liczby usuwającej y cyfr z pierwotnej liczby n, która ma x cyfr.

Zakładając y=2 n=5263 x=4, że możliwe liczby usuwające y = 2 cyfry to:

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

Zatem największa liczba 63musi być wynikiem dla tego przykładu.


Inna logika wyglądałaby następująco: za każdym y szukaj od lewej do prawej cyfry, która z prawej jest następna, a następnie usuń ją, w przeciwnym razie, gdy nie będzie pasujących, usuń ostatnie cyfry y .

Za pomocą y=3 n=76751432 x=8wyjaśnienia:

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

Obie metody wyjaśnione powyżej działają .. oczywiście możesz też użyć innej metody :)

Wyzwanie

Liczba n nie będzie miała więcej niż 8 cyfr, a y zawsze będzie większe niż zero i niższe niż x .

Aby uniknąć ścisłego formatu wejściowego, możesz użyć wartości: y n xtak, jak wolisz: jako parametrów w funkcji, surowego wejścia lub w inny prawidłowy sposób. Po prostu nie zapomnij powiedzieć, jak to zrobiłeś w swojej odpowiedzi.

Dane wyjściowe powinny być liczbą wynikową.

To jest , wygrywa najkrótsza odpowiedź w bajtach.

Przykład wejścia i wyjścia

Znowu: nie musisz być zbyt surowy :)

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

Edytować

Zmieniłem kolejność wprowadzania, aby odzwierciedlić fakt, że niektórzy z was mogą nie potrzebować wartości x do rozwiązania problemu. x jest teraz wartością opcjonalną.


2
Proszę pozwolić na bardziej ogólne dane wejściowe i wyjściowe, wymaganie określonego formatu ciągu jest zwykle złym pomysłem .
xnor

1
@LuisMendo Nie miałbym nic przeciwko edycji we / wy w moim. ¯ \ _ (ツ) _ / ¯
Alex A.

4
-1 ze względu na surowe wymagania I / O, +1 za ciekawe wyzwanie. Ogólnie rzecz biorąc, solidne przypomnienie.
Mego

1
Format wejściowy jest zbyt ścisły, jak powiedzieli inni, szczególnie biorąc pod uwagę, że xjest to rodzaj bezużytecznej informacji.
Fatalize

1
@Fatalize Właściwie myślę, że w zależności od przyjętego podejścia posiadanie xdanych wejściowych może skrócić kod. (Przykład: moja odpowiedź Julii.)
Alex A.,

Odpowiedzi:


3

A-Ray , 9 7 bajtów

Mój nowy język! Według meta jest to dozwolone, ale jeśli nie zostanie to zaakceptowane, usunę je.

pM:i-II

Wyjaśnienie:

  :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

Przykładowe dane wejściowe (liczba, x, y):

1736413 7 4

Wydajność:

764

Możesz to przetestować za pomocą pliku .jar podanego w łączu github.


4

MATL , 10 bajtów

-jowXncUX>

Używa wersji (9.2.1) języka / kompilatora, która jest wcześniejsza niż to wyzwanie.

Pobiera trzy wejścia ze standardowego wejścia w tej kolejności: długość ciągu, liczba usuniętych znaków, ciąg.

Przykład

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

EDYCJA : Wypróbuj online! (kod w linku XNzamiast tego Xnmusi odpowiadać zmianom języka po tym wyzwaniu; onie jest też potrzebny)

Wyjaśnienie

(To wciąż kosztuje 2 bajty więcej niż powinno, ponieważ nchoosekfunkcje Octave i Matlab zachowują się inaczej. Naprawiono w następnej wersji kompilatora.)

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

Odpowiedź na oryginalne wyzwanie (surowsze wymagania wejściowe): 16 bajtów

jYbZ)b-wowXncUX>

Korzysta z bieżącej wersji (9.2.1) języka / kompilatora.

Przykład

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

Wyjaśnienie

(Powinno to być o 4 bajty mniej, ale potrzebuję tego, wow...cponieważ nchoosekfunkcja Octave , w przeciwieństwie do Matlaba, nie działa z wprowadzaniem znaków. Zostanie naprawiona dla następnej wersji kompilatora.)

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
wowTwój kod jest zdumiony swoją własną krótkością;)
ETHproductions

3
@ETHproductions Haha. Cóż, przy nowych wymaganiach wejściowych stracił 6 bajtów i stał się ... oniemiały
Luis Mendo

3

Pyth - 11 9 8 bajtów

eS.cz-QE

Pakiet testowy .


Niezły golf, ale czy nie przestrzega formatowania wejściowego?
Lui

@Lui och, nie widziałem, że to było tak surowe, ustalające.
Maltysen

W porządku, wygląda na to, że jest kilka dyskusji na ten temat w komentarzach do samego pytania, ale nie zostało to rozwiązane.
Lui

@L naprawiony. WYPEŁNIACZ MIEJSCA.
Maltysen

Wygląda lepiej, ale myślę, że wejście ma także x w tej samej linii, gdzie x to liczba cyfr w głównej liczbie całkowitej? tj 2 5263 4. :
Lui,

1

Japt, 19 bajtów

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

Wypróbuj online!

Jak to działa

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

Brachylog , 30 bajtów

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

Ponieważ OP złagodziło ograniczenia we / wy, oczekuje to [Number, NumberOfDigitsRemoved]jako danych wejściowych i zwraca odpowiedź jako dane wyjściowe, np brachylog_main([1789823,4], Z)..

Wyjaśnienie

,{                   }?: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 bajtów

Definiuje to anonimową funkcję przyjmującą wszystkie trzy argumenty. Korzystając w pełni z zasady, że „możesz używać wartości: y n xtak, jak wolisz”, postanowiłem zaakceptować yi xjako liczby całkowite i njako ciąg. Zwracana wartość to ciąg znaków.

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

Na wszelki wypadek, gdy ktoś uważa, że ​​przesadza z regułami, ta wersja przyjmuje wszystkie dane wejściowe jako liczby całkowite i ma 74 bajty.

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

I tylko dla kopnięć, napisałem również wersję z dwoma argumentami, pobierającą yi nz wiersza poleceń i wypisującą wynik na STDOUT. Ma 92 bajty.

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

1

ES6, 70 bajtów

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

Zwraca wynik liczbowy, chyba że yjest fałszem i njest łańcuchem. Przekonałem się, że niewłaściwe wykonanie rekurencji nadal działa (moje rozwiązanie nie dotyczy prawidłowej rekurencji).

Również mój pierwszy kod golfowy, w którym używam wszystkich trzech znaków cudzysłowu (choć nie wszystkie jako cudzysłowy), co uniemożliwiło mi trywialne obliczenie długości.


1

Julia, 128 95 bajtów

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

Jest to funkcja, która przyjmuje trzy wartości jako parametry i zwraca liczbę całkowitą.

Nie golfowany:

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 bajty

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

Przykład użycia: (4#7)"1789823"-> "983".

Oryginalny numer njest traktowany jako ciąg znaków. (Nie jestem pewien, czy przesadzam z zasadą „brak ścisłego formatu wejściowego”, ale w pierwszej wersji wymagane było wprowadzenie ciągu znaków (!)).

Jak to działa: zrób listę wszystkich podsekwencji n, zachowaj te z długością x-yi wybierz maksimum.


1

Rubinowy, 40 bajtów

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

Jest to anonimowa funkcja, która przyjmuje yi xjako liczby całkowite i njako ciąg, i zwraca ciąg. Możesz to nazwać na przykład w ten sposób

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

i wróci "63".


1

MATLAB 40 bajtów

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

Test:

ans('76751432',3)
ans = 77543


0

JavaScript (ES6), 78

Funkcja rekurencyjna z 2 argumentami yid. ymoże być liczbą lub łańcuchem, dmusi być łańcuchem.

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

Przed zmianą wyzwania było 107 - ... ze wszystkimi osobliwościami wejścia / wyjścia ...

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'

Test

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>


Literówka: n-1powinna być y-1.
Neil
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.