Wytypuj, czy wiadomość będzie oznaczona gwiazdką, czy nie za 50 bajtów


41

Biorąc pod uwagę ciąg znaków składający się z dowolnej wiadomości z naszego czatu witryny pobranej z listy opisanej i połączonej poniżej, wypisz wartość prawdy lub fałszu, próbując przewidzieć, czy wiadomość ta została oznaczona gwiazdką, czy nie w 50 bajtach lub mniej.

Możesz użyć dowolnych wartości prawdy lub fałszu , ale muszą one być identyczne (tzn. Powinny być tylko dwa możliwe wyniki, jedno prawdomówne i jedno fałsz). Dane wejściowe zostaną podane jako surowy HTML z usuniętymi znakami nowej linii i mogą zawierać znaki Unicode inne niż ASCII. Jeśli potrzebujesz czegoś innego niż UTF-8, powiedz to w swojej odpowiedzi.

Zwycięskie zgłoszenie do tego wyzwania będzie tym, które poprawnie przewiduje najwyższy odsetek wiadomości czatu, z poniższej listy. Jeśli dwa podane zgłoszenia mają ten sam wskaźnik sukcesu, zgłoszenie krótsze wygra.

Podaj instrukcje dotyczące uruchamiania kodu na całym zestawie komunikatów i obliczania poprawnej wartości procentowej. Najlepiej byłoby, gdyby był to fragment kodu typu „kocioł” (nie liczony do 50 bajtów), który zapętla pozytywne przypadki testowe i wyświetla liczbę poprawek, a następnie robi to samo dla negatywnych przypadków testowych. (Ogólny wynik można następnie obliczyć ręcznie za pomocą (correctPositive + correctNegative) / totalMessages.)

Aby można było w wystarczającym stopniu przetestować kod, musi on zostać ukończony w ciągu 5 minut lub krócej dla całej listy wiadomości czatu na rozsądnym współczesnym sprzęcie.

Pełna lista wiadomości na czacie znajduje się tutaj i składa się z 1000 najnowszych wiadomości oznaczonych gwiazdką jako prawdziwych przypadków testowych i 1000 najnowszych wiadomości oznaczonych gwiazdką jako przypadków testowych fałszywych. Zauważ, że w liście znajdują się dwa pliki; przewiń mniej więcej w połowie, aby znaleźć wiadomości bez gwiazdek.


4
Znając zachowania na czacie, myślę, że wystarczyłby następujący Pyth:O2
Arcturus,

9
Biorąc pod uwagę historię wiadomości Don'?t star
oznaczonych

11
Byłoby to o wiele łatwiejsze, gdybyś otrzymał użytkownika jako część danych wejściowych.
Mama Fun Roll

3
W pewnym momencie odpowiedziałbym na Regex, 2 bajty \^
PurkkaKoodari

14
Myślę, że powinieneś to powtórzyć dla następnych 1000 wiadomości i zobaczyć, który z nich naprawdę przewiduje gwiazdkę
o

Odpowiedzi:


29

Siatkówka , 50 bajtów, 71,8% 72,15%

