对这些詹姆斯·邦德评分进行排序


31

介绍

我的祖父是詹姆斯·邦德(James Bond)的粉丝,但他始终不确定如何对他最喜欢的演员进行排名。因此,他总是在列出清单,这是很多工作。他要求我制作一个程序,使他的生活更轻松,但是我没有时间这样做,我必须工作!所以我指望你们。

挑战

挑战很简单。输入将包含一个列表,格式如下:

<number> <space> <actor's name> <newline>

您的任务是根据行首,从末尾到第一个结束的数字对它们进行排序。所有号码都应删除。

但是,我爷爷有时会犯错误。因此,您将需要验证数据。如果列表中的名称之一不涉及扮演邦德的演员之一,则需要将其丢弃。万一重复,应该删除重复,名称应保持与之关联的最低权重(示例3)。

对可以有多少行没有限制。

输出只需是某种形式的列表,无论是数组,逗号分隔的字符串,仅由空格分隔的值还是其他所有内容,即

Pierce Brosnan, Sean Connery, David Niven

尾随换行符或空格是允许的。

输入和输出示例

输入:

1肖恩·康纳利

2艾玛·沃特森

5蒂莫西·道尔顿

4罗杰·摩尔

3丹尼尔·克雷格

输出:

蒂莫西·道尔顿,罗杰·摩尔,丹尼尔·克雷格,肖恩·康纳利

输入:

2蒂莫西·道尔顿

4乔治·拉岑比

5乔治·拉岑比

3鲍勃·西蒙斯

输出:

乔治·拉岑比,鲍勃·西蒙斯,蒂莫西·道尔顿

输入:

3肖恩·康纳利

2皮尔斯·布鲁斯南

1肖恩·康纳利

输出:

皮尔斯·布鲁斯南(Sean Connery)

因为这是代码高尔夫球,所以最短的代码(以字节为单位)获胜!

附录

扮演邦德角色的演员名单:

  • 巴里·尼尔森
  • 鲍勃·西蒙斯
  • 肖恩·康纳利
  • 罗杰·摩尔
  • 戴维·尼文
  • 乔治·拉岑比
  • 蒂莫西·道尔顿
  • 皮尔斯·布鲁斯南
  • 丹尼尔·克雷格

3
欢迎来到PPCG,真是挑战!请注意,Sean Connery在您的列表中出现了两次。
Denham Coote

@DenhamCoote解决了该问题,并在示例输出中犯了错误。
MKII'2

2
我们是否可以假设所有可能的角色都由两个词(名字和姓氏)来标识?
路易斯·门多

17
艾玛·沃特森(Emma Watson)扮演詹姆斯·邦德(James Bond)很棒。
Alex A.

3
嗯,我的回答是echo Sean Connery因为每个人都知道,只有一个纽带
user902383

Answers:


2

Pyth,136个 132字节

_{mtcd\ f}stcTdc"BarryNelson BobSimmons SeanConnery RogerMoore DavidNiven GeorgeLazenby TimothyDalton PierceBrosnan DanielCraig"dS.z

在这里尝试!

说明

_ {mtcd \ f} stcTdc“ BarryNelson BobSimmons ...” dS.z#.z =所有输入行的列表
                                             Sz#排序输入升序
        f#过滤已排序的行,其中T为当前行
            cTd#在空格处分割一条线
          st#丢弃数字并加入名字和姓氏
               c“ BarryNelson BobSimmons ...” d#在空间上拆分键合演员列表...
         }#仅保留演员列表中的行
   mtcd \#从过滤的行中删除数字
