यह किसने कहा? 2016 का राष्ट्रपति चुनाव


16

इस चुनौती में, आपका कार्य एक कार्यक्रम लिखना है 300 से कम वर्णों वाला जो एक छोटे पैराग्राफ या कुछ वाक्य हैं जो एक उम्मीदवार ने कहा है और आउटपुट जिसने कहा है।

इनपुट : किसी फंक्शन के पैरामीटर के रूप में लिया जा सकता है, किसी प्रोग्राम के लिए इनपुट आदि। यह एक छोटा पैराग्राफ होगा, जिसे ठीक से पंक्चर किया जाएगा।

आउटपुट : उम्मीदवार जो आपको लगता है कि यह है। यह एक हो सकता है

Ben Carson (1)
Ted Cruz (2)
John Kasich (3)
Marco Rubio (4)
Donald Trump (5)
Hillary Clinton (6)
Bernie Sanders (7)

मैंने उन लोगों के नाम छोड़ दिए हैं जो 1 मार्च तक बाहर हो गए हैं। आप स्वयं नाम का उत्पादन कर सकते हैं, या अधिक सुविधाजनक रूप से, संख्या जो नाम से मेल खाती है।

स्कोरिंग: आपका स्कोर आपके द्वारा प्राप्त किए गए परीक्षण मामलों का प्रतिशत है। उच्चतम स्कोर जीतता है। Ties (या परफेक्ट स्कोर) कोड लंबाई के अनुसार एक कोड गोल्फ में टूट जाता है।

परीक्षण मामलों से लिया जा सकता है:

http://www.presidency.ucsb.edu/debates.php

प्रत्येक बहस पर क्लिक करें, डेमोक्रेट और रिपब्लिकन दोनों जो अब तक (1 मार्च से पहले) हुए हैं। हर पैराग्राफ एक टेस्ट केस है, जब तक कि "पैराग्राफ" 20 वर्णों से कम लंबा न हो।

यहाँ वह कोड है जो एक विशेष पृष्ठ से परीक्षण मामलों को बाहर निकालता है:

var t = $(".tools").parentNode.querySelectorAll("p");
var categ = {}, cur = 0;
for (var i = 0; i < t.length; ++i) {
  var p = t[i], str = p.innerText;
  if (p.querySelector("b")) {
    cur = p.querySelector("b").innerText.replace(':', '');
    str = str.replace(/^.*?:\s/, '');
  }
  str = str.replace(/\[applause\]/g, '')
  if (str.length < 20) continue;
  if (categ[cur] == null) categ[cur] = [];
  categ[cur].push(str);
}

फिर आप उन categ.SANDERSसभी पैराग्राफ की सूची प्राप्त कर सकते हैं जो सीनेटर सैंडर्स ने कहा है।

तुम कुछ भी है कि ऊपर सूचीबद्ध उम्मीदवारों द्वारा नहीं कहा त्यागने कर सकते हैं (उदाहरण के लिए categ.BUSHयाcateg.CHRISTIE )।

यहां सभी परीक्षण मामलों की फ़ाइल है: https://drive.google.com/file/d/0BxMn8--P71I-bDZBS2VZMDDMQ28/view?usp=sharing

फ़ाइल उम्मीदवार द्वारा आयोजित की जाती है

CANDIDATE CANDIDATE_LAST_NAME
(empty line)
Series of statements. Each paragraph is separated by (NEW PARAGRAPH)-
(empty line)
CANDIDATE NEXT_CANDIDATE_LAST_NAME
(empty line)
etc.

एक उदाहरण आंशिक सबमिशन होगा:

if (/ win | wall | great | beautiful/.test(p)) return 5;
if (/ percent | top one | rigged /.test(p)) return 7;
// etc. for all candidates

या

var words = p.split(' ');
// majority of words have less than 5 characters
if (words.length - words.filter(a => a.length < 5).length < 4) evidence[5]++;
// at the end
return /* index with the most evidence */ 

यहाँ एक जगह है जहाँ आप जावास्क्रिप्ट समाधान का परीक्षण कर सकते हैं: https://jsfiddle.net/prankol57/abfuhxxh/

