删除数字,保留更多数字


22

介绍

挑战在于找到从具有x个数字的原始数字n中删除y个数字的最大数字。

假设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我不介意在我的I / O中进行编辑。¯\ _(ツ)_ /¯
亚历A.

4
由于严格的I / O要求,因此为-1,而对于一个有趣的挑战则为+1。总体来说,这是一个坚实的投票。
Mego

1
输入格式过于严格,就像其他人所说的那样,尤其是考虑到这x是一种无用的信息。
致命

1
@Fatalize实际上,我认为根据您采用的方法,x输入内容可以缩短代码。(恰当的例子:我的茱莉亚答案。)
Alex A.

Answers:


3

A射线9 7字节

我的新语言!根据meta,这是允许的,但是如果不接受,则将其删除。

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

输入示例(数字,x,y):

1736413 7 4

输出:

764

您可以使用github链接中提供的.jar文件进行测试。


4

MATL,10字节

-jowXncUX>

这使用的语言/编译器版本(9.2.1)比此挑战要早。

它从stdin接收三个输入,顺序为:字符串长度,删除的字符数,字符串。

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

编辑在线尝试!(此挑战后,链接中的代码XN不必Xn符合语言的更改;而且,o不再需要)

说明

(由于Octave和Matlab的nchoosek功能有所不同,因此它仍然比应花费的字节多2个字节。在下一版编译器中已修复。)

-        % 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与Matlab不同,Octave的功能不适用于字符输入。在下一版编译器中将得到修复。)

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 2016年

3
@ETHproductions哈哈。好吧,有了新的输入要求,它丢失了6个字节并变得...无语
路易斯·门多

3

Pyth- 11 9 8个字节

eS.cz-QE

测试套件


高尔夫不错,但是不遵循输入格式吗?
路易斯

@Lui哦,没有看到它这么严格,正在修复。
Maltysen '16

公平地说,问题本身的注释中似乎有一些讨论,但尚未解决。
路易斯

@L固定。空间填充器。
Maltysen '16

看起来更好,但我认为输入在同一行上也有x,其中x是主整数中的位数?即:2 5263 4
2013年

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

Brachylog,30个字节

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

由于OP放宽了对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您喜欢的方式”的规则,我选择接受yx作为整数和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)))

只是为了踢一下,我还编写了一个包含两个参数的版本,从命令行获取yn从命令行将结果打印到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

Ruby,40个字节

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

这是一个匿名函数,采用yx作为整数和n字符串,然后返回字符串。你可以这样称呼它

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

它将返回"63"


1

MATLAB 40个字节

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

测试:

ans('76751432',3)
ans = 77543


0

JavaScript(ES6),78

具有两个参数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
尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.