Bu James Bond derecelendirmesini sıralayın


31

Giriş

Büyükbabam James Bond'un hayranı, ama her zaman en sevdiği aktörlerin nasıl sıralanacağından emin değil. Bu nedenle, her zaman çok fazla iş olan listeleri yapıyor. Benden hayatını kolaylaştıracak bir program yapmamı istedi, ama bunun için zamanım yok, çalışmak zorundayım! Bu yüzden size güveneceğim millet.

Meydan okuma

Zor olan basittir. Giriş, aşağıdaki biçimde bir listeden oluşacaktır:

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

Göreviniz , satırın başındaki sayıya , en baştan başlayıp birinciyle bitene göre sıralamak . Tüm numaralar kaldırılmalıdır.

Ancak, büyükbabam bazen hata yapar. Bu nedenle, verileri doğrulamanız gerekir. Listedeki isimlerden biri Bond oynayan oyunculardan birine atıfta bulunmuyorsa, onu atmanız gerekir. Tekrarlama durumunda, tekrarlar kaldırılmalı ve isim ilişkilendirildiği en düşük ağırlığı korumalıdır (örnek # 3).

Kaç tane satır olabileceğinin bir sınırı yoktur.

Çıktının yalnızca bir dizi, virgülle ayrılmış bir dize, yalnızca boşluklarla ayrılmış değerler veya tamamen başka bir şey olması gibi bir sıralama listesi olması gerekir.

Pierce Brosnan, Sean Connery, David Niven

Takip eden bir yeni satır veya boşluğa izin verilir.

Örnek Giriş ve Çıkış

Giriş:

1 Sean Connery

2 Emma Watson

5 Timothy Dalton

4 Roger Moore

3 Daniel Craig

Çıktı:

Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery

Giriş:

2 Timothy Dalton

4 George Lazenby

5 George Lazenby

3 Bob Simmons

Çıktı:

George Lazenby, Bob Simmons, Timothy Dalton

Giriş:

3 Sean Connery

2 Pierce Brosnan

1 Sean Connery

Çıktı:

Pierce Brosnan, Sean Connery

Bu bir kod golfü olduğundan, en kısa kod (bayt cinsinden) kazanır!

apandis

Bond rolünü oynayan aktörlerin listesi:

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

3
PPCG'ye hoş geldiniz ve güzel bir meydan okuma! Sean Connery'nin listenizde iki kez göründüğünü unutmayın.
Denham Coote

@DenhamCoote Bu ve örnek çıktıdaki hata düzeltildi.
MKII

2
Tüm olası aktörlerin iki kelimeyle (ad ve soyad) tanımlanacağını varsayabilir miyiz?
Luis Mendo

17
Emma Watson, James Bond kadar harikaydı.
Alex A.

3
hmm benim cevabım echo Sean Conneryçünkü herkes biliyor, sadece bir bağ var
user902383

Yanıtlar:


2

Pyth, 136 132 bayt

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

Burada dene!

açıklama

_ {mtcd \ f} stcTdc "BarryNelson BobSimmons ..." dS.z # .z = tüm girdi satırlarının listesi
                                             Sz # Artan girişi sırala
        f # filtre sıralı satırları T ile geçerli satır
            cTd # Boşluklara bir çizgi ayır
          st # Numarayı işaretleyin ve adınızı ve soyadınızı girin
               c "BarryNelson BobSimmons ..." d # Alanlardaki tahvil oyuncu listesini ...
         } # sadece aktör listesindeki satırları tut
   mtcd \ # sayıyı filtre satırlarından kaldır
