Xóa các chữ số, giữ lại số lớn hơn


22

Giới thiệu

Thử thách này bao gồm việc tìm ra số lớn nhất loại bỏ các chữ số y khỏi số n ban đầu có x chữ số.

Giả sử y=2 n=5263 x=4, các số có thể loại bỏ y = 2 chữ số là:

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

Vì vậy, số lượng lớn nhất 63phải là đầu ra cho ví dụ này.


Một logic khác sẽ là: đối với mỗi y, tìm kiếm từ trái sang phải chữ số mà chữ số tiếp theo bên phải lớn hơn, sau đó loại bỏ nó, khác khi không khớp, xóa các chữ số y cuối cùng .

Sử dụng y=3 n=76751432 x=8để giải thích:

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

Cả hai phương pháp được giải thích ở trên đều hoạt động .. tất nhiên, bạn cũng có thể sử dụng một phương pháp khác :)

Thử thách

Số n sẽ không có nhiều hơn 8 chữ số và y sẽ luôn lớn hơn 0 và thấp hơn x .

Để tránh định dạng đầu vào nghiêm ngặt, bạn có thể sử dụng các giá trị: y n xcách bạn thích: làm tham số trong hàm, đầu vào thô hoặc bất kỳ cách hợp lệ nào khác. Đừng quên nói bạn đã làm thế nào trong câu trả lời của bạn.

Đầu ra phải là số kết quả.

Đây là , câu trả lời ngắn nhất trong byte thắng.

Ví dụ đầu vào và đầu ra

Một lần nữa: bạn không cần quá nghiêm ngặt :)

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

Chỉnh sửa

Tôi đã thay đổi thứ tự đầu vào để phản ánh thực tế rằng một số bạn có thể không cần giá trị x để giải quyết vấn đề. x bây giờ là một giá trị tùy chọn.


2
Vui lòng cho phép đầu vào và đầu ra chung hơn, yêu cầu một định dạng chuỗi cụ thể thường là một ý tưởng tồi .
xnor

1
@LuisMendo Tôi không ngại chỉnh sửa I / O trong tôi. ¯ \ _ (ツ) _ / ¯
Alex A.

4
-1 vì các yêu cầu I / O nghiêm ngặt, +1 cho một thử thách thú vị. Nhìn chung, một sidevote vững chắc.
Mego

1
Định dạng đầu vào quá nghiêm ngặt như những người khác đã nói, đặc biệt coi đó xlà một loại thông tin vô dụng.
Gây tử vong vào

1
@Firthize Trên thực tế, tôi nghĩ rằng tùy thuộc vào cách tiếp cận bạn thực hiện, có xđầu vào có thể rút ngắn mã. (Trường hợp cụ thể: câu trả lời Julia của tôi.)
Alex A.

Câu trả lời:


3

A-Ray , 9 7 byte

Ngôn ngữ mới của tôi! Theo meta, điều này được cho phép, nhưng nếu điều này không được chấp nhận, thì tôi sẽ xóa nó.

pM:i-II

Giải trình:

  :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

Ví dụ đầu vào (số, x, y):

1736413 7 4

Đầu ra:

764

Bạn có thể kiểm tra điều này với tệp .jar được cung cấp trong liên kết github.


4

TOÁN , 10 byte

-jowXncUX>

Điều này sử dụng phiên bản (9.2.1) của ngôn ngữ / trình biên dịch, sớm hơn thử thách này.

Phải mất ba đầu vào từ stdin theo thứ tự này: độ dài chuỗi, số ký tự bị xóa, chuỗi.

Thí dụ

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

EDIT : Hãy thử trực tuyến! (mã trong liên kết có XNthay vìXn tuân thủ các thay đổi về ngôn ngữ sau thử thách này; cũng okhông cần thiết nữa)

Giải trình

(Điều này vẫn tốn hơn 2 byte so với nchoosekchức năng của Octave và Matlab hoạt động khác nhau. Đã sửa trong bản phát hành tiếp theo của trình biên dịch.)

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

Trả lời cho thử thách ban đầu (yêu cầu đầu vào chặt chẽ hơn): 16 byte

jYbZ)b-wowXncUX>

Sử dụng phiên bản hiện tại (9.2.1) của ngôn ngữ / trình biên dịch.

