先行および苦しみ番号


9

前書き:

オランダ語では、「ライデン」と「ライデン」である主導と苦しみの単語は、同じように発音されます。1つは「short ei」で、もう1つは「long ij」で書かれています。これは、オランダ人が言うように、「ei」と「ij」の両方が発音されます[ɛi]。

チャレンジ:

数値のリストを与えられて、どれが(もしあれば)先行しているか、どれが(もしあれば)苦しんでいるかを判断します。

主な数値は次のとおりです。

  • 正の数
  • 4桁以上
  • 価値に関してリストの上位50%にある
  • 3桁目が2桁目で置き換えられ、2桁目が0で埋められている場合(つまり、1234になる1024)、値の面でリストの上位50%にあります。

苦しんでいる数は:

  • 負の数
  • 4桁以上
  • 価値の点でリストの最低50%にある
  • 3桁目が2桁目で置き換えられ、2桁目が0で埋められている(つまり、-4321になる-4031)場合、値の点でリストの最下位50%にあります。

例:

入力:[5827, 281993, 3918, 3854, -32781, -2739, 37819, 0, 37298, -389]
出力:リーディング:[5827, 281993, 37819, 37298]; 苦しみ:[-32781, -2739]

説明:

数値をソートして2つに分割すると、次のようになります。

[[-32781, -2739, -389, 0, 3798], [3854, 3918, 5827, 37819, 281993]]

少なくとも4桁の負の数は2つしかありません[-32781, -2739]。上記のように数字を変更しても、それらの位置は変更されないため、どちらも数字に悩まされています。
最も大きい半分の場合、すべての数値は少なくとも4桁です:[3854, 3918, 5827, 37819, 281993]。上記のように数字を変更すると、一部の位置が変更されます。3854なる3084の下にそれを入れ、3798最低50%であるので、これは3854このリスト内の主要な数値ではありません。3918どちらになるか3098についても同じことが言えます3798。他の3つの数値は先行していて、に5827なるはずですが5087、これはまだ上3798にあり、実際にはソートされたリストの同じインデックスにあります。そう[5827, 37819, 281993] 主要な数値です。

チャレンジルール:

  • I / Oは柔軟です。input-listは、整数のリスト、2D数字リスト、文字列のリストなどです。出力は、整数のリスト、2つの区切られたリスト、2つの文字列で、どちらもSTDOUTに出力されます。
  • 数値が先行/苦しんでいるかどうかを判断する場合、数字がそれに応じて変更された場合のみ、その数値の新しい位置を確認します。すべての数値に変更を適用した後ではありません。
  • 変更された番号ではなく、元の番号を出力します。
  • 先行出力リストと影響を受ける出力リストの番号は、任意の順序にすることができます。
  • 入力リストのサイズが奇数の場合、中央の数はどちらにも属しません。
  • 番号は、変更後も一意であることが保証されています。したがって、のような[0, 1, 1045, 1485]リストは、変更後と1485等しいため、有効な入力リストではありません1045

一般的なルール:

  • これはなので、バイト単位の最短の回答が優先されます。
    コードゴルフ言語が非コードゴルフ言語で回答を投稿することを思いとどまらせないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。
  • デフォルトのI / Oルールを使用した回答には標準のルールが適用されるため、STDIN / STDOUT、関数/メソッドを適切なパラメーターで使用し、戻り値の型の完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)のリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

Input: [5827, 281993, 3918, 3854, -32781, -2739, 37819, 0, 37298, -389]
Output: leading: [5827, 281993, 37819, 37298]; suffering: [-32781, -2739]

Input: [-100, 472, 413, -1782]
Output: leading: []; suffering: [-1782]

Input: [-1234, -1235, -1236, 1234, 1235, 1236]
Output: leading: [1234, 1235, 1236]; suffering: [-1234, -1235, -1236]

Input: [-1919, -1819, -1719, -1619, -1500, -1444, 40, 4444, 18]
Output: leading: [4444]; suffering: []

Input: [-1004, -1111, -1000]
Output: leading: []; suffering: [-1111]

