最小の桁で最大数を出力します


37

正の10進整数の空でないリストが与えられた場合、最小の桁数の数値セットから最大の数値を出力します。

入力リストは特定の順序ではなく、繰り返される値を含む場合があります。

例:

[1] -> 1
[9] -> 9
[1729] -> 1729
[1, 1] -> 1
[34, 3] -> 3
[38, 39] -> 39
[409, 12, 13] -> 13
[11, 11, 11, 1] -> 1
[11, 11, 11, 11] -> 11
[78, 99, 620, 1] -> 1
[78, 99, 620, 10] -> 99
[78, 99, 620, 100] -> 99
[1, 5, 9, 12, 63, 102] -> 9
[3451, 29820, 2983, 1223, 1337] -> 3451
[738, 2383, 281, 938, 212, 1010] -> 938

バイト単位の最短コードが優先されます。


入力番号を別の行に入力できますか?
seshoumara

@seshoumaraそれは理にかなっています、はい。
カルビンの趣味

回答:


13

Pyth、7 3 6バイト

eS.ml`

テストスイート

説明:

e      Still grab the last element
 S      Still sort
  .ml`   But prefilter the list for those with the (m)inimum length.

7バイトソリューション:

eSh.gl`

テストスイート

説明:

   .g   Group items in (implicit) input by:
     l  The length of
      ` their representation
  h     Get those with the shortest length
 S      Sort the resulting list
e       and grab the last (i.e. largest) element

6

パイソン2、48の 42バイト

@Dennisのおかげで-6バイト(ではminなくを使用sorted

lambda l:min(l,key=lambda x:(len(`x`),-x))

すべてのテストケースはイデオンにあります

リストの最小値を(長さ、-値)で取ります


1
minの代わりに動作するはずですsorted
デニス

@デニス、ああジース-ありがとう!おそらくあなた自身がそれを投稿したほど十分に異なっています。
ジョナサンアラン

スワップsorted()[0]のためにmin?私はあなたの元のコードの些細な変更だと思います。
デニス

len(`x`)+1./x同じ長さのものもあります。あまりにも悪いあなたが必要です1.
xnor

まあ、それは私が思いついたよりも短いです。よくやった!
mbomb007

6

ゼリー、7 バイト

DL,NµÞḢ

TryItOnlineでテストするか、TryItOnlineで
すべてのテストケースを確認する

どうやって?

DL,NµÞḢ - Main link takes one argument, the list, e.g. [738, 2383, 281, 938, 212, 1010]
D       - convert to decimal, e.g. [[7,3,8],[2,3,8,3],[2,8,1],[9,3,8],[2,1,2],[1,0,1,0]]
 L      - length, e.g. [3,4,3,3,3,4]
   N    - negate, e.g [-738, -2383, -281, -938, -212, -1010]
  ,     - pair, e.g. [[3,-738],[4,-2383],[3,-281],[3,-938],[3,-212],[4,-1010]]
    µ   - make a monadic chain
     Þ  - sort the input by that monadic function, e.g [938,738,281,212,2383,1010]
          (the lists in the example are not created, but we sort over the values shown)
      Ḣ - pop and return the first element, e.g. 938

1
ソートの素晴らしい使用!
マイル

@milesあなたの道はまだインスピレーションを受けました:)
ジョナサンアラン

5

05AB1E、5バイト

コード:

