Sắp xếp các xếp hạng James Bond này


31

Giới thiệu

Ông tôi là một fan hâm mộ của James Bond, nhưng ông luôn không chắc chắn về cách xếp hạng các diễn viên yêu thích của mình. Như vậy, anh ấy luôn lập danh sách, đó là rất nhiều công việc. Anh ấy yêu cầu tôi sản xuất một chương trình giúp cuộc sống của anh ấy dễ dàng hơn, nhưng tôi không có thời gian cho việc đó, tôi phải làm việc! Vì vậy, tôi sẽ tin tưởng vào các bạn.

Thử thách

Thử thách rất đơn giản. Đầu vào sẽ bao gồm một danh sách, theo định dạng sau:

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

Nhiệm vụ của bạn là sắp xếp chúng dựa trên số ở đầu dòng, bắt đầu từ cuối cùng và kết thúc bằng số đầu tiên. Tất cả các số nên được loại bỏ.

Tuy nhiên, ông tôi đôi khi mắc lỗi. Như vậy, bạn sẽ cần xác nhận dữ liệu. Nếu một trong những tên trong danh sách không đề cập đến một trong những diễn viên đã đóng Bond, bạn cần loại bỏ nó. Trong trường hợp lặp lại, lặp lại nên được loại bỏ và tên phải duy trì trọng lượng thấp nhất mà nó được liên kết (ví dụ # 3).

Không có giới hạn về số lượng có thể có.

Đầu ra chỉ cần là một danh sách sắp xếp nào đó, cho dù đó là một mảng, một chuỗi được phân tách bằng dấu phẩy, chỉ các giá trị được phân tách bằng khoảng trắng hoặc một cái gì đó hoàn toàn khác, tức là

Pierce Brosnan, Sean Connery, David Niven

Một dòng mới hoặc dấu cách được cho phép.

Ví dụ đầu vào và đầu ra

Đầu vào:

1 Sean Connery

2 Emma Watson

5 Timothy Dalton

4 Roger Moore

3 Daniel Craig

Đầu ra:

Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery

Đầu vào:

2 Timothy Dalton

4 George Lazenby

5 George Lazenby

3 Simmons

Đầu ra:

George Lazenby, Bob Simmons, Timothy Dalton

Đầu vào:

3 Sean Connery

2 Pierc Brosnan

1 Sean Connery

Đầu ra:

Pierce Brosnan, Sean Connery

Vì đây là một mã golf, mã ngắn nhất (tính bằng byte) sẽ thắng!

ruột thừa

Danh sách các diễn viên đóng vai Bond:

  • Barry Nelson
  • Bob Simmons
  • Sean Connery
  • Roger Moore
  • David Niven
  • George Lazenby
  • Timothy Dalton
  • Pierce Brosnan
  • Daniel Craig

3
Chào mừng bạn đến với PPCG, và thử thách thú vị! Lưu ý rằng Sean Connery xuất hiện hai lần trong danh sách của bạn.
Denham Coote

@DenhamCoote Đã sửa lỗi đó và lỗi trong đầu ra ví dụ.
MKII

2
Chúng ta có thể giả sử tất cả các diễn viên có thể sẽ được xác định bằng hai từ (tên và họ) không?
Luis Mendo

17
Emma Watson đã tuyệt vời như James Bond.
Alex A.

3
hmm câu trả lời của tôi là echo Sean Connerybởi vì mọi người đều biết, chỉ có một trái phiếu
user902383

Câu trả lời:


2

Pyth, 136 132 byte

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

Hãy thử nó ở đây!

Giải trình

_ {mtcd \ f} stcTdc "BarryNelson BobSimmons ..." dS.z # .z = danh sách tất cả các dòng đầu vào
                                             Sz # Sắp xếp đầu vào tăng dần
        Bộ lọc f # đã sắp xếp các dòng với T là dòng hiện tại
            cTd # Tách một dòng trên dấu cách
          st # Dicard số và tham gia tên và họ
               c "BarryNelson BobSimmons ..." d # Chia danh sách diễn viên trái phiếu trên các không gian ...
         } # chỉ giữ các dòng trong danh sách diễn viên
   mtcd \ # xóa số khỏi các dòng được lọc