Input: [-1004, -1111, -1010, 1000]
Output: leading: [1000]; suffering: [-1111]

Input: [1000, -1000]
Output: leading: [1000]; suffering: [-1000]

Input: [1000, -5000, 4000]
Output: leading: [4000]; suffering: [-5000]

テストケースから判断すると、リストの長さが奇数の場合、50%は切り捨てられることになります。それを明示的に指定したい場合があります。
Grimmy

推奨テスト・ケース:[1000、-1000]
Grimmy

@Grimy最初のコメントと同様に、「入力リストのサイズが奇数の場合、中央の数はどちらにも属さない」というルールでそれをカバーできますよね?そして、提案されたテストケースを追加しました。
Kevin Cruijssen、

回答:


6

05AB1E27 24 23 22 21バイト

(‚εÅmyεD1è0šāǝ}‹y*₄@Ï

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



@KevinCruijssen自分で見つけた別の22の回答を編集しました。私たちは21のために、これらの最適化を組み合わせることができるかどうか...今見るために
Grimmy

1
おそらく違います。私が使用©し、®Åm代わりにあなたのÅmUyXバイトを保存するために、しかし、あなたは今取り除かUX行うことによってだけでなくÅm ... ‹y、それは同様の最適化ですので、マップの後。その場合、不要な変数を使用しないので、私は実際にあなたの方が好きです。:)
Kevin Cruijssen

ダン、とても素敵な発見0šāǝ!:Dそんなことは考えたことがないでしょう!
Kevin Cruijssen、

@KevinCruijssenありがとう!もありD¦0š2Lǝ、これはと同じバイト数D1è0šāǝです。
グリムミー



1

JavaScript(Node.js)、162バイト

a=>[(g=i=>a.filter(n=>n*i>999&(h=t=>a.reduce((a,c)=>a+(c!=n&i*c<i*t(n)),0)>=a.length/2)(x=>x)&h(m=x=>x<0?-m(-x):x>999?m(x/10)*10+x%10:x-x%100+x/10%10)))(1),g(-1)]

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

数値の配列を入力として受け取り、2要素の配列を出力として出力する無名関数。出力配列の最初の要素は先行数値の配列であり、出力配列の2番目の要素は後続の数値の配列です。

// a: input array of numbers
a=>
  // begin output array
  [
    // define a function g with input i
    // when i is 1, generate leading
    // when i is -1, generate following
    (g=i=>
      // function g returns a subset of a,
      // use filter() to select elements
      a.filter(n=>
        // n must be 4 digits and explicitly
        // positive or negative depending
        // on whether we are calculating
        // leading or following numbers
        n*i>999&
        // function h determines whether
        // the current number is in the
        // larger or smaller half,
        // depending on whether we are
        // calculating the leading or
        // following numbers.
        // argument t defines a
        // transformation that should
        // be applied to th current number
        (h=t=>
          // use reduce() to count the
          // number of numbers greater or
          // less than the transformed
          // current number
          a.reduce((a,c)=>
            // add the current total to...
            a+
            // either 0 or 1 depending on
            // whether the transformed
            // current number is in the
            // opposite group (leading vs
            // following
            (c!=n&i*c<i*t(n)),0)>=
          // are at least half in the
          // opposite group?
          a.length/2)
          // invoke h with the identity
          // transform
          (x=>x)&
          // invoke h again with a
          // transform m that moves the
          // 2nd digit to the 3rd digit and
          // 0's out the 2nd digit.
          // input for m is number x
          h(m=x=>
            // is x negative?
            x<0
              // invoke m with negated input
              // to force it to a positive value
              // and negate the result to
              // convert back to negative
              ?-m(-x)
              // otherwise, does x have 4 or
              // more digits?
              :x>999
                // recursively call m with 1
                // fewer digit, then add digit
                // back to the result
                ?m(x/10)*10+x%10
                // 3 or fewer digits, move
                // the 2nd digit to the 3rd
                // and 0 put the 2nd digit
                :x-x%100+x/10%10
        )
      )
    )
    // invoke g with input 1 for leading
    (1),
    // invoke g with input -1 for following
    g(-1)
  ]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.