소개
제 할아버지는 제임스 본드의 팬이지만 자신이 좋아하는 배우의 순위를 매기는 방법을 항상 확신하지 못합니다. 따라서 그는 항상 목록을 작성하고 있으며 이는 많은 작업입니다. 그는 나에게 인생을 편하게 해줄 프로그램을 만들어달라고 요청했지만 그럴 시간이 없다. 나는 일해야한다! 그래서 나는 너희들을 의지 할 것이다.
도전
도전은 간단합니다. 입력은 다음 형식의 목록으로 구성됩니다.
<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 션 코너리
산출:
피어스 브로스넌, 숀 코너리
이것이 코드 골프이기 때문에 가장 짧은 코드 (바이트)가 이깁니다!
충수
본드의 역할을 한 배우 목록 :
- 배리 넬슨
- 밥 시몬스
- 숀 코너리
- 로저 무어
- 데이비드 니븐
- 조지 라 젠비
- 티모시 달튼
- 피어스 브로스넌
- 다니엘 크레이그
답변
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 \ # 필터링 된 줄에서 숫자를 제거 _ {# 매핑 결과에서 중복을 제거하고 결과를 뒤집습니다
답변
망막 ,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
이것은 분류 단계입니다. +
적용 할 때 교체가 변경되지 않습니다 때까지이 단계를 반복해야하는 모드 의미에서 (즉, 우리는 고정 된 지점에 도달). 정규 표현식은 단어 경계를 찾은 다음 몇 개의 1
s와 나머지 줄을 개행까지 찾습니다 . 그런 다음 다음 줄에 1
s 가 더 많으면 정규 표현식이 일치하고 줄을 바꿉니다.
4 단계 :
+s`1+(\D+)¶(.*\1)
$2
이 단계에서는 +
모드를 다시 사용하지만 메타 문자가 개행과 일치 s
하도록하는 데 사용 됩니다 .
. 이렇게하면 1
s 다음에 정확한 복제본을 일치 시키고 첫 번째 복제본 이후에 물건을 캡처하여 전체 일치 항목을 대체하여 복제 선을 제거합니다. 위의 숫자가 클수록 이름이 이미 적절히 정렬되어 있기 때문에 타이 브레이킹 순서를 고려할 필요없이 작동합니다. 따라서 항상 작은 값을 유지합니다.
5 단계 :
1+
우리가 1
채권 앞에 많은 것을 가지고 있다는 것을 제외하고는 여기에서 매우 간단한 것입니다 . 그래서 우리는 그것들과 그 뒤의 공간을 아무것도로 대체합니다.
답변
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로 다시 쓰기 가능)에서도 작동하며 대부분의 언어보다 오래된 컴퓨터에서 문제없이 실행될 수 있습니다.
답변
펄, 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)
대부분의 규모는 채권 목록입니다. 잘못된 긍정을 허용하지 않고 정규식을 압축하는 좋은 방법을 찾을 수 없습니다.
답변
파이썬 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')
답변
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 ()를 사용할 필요가 없습니다.
답변
파이썬 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)