将半排序插入未排序的数组


14

欢迎来到PPCG Inc.的第一天。作为我们最新的初级助理文件分类机,您有责任确保我们发送给您的所有文件都按字母顺序存档。猴子很容易做到。好吧,隐喻地说,就像我们确实雇用了一只猴子来做那样。你猜怎么了?原来猴子对我们的字母缺乏理解。无论如何,现在没有时间修复现在的混乱局面,所以请尽量不要使情况变得更糟,好吗?然后去吧!如果饿了,水冷却器旁会放着香蕉。祝好运!

职位描述

输入值

  • 您将收到一个字符串列表(档案)和一个需要添加到该列表的字符串(文档)
  • 所有字符串将仅包含大写字母,小写字母和空格
  • 字符串始终以字母开头和结尾

任务

确定文档的目标位置:应在存档中接收的位置。目标位置可以如下确定:

  • 对于每个职位:
    • 计算该位置之前存档中字符串的数量(按字母顺序排列)
    • 计算该位置之后档案中按字母顺序排列的字符串数量
    • 将职位的分数定义为以上两个计数之和
  • 文档的目标位置是得分最高的位置
  • 在平局的情况下,所有得分最高的职位均有效地充当目标职位。只需要选择一个。

排序时:

  • 大写和小写字母是等效的
  • 字母前有空格

输出量

  • 以任何形式添加了文档的存档

要么

  • 基于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 '16

Dragonshy我就知道了!非常好:-D
Luis Mendo

@Lex最好再有一个或两个测试用例
Luis Mendo

Answers:


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,将map期间设置的结果变量替换为也会更短。
user81655 '16

同意,但是几乎不再像我的解决方案了……
Neil

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

Ruby,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

预期输入是一个列表,第一个元素是字符串列表(归档),第二个元素是字符串(文档)

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)

Z是自动初始化的0,如果我正确地阅读您的代码可以为您节省空间
Maltysen

使用["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"作为输入,并使用E替代@Q0@Q1可为您节省四个字节。
Leaky Nun

您可以使用AQ代替J@Q0K@Q1
Leaky Nun

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.