谁说的?2016年总统选举


16

在这个挑战中,您的任务是编写一个少于300个字符的程序该程序包含应试者说过的简短段落或几句话,并输出说出它的人。

输入:可以作为函数的参数,也可以作为程序的输入等。它将是一个简短的段落,正确标点。

输出:您认为是的候选人。这可能是其中之一

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

从3月1日起退学的人的名字,我已经省略了。您可以输出名称本身,或者更方便地输出与名称相对应的数字。

评分: 您的分数是您正确的测试用例的百分比。最高分获胜。领带(或完美分数)会像编码高尔夫球一样被编码长度打断。

测试用例可以从以下方面获取:

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

单击到目前为止(3月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.BUSHcateg.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 */ 

这是可以测试javascript解决方案的地方:https : //jsfiddle.net/prankol57/abfuhxrh/

代码使用参数p来表示要分类的短语。得分约20%的示例代码(猜测将得到11%左右):

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

正是我要问的问题:用少于300个字符编写一个程序/函数,以一个候选人说过的短语作为输入,并以候选人说出的内容作为输出返回。您的分数是正确的测试用例的百分比。最高分获胜。

是的,我知道,很多线路有[laughter][cheering]在其中。这些将不会被删除。最糟糕的是,它们是您可以忽略的额外信息。充其量,它们是您可以使用的额外信息(例如,我编造了这个信息,但也许人们的欢笑是Marco Rubio在讲话的证据)。测试用例与文本文件中显示的一样。


1
我有个建议。您如何将其设置为代码高尔夫,但必须正确引用所有引号?另外,您可能希望使引号短很多,因为按原样解决这有点荒谬。
Cyoce

2
考虑到大量的引号,@ Cyoce正确地使用所有引号将是荒谬的(我认为)。
soktinpk

1
聪明的挑战主意,虽然可能需要一些改进。您是否考虑过在Sandbox中发布以获得一些反馈?
Ashwin Gupta'3

1
获奖标准是什么?(为什么您会认为没有人能获得完美的成绩?)
Peter Taylor

2
您提供的源数据有些混乱(很难自动解析),我认为这消除了挑战的精神。我制作了一个清理后的版本,每个引号使用一行,而空白行分隔下一个候选名称。在大多数语言中,这更容易解析。我已将其上传到这里:drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg(除了更改换行符,我没有改动数据。这看起来像是–的编码问题)
Dave

Answers:


14

多语种〜18.6%

这适用于:Cjam,Pyth,TeaScript,Japt,Severly,05AB1E,GolfScript,Jelly,也许还有更多。

6

这将为所有输入输出希拉里。这是因为希拉里说得最多。虽然这不是最巧妙的方法。它起作用¯\ _(ツ)_ /¯


我喜欢这被标记为低质量的帖子。:P
Denker

1
@DenkerAffe可能是做空
Downgoat

1
有使用JavaScript的理由吗?您可以将它打成其他语言的一个字符:P
ghosts_in_the_code

@ghosts_in_the_code已修正
Downgoat

9

Pyth,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个字节中。

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个字符)中的所有子字符串(“令牌”),然后反复检查令牌,该令牌在列表中的下一个内容中具有最大的优势。一旦模式出现在列表中,请删除所有与之匹配的引号,然后重复(要使其保持快速运行会变得有些复杂,但这是基础)。该代码可能太长而无法在此处包含,但我可能稍后再将其放在github(当我将其清理了一点)。

我尝试了几种计分系统。最后,我选择了这个:

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%的结果实际上来自执行相同步骤的测试C ++程序。它应该匹配,但是我没有Pyth测试工具来进行检查。

这是我第一次使用Pyth,因此我想可以挤出更多的字节,从而允许更多的数据。


4
我现在也知道桑德斯喜欢谈论克林顿秘书,克林顿迷恋参议员桑德斯,卡西奇喜欢俄亥俄州,克鲁兹总是提到唐纳德·特朗普,卢比奥迷恋世纪,卡森拥有所有“事实”,并且特朗普完全喜欢说“完全”。感觉就像是一个政治狂热产生者的开始。我将不得不在某些英国
Dave

我认为您可以通过将字符串包装为来在此处节省一些字节."
lirtosiast '16

8

Javascript,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

Mathematica,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

Javascript,待定

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+=一定是拼写错误。
LegionMammal978'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.