누가 말했다? 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.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/abfuhxrh/

코드는 매개 변수 p를 사용하여 분류 할 문구를 나타냅니다. 점수가 약 20 % 인 예제 코드 (추측은 11 % 정도 임) :

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

정확히 내가 요구하는 것 : 후보자가 말한 문구를 입력으로 받아 후보가 말한 출력으로 반환하는 300 문자 미만으로 프로그램 / 함수를 작성하십시오. 당신의 점수는 당신이 맞은 테스트 사례의 비율입니다. 가장 높은 점수가 이깁니다.

예, 많은 줄이 [laughter]있거나 [cheering]그 줄에 있다는 것을 알고 있습니다. 이들은 제거되지 않습니다. 최악의 경우 무시할 수있는 추가 정보입니다. 기껏해야, 그들은 당신이 사용할 수있는 추가 정보입니다 (예를 들어, 이걸 만들었지 만 아마도 사람들은 웃음이 마르코 루비오가 말하고 있다는 증거 일 것입니다). 테스트 사례는 텍스트 파일에 나타나는대로입니다.


1
제안이 있습니다. 코드 골프를 만드는 것은 어떻습니까?하지만 모든 따옴표를 올바르게 가져와야합니까? 또한 따옴표를 더 짧게 만들고 싶을 수도 있습니다. 이는 그대로 해결하기가 약간 어리석기 때문입니다.
Cyoce

2
@Cyoce는 모든 따옴표를 올바르게 얻는 것은 따옴표의 수를 고려할 때 어리석은 일이라고 생각합니다.
soktinpk

1
영리한 도전 아이디어, 약간의 정제가 필요할 수 있습니다. 피드백을 받기 위해 Sandbox에 게시하는 것을 고려 했습니까?
Ashwin Gupta

1
이기는 기준은 무엇입니까? (그리고 왜 아무도 완벽한 점수를 얻지 못할 것이라고 생각합니까?)
Peter Taylor

2
귀하가 제공 한 소스 데이터는 약간 지저분하고 (자동으로 구문 분석하기가 어렵습니다) 도전의 정신을 일부 제거한다고 생각합니다. 나는 인용 당 한 줄을 사용하고 다음 후보 이름을 구분하는 빈 줄을 사용하여 정리 된 버전을 만들었습니다. 대부분의 언어에서 구문 분석이 훨씬 쉽습니다. 내가 여기에 업로드 한 : drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (줄 바꿈을 변경하는 이외, 나는 그대로 데이터를 떠 났어요 즉에 대한 인코딩 문제가 생겼는지 포함 -.)
데이브

답변:


14

폴리 글롯, ~ 18.6 %

이것은 Cjam, Pyth, TeaScript, Japt, Seriously, 05AB1E, GolfScript, Jelly 등에서 작동합니다.

6

모든 입력에 대해 Hillary를 출력합니다. Hillary가 가장 많이 말했기 때문입니다. 이것이 가장 독창적 인 방법은 아니지만. 작동합니다 ¯ \ _ (ツ) _ / ¯


품질이 낮은 게시물로 표시되는 방식이 마음에 듭니다. : P
Denker

1
@DenkerAffe는 아마 짧을지도 모른다
Downgoat

1
JavaScript를 사용해야하는 이유가 있습니까? P : 당신은 다른 언어로 하나 개의 문자에 내려 golfed 한 수
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 %에서 멈추는 것으로 보이며, 더 높아질 패턴 이 많이 필요합니다 . 이 fuzzier 접근법은 훨씬 더 잘 수행되며 여전히 550 항목으로 ~ 80 % 정확도에 도달 할 수 있습니다. 제출 된 점수에는 38 개의 항목이 있으며 이는 300 자 제한에 가장 적합합니다.

34 % 결과는 실제로 동일한 단계를 수행하는 테스트 C ++ 프로그램에서 나옵니다. 일치해야하지만 Pyth 테스트 하네스가 없습니다.

이것은 처음으로 Pyth를 사용했기 때문에 더 많은 데이터를 허용하기 위해 더 많은 바이트가 압착 될 수 있다고 생각합니다.


4
또한 샌더스는 클린턴 장관과 샌더스 상원 의원에 집착하고, 카시 치는 오하이오에 관심이 있고, 크루즈는 항상 도널드 트럼프에 대해 언급하고, 루비오는 수세기에 집착하고, 카슨은 문제의 모든 "사실"을 가지고 있으며 트럼프는 "완전히"말하는 것을 완전히 좋아합니다. 이것은 정치 빙고 생성기의 시작과 같은 느낌입니다. 나는 몇몇 영국 성격에 그것을 시도해야 할 것이다…
Dave

문자열을로 포장하여 여기에 약간의 바이트를 절약 할 수 있다고 생각합니다 .".
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 %

후보를 식별하는 데 사용될 4 가지 다른 캐릭터를 임의로 선택했습니다. 각 후보자에게는 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

자바 스크립트, TBD

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.