_ {#从映射结果中删除重复项并反转结果


小缺陷,排序是错误的方法(应该从最后到最后,而从头到尾)。
MKII

@MKII猜猜我过度阅读了这一部分...解决了!
Denker

12

视网膜201197 191

\ d +
$ 0 $ * 1
G` ^ 1 +(Barry Nelson | Bob Simmons | Sean Connery | Roger Moore | David Niven | George Lazenby | Timothy Dalton | Pierce Brosnan | Daniel Craig)$
+`\ b((1 +)\ D *)¶(\ 2. +)
$3¶$ 1
+ s`1 +(\ D +)¶(。* \ 1)
2美元
1+ 

在线尝试!

感谢Martin,节省了6个字节!

Whee,使用正则表达式进行泡沫排序。请注意,在开始时将十个字节用于十进制到一元的转换,如果一元输入正常,则不需要这样做。同样,如果数字不能用人的名字命名,则可以通过将删除非邦德演员的行移到末尾并删除1+(未测试\D版本)来节省更多字节。

说明:

视网膜程序由几个阶段组成,因此我将分别解释每个阶段。

阶段1:

\d+
$0$*1

用一元代替输入中的数字。这使用了Retina的特殊替换令牌:$*该令牌在等于前一个令牌的基数10值的次数后重复字符。

阶段2:

G`^1+ (Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$

`阶段中a 之前的内容会更改使用的模式。这将打开grep模式,这意味着不匹配正则表达式的每一行都将被丢弃。必须使用锚来防止近火柴滑倒。

阶段3:

+`\b((1+)\D*)¶(\2.+)
$3¶$1

这是分拣阶段。在+以模式表示此阶段应被重复,直到施加时更换不作任何改变(即,我们达到一个固定点)。正则表达式找到一个单词boundry,然后是一定数量的1s,然后是该行的所有其余部分,直到换行符为止。然后,如果下一行1比s多,则正则表达式将匹配,我们交换行。

阶段4:

+s`1+(\D+)¶(.*\1)
$2

此阶段+再次使用该模式,还用于s使.元字符也匹配换行符。通过匹配1s 之后的精确重复项并捕获第一个重复项之后的内容以替换整个匹配项,从而删除重复行。这样就可以工作,而无需考虑平局的顺序,因为名称已经被适当地排序了,上面的数字较大,因此我们将始终保留较小的值。

阶段5:

1+ 

这里真的很简单,除了我们1在Bonds前面有一堆s 之外,其他所有东西都是有序的,因此我们将它们及其后面的空格全部替换为空。


...该死,这种语言每天都给我留下深刻的印象。做得好,马丁!
基金莫妮卡的诉讼

6

TSQL 426字节(包含数据+输入)

打高尔夫球的解决方案:

create table A(Name varchar(99))insert into A values('Barry Nelson'),('Bob Simmons'),('Sean Connery'),('Roger Moore'),('David Niven'),('George Lazenby'),('Timothy Dalton'),('Pierce Brosnan'),('Daniel Craig')declare @I as table (R int, N varchar(99))insert into @I values(3,'Sean Connery'),(2,'Pierce Brosnan'),(1,'Sean Connery')select N from(select N,min(R) R from @I where N in (select N from A) group by N) x order by R desc

在这里尝试

SQL在这种任务上表现出色(无双关语):关联集,排序,切断重复项等。

您需要做的就是创建并填充一个Actor表,如下所示:

create table Actor (Name varchar(99))
insert into Actor values
 ('Barry Nelson')
,('Bob Simmons')
,('Sean Connery')
,('Roger Moore')
,('David Niven')
,('George Lazenby')
,('Timothy Dalton')
,('Pierce Brosnan')
,('Daniel Craig')

现在,如果我们使用表变量作为输入,我们只需要获取两个集合的交集即可。在SQL中删除重复项和排序非常容易。

范例1:

declare @Input as table (Rnk int, Name varchar(99))
insert into @Input values
 (1,'Sean Connery')
,(2,'Emma Watson')
,(5,'Timothy Dalton')
,(4,'Roger Moore')
,(3,'Daniel Craig')

select Name
from
(
    select Name, min(Rnk) as R
    from @Input
    where Name in (select Name from Actor)
    group by Name
) x
order by R desc

范例2:

declare @Input as table (Rnk int, Name varchar(99))
insert into @Input values
 (2,'Timothy Dalton')
,(4,'George Lazenby')
,(5,'George Lazenby')
,(3,'Bob Simmons')

select Name
from
(
    select Name, min(Rnk) as R
    from @Input
    where Name in (select Name from Actor)
    group by Name
) x
order by R desc

高尔夫版本只是完整的东西,例如输入3

此外,该SQL还可以用于较旧的DBMS版本(甚至可以重写为ANSI SQL),并且可以在大多数语言的较旧计算机中正常运行。


它可以在行首使用任何数字还是只能使用一位数字?
MKII'2

1
@MKII我使用INT类型,因此它不能接受–2,147,483,6482,147,483,647范围内的任何内容,也不能接受该行数=)
jean

您不需要子选择。您可以只使用order by min(R) desc内部选择,然后min(R)从选择中删除。那应该节省21个字节。
raznagul

高尔夫版本中也有一些不必要的空间。
raznagul

使用 char代替varchar将节省另外6个字节。
raznagul

5

Perl中,242个 179 217字节

print reverse grep{/^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/&&!$s{$_}++}map{s/\d+ //;$_}sort{($a=~/(\d+)/)[0]<=>($b=~/(\d+)/)[0]}<>;

格式更好的版本,带有注释:

print
     # reverse ranking order
     reverse
     # filter entries...
     grep {
         # only actual bonds
         /^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/
         # only new bonds
         && !$s{$_}++
     } map {s/\d+ //;$_}         # remove leading digits+space
     # sort according to embedded numbers
     sort {($a=~/(\d+)/)[0] <=> ($b=~/(\d+)/)[0]}
     <>;                        # slurp input as list (list context)

大部分是债券清单;如果找不到误报,我找不到压缩该正则表达式的好方法。


欢迎使用编程难题和Code Golf。出色的答案,+ 1。我本来建议您添加一个解释,但是后来我看到了编辑。也许有可能以某种方式压缩演员名单...
wizzwizz4 2016年

@ wizzwizz4我尝试了一些尝试来使该正则表达式更小,但解码的代价似乎总是比您节省的多-接受的内容太稀疏了。
大卫·莫里斯

可悲的是,它需要使用数字,而不仅是数字。抱歉,我在问题中使用了错误的术语。
MKII'2

@MKII aww,这花了我38个字节:(
David Morris

如果eval在Perl中有一个,并且有一个内置的压缩​​系统...
wizzwizz4

4

Python 2,250个字节:

lambda I:zip(*sorted({k:v for v,k in[x.split(' ',1)for x in I.split('\n')]if k in'Barry Nelson,Bob Simmons,Sean Connery,Roger Moore,David Niven,George Lazenby,Timothy Dalton,Pierce Brosnan,Daniel Craig'.split(',')}.items(),key=lambda t:-int(t[1])))[0]

演示:

>>> L = ["Barry Nelson",
...     "Bob Simmons",
...     "Sean Connery",
...     "Roger Moore",
...     "David Niven",
...     "George Lazenby",
...     "Timothy Dalton",
...     "Pierce Brosnan",
...     "Daniel Craig"]

>>> I="""2 Timothy Dalton
... 4 George Lazenby
... 5 George Lazenby
... 3 Bob Simmons"""
>>> F(I,L)
('George Lazenby', 'Bob Simmons', 'Timothy Dalton')

>>> I = """1 Sean Connery
... 2 Emma Watson
... 5 Timothy Dalton
... 4 Roger Moore
... 3 Daniel Craig"""
>>> 
>>> F(I,L)
('Timothy Dalton', 'Roger Moore', 'Daniel Craig', 'Sean Connery')


我只是使用字典理解来保留唯一名称,而不是设置理解。
Kasramvd

10
我愿意看到艾玛·沃特森(Emma Watson)扮演詹姆斯·邦德(James Bond)。
DJClayworth

它可以在行首使用任何数字还是只能使用一位数字?
MKII'2

2

PowerShell v3 +,227 219字节

$a=$args-split"`n"|sort|%{$c,$b=-split$_;$b-join' '}|?{$_-in('Barry Nelson,Bob Simmons,Sean Connery,Roger Moore,David Niven,George Lazenby,Timothy Dalton,Pierce Brosnan,Daniel Craig'-split',')}|select -u
$a[$a.count..0]

121字节只是演员列表...

接受输入$args-split使用来换行`n。用管道将其输送到sort,它将按数字升序对条目进行排序,目前还可以。我们将它们通过管道传递到foreach循环|%{...},每次迭代都将条目-split带入空格,然后-join将下半部分与空格放在一起(即从开头删除数字)。这些(升序)排序的名称现在留在管道上。我们将这些内容通过一个位置进行传递,以?确保它们-in成为批准的演员列表。最后,我们select-u nique条目,对于重复项,nique条目将选择它遇到的第一个条目(即权重最低的条目),并丢弃其余条目。我们将名称的结果数组存储到中$a

所以,现在我们有了一个排序的演员列表。由于挑战需要下降,因此我们$a通过从$a.count下到下进行来进行0

PS C:\Tools\Scripts\golfing> .\sort-these-james-bond-ratings.ps1 "1 Sean Connery`n2 Emma Watson`n5 Daniel Craig`n4 Roger Moore`n3 Daniel Craig"
Roger Moore
Daniel Craig
Sean Connery

编辑-编制索引时不需要使用[array] :: Reverse()


不仅可以使用sort -Des数组反转,还可以使用数组反转吗?当然,在更高版本的PowerShell中可能会破坏它,但我认为这不太可能或不是真正的问题;)
VisualMelon

@VisualMelon我曾经考虑过,但是 select -u它将抓住并保留值最高的顺序,而不是最低的顺序,因此对于我的示例,Daniel Craig和Roger Moore的位置将互换。我尝试修复该问题导致了比数组反转更长的代码。
AdmBorkBork

啊,是的,这是有道理的,我无法运行它并完全错过了它-真可惜只有这么多的逆转浪费了很多……
VisualMelon

2

蟒蛇 309 286字节

import sys
i='Barry Nelson.Bob Simmons.Sean Connery.Roger Moore.David Niven.George Lazenby.Timothy Dalton.Pierce Brosnan.Daniel Craig'.split('.')
print ', '.join(i.pop(i.index(x)) for x in zip(*sorted((x.strip().split(' ',1) for x in sys.stdin),None,lambda x:int(x[0]),1))[1] if x in i)

它可以在行首使用任何数字还是只能使用一位数字?
MKII'2

它没有,但现在可以了:)
mtp '16

看起来您可以在这里摆脱一些多余的空间,例如printa )]
wnnmaw

1

JavaScript(ES6),232字节

s=>s.split`
`.sort((a,b)=>(p=parseInt)(a)<p(b)).map(l=>l.replace(/\d+ /,"")).filter(l=>!p[l]&/^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/.test(p[l]=l))

说明

var solution =

s=>
  s.split`
`
  .sort((a,b)=>                 // sort the list by the number
    (p=parseInt)(a)<p(b)        // parseInt reads only the first number in a string
                                // the variable p also holds names that appeared in the
                                //     list previously
  )
  .map(l=>l.replace(/\d+ /,"")) // remove the number at the beginning of each line
  .filter(l=>
    !p[l]&                      // remove duplicates
    
    // Bond actor regex
    /^(Barry Nelson|Bob Simmons|Sean Connery|Roger Moore|David Niven|George Lazenby|Timothy Dalton|Pierce Brosnan|Daniel Craig)$/
    
    .test(p[l]=l)               // test for bondness and add the line to p
  )
<textarea id="input" rows="6" cols="40">1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>

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.