^.*([[CE;ಠ-ﭏ]|tar|ol|l.x|eo|a.u|pin|nu|o.f|"$)

Wypróbowałem trochę golfa regularnego za sugestią @ MartinBüttner. Pasuje do 704 wiadomości oznaczonych gwiazdką i nie pasuje do 739 wiadomości oznaczonych gwiazdką.

Ma ^.*( ... )to na celu upewnienie się, że zawsze występuje dopasowanie 0 lub 1, ponieważ Retina domyślnie wyświetla liczbę dopasowań. Możesz ocenić program na plikach wejściowych, przygotowując się m`do trybu multilinii, a następnie uruchamiając

Retina stars.retina < starred.txt

i podobnie dla unstarred.txt.


Analiza / wyjaśnienie

Wygenerowałem powyższe fragmenty (i wiele innych) za pomocą programu, a następnie wybrałem te, które chciałem ręcznie. Oto intuicja, dlaczego powyższe fragmenty działają:

  • C: Mecze PPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: Mecze @ETHproductions,@El'endiaStarman
  • ;: Ponieważ przypadki testowe są w formacie HTML, odpowiada to &lt;i&gt;
  • ಠ-ﭏ: Pasuje do zakresu znaków Unicode, najbardziej widocznych dla ಠ_ಠi@Doorknob冰
  • tar: Dopasowuje odmiany star, @El'endiaStarman(ponownie), a także tych, gravatarktóre pojawiają się w oneboxes opublikowanych przez nowe posty botów
  • ol: Mecze, rel="nofollow"które znajdują się w wielu linkach i oneboxach
  • l.x: Mecze @AlexA.,@trichoplax
  • eo: Głównie pasuje people, ale także trzy przypadki dla@Geobits
  • a.u: Głównie mecze graduation, status, featureiabuse
  • pin: Dopasowania pingi słowa kończące się na ping. Pasuje również do kilku postów w dyskusji na temat pineapple, jako przykład nadmiernego dopasowania.
  • nu: Pasuje do mieszanego zestawu słów, z których najczęściej występuje number
  • o.f: Mecze golf,conf(irm|use)
  • "$: Dopasowuje podwójny cudzysłów jako ostatni znak, np @phase He means "Jenga."

Nie [ma w tym nic specjalnego - właśnie zostałem z postaci, więc pomyślałem, że mogę użyć jej do dopasowania jeszcze jednego przypadku.


(Nie opublikowałem jeszcze kodu testowego, ponieważ wydaje się, że działa dość wolno i chciałbym dowiedzieć się, dlaczego. Teraz jednak jest już za późno.)
Sp3000,

1
Wykonanie Retina jeden raz dla każdego przypadku testowego zajmie dużo czasu. Tryb wieloliniowy niemal natychmiast zgłasza deklarowany wynik.
Dennis,

@Dennis Dzięki, zupełnie zapomniałem, że mogę to zrobić.
Sp3000,

3
LOL, teraz moje imię to magnes gwiazdowy?
ETHproductions

18

JavaScript ES6, 50 bajtów, 71,10%

Prawidłowo identyfikuje 670 gwiazdek i 752 gwiazdek.

x=>/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)

Przekrocz barierę 70% i pokonaj wszystkich oprócz Retiny!

Zwraca, truejeśli wiadomość zawiera jedną z następujących rzeczy:

  • Słowo z których druga litera to D, E, R, lub v;
  • tar(zwykle star);
  • ai uz jednym char między;
  • li xz jednym znakiem pomiędzy (zwykle alex);
  • kursywą;
  • eolub ol;
  • C, średnik, albo .

Oto kilka bardziej owocnych meczów, które nie wydają się warte pozbycia się innych:

  • nf
  • nu
  • yp
  • n.m

To coraz bardziej zbliża się do odpowiedzi Retiny, ale większość ulepszeń znalazłem na własną rękę.

Przetestować go w konsoli jednej z tych stron: teksty gwiazdkowe , teksty NO-gwiazdkowe

var r=document.body.textContent.replace(/\n<br/g,"<br").split("\n").slice(0,-1);
var s=r.filter(function(x){return/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)}).length;
console.log("Total:",r.length,"Matched:",s,"Not matched:",r.length-s);

Oto alternatywna wersja. /a/.testjest technicznie funkcją, ale nie spełnia naszych kryteriów :

/ .[ERv]|a.u|l.x|<i|eo|yp|ol|nf|tar|[C;ÿ-ff]/.test

To daje 71,90% (697 z gwiazdkami, 741 bez gwiazdek).


Przeprowadziłem kilka analiz na listach, aby zobaczyć, które grupy wyrażeń regularnych pasują do najbardziej oznaczonych gwiazdką i najmniej nieoznaczonych postów. Analizy można znaleźć w tym Gist . Do tej pory sprawdziłem aai a.adopasowałem. a.uspada na około 50 z wynikiem 28, ale jest to najbardziej efektywne dopasowanie w swoim formacie ...


Jest tylko 1000 wiadomości ...?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Niektóre były wielowierszowe, co nie zostało uwzględnione we fragmencie. Zostało to naprawione.
ETHprodukcje

Dlaczego nikt nie używa /regexp/.test()? Myślę, że można w tym przypadku ściśnąć jeszcze kilka.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳

8
Dzisiaj dowiedziałem się, że mogę uzyskać gwiazdki na czacie, wypowiadając własne imię.
Alex A.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Dzięki, nie wiem, jak o tym nie pomyślałem
ETHproductions

15

Pyth, 50 bajtów, 67,9%

0000000: 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46 69 b5 9d  !@jC"..]....\.Fi..
0000012: 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24 63 f8 bd  B.u.tq..y..].%$c..
0000024: 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 7a              .SE...1f_."2Cz

Spowoduje to zakodowanie danych wejściowych w jednym z 322 segmentów i wybranie wartości logicznej w zależności od tego segmentu.

Punktacja

$ xxd -c 18 -g 1 startest.pyth
0000000: 72 53 6d 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46  rSm!@jC"..]....\.F
0000012: 69 b5 9d 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24  i..B.u.tq..y..].%$
0000024: 63 f8 bd 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 64 2e  c...SE...1f_."2Cd.
0000036: 7a 38                                                  z8
$ echo $LANG
en_US
$ pyth/pyth.py startest.pyth < starred.txt
[[345, False], [655, True]]
$ pyth/pyth.py startest.pyth < unstarred.txt
[[703, False], [297, True]]

14

CJam, 45 bajtów, 65,55%

l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|

To sprawdza, czy pierwszy znak znajduje się na określonej liście, czy suma wszystkich punktów kodowych jest większa niż 8672.

Punktacja

$ cat startest.cjam
1e3{l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|}*
$ java -jar cjam-0.6.5.jar startest.cjam < starred.txt | fold -1 | sort | uniq -c
    308 0
    692 1
$ java -jar cjam-0.6.5.jar startest.cjam < unstarred.txt | fold -1 | sort | uniq -c
    619 0
    381 1

+1 za nauczenie mnie o foldpoleceniu wraz z faktyczną odpowiedzią.
Klamka

6

Matlab / Octave, 17 bajtów 60,15%

Prawidłowo klasyfikuje 490 wiadomości jako zapatrzonych, 713 wiadomości jako niezauważonych

Obecna wersja:

Sprawdzam tylko długość.

f=@(w)numel(w)>58

Stara wersja:

Może być przetłumaczony na inny język. Sprawdza tylko, czy wiadomość zawiera słowo gwiazda, czy nie.score: 59/911/52.5%

f=@(w)nnz(strfind(lower(w),'star'))>0 %

Wyniki dla przypadków testowych wykorzystujących ten kod:

slCharacterEncoding('UTF-8');

fid = fopen('codegolf_starred_messages_starred.txt');
line = fgetl(fid);
starred = 0;
while ischar(line)
    if f(line);
        starred = starred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);


fid = fopen('codegolf_starred_messages_unstarred.txt');
line = fgetl(fid);
unstarred = 0;
while ischar(line)
    if ~f(line);
        unstarred = unstarred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);

disp(['  correctly classified as *ed: ',num2str(starred)])
disp(['correctly classified as un*ed: ',num2str(unstarred)])
disp(['                  total score: ',num2str((starred+unstarred)/20),'\%'])

3

CJam, 32 bajty, łączny wynik 0,5605 (56%).

Prawidłowo identyfikuje 428 wiadomości oznaczonych gwiazdką i 693 wiadomości oznaczonych gwiazdką. Całkowity wynik to (360+730)/2000=0.545.

l_el"sta"/,1>\,)4%!|

Nie spodziewając się wygranej, nie widzę, jak się zachowuje. Powyżej znajduje się kod pojedynczej wiadomości, do wielokrotnego uruchamiania tej zmodyfikowanej wersji, która zwraca ilość wiadomości oznaczonych gwiazdką:

1000{l_el"star"/,1>\,)6%!|}fA]:+

Po prostu przetestuj go, gdy STDIN jest surowym tekstem dowolnego pliku. Zwraca true, jeśli wiadomość zawiera „gwiazdkę” lub jeśli length + 1 mod 4 = 0.


2
Więc ... jeśli cztery dzielą jeden więcej niż długość wiadomości, to ma szansę zostać gwiazdką?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tak, ale zapewnia wysoki wynik
GamrCorps

3

JavaScript ES6, 0,615 = 61,5%

342 poprawnie oznaczone jako oznaczone gwiazdką, 888 poprawnie oznaczone jako oznaczone gwiazdką, (342+888)/2000 = 0.615

x=>-~x.search(/(bo|le)x|sta|ಠ|ツ/i)

Przetestuj w ten lub inny sposób :

r=document.body.innerHTML.replace(/<\/*pre>/g,"").split`
`.filter(x=>-~x.search`(bo|le)x|sta|ಠ|ツ`).length

Wciąż mogę cię zdobyć, moja piękna!


1
Mam cię teraz;)
ETHproductions

@ETHproductions GG. Poszukam bardziej typowych wzorów.
Conor O'Brien

3

Siatkówka, 46 bajtów, 68,55

^.*([zj_C;&¡-ff]|sta|san|soc|bo|eo|xk|l.x|<.>)

679 gwiazdka: 692 unstar

Przełączono na Retinę, aby uzyskać więcej wyrażeń regularnych w ... Nadal nie gotowe.


O tak, zapomniałem o tym. Naprawię to.
Mama Fun Roll

1

C # 6.0 (.NET Framework 4.6), 50 bajtów, 63,60%

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");

Program używany do celów testowych:

void Main()
{
    var starred = @"C:\starred.txt";
    var unstarred = @"C:\unstarred.txt";

    var linesStarred = File.ReadAllLines(starred);
    var linesUnstarred = File.ReadAllLines(unstarred);

    var cls = linesStarred.Count();
    var clsc = 0;

    foreach (var line in linesStarred)
    {
        if ( s(line) ) clsc++;
    }

    var clu = linesUnstarred.Count();
    var cluc = 0;

    foreach (var line in linesUnstarred)
    {
        if (!s(line)) cluc++;
    }

    $"Starred {clsc}/{cls} correct ({(clsc/cls*100):0.00}%)".Dump();
    $"Unstarred {cluc}/{clu} correct ({(cluc /clu*100):0.00}%)".Dump();
    $"{(((clsc+cluc)/(decimal)(cls+clu))*100):0.00}".Dump();
}

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.