Сортировать эти рейтинги Джеймса Бонда

31

Введение

Мой дедушка является поклонником Джеймса Бонда, но он всегда не уверен, как оценивать своих любимых актеров. Таким образом, он всегда делает списки, что является большой работой. Он попросил меня создать программу, которая облегчит его жизнь, но у меня нет на это времени, мне нужно работать! Так что я буду рассчитывать на вас, ребята.

Вызов

Задача проста. Ввод будет состоять из списка в следующем формате:

<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 Шон Коннери

Выход:

Пирс Броснан, Шон Коннери

Поскольку это кодовый гольф, выигрывает самый короткий код (в байтах)!

аппендикс

Список актеров, сыгравших роль Бонда:

  • Барри Нельсон
  • Боб Симмонс
  • Шон Коннери
  • Роджер Мур
  • Дэвид Нивен
  • Джордж Лазенби
  • Тимоти Далтон
  • Пирс Броснан
  • Дэниел Крейг
MKII
источник
3
Добро пожаловать в PPCG, и хороший вызов! Обратите внимание, что Шон Коннери появляется дважды в вашем списке.
Denham Coote
@DenhamCoote Исправлено это и ошибка в выходных данных примера.
MKII
2
Можем ли мы предположить, что все возможные действующие лица будут идентифицированы двумя словами (имя и фамилия)?
Луис Мендо
17
Эмма Уотсон была великолепна, как Джеймс Бонд.
Алекс А.
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 \ # удалить номер из отфильтрованных строк
_ {# Удалить дубликаты из результата сопоставления и сторнировать результат

Denker
источник
Небольшой недостаток: порядок действий неправильный (предполагается, что он будет меняться от последнего к первому, а ваш - от первого до последнего).
MKII
@MKII Думаю, я перечитал эту часть ... Исправлено!
Денкер
12

Сетчатка ,201 197 191

\ D +
$ 0 $ * 1
G` ^ 1 + (Барри Нельсон | Боб Симмонс | Шон Коннери | Роджер Мур | Дэвид Нивен | Джордж Лазенби | Тимоти Далтон | Пирс Броснан | Дэниел Крейг) $
+ `\ Ъ ((1 +) \ D *) ¶ (\ 2. +)
$ 3¶ $ 1
+ S`1 + (\ D +) ¶ (. * \ 1)
$ 2
1+ 

Попробуйте онлайн!

6 байтов сэкономлено благодаря Мартину!

Whee, пузырьковая сортировка с регулярным выражением. Обратите внимание, что десять байтов тратятся на десятичное преобразование в унарное в начале, если унарный ввод в порядке, тогда это не нужно. Кроме того, если числа не могут быть в именах людей, тогда можно сохранить еще пару байтов, переместив строку, которая удаляет актеров, не являющихся связующими, в конец и удалив 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)$

Материал перед `этапом меняет используемый режим. Это включает режим grep, что означает, что каждая строка, не соответствующая регулярному выражению, отбрасывается. Якоря необходимы для предотвращения скольжения ближайших спичек.

Этап 3:

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

Это этап сортировки. Режим +in означает, что этот этап следует повторять до тех пор, пока замена не изменится при применении (т. Е. Мы достигнем фиксированной точки). Регулярное выражение находит границу слова, за которым следует некоторое число 1s, а затем вся остальная часть строки до новой строки. Затем, если в следующей строке больше 1s, чем это, регулярное выражение будет соответствовать, и мы поменяем строки.

Этап 4:

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

На этом этапе +снова используется режим, но также используется, sчтобы .метасимвол также соответствовал символам новой строки. Это удаляет дубликаты строк, сопоставляя точные дубликаты после 1s и захватывая материал после первого дубликата, чтобы заменить все совпадение на него. Это будет работать без необходимости учитывать порядок разрыва связи, потому что имена уже отсортированы соответствующим образом, с большими числами выше, поэтому мы всегда будем сохранять меньшие значения.

Этап 5:

1+ 

Здесь действительно все просто, все в порядке, за исключением того, что 1перед нашими облигациями у нас есть куча s, поэтому мы заменяем их и пространство после них ничем.

FryAmTheEggman
источник
... Блин, этот язык впечатляет меня все больше и больше с каждым днем. Отлично, Мартин!
Фонд Моника иск
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 может работать для более старых версий СУБД (даже переписать на ANSI SQL) и без проблем работать на старых компьютерах, чем большинство языков.

джинсовый
источник
Работает ли оно с каким-либо числом в начале строки или только с одной цифрой?
MKII
1
@MKII Я использовал тип INT, поэтому он может принимать все что угодно в диапазоне от –2 147 483 648 до 2 147 483 647, а также принимает это число строк тоже =)
Жан
Вам не нужен отбор. Вы можете просто использовать order by min(R) descс внутренним выбором и удалить min(R)из выбора. Это должно сэкономить 21 байт.
Разнагул
Также есть некоторые ненужные места в версии для гольфа.
Разнагул
Использование charвместо varcharсэкономит еще 6 байтов.
Разнагул
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
@ wizzwizz4 Я попытался сделать несколько вещей, чтобы сделать это регулярное выражение меньше, но кажется, что декодирование всегда стоит больше, чем вы экономите - оно слишком мало в том, что оно принимает.
Дэвид Моррис
К сожалению, он должен работать с числами, а не только однозначными. Извините, но я использовал неправильный термин в вопросе.
MKII
@MKII Ой, это стоит мне 38 байтов :(
Дэвид Моррис
Если есть 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
источник
Я просто использовал словарное понимание, чтобы сохранить уникальные имена, вместо того, чтобы установить понимание.
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утвержденным списком действующих лиц. Наконец, мы используем 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

Редактировать - не нужно использовать [массив] :: Reverse (), когда индексирование будет делать

AdmBorkBork
источник
Можете ли вы не просто использовать sort -Desвместо обращения массива? Конечно, это может быть сломано в более поздних версиях PowerShell, но я не думаю, что это вероятно или реальная проблема;)
VisualMelon
@VisualMelon Я обдумывал это, но тогда select -uбы он взял и сохранил самый высокий порядок, а не самый низкий, поэтому для моего примера позиции Дэниела Крейга и Роджера Мура поменялись местами. Мои попытки исправить это привели к увеличению длины кода, чем обращение массива.
AdmBorkBork
ах, да, это имеет смысл, я не смог запустить его и пропустил это полностью - обидно, что так много
тратится
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
Похоже, вы можете избавиться от некоторых лишних пробелов здесь, например, после printили после )или]
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>

user81655
источник