Hapus digit, pertahankan angka yang lebih besar


22

pengantar

Tantangan ini terdiri dari menemukan angka terbesar yang menghilangkan digit y dari angka asli n yang memiliki x digit.

Dengan asumsi y=2 n=5263 x=4, angka yang mungkin dihapus y = 2 digit adalah:

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

Jadi, jumlah terbesar adalah 63yang harus menjadi output untuk contoh ini.


Logika lainnya adalah: untuk setiap y, cari dari kiri ke kanan digit yang mana digit kanan berikutnya lebih besar, lalu hapus, jika tidak ada kecocokan, hapus y-digit terakhir .

Menggunakan y=3 n=76751432 x=8untuk menjelaskan:

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

Kedua metode yang dijelaskan di atas berfungsi .. tentu saja, Anda dapat menggunakan metode lain juga :)

Tantangan

Angka n tidak akan memiliki lebih dari 8 digit, dan y akan selalu lebih besar dari nol dan lebih rendah dari x .

Untuk menghindari format input yang ketat, Anda dapat menggunakan nilai-nilai: y n xcara yang Anda inginkan: sebagai parameter dalam fungsi, input mentah, atau cara valid lainnya. Hanya saja, jangan lupa mengatakan bagaimana Anda melakukannya dalam jawaban Anda.

Keluaran harus berupa nomor hasil.

Ini adalah , jawaban terpendek dalam byte menang.

Contoh Input dan Output

Sekali lagi: Anda tidak perlu terlalu ketat :)

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

Edit

Saya mengubah urutan input untuk mencerminkan fakta bahwa beberapa dari Anda mungkin tidak memerlukan nilai x untuk menyelesaikan masalah. x sekarang menjadi nilai opsional.


2
Harap izinkan input dan output yang lebih umum, memerlukan format string tertentu biasanya merupakan ide yang buruk .
xnor

1
@LuisMendo Saya tidak keberatan mengedit I / O di tambang. ¯ \ _ (ツ) _ / ¯
Alex A.

4
-1 karena persyaratan I / O yang ketat, +1 untuk tantangan yang menarik. Secara keseluruhan, suara sampingan yang solid.
Mego

1
Format input terlalu ketat seperti yang dikatakan orang lain, terutama mengingat itu xadalah jenis informasi yang tidak berguna.
Fatalkan

1
@Fatalize Sebenarnya, saya pikir itu tergantung pada pendekatan yang Anda ambil, memiliki xsebagai input dapat mempersingkat kode. (Contoh kasus: jawaban Julia saya.)
Alex A.

Jawaban:


3

A-Ray , 9 7 byte

Bahasa baru saya! Menurut meta, ini diizinkan, tetapi jika ini tidak diterima, maka saya akan menghapusnya.

pM:i-II

Penjelasan:

  :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

Input contoh (angka, x, y):

1736413 7 4

Keluaran:

764

Anda dapat menguji ini dengan file .jar yang diberikan di tautan github.


4

MATL , 10 byte

-jowXncUX>

Ini menggunakan versi (9.2.1) dari bahasa / kompiler, yang lebih awal dari tantangan ini.

Dibutuhkan tiga input dari stdin dalam urutan ini: panjang string, jumlah karakter yang dihapus, string.

Contoh

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

EDIT : Coba online! (kode di tautan XNbukannya Xnmenyesuaikan dengan perubahan bahasa setelah tantangan ini; juga, otidak diperlukan lagi)

Penjelasan

(Ini masih berharga 2 byte lebih dari yang seharusnya karena nchoosekfungsi Oktaf dan Matlab berperilaku berbeda. Diperbaiki dalam rilis berikutnya dari kompiler.)

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

Jawaban untuk tantangan asli (persyaratan input yang lebih ketat): 16 byte

jYbZ)b-wowXncUX>

Menggunakan versi saat ini (9.2.1) dari bahasa / kompiler.

Contoh

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

Penjelasan

