이 제임스 본드 등급 정렬


31

소개

제 할아버지는 제임스 본드의 팬이지만 자신이 좋아하는 배우의 순위를 매기는 방법을 항상 확신하지 못합니다. 따라서 그는 항상 목록을 작성하고 있으며 이는 많은 작업입니다. 그는 나에게 인생을 편하게 해줄 프로그램을 만들어달라고 요청했지만 그럴 시간이 없다. 나는 일해야한다! 그래서 나는 너희들을 의지 할 것이다.

도전

도전은 간단합니다. 입력은 다음 형식의 목록으로 구성됩니다.

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

당신의 임무는 줄의 시작 부분에서 번호 를 기준으로 정렬하는 것 입니다. 마지막에서 시작하여 첫 번째로 끝납니다. 모든 숫자를 제거해야합니다.

그러나 할아버지는 때때로 실수를합니다. 따라서 데이터의 유효성을 검사해야합니다. 목록에있는 이름 중 하나가 Bond를 연기 한 배우 중 하나를 나타내지 않으면 폐기해야합니다. 반복하는 경우 반복을 제거하고 이름이 가장 낮은 가중치를 유지해야합니다 (예 : 3).

줄 수에 제한이 없습니다.

출력은 배열, 쉼표로 구분 된 문자열, 공백으로 구분 된 값 또는 완전히 다른 것 등의 일종의 목록이어야합니다.

Pierce Brosnan, Sean Connery, David Niven

후행 줄 바꿈 또는 공백이 허용됩니다.

입력 및 출력 예

입력:

1 션 코너리

2 엠마 왓슨

5 티모시 달튼

4 로저 무어

3 다니엘 크레이그

산출:

Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery

입력:

2 디모데 달튼

4 조지 라 젠비

5 조지 라 젠비

밥 시몬스 3 명

산출:

조지 라 젠비, 밥 시몬스, 티모시 달튼

입력:

3 션 코너리

피어스 브로스넌

1 션 코너리

산출:

피어스 브로스넌, 숀 코너리

이것이 코드 골프이기 때문에 가장 짧은 코드 (바이트)가 이깁니다!

충수

본드의 역할을 한 배우 목록 :

  • 배리 넬슨
  • 밥 시몬스
  • 숀 코너리
  • 로저 무어
  • 데이비드 니븐
  • 조지 라 젠비
  • 티모시 달튼
  • 피어스 브로스넌
  • 다니엘 크레이그

3
PPCG에 오신 것을 환영합니다. Sean Connery가 목록에 두 번 나타납니다.
Denham Coote

@DenhamCoote 예제 출력에서 ​​오류가 수정되었습니다.
MKII

2
가능한 모든 행위자가 두 단어 (이름과 성)로 식별된다고 가정 할 수 있습니까?
Luis Mendo

17
엠마 왓슨은 제임스 본드로 훌륭했습니다.
Alex A.

3
흠 내 대답은 echo Sean Connery모두가 알고 있기 때문에 단 하나의 유대가 있다는 것입니다
user902383

답변:


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 # 숫자를 Dicard하고 이름과성에 합류
               c "BarryNelson BobSimmons ..."d # 본드 액터 목록을 공백으로 분할 ...
         } # 액터 목록에있는 줄만 유지
   mtcd \ # 필터링 된 줄에서 숫자를 제거
