Ai đã nói thế? Bầu cử tổng thống năm 2016


16

Trong thử thách này, nhiệm vụ của bạn là tạo ra một chương trình có ít hơn 300 ký tự có một đoạn văn ngắn hoặc một vài câu mà một ứng cử viên đã nói và xuất ra ai đã nói nó.

Đầu vào : Có thể được lấy làm tham số cho một chức năng, đầu vào cho một chương trình, vv Nó sẽ là một đoạn văn ngắn, được chấm câu đúng.

Đầu ra : Ứng cử viên mà bạn nghĩ nó là. Đây có thể là một trong

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

Tôi đã để lại tên của những người đã bỏ học kể từ ngày 1 tháng 3. Bạn có thể tự xuất tên, hoặc, thuận tiện hơn, số tương ứng với tên.

Chấm điểm: Điểm của bạn là tỷ lệ phần trăm các trường hợp kiểm tra bạn nhận được đúng. Điểm số cao nhất chiến thắng. Ties (hoặc điểm hoàn hảo) bị phá vỡ bởi độ dài mã như trong một mã golf.

Các trường hợp thử nghiệm có thể được kéo từ:

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

Nhấp vào từng cuộc tranh luận, cả Dân chủ và Cộng hòa đã xảy ra cho đến nay (trước ngày 1 tháng 3). Mỗi đoạn là một trường hợp thử nghiệm, trừ khi "đoạn" dài dưới 20 ký tự.

Đây là mã lấy ra các trường hợp thử nghiệm từ một trang cụ thể:

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);
}

Sau đó, bạn có thể làm categ.SANDERSđể có được một danh sách tất cả các đoạn mà Thượng nghị sĩ Sanders đã nói.

Bạn có thể loại bỏ bất cứ điều gì không được nói bởi các ứng cử viên được liệt kê ở trên (ví dụ categ.BUSHhoặc categ.CHRISTIE).

Đây là tệp có tất cả các trường hợp thử nghiệm: https://drive.google.com/file/d/0BxMn8--P71I-bDZBS2VZMDdmQ28/view?usp=shaming

Các tập tin được tổ chức bởi ứng cử viên

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.

Một ví dụ đệ trình một phần sẽ là:

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

hoặc là

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 */ 

Đây là nơi bạn có thể thử nghiệm các giải pháp javascript: https://jsfiddle.net/prankol57/abfuhxrh/

Mã sử ​​dụng tham số pđể biểu diễn cụm từ để phân loại. Mã ví dụ đạt khoảng 20% ​​(đoán sẽ nhận được khoảng 11%):

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

Chính xác những gì tôi đang hỏi: Viết một chương trình / hàm dưới 300 ký tự lấy đầu vào là cụm từ mà ứng viên đã nói và trả về là đầu ra mà ứng viên đã nói. Điểm của bạn là tỷ lệ phần trăm của các trường hợp kiểm tra bạn nhận được đúng. Điểm số cao nhất chiến thắng.

Vâng, tôi biết rằng rất nhiều dòng có [laughter]hoặc [cheering]trong đó. Những thứ này sẽ không được gỡ bỏ. Tồi tệ nhất, chúng là thông tin bổ sung mà bạn có thể bỏ qua; tốt nhất, chúng là những thông tin bổ sung mà bạn có thể sử dụng (ví dụ: tôi đã tạo ra điều này, nhưng có lẽ tiếng cười của mọi người là bằng chứng cho thấy Marco Rubio đang nói). Các trường hợp thử nghiệm là như chúng xuất hiện trong tệp văn bản.


1
Tôi có một đề nghị. Làm thế nào về bạn làm cho nó mã golf, nhưng bạn phải có được tất cả các báo giá phải không? Ngoài ra, bạn có thể muốn làm cho các trích dẫn ngắn hơn rất nhiều, vì điều này hơi vô lý để giải quyết nguyên trạng.
Cyoce

2
@Cyoce nhận được tất cả các trích dẫn đúng sẽ là vô lý (tôi nghĩ) xem xét số lượng trích dẫn tuyệt đối.
soktinpk