कोड pवर्गीकृत करने के लिए वाक्यांश का प्रतिनिधित्व करने के लिए पैरामीटर का उपयोग करता है । उदाहरण कोड जो लगभग 20% स्कोर करता है (अनुमान है कि लगभग 11% मिलेगा):

if (/ rigged | top | percent | Wall Street /.test(p)) return 'Sanders';
return 'Trump';

वास्तव में मैं क्या पूछ रहा हूँ: 300 से कम वर्णों में एक प्रोग्राम / फ़ंक्शन लिखें जो एक वाक्यांश के रूप में इनपुट करता है जो एक उम्मीदवार ने कहा है और आउटपुट के रूप में देता है जो उम्मीदवार ने कहा था। आपका स्कोर आपके द्वारा प्राप्त किए गए परीक्षण मामलों का प्रतिशत है। उच्चतम स्कोर जीतता है।

हां, मुझे पता है कि बहुत सारी लाइनें हैं [laughter]या [cheering]उनमें हैं। इन्हें हटाया नहीं जाएगा। सबसे कम, वे अतिरिक्त जानकारी हैं जिन्हें आप अनदेखा कर सकते हैं; सर्वोत्तम रूप से, वे अतिरिक्त जानकारी हैं जिनका आप उपयोग कर सकते हैं (जैसे मैंने इसे बनाया है, लेकिन शायद लोग हँसी इस बात का सबूत हैं कि मार्को रुबियो बोल रहा है)। परीक्षण के मामले वैसे हैं जैसे वे पाठ फ़ाइल में दिखाई देते हैं।


1
मेरे पास एक सुझाव है। कैसे के बारे में आप इसे कोड-गोल्फ बनाते हैं, लेकिन आपको सभी उद्धरण सही पाने होंगे? इसके अलावा, आप उद्धरणों को बहुत छोटा बनाना चाह सकते हैं, क्योंकि यह इस तरह से हल करने के लिए थोड़ा हास्यास्पद है।
3

2
@ सभी उद्धरण सही प्राप्त करना हास्यास्पद होगा (मुझे लगता है) उद्धरणों की सरासर संख्या को देखते हुए।
सोक्तपिंक

1
चतुर चुनौती विचार, हालांकि कुछ परिष्कृत करने की आवश्यकता हो सकती है। क्या आपने कुछ प्रतिक्रिया के लिए सैंडबॉक्स में पोस्टिंग पर विचार किया है?
अश्विन गुप्ता

1
जीतने की कसौटी क्या है? (और आप ऐसा क्यों सोचते हैं कि किसी को भी परफेक्ट स्कोर नहीं मिलेगा?)
पीटर टेलर

2
आपके द्वारा प्रदान किया गया स्रोत डेटा थोड़ा गड़बड़ है (स्वचालित रूप से पार्स करना मुश्किल है), जो मुझे लगता है कि चुनौती की भावना को कुछ दूर ले जाता है। मैंने एक साफ-सुथरा संस्करण बनाया है जो प्रति पंक्ति एक पंक्ति का उपयोग करता है, एक रिक्त पंक्ति के साथ अगले कैंडिडेट नाम को अलग करता है। अधिकांश भाषाओं में पार्स करना बहुत आसान है। मैंने इसे यहाँ अपलोड किया है: drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (नई रूपरेखाओं को बदलने के अलावा, मैंने डेटा को अछूता छोड़ दिया है। इसमें शामिल नहीं है - क्या इसके लिए एन्कोडिंग समस्या जैसा है)
डेव

जवाबों:


14

पॉलीग्लॉट, ~ 18.6%

यह काम करता है: Cjam, Pyth, TeaScript, Japt, Seriously, 05AB1E, GolfScript, Jelly, और शायद कई और।

6