_ {# 매핑 결과에서 중복을 제거하고 결과를 뒤집습니다


작은 결함, 순서는 잘못된 길입니다 (마지막으로 처음으로 가고, 처음부터 마지막으로 가야합니다).
MKII

@MKII 내가 그 부분을 읽은 것 같아 ... 고정!
Denker

12

망막 ,201 197 191

\ d +
$ 0 $ * 1
G` ^ 1 + (배리 넬슨 | 밥 시몬스 | 세안 코너리 | 로저 무어 | 데이비드 니븐 | 조지 라 젠비 | 티모시 달튼 | 피어스 브로스넌 | 다니엘 크레이그) $
+`\ b ((1 +) \ D *) ¶ (\ 2. +)
$ 3¶ $ 1
+ s`1 + (\ D +) ¶ (. * \ 1)
2 달러
1+ 

온라인으로 사용해보십시오!

Martin 덕분에 6 바이트가 절약되었습니다!

휘, 정규식으로 버블 정렬. 처음에 10 바이트를 십진수에서 단항으로 변환하는 데 소비됩니다. 단항 입력이 정상이면 필요하지 않습니다. 또한 사람들의 이름으로 숫자를 입력 할 수없는 경우 비 본드 액터를 제거하는 행을 끝으로 이동하고 1+( \D버전으로 평가 되지 않은)을 제거하여 몇 바이트를 더 절약 할 수 있습니다 .

설명:

Retina 프로그램은 여러 단계로 구성되어 있으므로 각 단계를 개별적으로 설명하겠습니다.

스테이지 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

이것은 분류 단계입니다. +적용 할 때 교체가 변경되지 않습니다 때까지이 단계를 반복해야하는 모드 의미에서 (즉, 우리는 고정 된 지점에 도달). 정규 표현식은 단어 경계를 찾은 다음 몇 개의 1s와 나머지 줄을 개행까지 찾습니다 . 그런 다음 다음 줄에 1s 가 더 많으면 정규 표현식이 일치하고 줄을 바꿉니다.

4 단계 :

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

이 단계에서는 +모드를 다시 사용하지만 메타 문자가 개행과 일치 s하도록하는 데 사용 됩니다 .. 이렇게하면 1s 다음에 정확한 복제본을 일치 시키고 첫 번째 복제본 이후에 물건을 캡처하여 전체 일치 항목을 대체하여 복제 선을 제거합니다. 위의 숫자가 클수록 이름이 이미 적절히 정렬되어 있기 때문에 타이 브레이킹 순서를 고려할 필요없이 작동합니다. 따라서 항상 작은 값을 유지합니다.

5 단계 :

1+ 

우리가 1채권 앞에 많은 것을 가지고 있다는 것을 제외하고는 여기에서 매우 간단한 것입니다 . 그래서 우리는 그것들과 그 뒤의 공간을 아무것도로 대체합니다.


...이 언어는 날마다 점점 더 인상적입니다. 잘 했어, 마틴!
기금 모니카의 소송

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은 이러한 종류의 작업에서 우수합니다 (펀칭되지 않음).

다음과 같이 액터 테이블을 생성하고 채우면됩니다.

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

1
@MKII 나는 INT 타입을 사용 하여 –2,147,483,648 에서 2,147,483,647 의 범위에있는 어떤 것도 받아 들일 수 없었습니다. 또한 그 수의 행도 받아 들일 수 없습니다 =)
jean

하위 선택이 필요하지 않습니다. order by min(R) desc내부 선택과 함께 사용 하고 선택에서 제거 할 수 있습니다 min(R). 21 바이트를 절약해야합니다.
raznagul

또한 골프 버전에는 불필요한 공간이 있습니다.
raznagul

char대신에 varchar를 사용하면 6 바이트가 더 절약됩니다.
raznagul

5

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

대부분의 규모는 채권 목록입니다. 잘못된 긍정을 허용하지 않고 정규식을 압축하는 좋은 방법을 찾을 수 없습니다.


프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다. 훌륭한 답변, +1 설명을 추가하라고 제안했지만 편집 내용을 보았습니다. 어쩌면 배우 목록을 압축하는 것이 가능할 수도 있습니다.
wizzwizz4

@ wizzwizz4 정규식을 더 작게 만들기 위해 몇 가지를 시도했지만 디코딩 비용은 항상 절약하는 것보다 비용이 많이 드는 것 같습니다.
David Morris

안타깝게도 한 자리 숫자뿐만 아니라 숫자로 작업해야합니다. 미안하지만 질문에 잘못된 용어를 사용했습니다.
MKII

@MKII aww, 그 비용은 38 바이트입니다 :(
David Morris

거기에 있다면 eval펄, 그리고 내장 된 압축 시스템 ...
wizzwizz4

4

파이썬 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
엠마 왓슨을 제임스 본드로 보겠다
DJClayworth

줄의 시작 부분에있는 숫자 또는 한 자릿수 만 사용할 수 있습니까?
MKII

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. 마지막으로, nique 항목 select-u복제합니다. 중복 항목의 경우 첫 번째 항목 (즉 가장 낮은 가중치 항목)을 선택하고 나머지 항목은 삭제합니다. 결과 이름 배열을에 저장합니다 $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

그것은 :)
mtp

예를 들어 printa )또는]
wnnmaw

1

자바 스크립트 (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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.