未ソート配列にセミソートを挿入


14

PPCG Incの最初の日へようこそ。最新のジュニアアシスタントドキュメントソーターとして、送信されたすべてのドキュメントがアルファベット順にアーカイブされていることを確認する責任があります。猿ができるのはとても簡単です。まあ、比phor的に言えば、私たちはそれを行うために猿を雇ったのです。何だと思う?サルはアルファベットを理解していないことがわかります。とにかく、今の混乱を修正する時間がないので、状況を悪化させないようにしてください。その後、それを取得します!おなかがすいたら、ウォータークーラーのそばにバナナがあります。幸運を!

仕事内容

入力

  • 文字列のリスト(アーカイブ)と、そのリストに追加する必要のある文字列(ドキュメント)を受け取ります。
  • すべての文字列には、大文字、小文字、スペースのみが含まれます
  • 文字列は常に文字で始まり、文字で終わる

仕事

ドキュメントのターゲット位置を決定します:アーカイブ内で受け取るべき位置。目標位置は次のように決定できます。

  • 各ポジションについて:
    • 文書内のアルファベット順で、その位置の前のアーカイブ内の文字列の量を数えます
    • 文書内のアルファベット順で、その位置の後のアーカイブ内の文字列の量を数えます
    • 上記の2つのカウントの合計としてポジションのスコアを定義します
  • ドキュメントの目標位置は、最高スコアの位置です
  • 同点の場合、最高スコアのすべてのポジションがターゲットポジションとして等しく有効です。1つだけを選択する必要があります。

ソートする場合:

  • 大文字と小文字は同等です
  • 文字の前にスペースが来る

出力

  • 任意の形式でドキュメントが追加されたアーカイブ

または

  • 0ベースまたは1ベースのインデックスでのドキュメントのターゲット位置

職務評価

最少バイトが勝ちます!

I / Oの例

Archive:
    Applebuck Season
    Friendship is Magic
    The Ticket Master
    Griffon the BrushOff
    Boast Busters
    Bridle Gossip

Document: Dragonshy

Position scores (0-based index):
0: 0 + 3 = 3
1: 1 + 3 = 4
2: 1 + 2 = 3
3: 1 + 1 = 2
4: 1 + 0 = 1
5: 2 + 0 = 2
6: 3 + 0 = 3

Target position: 1

5
PPCGへようこそ、これは素晴らしい最初の投稿のようです!:)「タスク」セクションの指示は読みにくいです。水平スクロールは面倒です。代わりに箇条書きリストを使用することを検討します。必要に応じて、コミュニティがレビューする課題を投稿できる便利なサンドボックスがあります。
FryAmTheEggman

Dragonshy私はちょうどそれを得た!とても素敵な:-D
ルイスMendo

@Lex 1つまたは2つ以上のテストケースがあるといいでしょう
ルイスメンドー

回答:


4

JavaScript(ES6)、81バイト

(a,d)=>a.map((e,i)=>d[l="toLowerCase"]()<e[l]()?s--:++s>m&&(++m,p=++i),m=s=p=0)|p

ゴルフをしていない:

function position(archive, document) {
    var score = 0;
    var max = 0;
    var pos = 0;
    var i = 0;
    while (i < archive.length) {
        if (archive[i++].toLowerCase() > document.toLowerCase()) {
            score--;
        } else {
            score++;
            if (score > max) {
                max++;
                pos = i;
            }
        }
    }
    return pos;
}

編集:@ user81655のおかげで多くのバイトを保存しました。


またindexOf、マップ中に設定された結果変数でを置き換えることも短くなります。
-user81655

同意したが、もはや私の解決策のようには見えない
ニール

3

Pyth、40 38バイト

クレジット@Katenkyoことを私に教えるためのA xnor B基本的ですA==B。(A xor BもですA!=B

AQJ+],k0.e,rb0hkGteh.Msmq<hdrH0<edeZJJ

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

使い方:

エントリがドキュメントよりも小さいかどうか、およびエントリのインデックスがドキュメントのインデックスよりも小さいかどうかのXNORを合計します。

この合計が最大になる位置を見つけて出力します。


2

Pythonの3、135の 167バイト

def a(b,c):a=[sum(map(lambda x:x.lower()>c.lower(),b[i:]))+sum(map(lambda x:x.lower()<c.lower(),b[:i]))for i in range(0,len(b)+1)];b.insert(a.index(max(a)),c);print(b)

1

ルビー、97バイト

無名関数、ターゲット位置を返します。

->a,d{d.upcase!;(0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}}}

実際にアーカイブに挿入する場合、110バイト

->a,d{t=d.upcase;a.insert (0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}},d}

1

Pyth、54 52 47 45バイト

AQVhlG=Ys+m>rH0rd0:G0Nm<rH0rd0gGNI>YZ=ZY=kN;k

入力はリスト、最初の要素は文字列のリスト(アーカイブ)、2番目の要素は文字列(ドキュメント)

AQ                                            # initialize G and H with the archive and the document
  VhlG                                        # iterate over the indexes on archive
      =Ys+                                    # concatenate and sum the following scores
          m>rH0rd0:G0N                        # map a string comparison between the document and the archives up to the index, returning true(1) for lower, and false(0) for higher
                      m<rH0rd0gGN             # same as above, but starts at the index and goes up to the end of the archive, returning false(0) for lower, and true(1) for higher
                                 I>YZ         # Check if score is higher than highest
                                     =ZY      # update highest score
                                        =kN;  # update index
                                            k # print index

ここでテスト

  • 入力の初期化時に5バイトを保存しました(@Kenny Lauに感謝)


使用して["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"、入力として使用し、E代わりに@Q0@Q1あなたに4つのバイトを保存することができます。
リーキー修道女

AQ代わりに使用できますJ@Q0K@Q1
リーキー修道女

1

MATL、32バイト

hk4#S4#S%2#0)>t0whYsw~0hPYsP+K#X>

入力は、アーカイブの文字列(スペースで区切られ、中かっこで囲まれたいくつかの文字列)のセル配列、およびドキュメントの文字列です。出力は1ベースです。同点の場合、最初の位置が返されます。

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

説明

h      % Concatenate archive and document as a cell array of strings
k      % Convert all strings to lowercase
4#S    % Sort and output the indices of the sorting
4#S    % Again. This gives the indices that applied to the concatenated
       % array would make it sorted
2#0)   % Separate last index (document) from the others (archive)
>      % Is it greater? Gives zero/one array the size of the archive
t      % Duplicate that array
0wh    % Prepend a 0
Ys     % Cumulative sum. This is first part of the score
w~     % Swap. Negate zero/one array
0h     % Postpend a 0
PYsP   % Reverse, cumulative sum, reverse. Second part of the score
+      % Add. This is the score of each position
K#X>   % Arg max
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.