リストの2番目の最大値を実行しています


20

整数のリストが与えられた場合、タスクは、2から入力リストの長さまでの各kについて、最初のk要素で2番目に大きい値を出力することです。

言い換えると、入力の各プレフィックスに対して2番目に大きい値を出力します。

最初の要素(k = 1)に任意の値を出力するか、1つの要素のリストに2番目の最大値がないため、この値を単純に省略できます。入力に少なくとも2つの要素があると仮定できます。

最短のコードが優先されます。

Input:
1 5 2 3 5 9 5 8
Output:
  1 2 3 5 5 5 8
Input:
1 1 2 2 3 3 4
Output:
  1 1 2 2 3 3
Input:
2 1 0 -1 0 1 2
Output:
  1 1 1 1 1 2

私の英語は最高ではありません、どのようにk決定されますか?
-LiefdeWen

@LiefdeWen各kの答えを含むリストを出力します。
jimmy23013

2
1厳密に言えば、ない二番目に大きい値1,1降順にソートするとき、それは第二の値です(第二例)。
ジョナサンアラン

たぶん私はただのバカだ(週末は本当に始まるかもしれないと思うけど)。誰かが私にとって最後のテストケースをELI5にできますか?最初の2つのテストケースは、リストをループして、リストの現在の最小値を特定し、そのアイテムを削除するだけで解決できます(または、リストを並べ替えて最後のアイテムを削除する)。これは、最初の2つのテストケースに対して正しい結果が得られますが、明らかに間違っている(そして与える-1, 0, 0, 1, 1, 2最後のテストケースのために。)
ケビンCruijssenに

1
@KevinCruijssenあなたが見た2つの最大の数字を覚えておいてください。最後のケースでは、2が最大で始まり、この時点では意味をなさないため、何も/何も出力しません。次に、次の反復で1と2に変更し、1を出力します。これは、最後に2に達するまで同じままで、2と2が最大で2番目に大きい
FryAmTheEggman

回答:


6

05AB1E、5バイト

ηεà\à

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

[]最初の(任意の値)を返します。


η¦ε{¨θ6バイトのために働く必要があります
アドナン・

もちろん@Adnanは> _ <...とにかくかかわらず、より良い方法を発見した
エリックOutgolfer

おもしろいことZ©KZ®‚¹sÃは、私が考えていたことàでした。
魔法のタコUr

別の5バイトの代替を見つけましたÁθ代わりに使用しました。
Mr Xcoder

5

9 7バイト

@Zgarbのおかげで1〜2バイト節約できました

mȯ→hOtḣ

0最初の「2番目の最大値」を返します

説明

         -- implicit input, e.g          [1,5,3,6]
      ḣ  -- prefixes                     [[],[1],[1,5],[1,5,3],[1,5,3,6]]
     t   -- remove the first element     [[1],[1,5],[1,5,3],[1,5,3,6]]
mȯ       -- map the composition of 3 functions
    O    --   sort                       [[1],[1,5],[1,3,5],[1,3,5,6]]
   h     --   drop the last element      [[],[1],[1,3],[1,3,5]
  →      --   return the last element    [0,1,3,5]
         -- implicit output

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


1
→hO代わりにマッピングして、バイトを保存できます。
-Zgarb


3

JavaScript(ES6)、58 51 50バイト

@Neilのおかげで1バイト節約

アペンドundefinedするためのk = 1

a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])

テストケース

注意:このスニペットはJSON.stringify()読みやすさのために使用します。これは、副作用として-に変換さundefinednullます。


1
a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])50だけだと思います
ニール

@ニールニース。:-)
アーナウド

2

Pyth、8バイト

m@Sd_2._

オンラインでお試しください!またはテストスイートをお試しください!


どうやって?

これにより、仕様に従って、リストの最初の要素がリストの最初の値として出力されます最初の要素に任意の値を出力できます

m@Sd_2._-暗黙的な入力を伴う完全なプログラム。

m ._Q-入力のプレフィックスを変数dでマップします。
  Sd-現在のプレフィックスをソートします。
 @-要素を取得...
    _2-インデックス-2(2番目に高い)。
           -暗黙的に印刷します。

2

ゼリー、8バイト