Thí dụ

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

Giải trình

(Điều này đáng lẽ phải ít hơn 4 byte, nhưng tôi cần điều đó wow...cbởi vì nchoosekchức năng của Octave , không giống như Matlab, không hoạt động với đầu vào ký tự. Sẽ được sửa cho lần phát hành tiếp theo của trình biên dịch.)

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
wowMã của bạn rất ngạc nhiên về độ ngắn của chính nó;)
Sản phẩm điện tử

3
@ETHproductions Haha. Chà, với các yêu cầu đầu vào mới, nó mất 6 byte và ... không nói nên lời
Luis Mendo

3

Pyth - 11 9 8 byte

eS.cz-QE

Phòng thử nghiệm .


Golf đẹp, nhưng không tuân thủ định dạng đầu vào?
Lui

@Lui oh, không thấy rằng nó là nghiêm ngặt, sửa chữa.
Maltysen

Đủ công bằng, có vẻ như có một số cuộc thảo luận về nó trong các bình luận về chính câu hỏi, nhưng nó không được giải quyết.
Lui

@L cố định. KHÔNG GIAN KHÔNG GIAN.
Maltysen

Có vẻ tốt hơn, nhưng tôi nghĩ đầu vào cũng có x trên cùng một dòng, trong đó x là số chữ số trong số nguyên chính? tức là : 2 5263 4.
Lui

1

Japt, 19 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Vì OP đã nới lỏng các ràng buộc trên IO, điều này mong đợi [Number, NumberOfDigitsRemoved]là đầu vào và trả về câu trả lời là đầu ra, vdbrachylog_main([1789823,4], Z). .

Giải trình

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

Điều này xác định một hàm ẩn danh chấp nhận cả ba đối số. Tận dụng tối đa quy tắc "bạn có thể sử dụng các giá trị: y n xcách bạn thích", tôi đã chọn chấp nhận yxlàm số nguyên và ndưới dạng chuỗi. Giá trị trả về là một chuỗi.

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

Chỉ trong trường hợp bất cứ ai cảm thấy rằng điều này đang kéo dài các quy tắc quá xa, phiên bản này lấy tất cả các đầu vào dưới dạng số nguyên và là 74 byte.

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

Và chỉ để đá, tôi cũng đã viết một phiên bản hai đối số, lấy yntừ dòng lệnh và in kết quả tới STDOUT. Đó là 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

Trả về một kết quả số trừ khi ylà giả vàn là một chuỗi. Tôi đã thuyết phục bản thân rằng thực hiện đệ quy sai cách xung quanh vẫn hoạt động (giải pháp của tôi không áp dụng để thực hiện đệ quy đúng).

Ngoài ra, mã golf đầu tiên của tôi, nơi tôi sử dụng cả ba dấu ngoặc kép (mặc dù không phải tất cả là dấu ngoặc kép), điều đó ngăn tôi tính toán một cách tầm thường.


1

Julia, 128 95 byte

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

Đây là một hàm chấp nhận ba giá trị làm tham số và trả về một số nguyên.

Ung dung:

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

Ví dụ sử dụng: (4#7)"1789823" -> "983".

Số ban đầu nđược lấy dưới dạng một chuỗi. (Không chắc chắn nếu tôi nhấn mạnh quy tắc "không có định dạng đầu vào nghiêm ngặt", nhưng đầu vào chuỗi là bắt buộc (!) Trong phiên bản đầu tiên).

Cách thức hoạt động: lập danh sách tất cả các phần sau n, giữ những phần có độ dài x-yvà chọn mức tối đa.


1

Ruby, 40 byte

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

Đây là một hàm ẩn danh nhận yxdưới dạng số nguyên và ndưới dạng chuỗi và trả về một chuỗi. Bạn có thể gọi nó như ví dụ như thế này

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

và nó sẽ trở lại "63".


1

MATLAB 40 byte

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

Kiểm tra:

ans('76751432',3)
ans = 77543


0

JavaScript (ES6), 78

Hàm đệ quy có 2 đối số y và d. ycó thể là số hoặc chuỗi, dphải là một chuỗi.

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

Trước khi thử thách thay đổi, nó là 107 - ... với tất cả các số lẻ đầu vào / đầu ra ...

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'

Kiểm tra

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-1nên được y-1.
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.