これらのジェームズボンドの評価を並べ替える


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へようこそ、素晴らしいチャレンジです!リストにSean Conneryが2回表示されることに注意してください。
デンハムクート

@DenhamCooteこれと、出力例の誤りを修正しました。
MKII

2
考えられるすべての俳優が2つの単語(名と姓)で識別されると仮定できますか?
ルイスメンドー

17
エマ・ワトソンはジェームズ・ボンドとして素晴らしかった。
アレックス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#番号を破棄し、姓と名を結合します
               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+ 

オンラインでお試しください!

Martinのおかげで6バイト節約されました!

Whee、正規表現を使用したバブルソート。10バイトが最初に10進数から単項への変換に費やされることに注意してください。単項入力が問題なければ、それは必要ありません。また、人の名前に数字を含めることができない場合は、Bond以外のアクターを削除する行を最後に移動して1+\Dバージョンで未テスト)を削除することで、さらに2バイトを節約できます。

説明:

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が続き、改行までの残りの行すべてを見つけます。次に、次の行にそれより1も多くのsがある場合、正規表現は一致し、行を交換します。

ステージ4:

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

このステージでは+モードを再び使用しますがs.メタ文字も改行に一致させるために使用します。これは、1sの後の正確な複製を照合し、最初の複製の後のものをキャプチャして一致全体を置き換えることにより、重複行を削除します。これは、タイブレークの順序を考慮する必要なく機能します。名前が既に適切にソートされており、上の数字が大きいため、常に小さい値を保持するためです。

ステージ5:

1+ 

ここでは本当にシンプルなもので、すべてが整然としていますが、1Bondsの前に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は古いDBMSバージョン(ANSI SQLに書き換えることも可能)で動作し、ほとんどの言語よりも古いコンピューターで問題なく実行できます。


行頭の任意の数字、または1桁のみで機能しますか?
MKII

1
@MKII私が使用INTのそれは病気の範囲で何かを受け入れるように、タイプを-21474836482,147,483,647も、それは病気すぎ行の数を受け入れる=)
ジャン

副選択は必要ありません。order by min(R) desc内側の選択で使用し、選択から削除することができmin(R)ます。これで21バイト節約できます。
raznagul

また、ゴルフバージョンにはいくつかの不要なスペースがあります。
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その正規表現を小さくするためにいくつかのことを試みましたが、デコードは常にあなたが節約するよりも費用がかかるようです---それが受け入れるものがあまりにもまばらです。
デビッドモリス

悲しいことに、1桁だけでなく、数字を扱う必要があります。申し訳ありませんが、質問で間違った用語を使用しました。
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')


固有の名前を保持するために、セット内包表記ではなく辞書内包表記を使用しました。
-Kasramvd

10
エマ・ワトソンをジェームズ・ボンドとして見たいと思います。
DJClayworth

行頭の任意の数字、または1桁のみで機能しますか?
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.count0

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を取得して保持するため、私の例ではダニエル・クレイグとロジャー・ムーアの位置が入れ替わります。これを修正しようとすると、配列の反転よりも長いコードになりました。
AdmBorkBork

ああ、それは理にかなっています、私はそれを実行することができず、それを完全に見逃しました-その反転のためだけに多くの無駄があるのは残念です
...-VisualMelon

2

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

行頭の任意の数字、または1桁のみで機能しますか?
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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.