Rakamları kaldırın, daha büyük sayıları koruyun


22

Giriş

Bu zorluk çıkarmadan fazla sayıda bulunmasında meydana gelmektedir y orijinal sayı basamak n sahiptir x basamak.

Varsayalım ki y=2 n=5263 x=4, y = 2 haneyi kaldıran rakamlar:

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

Bu nedenle, en büyük sayı 63bu örneğin çıktısı olmalıdır.


Başka bir mantık şöyle olacaktır: Her bir y için, soldan sağa doğru sağ sonraki basamağın büyük olduğu rakamı arayın, sonra kaldırın, eşleşme olmadığında son y rakamlarını kaldırın .

Açıklamak için kullanarak 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

Yukarıda açıklanan her iki yöntemde de çalışır .. tabii ki başka bir yöntem de kullanabilirsiniz :)

Meydan okuma

N sayısında 8 basamaktan fazla sayı olmaz ve y her zaman sıfırdan büyük ve x'ten küçük olur .

Kesin giriş biçiminden kaçınmak için, değerleri kullanabilirsiniz: y n xtercih ettiğiniz yol: işlev, ham girdideki parametreler veya geçerli başka bir yöntem. Sadece cevabında nasıl yaptığını söylemeyi unutma.

Çıktı, sonuç numarası olmalıdır.

Bu , bayt cinsinden en kısa cevabı kazanır.

Örnek Giriş ve Çıkış

Yine: çok sıkı olmanıza gerek yok :)

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

Düzenle

Sorunu çözmek için bazılarınızın x değerine ihtiyaç duymayabileceği gerçeğini yansıtacak şekilde girdi sırasını değiştirdim . x şimdi isteğe bağlı bir değerdir.


2
Lütfen daha genel bir giriş ve çıkışa izin verin, belirli bir dize formatı gerektiren genellikle kötü bir fikirdir .
xnor

1
@LuisMendo Madendeki I / O’yu düzenlemeyi umursamıyorum. ¯ \ _ (ツ) _ / ¯
Alex A.

4
Katı G / Ç gereksinimleri nedeniyle -1, ilginç bir mücadele için +1. Genel olarak, sağlam bir kaldırım ucu.
Mego

1
Giriş formatı, diğerlerinin de söylediği gibi çok katı, özellikle xde bunun yararsız bir bilgi olduğunu düşünüyoruz.
16'yı

1
@Fatalize Aslında, yaptığınız yaklaşıma bağlı olarak, xgirdi olarak sahip olmanın kodu kısaltabileceğini düşünüyorum. (Konuya ilişkin örnek: Julia cevabım.)
Alex A.

Yanıtlar:


3

A-Ray , 9 7 bayt

Benim yeni dil Metaya göre, buna izin verilir, ancak bu kabul edilmezse, o zaman kaldıracağım.

pM:i-II

Açıklama:

  :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

Örnek giriş (sayı, x, y):

1736413 7 4

Çıktı:

764

Bunu github linkinde verilen .jar dosyası ile test edebilirsiniz.


4

MATL , 10 bayt

-jowXncUX>

Bu dilden / derleyiciden sürüm (9.2.1) bu zorluktan daha eski olanını kullanır .

Bu sırayla stdin'den üç girdi alır: string uzunluğu, çıkarılan karakter sayısı, string.

Örnek

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

EDIT : Çevrimiçi deneyin! (Bağlantıdaki kod, bu zorluğun ardından dilde değişiklik yapmak XNyerine, Xnaynı zamanda ogerekli değildir).

açıklama

(Bu, Octave'nin ve Matlab'ın nchoosekfarklı davranışı nedeniyle olması gerekenden 2 bayta mal olur . Derleyicinin bir sonraki sürümünde düzeltildi.)

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

Orijinal mücadelenin cevabı (daha katı giriş şartları): 16 bayt

jYbZ)b-wowXncUX>

Dilin / derleyicinin geçerli sürümünü (9.2.1) kullanır .

Örnek

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

açıklama