यह सभी इनपुट्स के लिए हिलेरी को आउटपुट देता है। ऐसा इसलिए है क्योंकि हिलेरी ने सबसे कहा। हालांकि यह ऐसा करने का सबसे सरल तरीका नहीं है। यह ¯ \ _ (ツ) _ / (काम करता है


मुझे पसंद है कि कैसे यह कम गुणवत्ता वाले पोस्ट के रूप में फ़्लैग किया जाता है। : पी
डेन्कर

1
@ डेंकरएफ़ शायद शॉर्ट होने के लिए
डाउनगेट

1
जावास्क्रिप्ट का उपयोग करने का कोई कारण? आप इसे किसी अन्य भाषा में एक पात्र तक ले जा सकते हैं: P
ghosts_in_the_code

@ghosts_in_the_code फिक्स्ड
डाउनगोअट

9

पायथ, 34.16% (297 बाइट्स)

FNc"7creta
6enato
3ohio
2donal
7 major 
6o try t
5tot
5se me
7nai
4m pres
2he ob
3 bala
5jeb
6e aff
5mendous 
2mnest
5. we'r
7ave got to
2c ter
4ntur
7 campaign 
2flat
5obo
4is pre
4-here'
2note
2m el
4 issue 
5, very
6o af
1fact o
6en's
5pany
6he republicans
7 -- 
4meon
5bea
4ory o
7"bI}tNrzZhNB

(ध्यान दें कि कुछ लाइनें रिक्त स्थान पर समाप्त होती हैं)

मैं सबसे सरल विकल्प के साथ चला गया हूँ जो मैं सोच सकता था: पैटर्न की एक सूची की जाँच करें, और जैसे ही आप एक मैच पाते हैं, संबंधित उम्मीदवार को आउटपुट देते हैं। यदि बाकी सभी विफल हो जाते हैं, तो शेष से सबसे अधिक संभावित उम्मीदवार का उत्पादन करें। उसके बाद, यह संभव के रूप में 300 बाइट्स में अधिक से अधिक डेटा cramming के बारे में है।

FNc"<data>"bI}tNrzZhNB

टूट - फूट:

FN                      for N in ...
   "<data>"              the hard-coded data (newline separated)
  c                      split using...
           b             '\n' constant,
            I           if
              tN         tail (all but first char) of current item
             }           is contained within
                rzZ      the input (lowercased),
                        then:
                   hN    print the head (first char) of the current item
                     B   and break out of the loop.

तो वह डेटा कहां से आता है? खैर संरचना बस है:

<candidate_number><phrase>
<candidate_number><phrase>
<etc.>

(अंतिम गिरावट के रूप में कार्य करने के लिए कोई वाक्यांश के साथ अंत में एक प्रविष्टि के साथ)

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

मैंने स्कोरिंग सिस्टम के एक जोड़े की कोशिश की। अंत में मैं इस एक के साथ चला गया:

score = (
    + matching_quote_count_for_most_likely_author * 10
    - matching_quote_count_for_other_authors * 7
    - token_length
)

केवल नए आइटम की अनुमति देने का एक कठोर दृष्टिकोण जो गलत उत्तरों को पेश नहीं करता है, ऐसा लगता है कि लगभग 20-25% अटक गए हैं, बहुत कुछ चाहिए उच्चतर प्राप्त करने के लिए सारे पैटर्न की । यह फ़ज़ियर दृष्टिकोण बहुत बेहतर करता है, और अभी भी ~ 80% सटीकता (550 वस्तुओं के साथ) तक पहुंच सकता है। प्रस्तुत स्कोर में 38 आइटम हैं, जो कि सबसे अधिक मैं 300 वर्णों की सीमा में फिट हो सकता था।

34% परिणाम वास्तव में एक परीक्षण सी ++ प्रोग्राम से आता है जो समान चरणों का प्रदर्शन करता है। यह मेल खाना चाहिए, लेकिन मुझे इसे जांचने के लिए पाइथ टेस्ट हार्नेस नहीं मिला है।

यह पहली बार है जब मैंने पायथ का उपयोग किया है, इसलिए मुझे लगता है कि कुछ और बाइट्स को समाप्त किया जा सकता है, जिससे थोड़ा और डेटा प्राप्त हो सके।