1
Ý tưởng thách thức thông minh, có thể cần một số tinh chỉnh mặc dù. Bạn đã xem xét đăng bài trong Sandbox cho một số phản hồi?
Ashwin Gupta

1
Tiêu chí chiến thắng là gì? (Và tại sao bạn nghĩ rằng không ai sẽ có được một số điểm hoàn hảo?)
Peter Taylor

2
Dữ liệu nguồn bạn cung cấp hơi lộn xộn (khó phân tích tự động), mà tôi nghĩ sẽ lấy đi một phần tinh thần của thử thách. Tôi đã tạo một phiên bản được làm sạch, sử dụng một dòng trên mỗi trích dẫn, với một dòng trống phân tách tên kẹo tiếp theo. Điều này dễ dàng hơn nhiều để phân tích cú pháp trong hầu hết các ngôn ngữ. Tôi đã tải nó ở đây: drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (khác hơn là thay đổi dòng mới, tôi đã rời khỏi dữ liệu bị ảnh hưởng đó bao gồm những gì trông giống như một vấn đề mã hóa cho -.)
Dave

Câu trả lời:


14

Đa sắc, ~ 18,6%

Điều này hoạt động trong: Cjam, Pyth, TeaScript, Japt, Seriously, 05AB1E, GolfScript, Jelly, và có lẽ nhiều hơn nữa.

6

Điều này đầu ra Hillary cho tất cả các đầu vào. Điều này là do Hillary nói nhiều nhất. Trong khi đó không phải là cách khéo léo nhất để làm điều này. Nó hoạt động \ _ (ツ) _ /


Tôi thích làm thế nào điều này được gắn cờ là bài chất lượng thấp. : P
Denker

1
@DenkerAffe có lẽ là ngắn
Downgoat

1
Bất kỳ lý do cho việc sử dụng JavaScript? Bạn có thể đã đánh nó xuống một nhân vật bằng một số ngôn ngữ khác: P
ghosts_in_the_code

@ghosts_in_the_code đã được sửa
Downgoat

9

Pyth, 34,16% (297 byte)

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

(lưu ý rằng một số dòng kết thúc trong không gian)

Tôi đã thực hiện với tùy chọn đơn giản nhất mà tôi có thể nghĩ ra: kiểm tra danh sách các mẫu và ngay khi bạn tìm thấy kết quả khớp, hãy xuất ra ứng cử viên tương ứng. Nếu vẫn thất bại, xuất ra ứng cử viên có khả năng nhất từ ​​phần còn lại. Sau đó, tất cả chỉ là nhồi nhét càng nhiều dữ liệu vào 300 byte càng tốt.

FNc"<data>"bI}tNrzZhNB

Phá vỡ:

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.

Vậy dữ liệu đó đến từ đâu? Cấu trúc đơn giản là:

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

(với một mục ở cuối không có cụm từ để hoạt động như dự phòng cuối cùng)

Nhưng tại sao những mặt hàng cụ thể? Tôi đã viết một chương trình C ++ để phân tích tập dữ liệu được cung cấp (với một số cách làm sạch thủ công các dòng mới trước để làm cho cấu trúc nhất quán). Nó xem xét tất cả các chuỗi con ("mã thông báo") trong mỗi trích dẫn (1-16 ký tự), sau đó liên tục kiểm tra mã thông báo mang lại lợi ích cao nhất để đi tiếp trong danh sách. Khi một mẫu có trong danh sách, hãy xóa bất kỳ dấu ngoặc kép nào khớp với nó và lặp lại (sẽ phức tạp hơn một chút để giữ cho nó nhanh nhưng đó là những điều cơ bản). Mã này có thể quá dài để đưa vào đây, nhưng tôi có thể đưa nó lên github sau (khi tôi đã làm sạch nó một chút).

Tôi đã thử một vài hệ thống tính điểm. Cuối cùng tôi đã đi với cái này:

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

