Qual é a palavra mais frequente?
Dada uma frase, seu programa deve passar por ela, contando as frequências de cada palavra e, em seguida, produzir a palavra mais usada. Como uma sentença não possui um comprimento fixo e pode ser muito longa, seu código deve ser o mais curto possível.
Regras / Requisitos
- Cada envio deve ser um programa ou função completo. Se for uma função, deve ser executável, bastando adicionar a chamada de função na parte inferior do programa. Qualquer outra coisa (por exemplo, cabeçalhos em C) deve ser incluída.
- Deve haver um intérprete / compilador gratuito disponível para o seu idioma.
- Se possível, forneça um link para um site onde seu programa possa ser testado.
- Seu programa não deve escrever nada para
STDERR
.
- Seu programa deve receber informações
STDIN
(ou a alternativa mais próxima em seu idioma).
- As brechas padrão são proibidas.
- Seu programa deve fazer distinção entre maiúsculas e minúsculas (
tHe
, The
e the
todos contribuem para a contagem de the
).
- Se não houver uma palavra mais frequente (consulte o caso de teste nº 3), seu programa não produzirá nada.
Definição de uma 'palavra':
Você obtém a lista de palavras dividindo o texto de entrada em espaços. A entrada nunca conterá nenhum outro tipo de espaço em branco além dos espaços simples (em particular, não há novas linhas). No entanto, as palavras finais devem conter apenas alfanuméricos (az, AZ, 0-9), hífens (-) e apóstrofes ('). Você pode fazer isso removendo todos os outros caracteres ou substituindo-os pelo espaço antes de dividir a palavra. Para permanecer compatível com versões anteriores das regras, não é necessário incluir apóstrofos.
Casos de teste
The man walked down the road.
==> the
-----
Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
==> he
-----
This sentence has no most frequent word.
==>
-----
"That's... that's... that is just terrible!" he said.
==> that's / thats
-----
The old-fashioned man ate an old-fashioned cake.
==> old-fashioned
-----
IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
==> IPv6
-----
This sentence with words has at most two equal most frequent words.
==>
Nota: O terceiro e o sétimo casos de teste não têm saída; você pode escolher um no quarto.
Pontuação
Os programas são pontuados de acordo com os bytes. O conjunto de caracteres usual é UTF-8; se você estiver usando outro, especifique.
Quando o desafio terminar, o programa com o mínimo de bytes (chamado código-golfe ) vencerá.
Submissões
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
/* Configuration */
var QUESTION_ID = 79576; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 53406; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
don't d'ont dont a a
? Seriadont
?dont
,. Se nãoa
,. mas a maioria dos envios sim, e por issodont
é uma resposta correta.ipv6
saída é válida para o último caso de teste?Respostas:
Pyke,
2625 bytesExperimente aqui!
Ou
2322 bytes (não-competidor, adicione um nó onde mata a pilha se falso)Experimente aqui!
Ou com pontuação, 23 bytes (acho que isso concorre? Confirmar antes da edição)
Experimente aqui!
Ou 12 bytes (definitivamente não competitivo)
Experimente aqui!
fonte
-
e'
(hífen e apóstrofo).Gelatina , 25 bytes
Experimente online! ou verifique todos os casos de teste .
fonte
Pitão -
2330 bytesTem que haver uma maneira melhor de incluir dígitos e hífens, mas eu só quero consertar isso agora.
Conjunto de Teste .
fonte
Oitava,
11594 bytesContas para o caso sem a palavra mais frequente usando
try
. Nesse caso, ele não gera nada e "faz uma pausa" até capturar a exceção.Economizou 21 (!) Bytes graças à sugestão de Luis Mendo (usando a terceira saída de
mode
para obter a palavra mais comum).As regras mudaram bastante desde que postei minha resposta original. Vou examinar o regex mais tarde.
fonte
mode
emc
talvez? Sua terceira saída fornece todos os valores vinculados, se bem me lembro['\w\d]
porque você precisa preservar apóstrofos e dígitos. A menos que essas estejam entre maiúsculas e minúsculas no ASCII, nesse caso, me ignore porque não tenho uma tabela à mão.[~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])
dáout = {1 2}
Perl 6, 80 bytes
Vamos dividir a resposta em duas partes ...
given
é uma declaração de controle (comoif
oufor
). No Perl 6, eles são permitidos como correções posteriores. (a if 1
, ou como aquifoo given 3
).given
coloca seu tópico (lado direito) na variável especial$_
do lado esquerdo.O próprio "tópico" em minúsculas (
lc
), divide-se por palavra (words
), coloca os valores em um saco (definido com o número de ocorrências) e depois classifica por valor (DESC). Comosort
só sabe operar em listas, oBag
é transformado em umList
dosPair
aqui.uma condicional simples (
?? !!
são usadas no Perl 6, em vez de? :
).Apenas verifica se a lista possui mais de um elemento.
Os acessos
$_
podem ser encurtados ... Não especificando a variável..a
é exatamente como$_.a
. Portanto, isso é efetivamente "os dois principais elementos têm o mesmo número de ocorrências" - nesse caso, imprimimos '' (a sequência vazia).Caso contrário, vamos imprimir a chave do elemento superior (a contagem):
.[0].key
.fonte
value??!!
(eu sei que é um operador ternário, é só entreter)05AB1E , 30 bytes
Código:
Usa a codificação CP-1252 . Experimente online! .
fonte
I
comando, 05AB1E levará apenas o necessário.JavaScript (ES6), 155 bytes
Baseado na resposta Python do @ Blue.
fonte
Python 3.5,
142137134112117110127 bytes:( +17 bytes, porque, aparentemente, mesmo que haja palavras mais frequentes que as demais, mas elas tenham a mesma frequência, nada deve ser retornado. )
Agora deve satisfazer todas as condições. Este envio pressupõe que pelo menos 1 palavra seja inserida.
Experimente Online! (Ideona)
Além disso, se você quiser uma, aqui está outra versão da minha função sem expressões regulares ao custo de cerca de 43 bytes, embora essa seja de qualquer maneira não competitiva, portanto, isso realmente não importa. Acabei de colocá-lo aqui para o inferno:
Experimente esta nova versão online! (Ideona)
fonte
That's
é uma contração porquethat is
considerandothats
não é realmente uma palavra.Ruby,
9492102 bytesPreciso ir rápido (resposta do FGITW). Retorna a palavra em letras maiúsculas ou
nil
se não houver uma palavra mais frequente.Agora atualizado para novas especificações, eu acho. No entanto, eu consegui um pouco de golfe, então a contagem de bytes é a mesma!
fonte
Gotta go fast
?Pitão, 32 bytes
Suíte de teste.
fonte
JavaScript (ES6), 99 bytes
fonte
Sqlserver 2008, 250 bytes
Experimente online!
Sqlserver 2016, 174 bytes
Não foi possível manipular dados como este exemplo (contando os iguais como 3 palavras):
fonte
GROUP BY, LEFT JOIN, or PARTITION BY
funções adicionais do Anyway SQL Server incorporadas na SPLIT. Demonstração Ungolfed fique à vontade para torná-lo o mais curto possível.PostgreSQL,
246, 245 bytesSaída:
Entrada se alguém estiver interessado:
Normalmente eu usaria
MODE() WITHIN GROUP(...)
e será muito mais curto, mas violará:EDITAR:
Manuseio
'
:SqlFiddleDemo
Saída:
fonte
R, 115 bytes
Esta é uma função que aceita uma string e retorna uma string se uma única palavra aparecer com mais frequência do que outras
NULL
. Para chamá-lo, atribua-o a uma variável.Ungolfed:
fonte
Retina, 97 bytes
As regras continuam mudando ...
Experimente online!
Suíte de teste.
fonte
a
ser a palavra mais comum)Python, 132 bytes
O código acima pressupõe que a entrada tenha pelo menos duas palavras.
fonte
\w
inclui sublinhados.PHP, 223 bytes
fonte
Python 2, 218 bytes
Pressupõe mais de 2 palavras. Livrar-se da pontuação me destruiu ...
fonte
',-
etc?sorted
uma tupla em vez de precisar indexar manualmente na matriz?Matlab (225)
.
Caixa de ferramentas é necessária para executar isso.
Como isso funciona, um dos privilégios mais agradáveis do regex substitui no matlab: ele executa tokens em campo, chamando funções ambientais externas parametrizadas pelos tokens capturados no ambiente interno; portanto, qualquer sequência de
"Word_A Word_B .."
é substituída por números inteiros"A0 A1 A2 B0 B1 B2 ..."
onde o primeiro número inteiro é a assinatura Numerica ascii da palavra, o segundo é o índice inicial, o terceiro é o índice terminando, estes dois últimos números inteiros não reduplicate em toda a seqüência para que eu tirei essa vantagem para transpô-la para uma matriz, em seguida, o modo que, em seguida, procurar o resultem nessa matriz, portanto os índices inicial / final serão seguidos.Editar: após alterar alguns detalhes, o programa é chamado de função por um parâmetro de string.
Com 20 bytes salvos graças ao @StewieGriffin, 30 bytes adicionaram críticas a brechas acordadas em comum.
fonte
05AB1E ,
222120 bytesExplicação:
Nota: Se você estiver bem com as novas linhas à direita na saída para quando não deve produzir nada, remova a
?
no final para salvar um byte.Nota 2: O programa não funcionará com uma única palavra, mas duvido que isso seja um problema. Se você quiser corrigir isso, substitua
#
comð¡
para um byte extra.05AB1E usa CP-1252 como o conjunto de caracteres, não UTF-8.
Experimente online!
fonte
Perl,
60565554 bytesInclui +3 para
-p
Se uma palavra não puder ser apenas um número, você também pode largar a
a
53 para obter uma pontuação.fonte
-anE
não conta? Ele faz na outra resposta (2 bytes para-p
flag) ...E
não contam. A outra resposta normalmente precisaria apenas de +1 para-p
, mas a solução dele tem,'
portanto, não pode ser vista como uma extensão de-e
ou-E
. Portanto, ele deve contar de fato +3 (não +2), pois deve contar o espaço e o hífen (mas todas as opções extras seriam apenas +1).[\pL\d-]
parece que ele pode ter sido reduzido a[\w-]
(a menos que nos importemos com sublinhados), mas qualquer versão reportará emthat
vez dethat's
outhats
para o teste 4. Caso contrário, você precisará adicionar 4 bytes para inserir\x27
nessa classe de caracteres (a menos que você tenha uma maneira melhor de adicionar um apóstrofo).PowerShell (v4), 117 bytes
A primeira parte é fácil:
$input
é ~ = stdinGroup
por frequência (~ = coleções do Python.Counter),Sort
para colocar as palavras mais frequentes no final.Manipulação se não houver uma palavra mais frequente:
Use o golfe falso-ternário-operador do índice bool-como-array-index
(0,1)[truthyvalue]
, aninhado, para escolher "", $ z ou $ y como saída e, em seguida, use .Name.fonte
Lua,
232199175 bytesfonte
if not w[x]then w[x]=0 end w[x]=w[x]+1 end
->w[x]=(w[x]or0)+1
if m==v then o=''end
->o=m==v and '' or o
Perl 5,
969284 + 2 (-p
sinalizador) = 86 bytesUsando:
fonte
-p
bandeira deve invocar uma penalidade de 3 bytes. As regras são aproximadamente: Cada sinalizador de linha de comando tem +1 byte, pois são quantos bytes extras você precisa para estender seu-e'code'
estilo de linha de comando livre . Então normalmente-p
é de apenas um byte. Mas aqui o seu código possui,'
para que não possa ser executado simplesmente a partir da linha de comando sem escapar. Portanto, nenhuma combinação com-e
e o-
espaço antes dop
são extras e devem ser contados também-p
flag) se você invocá-lo na linha de comando comoperl -pe'…'
(disponibilizado pela remoção da'
conforme observado nos primeiros comentários)Python, 158 bytes
Recebe sua entrada assim:
Deve corresponder a todos os requisitos, embora falhe em cadeias vazias, é necessário verificar esses requisitos? Desculpe o atraso.
Dicas de conselhos / feedback / magia negra para salvar bytes são sempre bem-vindos
fonte
That
como ocorrências da palavra,that
pois a primeira começa com maiúsculaT
e a segunda com minúsculat
. Além disso, isso NÃO remove todas as outras formas de pontuação, exceto hífens (-
) e, opcionalmente, apóstrofes ('
) e, como resultado, isso NÃO funcionaria no quarto caso de teste fornecido na pergunta.This sentence has no most frequent word.
) como exemplo, sua função é exibida[('This', 1)]
, quando, em vez disso, não deveria estar produzindo nada. Eu poderia continuar falando sobre mais problemas, então recomendo corrigi-los o mais rápido possível.\w
inclui sublinhados.Tcl 8.6, 196 bytes
(Infelizmente, não consigo descobrir como obtê-lo menor do que isso ...)
Explicação
Ele usa vários idiomas obscuros do Tcl para fazer coisas.
[join [read stdin] " "]
- string de entrada → lista de palavras separadas por espaços em brancolmap ...
- itere sobre todos os elementos dessa lista. (Mais curtoforeach
e efetivamente idêntico, pois o resultado é descartado.)[regsub ... [string tolower ...]]
- Converta a string em minúscula e retire todos os caracteres, exceto os caracteres da palavra e o hífen.[dict incr d ...]
- Crie / modifique um dicionário / palavra → conte o histograma.set y ...
- Ordene os valores do dicionário, pegue o maior e retorne todos os pares (chave, valor) correspondentes a ele.if...
- Deve haver exatamente dois elementos: um único par (chave, valor), caso contrário não há nada para imprimir.puts...
- Imprima a chave no par de valores-chave, se houver. (Nenhuma palavra tem espaços.)Você pode jogar usando o CodeChef .
fonte
Rexx,
109128122 bytesMuito impresso ...
fonte
bash,
153146131154 154149137bytesOperação:
declare uma matriz associativa F de números inteiros (declare -iA F)
f é uma função que, dado um parâmetro de palavra $ 1, incrementa a contagem de frequências para esta palavra (T = ++ F [$ 1]) e se compara à contagem máxima até o momento (M).
Se for igual, temos um empate para não considerarmos essa palavra mais frequente (I =)
Se for maior que a contagem máxima até agora (M), defina a contagem máxima até agora para a contagem de frequência dessa palavra até agora (M = $ T) e lembre-se dessa palavra (I = $ 1)
Função final f
Leia uma linha (leia L) Torne minúsculas (L = $ {L ,,}) Remova qualquer caractere, exceto az, 0-9, traço (-) e espaço (L = $ {L // [^ - a-z0- 9]}) Faça uma sequência de instruções bash que chame f para cada palavra (printf -vA "f% s;" $ L). Isso é salvo na variável A. eval A e resultado da impressão (eval $ a; echo $ I)
Saída:
Bug: CORRIGIDO Eu tenho um bug que não é revelado nesses casos de teste. Se a entrada for
então meu código não deve produzir nada.
Eu tenho uma correção, mas parece ter atingido um erro do bash ... Recebo um comportamento muito estranho: M não é declarado um número inteiro: ++ F [$ 1] == M (depois de algumas palavras repetidas) aumenta os dois F [$ 1 ] e M !!- meu erro.fonte
Python 3,
7698100 bytesExperimente online
Emite a palavra mais comum como minúscula. Não inclui apóstrofes porque "não é necessário que apóstrofos sejam incluídos".
statistics.mode
requer Python 3.4Infelizmente, nenhuma saída para
stderr
é permitida ou seria muito menor.fonte
STDERR
, a menos que este programa não produza nenhum erro de saída?i- test i-
R, 96 bytes
19 bytes mais curtos que a resposta R existente , com uma abordagem um pouco diferente.
Lê do stdin, para que a entrada seja automaticamente separada por espaços. Convertemos para minúsculas e usamos
gsub
para remover todos os não alfanuméricos (mais-
e'
). Contamos as instâncias de cada palavratable
e salvamos o resultado emt
. Em seguida, verificamos se há mais de 1 no máximot
(verificando se há mais de um elemento igual amax(t)
. Se houver, retornamos a string vazia''
. Caso contrário, retornamos a palavra correspondente ao máximo emt
.fonte