Czytanie wiadomości jest nudne. Pomóż mi!

22

Wszyscy wiedzą, że wiadomość jest nudna. Naprawdę nudno . Chyba że chodzi o polityków i ich skandale. To jest zabawa! Ale niestety politycy mogą popełnić tylko tyle skandali. Zatrudniam cię, aby wiadomości były ciekawsze.

Cel Biorąc pod uwagę fragment kodu HTML, wykonaj wszystkie podstawienia znalezione tutaj , to znaczy na tym obrazku:

ALE nie powinieneś samodzielnie edytować żadnych tagów HTML. Prawidłowe słowo nazywam dowolnym słowem, które nie znajduje się w tagu HTML ani w jego atrybutach. Oznacza to, że nie powinno zastąpić <div class="smartphone">iPhone</div>się <div class="pokedex">iPhone</div>, ale należy wymienić <div>election</div>z <div>eating contest</div>.

Zasady analizowania

  • EDYCJA Powinieneś dopasowywać tylko słowa wyznaczone przez nie-słowo. Oznacza to, że powinieneś dopasowywać tylko pełne słowa. (Np. Dopasuj „Witaj świadku”, ale nie „Hellowitness”, „Hellow itness” lub „Witnesspacelection”.
  • Jeśli nie możesz wpisać znaku na klawiaturze, powinieneś wyświetlić najbliższy odpowiednik. (Np. „Smartfon” naprawdę stałby się „Pokedex”)
  • Skrzynia z pierwszą literą lub cała litera musi zostać zachowana. (Np. „Rzekomo umarli” zamienia się w „prawdopodobnie pewnie umarli”, „rzekomo umarli” staje się „pewnie umarli”, a „WYBÓR!” Staje się „KONKURSEM JEDZENIA!”, Podczas gdy „SPAcE” staje się „Spaaace” i „NEW STUDY” zmieniają się w „post tumblr”)
  • Wszystkie przypadki muszą być dopasowane. (Tj. Musisz dopasować słowo, niezależnie od jego wielkiej litery).
  • Każdy przypadek, w którym a <vowel>zostanie spełniony, powinien stać się an <vowel>i odwrotnie . (Np. „Senator” staje się „Władcą elfów”) Nie musisz tego robić za każdym razem, ale przynajmniej dla własnych zastępców.
  • Wszystko w liczbie mnogiej musi również zachować liczbę mnogą w tłumaczeniu (np. „Smartfony” stają się „pokedex”, a „Spaces” stają się „Spaaaces”)
  • Wszystko w określonym czasie musi pozostać w tym czasie w tłumaczeniu. (Np. „Rebuilt” staje się „Avenged”, „Rebuilds” zmienia się w „Avenges” itp.)
  • Wszystko w liczbie pojedynczej musi pozostać liczbą pojedynczą w tłumaczeniu (np. „Lider kongresu” staje się „duchem rzeki”)
  • Jeśli pozycja obejmuje wiele elementów HTML, powinieneś ją dopasować, ale możesz „wyrzucić” dowolne elementy pośrednie. (Np. S<b>pa</b>acePowinien stać się po prostu „spaaace”). Jeśli wpis jest samowystarczalny w ramach jednego elementu, należy go odpowiednio dopasować, a tag zachować.
  • „Świadkowie” powinni zostać „Ci kolesie, których znam”
  • „świadek” powinien stać się „Ten koleś, którego znam”
  • „Świadek” powinien stać się „Ten koleś, którego znam”
  • „Nie można dotrzeć do komentarza” powinno stać się „Jest winny i wszyscy o tym wiedzą”
  • „Nie można się o komentarz skomentować” powinno stać się „Jesteś winny i wszyscy o tym wiedzą”

Bonusy

Jeśli spotkasz -N%bonus, twój new amount = (old amount) * (1 - N/100). Tak więc, jeśli spotkałeś -5%bonus z kodem 500 bajtów, twój new amount = 500 * (1 - 5/100) = 500 * .95 = 475.

  • -5% premii, jeśli za każde wystąpienie „spacji” po pierwszej zamianie dodaje się dodatkowe „a”. Tak więc pierwszym zamiennikiem byłoby „spaaaace”, drugim - „spaaaace”, trzecim - „spaaaaace” itp.
  • -5% premii, jeśli za każdy ważny numer zamienisz ten numer na link do odpowiedniego komiksu XKCD. (Nie musi jeszcze istnieć). Jeśli pójdziesz do tej premii, należy dopasować numery takie jak 500, 3,000, 4 523, i 5.324. (Możesz zamiast tego zastąpić numer obrazem komiksu. Jeśli to zrobisz, zamiast -5%premii, otrzymasz a -15% bonus. Kolejną dodatkową -15%premię, jeśli możesz dodać tekst tytułowy do obrazu, jeśli w ogóle .)
  • -25% premii, jeśli możesz zastąpić jednocześnie wszystkie instancje po prawej stronie obrazu instancjami po lewej. (Np. „Spaaace” staje się „przestrzenią”, „konkurs jedzenia” staje się „wyborami” itp.) Jeśli zdecydujesz się na którykolwiek z bonusów, powinieneś być w stanie przywrócić je do odpowiednich wpisów. (Np. http://www.xkcd.com/542Powinien stać się „542”, a „spaaaaaaaace” powinien stać się „przestrzenią”.)
  • Możesz zdecydować się na minimum 6 zmian, ale za każdą niewykonaną zamianę (oprócz zamiany premii) otrzymasz dodatkową karę + 10%.

Przykładowe IO (bez bonusów)

Input: Witnesses allegedly used their smartphones to commit the crime.
Output: These dudes I know kinda probably used their pokedex to commit the crime.

Input: Mayor Golfalot rebuilt the city after the fatal election.
Output: Mayor Golfalot avenged the city after the fatal eating contest.

Input: This <b>new study</b> shows that people in <span class="space">space</span> cannot be reached for comment.
Output: This <b>tumblr post</b> shows that people in <span class="space">spaaace</span> are guilty and everyone knows it.

Input: <b>g</b><i>oo</i><s>g</s><u>le</u> glass is terrible. :(
Output: virtual boy is terrible. :(

Input: Electric SMARTPHONES have been shown to be more productive when not used by Senators and when not used in cars.
Output: Atomic POKEDEX have been shown to be more productive when not used by Elf-lords and when not used in cats.

Input: Homeland Security has been established as an evil foundation, especially in space.
Output: Homestar runner has been established as an evil foundation, especially in spaaace.

Input: The congressional leaders are testy today.
Output: The river spirits are testy today.

Input: SPACE is not a Senator or a cAR.
Output: SPAAACE is not an Elf-lord or a cat.

Input: Mr. Biz is running for reelection.
Output: Mr. Biz is running for reelection.

Input: Google   glass !
Output: Virtual boy !

Input: New (or old) study
Output: New (or old) study

To jest , więc wygrywa najkrótszy program w bajtach.

Conor O'Brien
źródło
Czym powinna być „Witnessespace”?
lirtosiast
@ThomasKwa „Witnessespace”. Nie dopasowuj niepełnych słów.
Conor O'Brien,
Związane z?
Rozpad beta w dniu
3
To wygląda na ciekawe wyzwanie. Niedługo będę musiał spróbować
Sam Weaver,
1
@DomHastings Tak, mogę; nie będzie żadnych nieprawidłowych danych wejściowych ani tagów samozamykających się (np. <br/>)
Conor O'Brien

Odpowiedzi:

8

Perl 5 , 850

Wiele wyrażeń regularnych używanych lub generowanych.
Skrót% l jest używany do powtarzania słów.

%l=qw(A avenge B _be_reached_for_comment C could D dude E pokedex G google_glass I _I_know K river_spirit L congressional_leader P smartphone 4 rebuil N new_stud T tumblr_post V virtual_boy W witness Y _guilty_and_everyone_knows_it);$t="G,V;Ges,Vs;Ps,E;P,E;4d,A;4t,Ad;Nies,Ts;Ny,T;Wes,these DsI;W,this DI;allegedly,kinda probably;cannotB,areY;car,cat;cars,cats;Ls,Ks;L,K;C notB,isY;Cn'tB,isY;election,eating contest;electric,atomic;homeland Security,homestar runner;senator,elf-lord;senators,elf-lords;space,spaaace";$o=$s=$_;$s=~s/\s\s*/ /g;map{$t=~s/$_/$l{$_}/g}keys%l;$t=~s/_/ /g;@L=split/;/,$t;map{my@T=split/,/;push@W,\@T}@L;map{$e=$a=$W[$_][0];$b=$W[$_][1];$U=uc$a;$u=ucfirst$a;$s=~s/(?<![\w"])$U(?![\w"])/\U$b/g;$s=~s/(?<![\w"])$u(?![\w"])/\u$b/g;$s=~s/(?<![\w"])$a(?![\w"])/$b/gi;$e=~s@.@(<.*?>)?$&(</.*?>)?@g;$s=~s/$e /$b /ig;}0..@W;$_=$s.$/

Test

$ cat news.txt |perl -p readingnews.pl
These dudes I know kinda probably used their pokedex to commit the crime.
Mayor Golfalot avenged the city after the fatal eating contest.
This <b>tumblr post</b> shows that people in <span class="space">spaaace</span> are guilty and everyone knows it.
virtual boy is terrible. :(
Atomic POKEDEX have been shown to be more productive when not used by Elf-lords and when not used in cats.
Homestar runner has been established as an evil foundation, especially in spaaace.
The river spirits are testy today.
SPAAACE is not a Elf-lord or a cat.
Mr. Biz is running for reelection.
Virtual boy !
New (or old) study
LukStorms
źródło
Gratulacje za pierwsze miejsce!
Conor O'Brien
9

JavaScript ES6, 954 bajty

Myślałem, że będzie to o wiele łatwiejsze niż było! Początkowo używałem JavaScript, więc mogłem łatwo zejść tylko do węzłów tekstowych i zamienić tam tekst, ale nie o to chodziło, więc skończyłem z tą potwornością! Pomija wszystkie przypadki testowe, z wyjątkiem sytuacji, <b>g</b><i>oo</i><s>g</s><u>le</u> glass is terrible. :(gdy cały ciąg znaków wraca do <b>znacznika z powodu zrównoważenia znaczników. Większość kodu to tabela odnośników i prawdopodobnie wciąż brakuje mi niektórych przypadków krawędzi, ale nie mogłem wymyślić lepszego sposobu na poprawne zarządzanie czasem i jestem pewien, że mógłbym to bardziej skompresować, ale Skończyły mi się pomysły ... Jestem pewien, że wrócę do tego później. Powinienem był użyć Perla, lepszy wybór @LukStorms !

d=document.createElement`div`,u='toUpperCase'
d[i='innerHTML']=prompt``;`the ${w='witness'}es,those dudes I know|${w}es,these dudes I know|the ${w},this dude I know|${w},dude I know|allegedly,kinda probably|new study,tumblr post|new studies,tumblr posts|rebuild,avenge|rebuilt,avenged|space,spaaace|${g='google glass'},virtual boy|${g}es,virtual boys|smartphones,pokédex|smartphone,pokédex|electric,atomic|senator,elf-lord|car,cat|election,eating contest|congressional leader,river spirit|homeland security,homestar runner|could not ${b='be reached for comment'},is${g=' guilty and everyone knows it'}|couldn't be reached for comment,is${g}|cannot be reached for comment,are${g}`[v='split']`|`.map(w=>d[i]=d[i][r='replace'](eval(`/(<[^>]+)?\\b${(w=w[v]`,`)[0][v]``.join`(?:<\\/?[^>]+>)*`[r](/ /g,'\\s+')}(s?)\\b/gi`),(s,q,t)=>[q?s:((!s.match(/[^A-Z]/)?w[1][u]():s.match(/^[A-Z]/)?w[1][r](/^./,q=>q[u]()):w[1])+t),q?0:w[1]=w[1][r](/ce$/,'ace')][0])[r](/\ba(?= [aeiou])/gi,s=>s=="a"?"an":"AN"))
alert(d[i])

Zastosowałem jeden bonus za 5% spaaaceotrzymania dodatkowego apo każdym udanym meczu. Używa alert()zgodnie z sugestią @sysreq , dzięki!

Przykłady

Input: <b>g</b><i>oo</i><s>g</s><u>le</u> glass is terrible. :(
Output: <b>virtual boy is terrible. :(</b>
Input: space. Space? Space! SPACE!
Output: spaaace. Spaaaace? Spaaaaace! SPAAAAAACE!
Input: Smartphones aren't really smart phones, but: SMARTPHONES!
Output: Pokédex aren't really smart phones, but: POKÉDEX!
Input: Senator John Doe was arrested today after attempting to write a new study on the danger of smartphones being used in the car, on his smartphone whilst driving his car. A witness testified to having seen the senator committing the crime. When questioned, Senator Doe "could not be reached for comment". It's unknown if his reputation can be rebuilt and this puts new doubts on the upcoming election. Congressional leaders have yet to comment.
Output: Elf-lord John Doe was arrested today after attempting to write a tumblr post on the danger of pokédex being used in the cat, on his pokédex whilst driving his cat. A dude I know testified to having seen the elf-lord committing the crime. When questioned, Elf-lord Doe "is guilty and everyone knows it". It's unknown if his reputation can be avenged and this puts new doubts on the upcoming eating contest. River spirits have yet to comment.

Bonus: bookmarklet

Uruchom to w konsoli, aby zaktualizować tekst w miejscu:

d=document.body;`the ${w='witness'}es,those dudes I know|${w}es,these dudes I know|the ${w},this dude I know|${w},dude I know|allegedly,kinda probably|new study,tumblr post|new studies,tumblr posts|rebuild,avenge|rebuilt,avenged|space,spaaace|${g='google glass'},virtual boy|${g}es,virtual boys|smartphones,pokédex|smartphone,pokédex|electric,atomic|senator,elf-lord|car,cat|election,eating contest|congressional leader,river spirit|homeland security,homestar runner|could not ${b='be reached for comment'},is${g=' guilty and everyone knows it'}|couldn't be reached for comment,is${g}|cannot be reached for comment,are${g}`[v='split']`|`.map(w=>d[i='innerHTML']=d[i][r='replace'](eval('/(<[^>]+)?\\b'+(w=w[v]`,`)[0][v]``.join`(?:<\\/?[^>]+>)*`[r](/ /g,'\\s+')+'(s)?\\b/gi'),(s,q,t)=>[q?s:((s.match(/^[A-Z]+$/)?w[1].toUpperCase():s.match(/^[A-Z]/)?w[1][r](/^./,q=>q.toUpperCase()):w[1])+(t||"")),q?0:w[1]=w[1][r](/ce$/,'ace')][0])[r](/\ba ([aeiou])/gi,(s,t)=>s[0]=="a"?"an "+t:"AN "+t))
Dom Hastings
źródło
2
alertjest krótszy niż console.logpod warunkiem, że działa w przeglądarce.
kot
<b>Tag „problem” jest całkowicie dopuszczalne, jeśli nie bardziej akceptowalne. I uwielbiam ostatni przykład. Próbowałem wymyślić taki, który zawiera większość z nich. Gratulujemy pierwszej odpowiedzi! Jestem pewien, że jest konkurencyjny;)
Conor O'Brien