Bunu kim söyledi? 2016 Cumhurbaşkanlığı seçimi


16

Bu görevde göreviniz, bir adayın söylediği ve kimin söylediğini çıkardığı kısa bir paragraf veya birkaç cümle alan 300'den az karakterden oluşan bir program yazmaktır .

Girdi : Bir işleve parametre olarak alınabilir, bir programa girilebilir vb. Kısa bir paragraf olacak ve düzgün şekilde noktalanacaktır.

Çıktı : Düşündüğünüz aday. Bu biri olabilir

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

1 Mart'tan itibaren okuldan ayrılanların isimlerini bıraktım. İsmin kendisini veya daha uygun olarak, isme karşılık gelen sayıyı çıkarabilirsiniz.

Puanlama: Puanınız doğru yaptığınız test vakalarının yüzdesidir. En yüksek puan kazanır. Kravatlar (veya mükemmel skorlar) bir kod golfünde olduğu gibi kod uzunluğuna göre kırılır.

Test senaryoları aşağıdakilerden çekilebilir:

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

Demokrat ve Cumhuriyetçi olan her tartışmaya (1 Mart'tan önce) tıklayın. "Paragraf" 20 karakterden kısa değilse, her paragraf bir test durumudur.

Test senaryolarını belirli bir sayfadan çıkaran kod:

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

Daha sonra categ.SANDERSSenatör Sanders'ın söylediği tüm paragrafların bir listesini almak için yapabilirsiniz .

Yukarıda listelenen (örneğin categ.BUSHveya categ.CHRISTIE) adaylar tarafından söylenmeyen herhangi bir şeyi atabilirsiniz .

Tüm test senaryolarının bulunduğu dosya: https://drive.google.com/file/d/0BxMn8--P71I-bDZBS2VZMDdmQ28/view?usp=sharing

Dosya aday tarafından düzenlenir

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.

Kısmi bir örnek gönderilmesi:

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

veya

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 çözümlerini test edebileceğiniz bir yer: https://jsfiddle.net/prankol57/abfuhxrh/

Kod, psınıflandırmak için ifadeyi temsil etmek üzere parametreyi kullanır . % 20 civarında puan alan örnek kod (tahmin etme% 11 civarında olur):

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

Tam olarak sorduğum şey: Bir adayın söylediği bir ifadeyi girdi olarak alan ve adayın söylediği çıktı olarak geri dönen 300'den az karakter içeren bir program / işlev yazın. Puanınız doğru yaptığınız test vakalarının yüzdesidir. En yüksek puan kazanır.

Evet, biliyorum ki içinde [laughter]veya [cheering]içinde çok fazla çizgi var . Bunlar kaldırılmayacak. En kötüsü, görmezden gelebileceğiniz ekstra bilgilerdir; en iyi ihtimalle, kullanabileceğiniz ekstra bilgilerdir (örneğin bunu uydurdum, ama belki de kahkahalar Marco Rubio'nun konuştuğunun kanıtıdır). Test senaryoları metin dosyasında göründükleri gibidir.


1
Bir önerim var. Kod-golf yapmaya ne dersin, ama tüm alıntıları doğru almalısın? Ayrıca, tırnakları çok daha kısa yapmak isteyebilirsiniz, çünkü bu olduğu gibi çözmek biraz saçma.
Cyoce

2
@Tüm tırnakları doğru bir şekilde almak, çok sayıda tırnak dikkate alındığında saçma olurdu (sanırım).
soktinpk

1
Zekice meydan okuma fikri, yine de biraz rafine edilmeye ihtiyaç duyabilir. Geri bildirim almak için Sandbox'ta yayın paylaşmayı düşündünüz mü?
Ashwin Gupta

1
Kazanan kriter nedir? (Ve neden kimsenin mükemmel bir skor elde edemeyeceğini düşünüyorsunuz?)
Peter Taylor

2
Sağladığınız kaynak veriler biraz dağınık (otomatik olarak ayrıştırılması zor), bence meydan okuma ruhunu biraz alıyor. Bir sonraki candiate adını ayıran boş bir çizgi ile, teklif başına bir satır kullanan temizlenmiş bir sürüm yaptım. Çoğu dilde ayrıştırmak çok daha kolaydır. Buraya yükledim: drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (yeni satırları değiştirmek dışında verileri el değmeden bıraktım. Bu, kodlama sorunu gibi görünen şeyleri içerir -)
Dave

Yanıtlar:


14

Poliglot, ~% 18.6

Bu çalışır: Cjam, Pyth, TeaScript, Japt, Cidden, 05AB1E, GolfScript, Jelly ve muhtemelen çok daha fazlası.

6

Bu, Hillary'yi tüm girdiler için çıktılar. Bunun nedeni Hillary'nin en çok söylediğidir. Bunu yapmanın en ustaca yolu olmasa da. Çalışıyor ¯ \ _ (ツ) _ / ¯


Bunun düşük kaliteli yazı olarak işaretlenmesini seviyorum. : P
Denker

1
@DenkerAffe muhtemelen kısa olduğu için
Downgoat

1
JavaScript kullanmak için herhangi bir neden var mı? Başka bir dilde bir karaktere kadar golf oynayabilirsiniz: P
ghosts_in_the_code

@ghosts_in_the_code düzeltildi
Downgoat

9

Pyth,% 34.16 (297 bayt)

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

(bazı satırların boşluklarda biteceğini unutmayın)

Düşünebildiğim en basit seçenekle gittim: bir desen listesini kontrol edin ve bir eşleşme bulduğunuzda ilgili adayı çıktılayın. Eğer her şey başarısız olursa, en olası adayı geri kalanından alın. Bundan sonra, her şey mümkün olduğunca 300 bayta kadar veri sıkıştırmakla ilgilidir.

FNc"<data>"bI}tNrzZhNB

Yıkmak:

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.

Peki bu veriler nereden geliyor? Peki yapı basitçe:

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

(son geri dönüş olarak hareket edecek kelime öbeği olmayan bir girişle)

Ama neden bu özel eşyalar? Sağlanan veri kümesini analiz etmek için bir C ++ programı yazdım (yapıyı tutarlı hale getirmek için önce yeni satırların elle temizlenmesi ile). Her alıntıdaki (1-16 karakter) tüm alt dizelere ("belirteçler") bakar, ardından listede bir sonraki adıma en fazla yararı veren simgeyi tekrar tekrar denetler. Bir desen listeye girdikten sonra, eşleşen tüm tırnak işaretlerini kaldırın ve tekrarlayın (hızlı tutmak biraz daha karmaşıklaşır, ancak bu temeldir). Kod muhtemelen buraya dahil etmek için çok uzun, ama daha sonra github koyabilirsiniz (biraz temizledikten sonra).

Birkaç puanlama sistemi denedim. Sonunda bununla gittim:

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

Sadece yanlış cevaplar getirmeyen yeni öğelere izin vermek için daha katı bir yaklaşım, yaklaşık% 20-25 oranında sıkışmış gibi görünüyordu ve daha yüksek olmak için çok sayıda desene ihtiyaç duyuyordu . Bu daha bulanık yaklaşım çok daha iyi sonuç verir ve yine de ~% 80 doğruluk oranına ulaşabilir (550 öğe ile). Sunulan puan 38 maddeden oluşuyor ve 300 karakter sınırına sığabileceğim en yüksek puan bu.

% 34 sonuç aslında aynı adımları gerçekleştiren bir test C ++ programından gelir. Eşleşmeli, ama kontrol etmek için bir Pyth test koşumum yok.

Pyth'i ilk kez kullandım, bu yüzden biraz daha fazla baytın gıcırdayabileceğini ve biraz daha fazla veriye izin verebileceğini hayal ediyorum.


4
Ayrıca şimdi Sanders'ın sekreter Clinton hakkında konuşmayı sevdiğini, Clinton'un senatör Sanders'a takıntılı olduğunu, Kasich Ohio'yu sevdiğini, Cruz'un her zaman Donald Trump'tan bahsettiğini, Rubio'nun Yüzyıllara takıntılı olduğunu, Carson'un tüm "gerçekleri" olduğunu ve Trump "tamamen" demeyi çok seviyor. Bu bir politika-tombala jeneratörünün başlangıcı gibi geliyor. Bunu bazı İngiliz kişilikleri üzerinde denemeliyim…
Dave

Sanırım dizeyi paketleyerek bazı baytlar kaydedebilirsiniz .".
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

Strateji:

Bir "karma" içine hangi kelime segmentleri dahil etmek bir bruce kuvvet arama yaptım. Sonra, bu karma ile o karma için en olası adayı seçecek şekilde bir dize araması gerçekleşir.

Kodun kendisi:

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

Bu benim ilk kod golf gönderimi, bu yüzden önerilerinizi bekliyoruz :)


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]]&

