Хто сказав, що? 2016 президентські вибори


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

Тут ви можете протестувати рішення JavaScript: https://jsfiddle.net/prankol57/abfuhxrh/

Код використовує параметр pдля представлення фрази для класифікації. Приклад коду, який набирає приблизно 20% (здогадуючись, це буде близько 11%):

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

Саме те, про що я прошу: Напишіть програму / функцію менше 300 символів, яка бере на вхід фразу, яку сказав кандидат, і повертає як вихід, який кандидат сказав. Ваш бал - відсоток тестових випадків, які ви отримаєте правильно. Найвищий результат виграє.

Так, я знаю, що багато рядків є [laughter]або [cheering]в них. Вони не будуть видалені. У гіршому випадку це додаткова інформація, яку ви можете ігнорувати; в кращому випадку це додаткова інформація, яку ви можете використовувати (наприклад, я це придумав, але, можливо, сміх людей є свідченням того, що говорить Марко Рубіо). Тестові випадки є такими, як вони відображені в текстовому файлі.


1
У мене є пропозиція. Як щодо цього ви зробите код-гольф, але все, що вам потрібно, ви повинні правильно зрозуміти? Крім того, ви можете зробити цитати набагато коротшими, оскільки це трохи смішно вирішувати як є.
Кіос

2
@Cyoce отримати всі цитати правильно було б смішно (я думаю) з огляду на велику кількість цитат.
soktinpk

1
Розумна виклик ідеї, можливо, знадобиться певне уточнення. Ви розглядали можливість розміщення відгуків у Sandbox?
Ешвін Гупта

1
Який критерій виграшу? (А чому ви вважаєте, що ніхто не отримає ідеального балу?)
Пітер Тейлор

2
Наведені вами вихідні дані трохи безладні (важко проаналізувати автоматично), що, на мою думку, позбавляє деякого духу виклику. Я створив очищену версію, яка використовує один рядок за цитатою, із порожнім рядком, що розділяє наступне ім'я кандидата. Це набагато простіше розбирати на більшості мов. Я завантажив його сюди: drive.google.com/file/d/0B3uyVnkMpqbVSnVrZkVwTUhDODg (окрім зміни нових рядків, я залишив дані недоторканими. Це включає в себе те, що схоже на проблему кодування -)
Дейв,

Відповіді:


14

Поліглот, ~ 18,6%

Це працює в: Cjam, Pyth, TeaScript, Japt, серйозно, 05AB1E, GolfScript, Jelly і, мабуть, багато інших.

6

Це виводить Hillary для всіх входів. Це тому, що найбільше сказала Хілларі. Хоча це не самий геніальний спосіб зробити це. Він працює ¯ \ _ (ツ) _ / ¯


Мені подобається, як ця публікація позначена як повідомлення низької якості. : P
Денкер

1
@DenkerAffe, ймовірно, за короткий час
Downgoat

1
Будь-яка причина використання JavaScript? Ви могли переграти його до одного персонажа якоюсь іншою мовою: P
ghosts_in_the_code

@ghosts_in_the_code fix
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
Також я тепер знаю, що Сандерс любить говорити про секретаря Клінтона, одержимий Клінтан сенатором Сандерсом, Касіч любить Огайо, Крус завжди згадує про Дональда Трампа, Рубіо одержимий століттями, Карсон має всі "факти [справи]", і Трамп абсолютно любить говорити "повністю". Це відчувається як початок генератора політичного бінго. Мені доведеться спробувати це на деяких особистостях Великобританії…
Дейв,

Я думаю, ви можете зберегти тут кілька байт, упакувавши рядок .".
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

Математика, 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%

Довільно вибрав чотири різних символи, які будуть використані для ідентифікації кандидатів. Кожному кандидату присвоюється коефіцієнт оцінки на персонаж, виходячи з пошуку на сходження на гору, який я пробіг протягом декількох хвилин, і закінчився 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 + = a? 0: 1000? (Мені довелося замінити попередження поверненням, тому я не був точно впевнений, що робити)
soktinpk

@soktinpk Вибачте, a+=напевно, був помилковий помилок .
LegionMammal978
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.