(Bu, 4 bayt daha az olmalıydı, ama buna ihtiyacım var, wow...cçünkü nchoosekMatlab'ın aksine Octave'nin işlevi karakter girişi ile çalışmaz. Derleyicinin bir sonraki sürümü için sabitlenecektir.)

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
wowKodunuz kendi kısalığı ile şaşırtıyor;)
ETHproductions

3
@ETHproductionshaha. Eh, yeni girdi gereksinimleri ile 6 bayt kaybetti ve ... suskun kaldı
Luis Mendo

3

Pyth - 11 9 8 bayt

eS.cz-QE

Test Takımı .


Güzel golf, ancak giriş formatına uymuyor mu?
Lui

@Lui oh, bu kadar kesin ve tamir olduğunu görmedi.
Maltysen,

Yeterince adil, sorunun kendisiyle ilgili yorumlarda bazı tartışmalar var gibi görünüyor, ancak çözülmedi.
Lui,

@ L düzeltildi. UZAY DOLDURUCU.
Maltysen,

Daha iyi görünüyor, ancak girişin aynı satırda x de olduğunu düşünüyorum, burada x ana tam sayıdaki hane sayısı nedir? yani: 2 5263 4.
Lui,

1

Japt, 19 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

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

OP, IO üzerindeki kısıtlamaları gevşetdiğinden, bu [Number, NumberOfDigitsRemoved]girdi olarak bekler ve cevabı çıktı olarak döndürür brachylog_main([1789823,4], Z)..

açıklama

,{                   }?: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 bayt

Bu, üç argümanın tümünü kabul eden adsız bir işlevi tanımlar. "Eğer değerleri kullanabilirsiniz: üstünlüğünün tam yararlanan y n xtercih şekilde" ben kabul etmeyi tercih ettik yve xtamsayı olarak ve nbir dize olarak. Dönüş değeri bir dizedir.

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

Herhangi birinin bunun kuralları çok zorladığını hissetmesi durumunda, bu sürüm tüm girdileri tam sayı olarak alır ve 74 bayttır.

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

Ve bunu sadece eğlence için, ben de alarak iki argüman versiyonunu yazdı yve nkomut satırından ve sonucu baskı STDOUT. 92 bayttır.

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

1

ES6, 70 bayt

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

ySahte olmadıkça ve nbir dize olmadıkça sayısal sonuç döndürür . Kendimi özyinelemeyi hala yanlış bir şekilde yapmanın hala işe yaradığına ikna ettim (çözümüm özyinelemeyi yapmak için geçerli değil).

Ayrıca benim ilk kod golf benim üç tırnak işareti (hepsi tırnak işareti olmasa da) kullandım, bu da uzunluğunu önemsizce hesaplamamı engelledi.


1

Julia, 128 95 bayt

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

Bu, üç değeri parametre olarak kabul eden ve bir tamsayı döndüren bir işlevdir.

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 bayt

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

Kullanım örneği: (4#7)"1789823"-> "983".

Orijinal sayı nbir dizge olarak kabul edilir. ("Sıkı giriş formatı yok" kuralını aştığımdan emin değilim, ancak ilk sürümde string girişi gerekliydi (!).

Nasıl çalışır: tüm alt öğelerin bir listesini yapın, nuzunluktakileri saklayın x-yve maksimumları seçin.


1

Yakut, 40 bayt

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

Bu, tamsayı ve bir dize olarak alan yve alan olan ve bir dize döndüren adsız bir işlevdir . Mesela böyle diyebilirsinxn

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

ve geri dönecek "63".


1

MATLAB 40 bayt

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

Ölçek:

ans('76751432',3)
ans = 77543


0

JavaScript (ES6), 78

Y ve d argümanlarına sahip özyinelemeli bir işlev. ysayısal veya dize olabilir, dbir dize olmalıdır.

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

Mücadelenin değişmesinden önce 107 - ... bütün girdi / çıktı gariplikleri ...

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'

Ölçek

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>


Yazım hatası: n-1olmalıdır y-1.
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.