ḣJṢ€Ṗ€Ṫ€

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

最初の値は常に0になり、次の数字は各プレフィックスの2番目の最大値になります。

説明

ḣJṢ€Ṗ€Ṫ€  Input: array A
 J        Enumerate indices, [1, 2, ..., len(A)]
ḣ         Head, get that many values from the start for each, forms the prefixes
  Ṣ€      Sort each
    Ṗ€    Pop each, removes the maximum
      Ṫ€  Tail each

@ Challenger5私はそれが動作するとは思わない
マイル

@ Challenger5それは動作しません...
エリックアウトゴルファー

@EriktheOutgolferああ、わかりました。
エソランジングフルーツ


2

Python 2、45バイト

f=lambda l:l[1:]and f(l[:-1])+[sorted(l)[-2]]

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

コードの右側は一目瞭然です。ただし、の左側に何を入れandますか?リストの一部を再帰的に連結しているため、l2つ以上の要素がある場合は左側が真である必要があり、そうでない場合は空のリストが必要です。l[1:]この基準をうまく満たしています。




1

バッチ、123バイト

@set/af=s=%1
@for %%n in (%*)do @call:c %%n
@exit/b
:c
@if %1 gtr %s% set s=%1
@if %1 gtr %f% set/as=f,f=%1
@echo %s%


1

05AB1E、5バイト

Erikのソリューションとは非常に異なる別の5バイトを見つけました。任意の値は、リストの最初の要素です。

