Сортуйте ці рейтинги Джеймса Бонда


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

Вихід:

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

Оскільки це гольф коду, виграє найкоротший код (у байтах)!

Додаток

Список акторів, які зіграли роль Бонда:

  • Баррі Нельсон
  • Боб Сіммонс
  • Шон Конері
  • Роджер Мур
  • Девід Нівен
  • Джордж Лазенбі
  • Тімоті Далтон
  • Пірс Броснан
  • Даніель Крейг

3
Ласкаво просимо до PPCG та приємного виклику! Зауважте, що Шон Коннері з’являється двічі у вашому списку.
Денхем Кут

@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 # Відкиньте номер та приєднайте ім’я та прізвище
               c "BarryNelson BobSimmons ..." d # Розділити список акторів облігацій на пробіли ...
         } # зберігайте лише рядки зі списку акторів
   mtcd \ # видаліть номер із відфільтрованих рядків
_ {# Видаліть дублікати з результату відображення та поверніть результат


Маленький недолік, впорядкування - це неправильний шлях (він повинен йти від останнього до першого, тоді як ваш - перший до останнього).
MKII

@MKII Вгадайте, я перечитав цю частину ... Виправлено!
Денкер

12

Сітківка ,201 197 191

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

Спробуйте в Інтернеті!

6 байт збережено завдяки Мартіну!

Сорт, міхур сортуємо з регулярним виразом. Зауважте, що десять байтів витрачаються на здійснення десятичного до одинарного перетворення на початку, якщо однорідне введення в порядку, то це не потрібно. Крім того, якщо цифри не можуть бути в іменах людей, то можна зберегти ще пару байтів, перемістивши лінію, яка видаляє некондиційних акторів, до кінця та видаливши 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

Це етап сортування. У +режимі означає, що цей етап слід повторювати, поки заміна не зміниться при застосуванні (тобто ми досягнемо фіксованої точки). У регулярному вираженні знаходить межу слова, за якою слідує деяка кількість 1s, а потім весь інший рядок до нового рядка. Потім, якщо наступний рядок має більше 1s, ніж його, регулярний вираз буде відповідати, і ми поміняємо рядки.

Етап 4:

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

Цей етап +знову використовує режим, але також використовує sдля того, щоб .мета-символ також відповідав новим рядкам. При цьому видаляються дублікати рядків, шляхом узгодження точних дублікатів після 1s та захоплення матеріалу після першого дубліката, щоб замінити весь матч на нього. Це буде спрацьовувати без необхідності враховувати порядок розриву краватки, оскільки імена вже відсортовані відповідно, з більшими цифрами вище, тому ми завжди будемо зберігати менші значення.

5 етап:

1+ 

Тут дійсно просто, все в порядку, за винятком того, 1що перед нашими Облігаціями є купа 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 досконалий (не призначений для каламбура) у такому завданні: пов'язані набори, замовлення, вирізання дублікатів тощо.

Все, що вам потрібно, це створити та заповнити таку таблицю акторів, як ця:

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 типу так погано приймати що - або в діапазоні -2147483648 до 2147483647. також він погано визнати , що кількість рядків теж =)
джинсової

Вам не потрібен підбір. Ви можете просто використовувати order by min(R) descз внутрішнім вибором і видалити min(R)вибране. Це має заощадити 21 байт.
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)

Більшість розмірів - це список Облігацій; Я не можу знайти гарний спосіб стиснення цього регулярного виразу, не допускаючи помилкових позитивних результатів.


Ласкаво просимо до головоломки програмування та коду для гольфу Блискуча відповідь, +1. Я збирався запропонувати вам додати пояснення, але потім я побачив редагування. Можливо, можна якось стиснути список акторів ...
wizzwizz4

@ wizzwizz4 Я спробував декілька речей, щоб зробити цей регулярний вигляд меншим, але декодування завжди здається коштувати дорожче, ніж економити --- надто рідко в тому, що він приймає.
Девід Морріс

На жаль, йому потрібно працювати з числами, а не лише одноцифровими. Мені шкода, але я використав неправильний термін у питанні.
MKII

@MKII aww, що коштує мені 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')


Я просто використовував розуміння словника, щоб зберегти унікальні назви, а не задане розуміння.
Касрамвд

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, який буде сортувати записи за чисельним зростанням, що на сьогодні нормально. Ми передаємо їх у цикл передбачення |%{...}, кожну ітерацію беремо на запис, -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

Редагувати - не потрібно використовувати [масив] :: Реверс () при індексації


Чи можете ви не просто використовувати, sort -Desа не реверсувати масив? Зрозуміло, це може бути порушено в пізніших версіях PowerShell, але я не думаю, що це ймовірно чи справжнє питання;)
VisualMelon

@VisualMelon Я вважав це, але тоді select -uзахопив би і збереже найвище замовлене замовлення, а не найнижчий, тому для мого прикладу позиції Деніела Крейга та Роджера Мура змінилися б. Мої спроби виправити це призвели до більш тривалого коду, ніж обертання масиву.
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

Схоже, ви можете позбутися деяких додаткових просторів тут, наприклад після 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.