Siapa yang bilang? Pemilihan Presiden 2016

16

Dalam tantangan ini, tugas Anda adalah membuat program menulis dengan kurang dari 300 karakter yang membutuhkan paragraf pendek atau beberapa kalimat yang dikatakan seorang kandidat dan menampilkan siapa yang mengatakannya.

Input : Dapat diambil sebagai parameter untuk suatu fungsi, input ke program dll. Ini akan menjadi paragraf pendek, diselingi dengan benar.

Keluaran : Calon yang Anda pikirkan. Ini bisa jadi salah satunya

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

Saya telah meninggalkan nama-nama orang yang keluar pada tanggal 1 Maret. Anda dapat menampilkan nama itu sendiri, atau, lebih mudahnya, nomor yang sesuai dengan namanya.

Mencetak: Anda adalah persentase dari kasus uji yang Anda lakukan dengan benar. Kemenangan skor tertinggi. Dasi (atau skor sempurna) dipecah berdasarkan panjang kode seperti pada kode golf.

Kasus uji dapat ditarik dari:

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

Klik pada setiap debat, baik Demokrat dan Republik yang telah terjadi sejauh ini (sebelum 1 Maret). Setiap paragraf adalah uji kasus, kecuali jika "paragraf" kurang dari 20 karakter.

Berikut ini adalah kode yang mengeluarkan kasus uji dari halaman tertentu:

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

Anda kemudian bisa melakukannya categ.SANDERS untuk mendapatkan daftar semua paragraf yang dikatakan Senator Sanders.

Anda dapat membuang apa pun yang tidak dikatakan oleh kandidat yang tercantum di atas (misalnya categ.BUSHataucateg.CHRISTIE ).

Berikut adalah file dengan semua kasus uji: https://drive.google.com/file/d/0BxMn8--P71I-bDZBS2VZMDdmQ28/view?usp=sharing

File ini diatur oleh kandidat

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.

Contoh pengiriman sebagian adalah:

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

atau

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

Berikut adalah tempat di mana Anda dapat menguji solusi javascript: https://jsfiddle.net/prankol57/abfuhxrh/

Kode menggunakan parameter puntuk mewakili frasa untuk mengklasifikasikan. Contoh kode yang mendapat skor sekitar 20% (menebak akan mendapatkan sekitar 11%):

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

Persis apa yang saya tanyakan: Tulis program / fungsi dalam kurang dari 300 karakter yang mengambil sebagai input frase yang dikatakan seorang kandidat dan kembali sebagai output yang kandidat mengatakannya. Skor Anda adalah persentase dari kasus uji yang Anda lakukan dengan benar. Kemenangan skor tertinggi.

Ya, saya tahu bahwa banyak baris memiliki [laughter]atau [cheering]di dalamnya. Ini tidak akan dihapus. Paling buruk, itu adalah informasi tambahan yang bisa Anda abaikan; paling-paling, itu adalah informasi tambahan yang dapat Anda gunakan (mis. saya mengada-ada, tetapi mungkin orang tertawa adalah bukti bahwa Marco Rubio berbicara). Kasing uji adalah seperti yang ditampilkan dalam file teks.

soktinpk
sumber
1
Saya punya saran. Bagaimana kalau Anda membuatnya kode-golf, tetapi Anda harus mendapatkan semua penawarannya dengan benar? Juga, Anda mungkin ingin membuat kutipan jauh lebih pendek, karena ini agak konyol untuk dipecahkan apa adanya.
Cyoce
2
@Cyoce mendapatkan semua kutipan dengan benar akan menjadi konyol (saya pikir) mengingat banyaknya kutipan.
soktinpk
1
Ide tantangan yang cerdas, mungkin perlu disempurnakan. Sudahkah Anda mempertimbangkan untuk memposting di Sandbox untuk mendapat tanggapan?
Ashwin Gupta
1
Apa kriteria kemenangan? (Dan mengapa Anda berpikir bahwa tidak ada yang akan mendapatkan skor sempurna?)
Peter Taylor
2
Sumber data yang Anda berikan agak berantakan (sulit untuk diurai secara otomatis), yang saya pikir menghilangkan beberapa semangat tantangan. Saya telah membuat versi pembersihan yang menggunakan satu baris per kutipan, dengan baris kosong memisahkan nama kandidat berikutnya. Ini jauh lebih mudah untuk diuraikan dalam sebagian besar bahasa. Saya telah mengunggahnya di sini: drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (selain mengubah baris baru, saya meninggalkan data tidak tersentuh. Itu termasuk apa yang tampak seperti masalah penyandian untuk -)
Dave

Jawaban:

14

Polyglot, ~ 18,6%

Ini berfungsi di: Cjam, Pyth, TeaScript, Japt, Seriously, 05AB1E, GolfScript, Jelly, dan mungkin masih banyak lagi.

6

Ini menghasilkan Hillary untuk semua input. Ini karena Hillary yang paling banyak bicara. Meskipun ini bukan cara yang paling cerdik untuk melakukan ini. Ia bekerja ¯ \ _ (ツ) _ / ¯

Downgoat
sumber
Saya suka bagaimana ini ditandai sebagai pos berkualitas rendah. : P
Denker
1
@DenkerAffe mungkin karena kekurangan
Downgoat
1
Ada alasan untuk menggunakan JavaScript? Anda bisa memasukkannya ke satu karakter dalam beberapa bahasa lain: P
ghosts_in_the_code
@ghosts_in_the_code diperbaiki
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