4
इसके अलावा, अब मुझे पता है कि सैंडर्स सचिव क्लिंटन के बारे में बात करना पसंद करते हैं, क्लिंटन सीनेटर सैंडर्स के साथ जुनूनी है, कैसिच ओहियो से प्यार करता है, क्रूज़ हमेशा डोनाल्ड ट्रम्प का उल्लेख कर रहा है, रूबियो सेंचुरीज़ के प्रति जुनूनी है, कार्सन के पास इस मामले के सभी "तथ्य" हैं ", और ट्रम्प पूरी तरह से "पूरी तरह से" कहकर प्यार करते हैं। यह एक राजनीति-बिंगो जनरेटर की शुरुआत की तरह लगता है। मुझे इसे यूके की कुछ हस्तियों पर आज़माना होगा ...
डेव

मुझे लगता है कि आप स्ट्रिंग को पैक करके यहां कुछ बाइट्स बचा सकते हैं ."
lirtosiast

8

जावास्क्रिप्ट, 32.87%

299 वर्ण:

function Q(a,b){return p.toLowerCase().split(' ').join('').includes(a)<<b}z=Q('ink',0)+Q('int',1)+Q('ona',2)+Q('rica',3)+Q('twe',4)+Q("we'",5)+Q('youkn',6);return '55472726464727446676664676767676563641233643334456364233336141745116222136477126111113361611262316263122216111673336225611363276'[z]*1

रणनीति:

मैंने एक ब्रूस बल खोज की जिस पर शब्द खंडों को "हैश" में शामिल करना है। फिर एक स्ट्रिंग लुकिंग उस हैश के साथ इस तरह से होती है जो उस हैश के लिए सबसे अधिक संभावित उम्मीदवार को चुनता है।

कोड ही:

// The Q function checks if a string is present.
// Then left-shifts the true/false result up to e.g. 64,32,16,8,4,2,1
// This way we can combine results into any number 0 to 127.
function Q(a,b){return p.toLowerCase().split(' ').join('').includes(a)<<b}

// Now we check for key string occurrences:
z=Q('ink',0)+Q('int',1)+Q('ona',2)+Q('rica',3)+Q('twe',4)+Q("we'",5)+Q('youkn',6)

// Finally, use this as an index into the lookup string. (Multiply by 1 to convert char to int.)
return '55472726464727446676664676767676563641233643334456364233336141745116222136477126111113361611262316263122216111673336225611363276'[z]*1

यह मेरा पहला कोड गोल्फ सबमिशन है, इसलिए सुझावों का स्वागत है :)


5

गणितज्ञ, 23.7775%