_ {# Loại bỏ trùng lặp khỏi kết quả ánh xạ và đảo ngược kết quả


Lỗ hổng nhỏ, thứ tự là sai cách xung quanh (nó được cho là đi từ cuối đến trước, trong khi của bạn là đầu tiên đến cuối cùng).
MKII

@MKII Đoán tôi đã đọc quá phần đó ... Đã sửa nó!
Denker

12

Võng mạc ,201 197 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+ 

Hãy thử trực tuyến!

6 byte được lưu nhờ Martin!

Whee, bong bóng sắp xếp với regex. Lưu ý rằng mười byte được sử dụng để thực hiện chuyển đổi thập phân sang đơn nguyên lúc đầu, nếu đầu vào đơn nguyên là OK thì điều đó là không cần thiết. Ngoài ra, nếu số không thể có tên của mọi người, thì có thể lưu thêm một vài byte bằng cách di chuyển dòng loại bỏ các tác nhân không liên kết đến cuối và xóa 1+(chưa được kiểm tra với \Dphiên bản).

Giải trình:

Một chương trình Retina được tạo thành từ nhiều giai đoạn, vì vậy tôi sẽ giải thích riêng từng giai đoạn.

Giai đoạn 1:

\d+
$0$*1

Thay thế các số trong đầu vào bằng unary. Điều này sử dụng mã thông báo thay thế đặc biệt của Retina: $*lặp lại ký tự sau một số lần bằng với giá trị cơ sở 10 của mã thông báo trước đó.

Giai đoạn 2:

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

Các công cụ trước một `giai đoạn thay đổi chế độ đang được sử dụng. Điều này bật chế độ grep, có nghĩa là mỗi dòng không khớp với biểu thức chính quy sẽ bị loại bỏ. Các neo là cần thiết để ngăn chặn các trận đấu gần bị trượt.

Giai đoạn 3:

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

Đây là giai đoạn phân loại. Trong +chế độ biểu thị rằng giai đoạn này nên được lặp lại cho đến khi thay thế không thay đổi khi áp dụng (tức là chúng ta đạt đến một điểm cố định). Regex tìm thấy một ràng buộc từ, theo sau là một số 1s và sau đó tất cả phần còn lại của dòng lên đến dòng mới. Sau đó, nếu dòng tiếp theo có nhiều 1s hơn nó, regex sẽ khớp và chúng ta trao đổi các dòng.

Giai đoạn 4:

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

Giai đoạn này sử dụng lại +chế độ, nhưng cũng sử dụng sđể làm cho .siêu ký tự cũng khớp với các dòng mới. Điều này loại bỏ các dòng trùng lặp, bằng cách khớp cho các bản sao chính xác sau 1s và chụp nội dung sau bản sao đầu tiên để thay thế toàn bộ khớp với nó. Điều này sẽ hoạt động mà không cần phải xem xét thứ tự ngắt kết nối, bởi vì các tên đã được sắp xếp một cách thích hợp, với các số lớn hơn ở trên, do đó chúng tôi sẽ luôn giữ các giá trị nhỏ hơn.

Giai đoạn 5:

1+ 

Thực sự đơn giản ở đây, mọi thứ đều theo thứ tự, ngoại trừ chúng tôi có một loạt các 1mặt trước Trái phiếu của chúng tôi, vì vậy chúng tôi thay thế chúng và không gian sau chúng không có gì.


... Chết tiệt, ngôn ngữ này ngày càng gây ấn tượng với tôi hơn. Làm tốt lắm, Martin!
Vụ kiện của Quỹ Monica

6

TSQL 426 byte (bao gồm dữ liệu + đầu vào)

Giải pháp đánh gôn:

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

Hãy thử nó ở đây

SQL vượt trội (không có ý định chơi chữ) trong loại nhiệm vụ này: các bộ liên quan, đặt hàng, cắt bỏ các bản sao, v.v.

Tất cả những gì bạn cần là tạo và điền vào bảng các Diễn viên như thế này:

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')

Bây giờ nếu chúng ta sử dụng biến bảng làm đầu vào, chúng ta chỉ cần lấy giao điểm của cả hai bộ. Loại bỏ trùng lặp và đặt hàng trong SQL thực sự dễ dàng.

Ví dụ 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

Ví dụ 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

Phiên bản chơi gôn chỉ là thứ đầy đủ, ví dụ đầu vào 3

Ngoài ra, SQL này có thể hoạt động cho các phiên bản DBMS cũ hơn (thậm chí được viết lại thành ANSI SQL) và chạy mà không gặp vấn đề gì trong các máy tính cũ hơn hầu hết các ngôn ngữ.


Nó có hoạt động với bất kỳ số nào ở đầu dòng, hoặc chỉ một chữ số không?
MKII

1
@MKII Tôi đã sử dụng loại INT vì vậy nó không chấp nhận bất cứ điều gì trong phạm vi từ2,147,483,648 đến 2,147,483,647 cũng không chấp nhận số lượng hàng đó =)
jean

Bạn không cần một mục phụ. Bạn chỉ có thể sử dụng order by min(R) descvới lựa chọn bên trong và loại bỏ min(R)khỏi lựa chọn. Điều đó sẽ tiết kiệm 21 byte.
raznagul

Ngoài ra có một số không gian không cần thiết trong phiên bản golf.
raznagul

Sử dụng charthay vì varcharsẽ tiết kiệm thêm 6 byte.
raznagul

5

Perl, 242 179 217 byte

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]}<>;

Phiên bản định dạng Nicer, với các bình luận:

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)

Hầu hết các kích thước là danh sách trái phiếu; Tôi không thể tìm thấy một cách hay để nén regex đó mà không cho phép dương tính giả.


Chào mừng bạn đến với Câu đố lập trình và Code Golf. Câu trả lời xuất sắc, +1. Tôi sẽ đề nghị bạn thêm một lời giải thích, nhưng sau đó tôi thấy chỉnh sửa. Có lẽ bằng cách nào đó có thể nén danh sách diễn viên bằng cách nào đó ...
wizzwizz4

@ wizzwizz4 Tôi đã thử một vài điều để làm cho regex đó nhỏ hơn, nhưng việc giải mã dường như luôn tốn kém hơn bạn tiết kiệm --- nó quá thưa thớt trong những gì nó chấp nhận.
David Morris

Đáng buồn thay, nó cần phải làm việc với các số, không chỉ các chữ số. Tôi xin lỗi, nhưng tôi đã sử dụng thuật ngữ sai trong câu hỏi.
MKII

@MKII aww, chi phí cho tôi 38 byte :(
David Morris

Nếu có evalPerl và hệ thống nén tích hợp ...
wizzwizz4

4

Python 2, 250 byte:

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]

Bản giới thiệu:

>>> 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')


Tôi chỉ sử dụng khả năng hiểu từ điển để giữ nguyên các tên duy nhất, thay vì đặt hiểu.
Kasramvd

10
Tôi sẽ trả tiền để xem Emma Watson là James Bond.
DJClayworth

Nó có hoạt động với bất kỳ số nào ở đầu dòng, hoặc chỉ một chữ số không?
MKII

2

PowerShell v3 +, 227 219 byte

$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 byte đó chỉ là danh sách các diễn viên ...

Đưa đầu vào $args-splits trên dòng mới với `n. Đường ống mà sort, sẽ sắp xếp các mục tăng dần về số lượng, hiện tại vẫn ổn. Chúng tôi dẫn chúng vào một vòng lặp foreach |%{...}, mỗi lần lặp lại lấy mục, -splitnó trên khoảng trắng, sau đó -joinnửa sau trở lại cùng với một khoảng trắng (nghĩa là tước các số khỏi đầu). Những tên được sắp xếp (tăng dần) hiện được để lại trên đường ống. Chúng tôi dẫn những người đi qua một nơi với ?điều đó đảm bảo họ là -indanh sách diễn viên được phê duyệt. Cuối cùng, chúng tôi selectchỉ các -umục nique, mà đối với các mục trùng lặp sẽ chọn mục đầu tiên mà nó gặp (nghĩa là mục có trọng số thấp nhất) và loại bỏ phần còn lại. Chúng tôi lưu trữ các mảng kết quả của tên vào $a.

Vì vậy, bây giờ chúng tôi đã có một danh sách các diễn viên tăng dần được sắp xếp. Vì thử thách đòi hỏi phải giảm dần, chúng tôi thực hiện thao tác đảo ngược tại chỗ $abằng cách lập chỉ mục từ $a.countxuống 0.

Thí dụ

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

Chỉnh sửa - không cần sử dụng [mảng] :: Reverse () khi lập chỉ mục sẽ làm


Bạn có thể không chỉ sử dụng sort -Deschứ không phải là đảo ngược mảng? Cấp, điều này có thể bị phá vỡ trong các phiên bản sau của PowerShell, nhưng tôi không nghĩ đó có thể là vấn đề thực sự;)
VisualMelon

@VisualMelon Tôi đã xem xét điều đó, nhưng sau đó select -usẽ lấy và giữ thứ tự có giá trị cao nhất , thay vì thấp nhất, vì vậy, ví dụ của tôi, vị trí của Daniel Craig và Roger Moore sẽ hoán đổi. Tôi cố gắng khắc phục điều đó dẫn đến mã dài hơn so với đảo ngược mảng.
admBorkBork

à, vâng, điều đó có ý nghĩa, tôi đã không thể chạy nó và hoàn toàn bỏ lỡ điều đó - thật xấu hổ vì có quá nhiều sự lãng phí chỉ cho sự đảo ngược đó ...
VisualMelon

2

Con trăn 309 286 byte

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)

Nó có hoạt động với bất kỳ số nào ở đầu dòng, hoặc chỉ một chữ số không?
MKII

nó đã không, bây giờ nó vẫn vậy :)
mtp

Có vẻ như bạn có thể thoát khỏi một số không gian thừa ở đây, ví dụ sau printhoặc sau một )hoặc]
wnnmaw

1

JavaScript (ES6), 232 byte

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))

Giải trình

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.