इन जेम्स बॉन्ड रेटिंग को क्रमबद्ध करें


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

पायथ, 136 132 बाइट्स

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

यहाँ कोशिश करो!

व्याख्या

_ {mtcd \ f} stcTdc "BarryNelson BobSimmons ..." dS.z # .z = सभी इनपुट लाइनों की सूची।
                                             एसईजी # सॉर्टिंग इनपुट आरोही
        f # फ़िल्टर को वर्तमान रेखा होने के साथ टी की तरह छांटा गया
            cTd # रिक्त स्थान पर एक लाइन विभाजित करें
          सेंट # नंबर त्यागें और पहले और आखिरी नाम से जुड़ें
               c "बैरी नेल्सन बॉबसिमोंस ..." d # स्प्लिट्स ऑन द बॉन्ड एक्टर लिस्ट इन स्पेस ...
         } # केवल उन लाइनों को रखें जो अभिनेता की सूची में हैं
   mtcd \ _ फ़िल्टर की गई पंक्तियों से संख्या हटा दें
_ {# मैपिंग परिणाम से डुप्लिकेट निकालें और परिणाम को उल्टा करें


छोटे दोष, ऑर्डर करना गलत तरीका है (यह पिछले से पहली बार जाना है, जबकि आपका पहला है)।
एमकेआईआई

@MKII मुझे लगता है कि मैं उस हिस्से को फैला दिया ... तय कर लिया!
डेन्कर

12

रेटिना ,201 197 191

\ D +
$ 0 $ * 1
G` ^ 1 + (बैरी नेल्सन | बॉब सीमन्स | सीन कॉनरी | रोजर मूर | डेविड निवेन | जॉर्ज लेज़ेनबी | टिमोथी डाल्टन | पियर्स ब्रॉसनन | डैनियल क्रेग) $
+ `\ B ((1 +) \ डी *) ¶ (\ 2 +)
$ 3¶ $ 1
+ S`1 + (\ डी +) ¶ (। * \ 1)
$ 2
1 + 

इसे ऑनलाइन आज़माएं!

6 बाइट्स ने मार्टिन को दिया धन्यवाद!

मट्ठा, बुलबुला रेगेक्स के साथ। ध्यान दें कि दस बाइट्स शुरुआत में एकतरफा रूपांतरण के लिए दशमलव कर रहे हैं, अगर एकरी इनपुट ठीक है तो इसकी आवश्यकता नहीं है। इसके अलावा, यदि संख्या लोगों के नाम में नहीं हो सकती है, तो कुछ और बाइट्स को उस रेखा को स्थानांतरित करके बचाया जा सकता है जो गैर-बॉन्ड अभिनेताओं को अंत तक हटा देता है और 1+( \Dसंस्करण के साथ अनटाइटेड ) को हटा देता है ।

स्पष्टीकरण:

एक रेटिना कार्यक्रम कई चरणों से बना है, इसलिए मैं प्रत्येक चरण को अलग से समझाऊंगा।

चरण 1:

\d+
$0$*1

इनपुट में संख्याओं को एकात्मकता के साथ बदल देता है। यह रेटिना के विशेष प्रतिस्थापन टोकन का उपयोग करता है: $*जो पूर्ववर्ती टोकन के आधार 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

यह छँटाई अवस्था है। +मोड का प्रतीक जब तक प्रतिस्थापन जब लागू किया कोई परिवर्तन नहीं करता है इस स्तर दोहराया जाना चाहिए कि में (यानी हम एक निश्चित बिंदु तक पहुँचने)। रेगेक्स एक शब्द सीमा पाता है, उसके बाद कुछ संख्याएँ होती हैं 1और फिर शेष सभी रेखाएँ नई रेखा तक जाती हैं। फिर, यदि अगली पंक्ति में इससे अधिक 1s है, तो रेगेक्स मेल खाएगा और हम लाइनों को स्वैप करते हैं।

स्टेज 4:

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

यह चरण +फिर से मोड का उपयोग करता है , लेकिन मेटा-कैरेक्टर sबनाने के लिए भी उपयोग करता है जो .नई सूचियों से मेल खाता है। यह डुप्लिकेट लाइनों को हटाता है, 1एस के बाद सटीक डुप्लिकेट के लिए मिलान करके और इसके साथ पूरे मैच को बदलने के लिए पहले डुप्लिकेट के बाद सामान को कैप्चर करता है। यह टाई ब्रेकिंग के क्रम पर विचार करने की आवश्यकता के बिना काम करेगा, क्योंकि नाम पहले से ही उचित रूप से क्रमबद्ध हैं, ऊपर बड़ी संख्याओं के साथ, इसलिए हम हमेशा छोटे मान रखेंगे।

चरण 5:

1 + 

यहां वास्तव में सरल है, सब कुछ क्रम में है, सिवाय इसके 1कि हमारे बांड के सामने एस का एक गुच्छा है , इसलिए हम उन्हें और उनके बाद की जगह को कुछ भी नहीं के साथ बदल देते हैं।


... धिक्कार है, यह भाषा मुझे हर दिन अधिक से अधिक प्रभावित करती है। अच्छा हुआ, मार्टिन!
निधि मोनिका का मुकदमा

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 मैं इस्तेमाल किया INT तो यह बीमार रेंज में कुछ भी स्वीकार प्रकार -+२१४७४८३६४८ को 2,147,483,647 भी यह बीमार भी पंक्तियों की संख्या को स्वीकार =)
Jean

आपको एक सबसिलेक्ट की आवश्यकता नहीं है। आप केवल order by min(R) descआंतरिक चयन के साथ उपयोग कर सकते हैं और चयन min(R)से हटा सकते हैं। कि 21 बाइट्स बचाना चाहिए।
raznagul

इसके अलावा गोल्फ संस्करण में कुछ अनावश्यक स्थान हैं।
raznagul

के charबजाय का उपयोग कर varcharएक और 6 बाइट बचा लेगा।
राजनागुल

5

पर्ल, 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 aww, कि मेरी लागत 38 बाइट्स है :(
डेविड मॉरिस

अगर वहाँ एक evalपर्ल में है, और एक अंतर्निहित संपीड़न प्रणाली ...
wizzwizz4

4

पायथन 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
मैं जेम्स बॉन्ड के रूप में एम्मा वाटसन को देखना चाहता हूं।
डीजेकेवर्थ

क्या यह लाइन की शुरुआत में किसी भी संख्या के साथ काम करता है, या केवल एक अंक?
एमकेआईआई

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इसके साथ newlines पर है `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 मैंने उस पर विचार किया था, लेकिन तब सबसे कम के बजाय उच्चतम- प्राप्त ऑर्डर select -uको हथियाना और बनाए रखना होगा , इसलिए मेरे उदाहरण के लिए डैनियल क्रेग और रोजर मूर की स्थिति में अदला-बदली होगी। ठीक करने का मेरा प्रयास सरणी उलटने की तुलना में लंबे कोड का परिणाम है।
AdmBorkBork 14

आह, हाँ, यह समझ में आता है, मैं इसे चलाने में सक्षम नहीं था और पूरी तरह से याद किया - यह शर्म की बात है कि सिर्फ उस उलटफेर के लिए बहुत बेकार है ...
विजुअलमेल

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)

क्या यह लाइन की शुरुआत में किसी भी संख्या के साथ काम करता है, या केवल एक अंक?
एमकेआईआई

यह नहीं था, यह अब करता है :)
mtp

आप की तरह लग रहा कुछ अतिरिक्त रिक्त स्थान की के बाद, यहाँ में छुटकारा पा सकते हैं, उदाहरण के लिए printया के बाद एक )या]
wnnmaw

1

जावास्क्रिप्ट (ईएस 6), 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.