ที่บอกว่า? 2559 การเลือกตั้งประธานาธิบดี


16

ในการท้าทายนี้งานของคุณคือการเขียนโปรแกรมที่มีอักขระน้อยกว่า 300 ตัวที่ใช้ย่อหน้าสั้น ๆ หรือประโยคสองสามประโยคที่ผู้สมัครได้พูดและส่งออกผู้ที่กล่าวถึง

อินพุต : สามารถใช้เป็นพารามิเตอร์ในฟังก์ชั่นอินพุตไปยังโปรแกรมอื่น ๆ มันจะเป็นย่อหน้าสั้น ๆ คั่นอย่างถูกต้อง

ผลลัพธ์ : ผู้สมัครที่คุณคิดว่าเป็น นี่อาจเป็นหนึ่งใน

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

ฉันได้ละทิ้งชื่อของคนที่ลาออกตั้งแต่วันที่ 1 มีนาคม คุณอาจส่งออกชื่อตัวเองหรือสะดวกกว่าหมายเลขที่สอดคล้องกับชื่อ

เกณฑ์การให้คะแนน: คะแนน ของคุณคือเปอร์เซ็นต์ของกรณีทดสอบที่คุณได้รับ คะแนนสูงสุดชนะ ความสัมพันธ์ (หรือคะแนนสมบูรณ์แบบ) จะแตกตามความยาวของรหัสเช่นเดียวกับในการตีกอล์ฟ

กรณีทดสอบสามารถดึงจาก:

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

คลิกที่การอภิปรายแต่ละครั้งทั้งพรรคประชาธิปัตย์และพรรครีพับลิกันที่เคยเกิดขึ้นมาก่อนวันที่ 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
ฉันมีข้อเสนอแนะ ถ้าอย่างนั้นคุณทำให้มันเป็น code-golf แต่คุณจะต้องได้รับการเสนอราคาทั้งหมด นอกจากนี้คุณอาจต้องการทำให้คำพูดสั้นลงมากเนื่องจากนี่เป็นเรื่องน่าขันเล็กน้อยที่จะแก้ไขตามที่เป็น
Cyoce

2
@Cyoce รับราคาทั้งหมดถูกต้องจะไร้สาระ (ฉันคิดว่า) พิจารณาจำนวนของราคาที่แท้จริง
soktinpk

1
แนวคิดท้าทายที่ชาญฉลาดอาจต้องมีการปรับแต่ง คุณคิดว่าจะโพสต์ในแซนด์บ็อกซ์เพื่อรับฟังความคิดเห็นบ้างไหม?
Ashwin Gupta

1
เกณฑ์การชนะคืออะไร? (และทำไมคุณถึงคิดว่าไม่มีใครจะได้คะแนนที่สมบูรณ์แบบ?)
Peter Taylor

2
ข้อมูลต้นฉบับที่คุณให้นั้นยุ่งเหยิงเล็กน้อย (ยากที่จะแยกวิเคราะห์อัตโนมัติ) ซึ่งฉันคิดว่าจะนำจิตวิญญาณของความท้าทายไป ฉันสร้างเวอร์ชันที่ล้างแล้วซึ่งใช้หนึ่งบรรทัดต่อคำพูดโดยมีบรรทัดว่างคั่นชื่อ candiate ถัดไป วิธีนี้ง่ายกว่าในการแยกวิเคราะห์ในภาษาส่วนใหญ่ ฉันได้อัปโหลดที่นี่: drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (นอกเหนือจากการเปลี่ยนบรรทัดใหม่ฉันได้ทิ้งข้อมูลไว้ซึ่งรวมถึงสิ่งที่ดูเหมือนปัญหาการเข้ารหัสสำหรับ -)
เดฟ

คำตอบ:


14

พูดได้หลายภาษา ~ 18.6%

ใช้งานได้ใน: Cjam, Pyth, TeaScript, Japt, Seriously, 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
ตอนนี้ฉันรู้แล้วว่าแซนเดอร์สชอบพูดถึงเลขาธิการคลินตันคลินตันหมกมุ่นกับวุฒิสมาชิกแซนเดอร์ส Kasich รักโอไฮโอครูซมักจะพูดถึงโดนัลด์ทรัมป์รูบิโอหมกมุ่นอยู่กับศตวรรษคาร์สันมี ทรัมป์รักการพูดว่า "เต็มเปา" สิ่งนี้ให้ความรู้สึกเหมือนเป็นจุดเริ่มต้นของเครื่องกำเนิดบิงโกการเมือง ฉันจะต้องลองใช้บุคลิกของสหราชอาณาจักรสักหน่อย ...
เดฟ

."ฉันคิดว่าคุณจะสามารถประหยัดไบต์บางอย่างที่นี่โดยการบรรจุสตริงกับ
lirtosiast

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

Python 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, 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? 0: 1,000 ทำอะไร (ผมต้องเปลี่ยนการแจ้งเตือนกับการกลับมาเพื่อให้ผมไม่แน่ใจว่าสิ่งที่ต้องทำ)
soktinpk

@soktinpk ขออภัยa+=ต้องเป็นตัวพิมพ์ผิด
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.