_ {# Eşleme sonucundan kopyaları kaldırın ve sonucu ters çevirin


Küçük kusur, sıralamanın tersine bir yoldur (sizden ilke giderken sondan ilke geçmesi gerekirdi).
MKII

@MKII Sanırım bu kısmı yenmiştim ... Düzeltildi!
Denker

12

retina ,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+ 

Çevrimiçi deneyin!

Martin sayesinde 6 bayt kurtarıldı!

Whee, regex ile kabarcık sıralama. Unary girişi tamamsa o zaman gerekli değildir, on bayt başlangıçta unary dönüşüm için ondalık harcayarak unutmayın. Ayrıca, sayılar insanların adlarında olamazsa, Bond olmayan aktörleri sonlandıran ve kaldırarak 1+( \Dsürümle denenmemiş ) satırı kaldırarak birkaç bayt daha kurtarılabilir .

Açıklama:

Bir Retina programı birkaç aşamadan oluşur, bu yüzden her aşamayı ayrı ayrı açıklayacağım.

1. Aşama:

\d+
$0$*1

Girişteki sayıları unary ile değiştirir. Bu, Retina'nın özel değiştirme belirtecini kullanır: $*karakter, önceki belirtecin temel 10 değerine eşit sayıda kez sonra tekrar eder.

2. aşama:

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

`Bir aşamada önce gelenler kullanılan modu değiştirir. Bu, grep modunu açar, bu, regex ile eşleşmeyen her satırın atıldığı anlamına gelir. Ankrajlar, yakın kibritlerin kaymasını önlemek için gereklidir.

Sahne 3:

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

Bu sıralama aşamasıdır. Bu +modda, değiştirme işlemi uygulandığında değişiklik yapmayıncaya kadar (örneğin sabit bir noktaya ulaşırız) bu aşamanın tekrarlanması gerektiğini belirtir. Düzenli ifade bir sınır kelimesi bulur, ardından bir miktar 1s ve ardından satırın sonuna kadar yeni satırın başına gelir. Sonra, bir sonraki satırın kendisinden daha 1fazla olması durumunda, regex eşleşecek ve satırları değiştireceğiz.

4. Aşama:

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

Bu aşama, +modu tekrar kullanır , ancak aynı zamanda meta-karakterin yeni satırlarla eşleşmesini ssağlamak için de kullanır .. Bu, 1s'den sonra tam olarak yinelenenleri eşleştirerek ve tüm eşleşmeyi onunla değiştirmek için ilk yinelemeden sonra gelenleri yakalayarak yinelenen satırları kaldırır . Bu, bağlantı kopma sırasını göz önünde bulundurmaya gerek kalmadan çalışacaktır çünkü isimler zaten yukarıda belirtilen daha büyük sayılarla uygun şekilde sıralanmıştır, bu nedenle daima daha küçük değerleri koruruz.

Aşama 5:

1+ 

Gerçekten basit olanı burada, her şey yolunda, çünkü 1tahvillerimizin önünde bir demet var , bu yüzden onları ve ardındaki boşluğu hiçbir şey olmadan değiştiririz.


... Kahretsin, bu dil beni her geçen gün daha fazla etkiliyor. Aferin Martin!
Fon Monica'nın Davası

6

TSQL 426 bayt (veri + giriş dahil)

Golf çözümü:

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

Burada dene

SQL, bu tür görevlerde üstünlük sağlar (punto amaçlı değildir): kümelerle ilgili, sipariş verme, kopyaları kesme vb.

İhtiyacınız olan tek şey şöyle bir Aktör tablosu oluşturmak ve doldurmak:

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

Şimdi girdi olarak bir tablo değişkeni kullanırsak, sadece her iki kümenin kesişimini almamız gerekir. Yinelenenleri kaldırmak ve SQL'de sipariş vermek gerçekten kolaydır.

Örnek 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

Örnek 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

Golf edilmiş versiyon, örneğin giriş 3

Artı olarak, bu SQL eski DBMS sürümleri için çalışabilir (hatta ANSI SQL'e yeniden yazılabilir) ve eski bilgisayarlarda çoğu dilde sorun olmadan çalışabilir.


Satırın başındaki herhangi bir numarayla mı çalışıyor yoksa yalnızca tek rakamlarla mı çalışıyor?
MKII

1
@MKII kullandığım INT o hasta aralığında şey kabul yüzden türünü -2147483648 için 2,147,483,647 ayrıca hasta çok bu satır sayısını kabul =)
jean

Bir alt seçime ihtiyacınız yok. Sadece order by min(R) desciç seçimde kullanabilirsiniz ve seçimden kaldırabilirsiniz min(R). Bu 21 bayt kurtarmalı.
raznagul

Ayrıca golf versiyonunda gereksiz yere yer var.
raznagul

charBunun yerine kullanıldığında varchar6 bayt daha tasarruf edilir.
raznagul

5

Perl, 242 179 217 bayt

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

Güzel biçimlendirilmiş versiyonu, yorumlarla:

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)

Boyutun çoğu Tahvillerin Listesi; Sahte pozitiflere izin vermeden bu regex'i sıkıştırmanın iyi bir yolunu bulamıyorum.


Programming Puzzles ve Code Golf'a hoş geldiniz. Mükemmel cevap, +1. Bir açıklama eklemeni önerecektim, ama sonra düzenlemeyi gördüm. Belki de oyuncuların listesini bir şekilde sıkıştırmak mümkündür ...
wizzwizz4

@ wizzwizz4 Bu regex'i küçültmek için birkaç şey denedim, fakat kod çözme işlemi her zaman tasarruf ettiğinizden daha pahalıya mal oluyormuş gibi görünüyor - kabul ettiği şeylerde çok seyrek.
David Morris,

Ne yazık ki, sadece tek rakamlarla değil sayılarla da çalışması gerekiyor. Üzgünüm, ama soruda yanlış terimi kullandım.
MKII

@MKII aww, bu bana 38 bayta mal oldu :(
David Morris

Orada bir buysa evalPerl ve yerleşik bir sıkıştırma sistemine ...
wizzwizz4

4

Python 2,250 bayt:

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]

Demo:

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


Belirlenmiş anlama yerine, benzersiz isimleri korumak için sadece sözlük anlamayı kullandım.
Kasramvd

10
Emma Watson'ı James Bond olarak görmek için para öderdim.
DJClayworth

Satırın başındaki herhangi bir numarayla mı çalışıyor, yoksa sadece tek basamaklı mı?
MKII

2

PowerShell v3 +, 227 219 bayt

$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]

Bunun 121 baytı sadece aktörlerin listesi ...

Girdi alır $argsve -splitile yeni hatlarda `n. Bunu sort, şu an için tamam olan girişleri sayısal olarak artan şekilde sıralayacak şekilde düzenleyin. Bunları foreach döngüsüne yönlendiriyoruz |%{...}, her bir yineleme girişi -splitboşluklara alıyor, sonra -joinikinci yarı bir boşluk ile birlikte geri dönüyor (sayıları başlangıçtan sıyrılıyor). Bu (artan) sıralanan adlar şimdi boru hattında bırakılır. Bunları, nerede ?olduklarını -inonaylayan bir aktör listesi olmasını sağlayacak şekilde düzenliyoruz. Son olarak, biz selectsadece -ukopyalar için karşılaştığı ilkini seçecek olan (yani en düşük ağırlıklı olanı) nique girişleri ve diğerlerini atıyoruz. Elde edilen ad dizisini içine kaydederiz $a.

Şimdi sıralı yükselen oyuncu listesine sahibiz. $aMücadelenin $a.countinmeyi gerektirmesi nedeniyle , aşağıdan indeksleyerek yerinde bir tersine çevirme işlemi yapıyoruz 0.

Örnek

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

Düzenleme - İndeksleme yaparken [array] :: Reverse () kullanmanıza gerek yoktur


sort -DesDizi tersini kullanmak yerine sadece kullanamaz mısınız? Verilmiş, bu PowerShell'in sonraki sürümlerinde kırılmış olabilir, ancak bunun muhtemel veya gerçek bir sorun olduğunu sanmıyorum;)
VisualMelon

@VisualMelon Bunu düşünmüştüm ama sonra select -u düşük değer yerine en yüksek değerli siparişi alıp tutmaya devam edecektim , bu yüzden benim örneğim için Daniel Craig ve Roger Moore'un pozisyonları değişecekti. Düzeltme denemelerim, dizinin tersine çevrilmesinden daha uzun kodla sonuçlandı.
AdmBorkBork

ah, evet, bu mantıklı, onu çalıştıramadım ve bunu tamamen özledim - bu tersine çevirmek için çok fazla atık olması çok yazık ...
VisualMelon

2

piton 309 286 bayt

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)

Satırın başındaki herhangi bir numarayla mı çalışıyor, yoksa sadece tek basamaklı mı?
MKII

yapmadı, şimdi oldu ama :)
mtp

Burada, örneğin printbir )veya]
wnnmaw'dan

1

JavaScript (ES6), 232 bayt

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

açıklama

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.