(perhatikan bahwa beberapa garis berakhir dengan spasi)

Saya telah menggunakan opsi paling sederhana yang dapat saya pikirkan: periksa daftar pola, dan segera setelah Anda menemukan kecocokan, hasilkan kandidat yang sesuai. Jika semuanya gagal, hasilkan kandidat yang paling mungkin dari sisanya. Setelah itu, semuanya tentang menjejalkan sebanyak mungkin data ke dalam 300 byte.

FNc"<data>"bI}tNrzZhNB

Kerusakan:

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.

Jadi dari mana data itu berasal? Strukturnya sederhana:

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

(dengan entri di bagian akhir tanpa frasa untuk bertindak sebagai mundur terakhir)

Tapi mengapa barang-barang tertentu itu? Saya menulis program C ++ untuk menganalisis dataset yang disediakan (dengan beberapa pembersihan baris baru secara manual untuk membuat struktur konsisten). Itu terlihat pada semua substring ("token") di setiap kutipan (1-16 karakter), kemudian berulang kali memeriksa token yang memberikan manfaat paling besar untuk pergi berikutnya dalam daftar. Setelah pola ada dalam daftar, hapus tanda kutip yang cocok dan ulangi (itu menjadi sedikit lebih rumit untuk membuatnya cepat tapi itulah dasarnya). Kode ini mungkin terlalu panjang untuk dimasukkan di sini, tetapi saya mungkin akan meletakkannya di github nanti (ketika saya sudah sedikit membersihkannya).

Saya mencoba beberapa sistem penilaian. Pada akhirnya saya memilih yang ini:

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

Pendekatan yang lebih ketat dengan hanya memperbolehkan item baru yang tidak memperkenalkan jawaban yang salah nampaknya macet sekitar 20-25%, membutuhkan banyak pola untuk menjadi lebih tinggi. Pendekatan fuzzier ini jauh lebih baik, dan masih dapat mencapai akurasi ~ 80% (dengan 550 item). Skor yang dikirimkan memiliki 38 item, yang merupakan jumlah maksimum yang bisa saya masukkan dalam batas 300 karakter.

Hasil 34% sebenarnya berasal dari program uji C ++ yang melakukan langkah-langkah yang sama. Seharusnya cocok, tapi saya belum punya harness uji Pyth untuk memeriksanya.

Ini adalah pertama kalinya saya menggunakan Pyth, jadi saya membayangkan beberapa byte lagi bisa dicabut, memungkinkan data sedikit lebih banyak.

Dave
sumber
4
Juga saya sekarang tahu bahwa Sanders suka berbicara tentang sekretaris Clinton, Clinton terobsesi dengan senator Sanders, Kasich mencintai Ohio, Cruz selalu menyebut Donald Trump, Rubio terobsesi dengan Berabad-abad, Carson memiliki semua "fakta tentang masalah", dan Trump sangat suka mengatakan "sepenuhnya". Ini terasa seperti awal dari generator politik-bingo. Saya harus mencobanya pada beberapa kepribadian Inggris ...
Dave
Saya pikir Anda bisa menyimpan beberapa byte di sini dengan mengemas string dengan .".
lirtosiast
8

Javascript, 32.87%

299 Karakter:

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

Strategi:

Saya melakukan pencarian bruce force pada segmen kata mana yang akan dimasukkan dalam "hash". Kemudian pencarian string terjadi dengan hash sedemikian rupa sehingga memilih kandidat yang paling mungkin untuk hash itu.

Kode itu sendiri:

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

Ini adalah pengiriman golf kode pertama saya, jadi saran dipersilahkan :)

Ru Hasha
sumber
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]]&

Ini menghitung kemunculan kata kunci umum yang unik untuk setiap kandidat dan menampilkan jumlah kandidat dengan skor tertinggi.

Pada dasarnya, saya menemukan kata-kata yang paling umum dari semua kandidat

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;

dan memilih kata kunci umum yang unik untuk setiap kandidat.

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

Setelah secara manual menghapus beberapa kata kunci, ini adalah tabel terakhir:

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

Dengan kata kunci ini total panjang fungsi adalah 211 karakter. Saya menguji fungsi atas semua kutipan:

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

yang memberikan akurasi 23,7775%.

shrx
sumber
3

Python, 25.677868%

Secara sewenang-wenang memilih empat karakter berbeda yang akan digunakan untuk mengidentifikasi kandidat. Setiap kandidat diberikan faktor skor per karakter berdasarkan pencarian mendaki bukit yang saya jalankan selama beberapa menit hingga berakhir pada 25,68%.

Saya kira ini setidaknya membuktikan bahwa konsepnya lebih baik daripada memilih kandidat yang ditutup matanya atau hanya memilih Clinton, tetapi saya akan tertarik melihat seseorang menerapkan algoritma pencarian yang lebih baik, baik untuk faktor maupun karakter yang digunakan.

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
boomlinde
sumber
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)

Mengubah setiap string menjadi kode hash, kemudian menggunakan metode probabilistik untuk menentukan pembicara. Akan lebih baik jika seseorang dengan pengaturan yang bagus bisa menguji ini untuk saya.

LegionMammal978
sumber
Saya menghitung sekitar 16,1%, tetapi saya tidak begitu yakin apa fungsinya. Apa yang dilakukan a + = a? 0: 1000? (Saya harus mengganti peringatan dengan pengembalian jadi saya tidak yakin apa yang harus dilakukan)
soktinpk
@soktinpk Maaf, a+=pasti salah ketik.
LegionMammal978