Her aday için benzersiz olan ortak anahtar kelimelerin oluşumunu sayar ve en yüksek puanı alan adayın sayısını verir.

Temel olarak, tüm adayların en yaygın kelimelerini buldum

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;

ve her aday için benzersiz olan ortak anahtar kelimeleri seçin.

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

Bazı anahtar kelimeleri manuel olarak sildikten sonra, bu son tablodur:

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

Bu anahtar kelimelerle toplam işlev uzunluğu 211 karakterdir. Ben tüm tırnak üzerinde fonksiyonu test:

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 doğruluk sağlar.


3

Python,% 25.677868

Adayları tanımlamak için keyfi olarak dört farklı karakter seçti. Her adaya, birkaç dakika koştuğum bir tepe tırmanma aramasına dayanarak karakter başına bir puan faktörü verilir ve sonuçta% 25,68 olur.

Sanırım bu, en azından kavramın gözü kapalı bir adayı seçmek ya da sadece Clinton'u seçmekten daha iyi olduğunu kanıtlıyor, ancak birisinin hem faktörler hem de kullanılan karakterler için daha iyi bir arama algoritması uyguladığını görmek isterim.

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)

Her dizeyi bir karma koduna dönüştürür, ardından hoparlörü belirlemek için olasılıklı yöntemler kullanır. İyi bir kurulumu olan biri bunu benim için test edebilirse iyi olur.


Yaklaşık% 16.1 sayıyorum, ama ne yaptığından emin değilim. A + = a? 0: 1000 ne yapıyor? (Ne yapacağımı tam olarak bilmiyordum bu yüzden bir dönüşle uyarıyı değiştirmek zorunda kaldım)
soktinpk

@soktinpk Üzgünüm, a+=bir yazım hatası olmalı.
LegionMammal978
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.