数字を削除して、より大きな数を保持する


22

前書き

この課題は、除去最大数見つけることにあるY元番号から数字をn個有するX桁。

を仮定するとy=2 n=5263 x=4y = 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。全体として、堅実な賛成票。
メゴ

1
他の人が言ったように、入力形式はあまりにも厳格で、特にそれxは一種の役に立たない情報だと考えています。
16年

1
@Fatalize実際、あなたがとるアプローチによっては、x入力として持つとコードが短くなると思います。(事例:ジュリアの答え。)
アレックスA.

回答:


3

A-Ray9 7バイト

私の新しい言語!メタによれば、これは許可されていますが、これが受け入れられない場合は削除します。

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から次の3つの入力を受け取ります:文字列の長さ、削除された文字の数、文字列。

>> 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バイト少なくなっているはずですが、Matlabの関数とは異なり、wow...cOctaveのnchoosek関数は文字入力では動作しないため、これが必要です。コンパイラの次のリリースで修正される予定です。)

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

3
@ETHproductionsハハ。さて、新しい入力要件により、6バイトを失い...言葉を失いました
ルイスメンドー

3

Pyth- 11 9 8バイト

eS.cz-QE

テストスイート


素敵なゴルフですが、入力フォーマットに準拠していませんか?
ルイ

@Luiああ、それがそんなに厳格な修正だとは思わなかった。
マルティセン

結構、質問自体のコメントにそれについての議論があるように見えますが、解決されていません。
ルイ

@Lが修正されました。スペースフィラー。
マルティセン

よく見えますが、入力のxも同じ行にあると思います。xは主な整数の桁数ですか?すなわち:2 5263 4
ルイ

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バイト

これは、3つの引数すべてを受け入れる匿名関数を定義します。「あなたがた値を使用することができます。ルールをフルに活用して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て結果をに出力する2引数バージョンも作成しました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文字列でない限り、数値の結果を返します。再帰を間違った方法で行うことはまだ有効であると私は確信しています(私の解決策は正しい再帰の実行には適用できません)。

また、3つすべての引用符を使用する最初のコードゴルフ(すべて引用符としてではありませんが)により、長さを簡単に計算できませんでした。


1

ジュリア、128 95バイト

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

これは、3つの値をパラメーターとして受け入れ、整数を返す関数です。

ゴルフをしていない:

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

ルビー、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"ます。




0

JavaScript(ES6)、78

2つの引数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
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.