ηε{Áθ

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


説明

ηε{Áθ  - Full program that reads implicitly from STDIN and outputs to STDOUT.

η      - Push the Prefixes of the list.
 ε     - Apply to each element (each prefix):
  {      - Sort the prefix list.
   Á     - Shift the list to the right by 1, such that the first element goes to the 
           beginning  and the second largest one becomes the last.
    θ    - Get the last element (i.e. the second largest)
         - Print implicitly.

わかりやすくするために例を見てみましょう。

  • まず、暗黙的な入力を取得します。 [1, 5, 2, 3, 5, 9, 5, 8]ます。

  • 次に、η- を使用してプレフィックスをプッシュし[[1], [1, 5], [1, 5, 2], [1, 5, 2, 3], [1, 5, 2, 3, 5], [1, 5, 2, 3, 5, 9], [1, 5, 2, 3, 5, 9, 5], [1, 5, 2, 3, 5, 9, 5, 8]]ます。

  • これで、コードはリストをマップし、{- を使用して各プレフィックスをソートします[[1], [1, 5], [1, 2, 5], [1, 2, 3, 5], [1, 2, 3, 5, 5], [1, 2, 3, 5, 5, 9], [1, 2, 3, 5, 5, 5, 9], [1, 2, 3, 5, 5, 5, 8, 9]]

  • 次に、最後の要素を取得して先頭に移動します[[1], [5, 1], [5, 1, 2], [5, 1, 2, 3], [5, 1, 2, 3, 5], [9, 1, 2, 3, 5, 5], [9, 1, 2, 3, 5, 5, 5], [9, 1, 2, 3, 5, 5, 5, 8]]

  • もちろん、今ではコードはθ- を使用して各サブリストの最後の要素を取得します[1, 1, 2, 3, 5, 5, 5, 8](最初の要素は任意の値です。




1

Japt12 10バイト

出力配列は、入力配列の最初の要素と、それに続く目的のシーケンスで構成されます。

£¯YÄ n< g1

試して


説明

arrayの暗黙的な入力U

£

Map over U、ここYでは現在のインデックスです。

¯YÄ

Uから0にスライスしY+1ます。

n<

降順で並べ替えます。

g1

2番目の要素を取得します。

結果の配列を暗黙的に出力します。


1

MATL19 10バイト

Luis Mendoに9バイトを削ってくれてありがとう!

"GX@:)SP2)

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

説明

"GX@:)SP2)
"                  for all the values in the input
 G                 get input
  X@:)             get values up to the iteration
      SP           sort it in descending order
        2)         get the second value
                   implicit end of loop and output

@LuisMendoうわー!MATLについて私がどれだけ知っているかを示します。助けてくれてありがとう!
DanTheMan


1

オーム10 8バイト

ETHproductionsのおかげで-2バイト。

∙p»îS2~ª

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

ええ、これは奇妙ですが、負の数をプッシュする他の方法わかりません...オームは本当に知りませ。:P


1
さて、0 2-...非常に奇妙なようだ
氏Xcoder

1
ドキュメントを見るだけで(オームについては何も知りません)、できますか2~
-ETHproductions

@TEHProductionsああ、はるかに良い。ありがとう!
完全に人間



0

Swift 3、67バイト

func g(l:[Int]){print((1..<l.count).map{l[0...$0].sorted()[$0-1]})}

テストスイート。

Swift 3、65バイト

{l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

テストスイート。


これらの実行方法は?

最初の関数は、関数パラメーターとして入力を受け取り、結果を出力する完全な関数です。テストリンクに示されているとおりに使用できます。ただし、2番目のタイプの関数はほとんど使用されず、ほとんどの人はその存在を知らないため、命令を追加することにしました。使用法:

g(l: [1, 1, 2, 2, 3, 3, 4] )

2つ目は、ラムダのような匿名関数です。Pythonと同じように使用して、変数fを宣言して呼び出すことができます。

var f = {l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

print(f([1, 1, 2, 2, 3, 3, 4]))

または、括弧で囲んで直接呼び出します((...)(ArrayGoesHere)):

print(({l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int])([1, 1, 2, 2, 3, 3, 4]))

0

PHP、53バイト

for(;a&$n=$argv[++$i];rsort($a),print$a[1]._)$a[]=$n;

コマンドライン引数から入力を受け取ります。出力はセミコーラで区切られ、先行し、後続します。
で実行する-nr、オンラインで試してください

PHP 7.1で警告を生成します。置き換えa&""<修正します。
または使用for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54バイト)


0

Mathematica 42バイト

独立して@Jenny_mathyに非常に似ているが3バイト短い回答に到達しました

Sort[#[[;;i]]][[-2]]~Table~{i,2,Length@#}&

最初の実行中の最大値は15バイトと2つの関数呼び出しのみであることに気付きました!:

Max~FoldList~#&

ので、これはとても簡潔に行うことができるMax属性を持っているFlatし、OneIdentityそれがために真実ではありませんRankedMax論理的な交換されるであろう。残念ながら、既存の関数で属性を定義したり変更したりするのは非常に多くのバイトを必要とするため、他の方法で平坦化を行う必要があります。

n番目のランニングマックスはすべて48バイトで見つけることができます。

PadLeft[Sort/@Flatten/@FoldList[{##}&,{},#&@#]]&


0

k、13バイト

{x(>x)1}'1_,\

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

           ,\ /sublists of increasing lengths (scan concat)
         1_   /remove the first sublist
{      }'     /for each sublist:
  (>x)        /    indices to permute sublist into largest to smallest
      1       /    get second index
 x            /    get sublist[that index]


0

JavaScript(ES6)、43 51バイト

編集: 数値の並べ替えが必要なため、8バイトを追加しました。 :(

a=>a.map((_,b)=>a.slice(0,b+1).sort((a,b)=>b-a)[1])

ただし、辞書式の順序が必要な場合は短くするため、ここにこれを保持します。

a=>a.map((_,b)=>a.slice(0,b+1).sort()[b-1])

両方の式undefinedは、最初の要素に対して生成されます。

テストコード


レピュテーションシステム用ではない場合は、既存のJS投稿にコメントすることをお勧めします。
アーロンヒル

PPCGへようこそ!50 repコメントのしきい値も好きではありませんが、スパマーがコメントしないようにするために必要だと思います。とにかく、私は入力のような二桁の番号が含まれている場合、これが失敗すると思い10として、.sort()デフォルトで辞書順でソートする(すなわち1,10,100,11,12,13、...、2,20,21を、...)。(a,b)=>a-b番号で並べ替えるには、含めるか類似する必要があります。
ETHproductions

ありがとう、@ ETHproductions。数値の順序を更新しました。つまり、これで十分ではありません。しかたがない。
アーロンヒル

0

Clojure、56バイト

#(for[i(drop 2(reductions conj[]%))](nth(sort-by - i)1))

たぶん、これらのプレフィックスを生成するより良い方法があります。

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