({é¬(

説明:

(      # Negate the list, e.g. [22, 33, 4] -> [-22, -33, -4]
 {     # Sort, e.g. [-22, -33, -4] -> [-33, -22, -4]
  é    # Sort by length, e.g. [-33, -22, -4] -> [-4, -22, -33]
   ¬   # Get the first element.
    (  # And negate that.

CP-1252エンコードを使用します。オンラインでお試しください!


4

ルビー、34バイト

->a{a.max_by{|n|[-n.to_s.size,n]}}

eval.inで参照してください:https ://eval.in/643153


4

MATL、14バイト

10&YlktX<=G*X>

オンラインでお試しください!

説明:

  &Yl           % Log
10              % Base 10
     kt         % Floor and duplicate
       X<       % Find the smallest element
         =      % Filter out elements that do not equal the smallest element
          G     % Push the input again
           *    % Multiply (this sets numbers that do not have the fewest digits to 0)
            X>  % And take the maximum

4

網膜24 16バイト

O ^ `
O $# `
$ .0
G1`

オンラインでお試しください!または、すべてのテストケースを実行します

Martinのおかげで8バイト節約されました!

すべてのテストはコードの少し古いバージョンを使用していますが、アルゴリズムは同じです。時間があれば、更新して近づきます。

末尾の改行は重要です。数値を逆数値でソートし、次に桁数でソートします。これにより、最初の位置の数字が最も少ない最大数になるため、残りの数字を削除するだけです。


入力を改行で区切る場合、両方のソート段階から正規表現を省略しG1`て、最後の段階で使用できます。
マーティンエンダー

また、最初の段階は必要ありません#。与えられた整数の長さの相対的な順序にのみ注意し、1つの長さ内の数字の辞書式ソートが正しい。
マーティンエンダー

@MartinEnderありがとう!両方のヒントを追加しました。\w+ソートのデフォルトとして、テストスイートを作成するのにそれほど苦労する必要がないように提案すべきでした;)
FryAmTheEggman

これは、さらにゴルフをするためのアイデアを提供する場合のための別の16です。retina.tryitonline.net
Martin Ender

4

Mathematica、33 31バイト

Max@MinimalBy[#,IntegerLength]&

MinimalByは、元の入力リストのすべての要素を選択します。 IntegerLength、つまり桁数が最小ます。Maxは最大のものを出力します。

私のために2バイトを見つけて保存してくれたMartin Enderに感謝します:)


4

Perl 6、18バイト

*.min:{.chars,-$_}

説明:

*\        # Whatever lambda
.min:     # find the minimum using

{         # bare block lambda with implicit parameter 「$_」

  .chars, # number of characters first ( implicit method call on 「$_」 )
  -$_     # then negative of the value in case of a tie
}

使用法:

say [738, 2383, 281, 938, 212, 1010].&( *.min:{.chars,-$_} ); # 938

my &code = *.min:{.chars,-$_}

say code [78, 99, 620, 10]; # 99

3

ゼリー、8バイト

DL€İMị¹Ṁ

オンラインでお試しください!またはすべてのテストケースを検証します。

説明

DL€İMị¹Ṁ  Input: list A
D         Convert each integer to a list of base 10 digits
 L€       Get the length of each list (number of digits of each)
   İ      Take the reciprocal of each
    M     Get the indices of the maximal values
      ¹   Get A
     ị    Select the values at those indices from A
       Ṁ  Find the maximum and return

この8バイトはどうですか?これらの文字はすべてASCIIに適合しますか?
フェデリコ

1
@FedericoPoloni はい、別のコードページにありますが、適合します。
エリックアウトゴルファー

3

JavaScript(ES6)、51

l=>l.sort((a,b)=>(a+l).length-(b+l).length||b-a)[0]

テスト

f=l=>l.sort((a,b)=>(a+l).length-(b+l).length||b-a)[0]

;[
 [[1], 1]
,[[9], 9]
,[[1729], 1729]
,[[1, 1], 1]
,[[34, 3], 3]
,[[38, 39], 39]
,[[409, 12, 13], 13]
,[[11, 11, 11, 1], 1]
,[[11, 11, 11, 11], 11]
,[[78, 99, 620, 1], 1]
,[[78, 99, 620, 10], 99]
,[[78, 99, 620, 100], 99]
,[[1, 5, 9, 12, 63, 102], 9]
,[[3451, 29820, 2983, 1223, 1337], 3451]
,[[738, 2383, 281, 938, 212, 1010], 938]
].forEach(([l,x])=>{
  var r=f(l)
  console.log(r==x?'OK':'KO',l+' -> '+r)
})  


3

J、21 14バイト

マイルと(間接的に)ジョナサンのおかげで7バイト節約できました!

{.@/:#@":"0,.-

これは4つのチェーンです。

{.@/: (#@":"0 ,. -)

inputを見てみましょう10 27 232 1000。内側のフォークは3つのタインで構成されています。#@":"0サイズを計算し、,.各サイズとその否定(-)メンバーを連結します。入力10 27 232 1000については、次のようにします。

   (#@":"0 ,. -) 10 27 232 1000
2   _10
2   _27
3  _232
4 _1000

今、私たちは{.@/:外側の歯として持っています。これは{.、二項ソート(/:)よりもモナド優先()です。つまり、dyadicの結果の最初の要素を取得します/:。これは、右引数を左引数に従ってソートし、入力を提供します。

   (/: #@":"0 ,. -) 10 27 232 1000
27 10 232 1000

次に、を使用すると{.、そのリストの最初の要素が得られ、完了です。

   ({.@/: #@":"0 ,. -) 10 27 232 1000
27

古いバージョン

>./@(#~]=<./@])#@":"0

改善に取り組んでいます。私は30からゴルフをしましたが、これで十分だと思います。最初に基本的な部分に分解します。

   size =: #@":"0
   max =: >./
   min =: <./
   over =: @
   right =: ]
   left =: [
   selectMin =: #~ right = min over right

   f =: max over selectMin size
   f 3 4 5
5
   f 3 4 53
4
   f 343 42 53
53

これがどのように機能するかを次に示します。

>./@(#~ ] = <./@]) #@":"0

これはモナド列ですが、この部分はフックです。動詞>./@(#~ ] = <./@])は、メインチェーンへの入力として左の引数を使用し#@":"0て、右の引数としてとして定義されたサイズで呼び出されます。これは、長さ(#)から(@)デフォルト形式(":)、つまり数値文字列化、入力の0セル(つまりメンバー)に適用されます("0)。

入力例について見ていきましょう409 12 13

   (#@":"0) 409 12 13
3 2 2

今すぐ内側の動詞のために、>./@(#~ ] = <./@])。のように見えますが>./@(...)、これは内部の>./@)の最大値()を効果的に意味します(...)。内部については、これは4トレインで、この5トレインと同等です。

[ #~ ] = <./@]

[元の引数を]参照し、サイズ配列を参照します。この例409 12 13では3 2 2それぞれ。この場合<./@]、右のタインが最小サイズを計算します2。この場合] = <./@]、最小値に等しい値のブール配列です0 1 1。最後[ #~ ...に、右引数マスクに従って左引数から値を取得します。これは、対応する要素0が削除され、1保持されることを意味します。だから私たちは残ってい12 13ます。最後に、上記に従って、maxが取得され、の正しい結果が得られ13、完了です。


いくつかのシャッフルとフックはバイトを節約できます>./@#~[:(=<./)#@":"0。もう少し節約する必要があると思います
マイル

@miles XD説明を書き終えたところです。よくああ、私は...この美しさを見てみましょう
コナー・オブライエン

ジョナサンはより良い方法を見つけました。Jに変換すると、その14バイトです{.@/:#@":"0,.-が、入力はリストとして整形する必要があります
マイル

@milesは「リストの形」ですか?つまり、のような400 12 13
コナーオブライエン

2

JavaScript(ES6)、62バイト

var solution =

a=>a.map(n=>(l=`${n}`.length)>a?l>a+1|n<r?0:r=n:(a=l-1,r=n))|r

;document.write('<pre>' + `
[1] -> 1
[9] -> 9
[1729] -> 1729
[1, 1] -> 1
[34, 3] -> 3
[38, 39] -> 39
[409, 12, 13] -> 13
[11, 11, 11, 1] -> 1
[11, 11, 11, 11] -> 11
[78, 99, 620, 1] -> 1
[78, 99, 620, 10] -> 99
[78, 99, 620, 100] -> 99
[1, 5, 9, 12, 63, 102] -> 9
[3451, 29820, 2983, 1223, 1337] -> 3451
[738, 2383, 281, 938, 212, 1010] -> 938
`.split('\n').slice(1, -1).map(c =>
  c + ', result: ' + solution(eval(c.slice(0, c.indexOf('->'))))
).join('\n'))


2

dc、54バイト

?dZsL0sN[dsNdZsL]su[dlN<u]sU[dZlL=UdZlL>ukz0<R]dsRxlNp

説明:

?dZsL0sN                  # read input, initialize L (length) and N (number)
[dsNdZsL]su               # macro (function) 'u' updates the values of L and N
[dlN<u]sU                 # macro 'U' calls 'u' if N < curr_nr
[dZlL=U dZlL>ukz0<R]dsR   # macro 'R' is a loop that calls 'U' if L == curr_nr_len
                          #or 'u' if L > curr_nr_len
xlNp                      # the main: call 'R' and print N at the end

実行例:「input.txt」には、質問のステートメントにすべてのテストケースが含まれています

while read list;do echo "$list -> "$(dc -f program.dc <<< $list);done < input.txt

出力:

1 -> 1
9 -> 9
1729 -> 1729
1 1 -> 1
34 3 -> 3
38 39 -> 39
409 12 13 -> 13
11 11 11 1 -> 1
11 11 11 11 -> 11
78 99 620 1 -> 1
78 99 620 10 -> 99
78 99 620 100 -> 99
1 5 9 12 63 102 -> 9
3451 29820 2983 1223 1337 -> 3451
738 2383 281 938 212 1010 -> 938

2

Java 7、112 104バイト

int c(int[]a){int i=a[0],j;for(int b:a)i=(j=(i+"").length()-(b+"").length())>0?b:b>i&j==0?b:i;return i;}

@ Barteks2xのおかげで複数バイトを節約するための異なるアプローチ

未ゴルフ&テストケース:

ここで試してみてください。

class M{
  static int c(int[] a){
    int i = a[0],
        j;
    for(int b : a){
      i = (j = (i+"").length() - (b+"").length()) > 0
           ? b
           : b > i & j == 0
              ? b
              : i;
    }
    return i;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1 }));
    System.out.println(c(new int[]{ 9 }));
    System.out.println(c(new int[]{ 1729 }));
    System.out.println(c(new int[]{ 1, 1 }));
    System.out.println(c(new int[]{ 34, 3 }));
    System.out.println(c(new int[]{ 409, 12, 13 }));
    System.out.println(c(new int[]{ 11, 11, 11, 1 }));
    System.out.println(c(new int[]{ 11, 11, 11, 11 }));
    System.out.println(c(new int[]{ 78, 99, 620, 1 }));
    System.out.println(c(new int[]{ 78, 99, 620, 100 }));
    System.out.println(c(new int[]{ 1, 5, 9, 12, 63, 102 }));
    System.out.println(c(new int[]{ 3451, 29820, 2983, 1223, 1337 }));
    System.out.println(c(new int[]{ 738, 2383, 281, 938, 212, 1010 }));
  }
}

出力:

1
9
1729
1
3
13
1
11
1
99
9
3451
938

1
短いバージョン:int c(int [] a){int i = a [0]、j; for(int b:a)i =(j =(i + "")。length()-(b + "")。 length())> 0?b:b> i&j == 0?b:i; return i;}
barteks2x

@ Barteks2xありがとう、編集しました。
ケビンCruijssen

2

bash、awk、53バイトのソート

set `awk '{print $0,length($0)}'|sort -rnk2n`;echo $1

stdinから入力を読み取り、1行に1つの値

bash and sort、58 57バイト

set `sort -n`;while((${#2}==${#1}));do shift;done;echo $1


938の代わりに2383を与えた最後のサンプルでは機能しません
Archemar

@Archemar申し訳ありませんが、質問を読み違えました。現在修正されています
エマニュエル

whileとの間のスペースを削除でき((ます。
seshoumara

1

JavaScriptのES6、80の 77 70バイト

a=>Math.max(...a.filter(l=>l.length==Math.min(...a.map(i=>i.length))))

私が正しい方向に進んでいることを願っています...


に置き換えa.map(i=>i.length).sort((a,b)=>a-b)[0]てもらえますMath.min(...a.map(i=>i.length))か?
user81655

@ user81655はい、できます。私はその編集をしていたが、どうやら私はしなかったと思った
Downgoat

あなたが再利用できるように、また、最小を否定試みることができるMath.maxa=>(m=Math.max)(...a.filter(l=>l.length==-m(...a.map(i=>-i.length))))しかし唯一の1バイトを保存しているようです。
user81655

別のバイトのためfilterに置き換えることができmap、そのリターン0:テストに合格しない値のためにa=>(m=Math.max)(...a.map(l=>l.length+m(...a.map(i=>-i.length))?0:l))
user81655


1

Haskell、39バイト

snd.maximum.map((0-).length.show>>=(,))

これは好む、動作しません342
xnor

ああ、ありがとう。私はそれを再考する必要が...
ダミアン

うまく動作するようになりました!
ダミアン

1

Javascript(ES6)、57 54 53バイト

l=>l.sort((a,b)=>(s=a=>1/a+`${a}`.length)(a)-s(b))[0]

記録のために、私の以前のバージョンはより数学指向でしたが、1バイト大きくなりました:

l=>l.sort((a,b)=>(s=a=>1/a-~Math.log10(a))(a)-s(b))[0]

テストケース

let f =
l=>l.sort((a,b)=>(s=a=>1/a+`${a}`.length)(a)-s(b))[0]

console.log(f([1]));                              //  -> 1
console.log(f([9]));                              //  -> 9
console.log(f([1729]));                           //  -> 1729
console.log(f([1, 1]));                           //  -> 1
console.log(f([34, 3]));                          //  -> 3
console.log(f([38, 39]));                         //  -> 39
console.log(f([409, 12, 13]));                    //  -> 13
console.log(f([11, 11, 11, 1]));                  //  -> 1
console.log(f([11, 11, 11, 11]));                 //  -> 11
console.log(f([78, 99, 620, 1]));                 //  -> 1
console.log(f([78, 99, 620, 10]));                //  -> 99
console.log(f([78, 99, 620, 100]));               //  -> 99
console.log(f([1, 5, 9, 12, 63, 102]));           //  -> 9
console.log(f([3451, 29820, 2983, 1223, 1337]));  //  -> 3451
console.log(f([738, 2383, 281, 938, 212, 1010])); //  -> 938


1

MATL、11バイト

tV48\&XS0))

入力は、次のような列ベクトル(;セパレーターとして使用)です。

[78; 99; 620; 100]

オンラインでお試しください!または、すべてのテストケースを確認します

説明

[78; 99; 620; 100]例として入力を使用してみましょう。

t      % Input column vector implicitly. Duplicate
       %   STACK: [78; 99; 620; 100], [78; 99; 620; 100]
V      % Convert to string. Each number is a row, left-padded with spaces
       %   STACK: [78; 99; 620; 100], [' 78'; ' 99'; '620'; '100']
48\    % Modulo 48. This transforms each digit into the corresponding number,
       % and space into 32. Thus space becomes the largest "digit"
       %   STACK: [78; 99; 620; 100], [32 7 8; 32 9 9; 6 2 0; 1 0 0]
&XS    % Sort rows in lexicographical order, and push the indices of the sorting
       %   STACK: [78; 99; 620; 100], [4; 3; 1; 2]
0)     % Get last value
       %   STACK: [78; 99; 620; 100], 2
)      % Index
       %   STACK: 99
       % Implicitly display

1
あなたの説明でスタックの状態を見るのは素晴らしいです!
flawr

1

Perl、38 37バイト

+1を含む -a

STDINに入力します。

perl -M5.010 maxmin.pl <<< "3451 29820 2983 1223 1337"

maxmin.pl

#!/usr/bin/perl -a
\$G[99-y///c][$_]for@F;say$#{$G[-1]}

最大数で線形のメモリを使用するため、大きすぎる数でこれを試さないでください。その欠陥のないソリューションは38バイトです。

#!/usr/bin/perl -p
$.++until$\=(sort/\b\S{$.}\b/g)[-1]}{

これらのすべては非常に厄介であり、まったく最適に感じません...


1

R、72 41 36バイト

新しいアプローチで関数を書き直しました。@bouncyballからの提案のおかげで5バイトをゴルフしました。

n=nchar(i<-scan());max(i[n==min(n)])

説明:

        i<-scan()       # Read input from stdin
n=nchar(         );     # Count the number of characters in each number in i
max(             )      # Return the maximum of the set where
    i[n==min(n)]        # the number of characters is the minimum number of characters.

function(i){while(1){if(length(o<-i[nchar(i)==T]))return(max(o));T=T+1}}

インデント/説明:

function(i){               # Take an input i
  while(1){                # Do the following continuously:
    if(length(
        o<-i[nchar(i)==T]) # Define o to be the subset of i with numbers of length T,
      )                    # where T is 1 (a built-in!).
                           # We take the length of this subset (its size), and then pass
                           # it to if(). Thanks to weak typing, this numeric is converted
                           # to a logical value. When this occurs, zero evaluates to FALSE
                           # and any non-zero number evaluates to TRUE. Therefore, the if()
                           # is TRUE iff the subset is not empty.
      return(max(o));      # If it's true, then we just return the largest element of the
                           # subset, breaking out of our loop.
    T=T+1                  # Otherwise, increment our counter and continue.
  }
}


1
定義しないことにより、4バイトの保存functioni=scan();n=nchar(i);max(i[n==min(n)])
bouncyball

@bouncyballありがとう!そして、さらに1バイトが保存されましたn=nchar(i<-scan())
rturnbull

1

Bash + coreutils, 58 bytes

d=`sort -n`;egrep ^.{`sed q<<<"$d"|wc -L`}$<<<"$d"|tail -1

Input format is one value per line. Golfing suggestions are welcomed.

Explanation:

d=`sort -n`                             #save the list in ascending numerical order
egrep ^.{                    }$<<<"$d"  #print only list lines having as many chars
         `sed q<<<"$d"|wc -L`                 #as the first sorted line does
|tail -1                                #and then get the last one (the answer)

+1 thank you now I know that sed q = head -1
Emmanuel


0

Python 2, 58 bytes

def F(x):l={len(`i`):i for i in sorted(x)};print l[min(l)]

0

Python 3, 56 bytes

lambda a:sorted(sorted(a),key=lambda x:-len(str(x)))[-1]

Uses a lambda in a lambda!

Python 2, 53 bytes

s=lambda a:sorted(sorted(a),key=lambda x:-len(`x`))[-1]

Same but with backticks


0

Pip, 11 bytes

(SNgSK-#_v)

Takes input as command-line args. Try it online!

First time using the Sort-Keyed operator! Like Python's sorted(), it takes a function that is applied to each item of the iterable and the result used as a sort key. Here's how this program works:

 SNg         List of cmdline args, sorted numerically in increasing order
    SK       Sort with key function...
      -#_    ... negative length(x), thus putting the shortest numbers at the end but not
               affecting the relative ordering among numbers with the same length
(        v)  Get the last element (index -1) and auto-print

0

Clojure, 63 bytes

(reduce #(if(=(quot %1 10)(quot %2 10))(max %1 %2) %1)(sort x)) 

as in:

(reduce #(if(=(quot %1 10)(quot %2 10))(max %1 %2) %1)(sort[3 7 121 11 8 2 10 9]))
=> 9

Though I'm sure there's a way to make it smaller.


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