(l=ToLowerCase@#;Ordering[-StringCount[l,#]&/@{"fact","donald"|"obama","done"|"ohio","issue"|"united"|"why"|"world","great"|"many","senator","american"|"believe"|"campaign"|"secretary"|"street"|"wall"},1])[[1]]&

यह प्रत्येक उम्मीदवार के लिए अद्वितीय सामान्य कीवर्ड की घटनाओं को गिनता है और उच्चतम स्कोर वाले उम्मीदवार की संख्या को आउटपुट करता है।

मूल रूप से, मुझे सभी उम्मीदवारों के सबसे सामान्य शब्द मिले

t = Import["~/Documents/candidate quotes.txt"];
ts = DeleteCases[StringSplit[t, "\n\n"], ""];
tss = Split[ts, StringLength[#2] > 20 &][[{3, 4, 5, 6, 7, 1, 2}]];
names = StringSplit[#][[2]] & /@ tss[[All, 1]];
quotes = StringSplit[#, "(NEXT PARAGRAPH)"] & /@ StringJoin /@ tss[[All, 2 ;;]];
(* remove the 100 commonest english words *)
wd = WikipediaData["Most common words in English", "ArticleWikicode"];
Flatten[StringSplit[StringCases[wd, 
  Shortest["{| class=\"wikitable\"" ~~ w__ ~~ "}"] -> w], "\n"]];
common100 = 
Alternatives @@ ToLowerCase@DeleteDuplicates@Flatten[StringSplit /@ 
     StringCases[#, 
      "|| " ~~ ("[[" | "") ~~ w : ((WordCharacter | " ") ..) -> 
       w] & /@ %];
commonest = 
  Commonest[
Flatten[StringSplit[
    StringDelete[ToLowerCase[#], 
     PunctuationCharacter | (WordBoundary ~~ (common100) ~~ 
        WordBoundary)]] & /@ #], 20] & /@ quotes;

और उन सामान्य खोजशब्दों को चुना जो प्रत्येक उम्मीदवार के लिए अद्वितीय हैं।

keywords = 
 Alternatives @@@ 
  Table[Complement[commonest[[n]], 
    Union[Flatten[Delete[commonest, n]]]], {n, Length[names]}];

कुछ कीवर्ड को मैन्युअल रूप से हटाने के बाद, यह अंतिम तालिका है:

Carson    fact
Cruz      donald|obama
Kasich    done|ohio
Rubio     issue|united|why|world
Trump     great|many
Clinton   senator
Sanders   american|believe|campaign|secretary|street|wall

इन कीवर्ड के साथ कुल फ़ंक्शन लंबाई 211 वर्ण है। मैंने सभी उद्धरणों पर फ़ंक्शन का परीक्षण किया:

pairs = Flatten[MapThread[Table[q -> #1, {q, #2}] &, {names, quotes}]];
test[q_ -> n_] := Boole[n === names[[p@q]]] (* here p is my function that outputs the predicted candidate's number *)
Total[ParallelMap[test, pairs]]/Length[pairs] // N

जो 23.7775% की सटीकता देता है।


3

पायथन, 25.677868%

अभ्यर्थियों ने चार अलग-अलग वर्ण चुने जिनका उपयोग उम्मीदवारों की पहचान के लिए किया जाएगा। प्रत्येक उम्मीदवार को पहाड़ी चढ़ाई की खोज के आधार पर प्रति वर्ण स्कोर कारक दिया जाता है जिसे मैं कुछ मिनटों के लिए 25.68% पर समाप्त करता था।

मुझे लगता है कि यह कम से कम यह साबित करता है कि अवधारणा किसी उम्मीदवार की आंखों पर पट्टी बांधने या सिर्फ क्लिंटन को चुनने से बेहतर है, लेकिन मुझे किसी को बेहतर खोज एल्गोरिदम लागू करने में दिलचस्पी होगी, दोनों कारकों के लिए और उपयोग किए गए पात्रों के लिए।

w=dict(zip("hr?.",((.847,.491,.821,.54,.744,.765,.234),(.494,.777,.202,.587,.7,.852,.484),(.915,.187,.161,.559,.748,.244,.43),(.11,.013,.628,.974,1.037,.484,.302))))
def f(t,r=(0,0,0,0,0,0,0)):
 s=r
 for c in t:s=map(lambda a,b:a+b,s,w.get(c,r))
 return s.index(max(s))+1

1

जावास्क्रिप्ट, टीबीडी

a=[...p].reduce((a,b)=>(a<<5)-a+b.charCodeAt(0)|0,0)%1000,alert(a>0?0:1000,a<79?1:a<226?2:a<333?3:a<497?4:a<697?5:a<849?6:7)

प्रत्येक स्ट्रिंग को हैश कोड में परिवर्तित करता है, फिर स्पीकर को निर्धारित करने के लिए संभाव्य तरीकों का उपयोग करता है। अच्छा होगा यदि कोई अच्छा सेटअप वाला व्यक्ति मेरे लिए यह परीक्षण कर सके।


मेरी गिनती लगभग 16.1% है, लेकिन मुझे यकीन नहीं है कि यह क्या करता है। A + = a? 0: 1000 क्या करता है? (मुझे चेतावनी को एक वापसी के साथ बदलना पड़ा, इसलिए मुझे यकीन नहीं था कि क्या करना है)
soktinpk

@soktinpk क्षमा करें, a+=एक टाइपो रहा होगा।
२२:०२ पर लीजनमॉम्मल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.