Một cách tiếp cận chặt chẽ hơn chỉ cho phép các mục mới không đưa ra câu trả lời không chính xác dường như bị mắc kẹt ở khoảng 20-25%, cần rất nhiều mẫu để có được cao hơn. Cách tiếp cận mờ hơn này tốt hơn nhiều, và vẫn có thể đạt độ chính xác ~ 80% (với 550 mục). Điểm số đã gửi có 38 mục, là số điểm lớn nhất tôi có thể đạt được trong giới hạn 300 ký tự.

Kết quả 34% thực sự đến từ một chương trình C ++ thử nghiệm thực hiện các bước tương tự. Nó phù hợp, nhưng tôi chưa có khai thác thử nghiệm Pyth để kiểm tra.

Đây là lần đầu tiên tôi sử dụng Pyth, vì vậy tôi tưởng tượng một số byte khác có thể được rút ra, cho phép thêm một chút dữ liệu.


4
Bây giờ tôi cũng biết rằng Sanders thích nói về thư ký của bà Clinton, bà Obama bị ám ảnh bởi thượng nghị sĩ Sanders, Kasich yêu Ohio, Cruz luôn nhắc đến Donald Trump, Rubio bị ám ảnh bởi hàng thế kỷ, Carson có tất cả "sự thật của vấn đề", và Trump hoàn toàn thích nói "hoàn toàn". Cảm giác này giống như sự khởi đầu của một nhà sản xuất bingo chính trị. Tôi sẽ phải thử nó trên một số tính cách của Vương quốc Anh
Dave

Tôi nghĩ bạn có thể lưu một số byte ở đây bằng cách đóng gói chuỗi .".
lirtosiast 14/03/2016

8

Javascript, 32,87%

299 nhân vật:

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

Chiến lược:

Tôi đã thực hiện một tìm kiếm mạnh mẽ về các phân đoạn từ để bao gồm trong một "băm". Sau đó, việc tra cứu chuỗi xảy ra với hàm băm đó theo cách chọn ứng viên có khả năng nhất cho hàm băm đó.

Bản thân mã:

// 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

Đây là lần gửi mã golf đầu tiên của tôi, vì vậy các đề xuất đều được chào đón :)


5

Toán học, 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]]&

Nó đếm số lần xuất hiện của các từ khóa phổ biến duy nhất cho mỗi ứng cử viên và đưa ra số lượng ứng cử viên có số điểm cao nhất.

Về cơ bản, tôi tìm thấy những từ phổ biến nhất của tất cả các ứng cử viên

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;

và chọn các từ khóa phổ biến duy nhất cho mỗi ứng cử viên.

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

Sau khi xóa thủ công một số từ khóa, đây là bảng cuối cùng:

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

Với các từ khóa này, tổng chiều dài hàm là 211 ký tự. Tôi đã thử nghiệm chức năng trên tất cả các trích dẫn:

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

cung cấp độ chính xác 23,7775%.


3

Con trăn, 25.677868%

Tự ý chọn bốn ký tự khác nhau sẽ được sử dụng để xác định các ứng cử viên. Mỗi ứng cử viên được cho một yếu tố điểm cho mỗi nhân vật dựa trên tìm kiếm leo đồi mà tôi đã chạy trong vài phút để kết thúc ở mức 25,68%.

Tôi cho rằng điều này ít nhất chứng minh rằng khái niệm này tốt hơn là chọn một ứng cử viên bịt mắt hoặc chỉ chọn bà Clinton, nhưng tôi sẽ thích thú khi thấy ai đó áp dụng thuật toán tìm kiếm tốt hơn, cả về các yếu tố và cho các nhân vật được sử dụng.

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

Chuyển đổi từng chuỗi thành mã băm, sau đó sử dụng các phương pháp xác suất để xác định người nói. Sẽ thật tuyệt nếu ai đó có một thiết lập tốt có thể kiểm tra điều này cho tôi.


Tôi chiếm khoảng 16,1%, nhưng tôi không thực sự chắc chắn về những gì nó làm. A + = a? 0: 1000 làm gì? (Tôi đã phải thay thế cảnh báo bằng trả lại vì vậy tôi không chắc chắn chính xác phải làm gì)
soktinpk

@soktinpk Xin lỗi, a+=phải là một lỗi đánh máy.
LegionMammal978
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.