(Seharusnya ini kurang dari 4 byte, tetapi saya membutuhkannya wow...ckarena nchoosekfungsi Octave , tidak seperti Matlab, tidak bekerja dengan input karakter. Akan diperbaiki untuk rilis kompiler berikutnya.)

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
wowKode Anda kagum akan
kekurangannya

3
@ EHProduk Haha. Nah, dengan persyaratan input baru itu kehilangan 6 byte dan mendapat ... terdiam
Luis Mendo

3

Pyth - 11 9 8 byte

eS.cz-QE

Test Suite .


Golf yang bagus, tetapi tidak mematuhi format input?
Lui

@Lui oh, tidak melihat bahwa itu ketat, memperbaiki.
Maltysen

Cukup adil, sepertinya ada beberapa diskusi tentang itu di komentar pada pertanyaan itu sendiri, tetapi tidak terselesaikan.
Lui

@ L diperbaiki. FILLER RUANG.
Maltysen

Terlihat lebih baik, tetapi saya pikir inputnya juga memiliki x pada baris yang sama, di mana x adalah jumlah digit dalam bilangan bulat utama? yaitu: 2 5263 4.
Lui

1

Japt, 19 byte

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

Cobalah online!

Bagaimana itu bekerja

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

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

Karena OP telah mengurangi kendala pada IO, ini diharapkan [Number, NumberOfDigitsRemoved]sebagai input dan mengembalikan jawaban sebagai output, misalnyabrachylog_main([1789823,4], Z). .

Penjelasan

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

Ini mendefinisikan fungsi anonim yang menerima ketiga argumen. Mengambil keuntungan penuh dari aturan bahwa "Anda dapat menggunakan nilai-nilai: y n xseperti yang Anda inginkan", saya telah memilih untuk menerima ydan xsebagai bilangan bulat dan nsebagai string. Nilai kembali adalah string.

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

Untuk berjaga-jaga jika ada yang merasa bahwa ini terlalu memperluas aturan, versi ini mengambil semua input sebagai bilangan bulat dan 74 byte.

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

Dan hanya untuk iseng, saya juga menulis versi dua argumen, mengambil ydan ndari baris perintah dan mencetak hasilnya STDOUT. Ini 92 byte.

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

1

ES6, 70 byte

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

Mengembalikan hasil numerik kecuali ypalsu dann string. Saya meyakinkan diri saya bahwa melakukan rekursi dengan cara yang salah masih berhasil (solusi saya tidak berlaku untuk melakukan rekursi yang benar).

Juga golf kode pertama saya di mana saya menggunakan ketiga tanda kutip (meskipun tidak semua sebagai tanda kutip), yang mencegah saya dari menghitung panjangnya dengan sepele.


1

Julia, 128 95 byte

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

Ini adalah fungsi yang menerima tiga nilai sebagai parameter dan mengembalikan integer.

Tidak Disatukan:

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 byte

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

Contoh penggunaan: (4#7)"1789823"-> "983".

Nomor aslinya ndiambil sebagai string. (Tidak yakin apakah saya terlalu menekankan aturan "no format input ketat", tetapi input string diperlukan (!) Di versi pertama).

Cara kerjanya: buat daftar semua urutan n, simpan yang panjang x-ydan pilih yang maksimal.


1

Ruby, 40 byte

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

Ini adalah fungsi anonim yang mengambil ydan xsebagai bilangan bulat dan nsebagai string, dan mengembalikan string. Anda dapat menyebutnya misalnya seperti ini

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

dan itu akan kembali "63".


1

MATLAB 40 byte

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

Uji:

ans('76751432',3)
ans = 77543


0

JavaScript (ES6), 78

Fungsi rekursif dengan 2 argumen y dan d. ybisa berupa numerik atau string, dharus berupa string.

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

Sebelum tantangan berubah itu 107 - ... dengan semua keanehan input / output ...

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'

Uji

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>


Typo: n-1seharusnya y-1.
Neil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.