¿Cuál es la palabra más frecuente?
Dada una oración, su programa debe atravesarla, contando las frecuencias de cada palabra, luego generar la palabra más utilizada. Debido a que una oración no tiene una longitud fija y, por lo tanto, puede ser muy larga, su código debe ser lo más corto posible.
Reglas / requisitos
- Cada presentación debe ser un programa completo o una función. Si es una función, debe ser ejecutable solo necesitando agregar la llamada a la función al final del programa. Cualquier otra cosa (por ejemplo, encabezados en C), debe incluirse.
- Debe haber un intérprete / compilador gratuito disponible para su idioma.
- Si es posible, proporcione un enlace a un sitio donde se pueda probar su programa.
- Su programa no debe escribirle nada
STDERR
.
- Su programa debe recibir información de
STDIN
(o la alternativa más cercana en su idioma).
- Las lagunas estándar están prohibidas.
- Su programa debe ser sensible a las mayúsculas (
tHe
, The
y the
contribuir a la cuenta de the
).
- Si no hay una palabra más frecuente (vea el caso de prueba # 3), su programa no debería generar nada.
Definición de una 'palabra':
Obtiene la lista de palabras dividiendo el texto de entrada en espacios. La entrada nunca contendrá ningún otro tipo de espacio en blanco que los espacios simples (en particular, no hay líneas nuevas). Sin embargo, las palabras finales solo deben contener caracteres alfanuméricos (az, AZ, 0-9), guiones (-) y apóstrofes ('). Puede hacerlo eliminando todos los demás caracteres o reemplazándolos por espacios antes de dividir la palabra. Para seguir siendo compatible con versiones anteriores de las reglas, no es necesario incluir apóstrofes.
Casos de prueba
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: Los casos de prueba tercero y séptimo no tienen salida, puede elegir cualquiera de los cuatro.
Tanteo
Los programas se puntúan según los bytes. El juego de caracteres habitual es UTF-8; si está utilizando otro, especifíquelo.
Cuando finalice el desafío, el programa con la menor cantidad de bytes (se llama code-golf ), ganará.
Envíos
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores 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
? ¿Lo seríadont
?dont
. Si no es así,a
. pero la mayoría de las presentaciones lo hacen, por lo quedont
es una respuesta correcta.ipv6
una salida válida para el último caso de prueba?Respuestas:
Pyke,
2625 bytesPruébalo aquí!
O
2322 bytes (sin competencia, agregue el nodo donde mata la pila si es falso)Pruébalo aquí!
O con puntuación, 23 bytes (creo que esto compite? Comprometerse antes de la edición)
Pruébalo aquí!
O 12 bytes (definitivamente sin competencia)
Pruébalo aquí!
fuente
-
y'
(guión y apóstrofe).Jalea , 25 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
fuente
Pyth -
2330 bytesTiene que haber una mejor manera de incluir dígitos y guiones, pero solo quiero arreglar esto ahora.
Test Suite .
fuente
Octava,
11594 bytesCuentas para el caso sin palabras más frecuentes mediante el uso
try
. En este caso, no genera nada y "toma un descanso" hasta que detecta la excepción.Ahorró 21 (!) Bytes gracias a la sugerencia de Luis Mendo (usando la tercera salida de
mode
para obtener la palabra más común).Las reglas han cambiado bastante desde que publiqué mi respuesta original. Veré la expresión regular más tarde.
fuente
mode
enc
tal vez? Su tercer resultado da todos los valores vinculados, si mal no recuerdo['\w\d]
porque tienes que preservar los apóstrofes y los dígitos. A menos que estén entre mayúsculas y minúsculas en ASCII, en cuyo caso ignóreme porque no tengo una tabla a mano.[~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])
daout = {1 2}
Perl 6, 80 bytes
Dividamos la respuesta en dos partes ...
given
es una declaración de control (comoif
ofor
). En Perl 6, están permitidos como postfixes. (a if 1
o como aquífoo given 3
)given
pone su tema (lado derecho) en la variable especial$_
para su lado izquierdo.El "tema" en minúsculas (
lc
), se divide por palabra (words
), coloca los valores en una bolsa (conjunto con número de ocurrencias), luego se ordena por valor (DESC). Comosort
solo sabe cómo operar en listas, aquíBag
se transforma en unaList
dePair
s.un condicional simple (
?? !!
se usa en Perl 6, en lugar de? :
).Simplemente verifica que la lista tenga más de un elemento.
Los accesos a
$_
se pueden acortar ... Al no especificar la variable..a
es exactamente igual$_.a
. Entonces esto es efectivamente "¿tienen los dos elementos superiores el mismo número de ocurrencias? - Si es así, imprimimos" (la cadena vacía).De lo contrario, es la impresión de la clave del elemento superior (la cuenta):
.[0].key
.fuente
value??!!
(Sé que es un operador ternario, es entretenido)05AB1E , 30 bytes
Código:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
I
comando, 05AB1E solo tomará todo lo que necesite.JavaScript (ES6), 155 bytes
Basado en la respuesta de Python de @ Blue.
fuente
Python 3.5,
142137134112117110127 bytes:( +17 bytes, porque aparentemente, incluso si hay palabras más frecuentes que el resto, pero tienen la misma frecuencia, todavía no se debe devolver nada ) .
Ahora debe satisfacer todas las condiciones. Esta presentación supone que se ingresa al menos 1 palabra.
¡Pruébelo en línea! (Ideone)
Además, si desea una, aquí hay otra versión de mi función desprovista de expresiones regulares a un costo de aproximadamente 43 bytes, aunque esta no es competitiva de todos modos, por lo que realmente no importa. Solo lo puse aquí por el gusto de hacerlo:
¡Prueba esta nueva versión en línea! (Ideone)
fuente
That's
es una contracciónthat is
mientrasthats
que en realidad no es una palabra.Ruby,
9492102 bytesTengo que ir rápido (respuesta FGITW). Devuelve la palabra en mayúsculas, o
nil
si no hay una palabra más frecuente.Ahora actualizado a nuevas especificaciones, creo. Sin embargo, me las arreglé para jugar golf un poco, ¡así que el conteo de bytes es el mismo!
fuente
Gotta go fast
?Pyth, 32 bytes
Banco de pruebas.
fuente
JavaScript (ES6), 99 bytes
fuente
Sqlserver 2008, 250 bytes
Pruébalo en línea!
Sqlserver 2016, 174 bytes
No se pueden manejar datos como este ejemplo (contando los iguales como 3 palabras):
fuente
GROUP BY, LEFT JOIN, or PARTITION BY
Anyway SQL Server adicional con la función SPLIT incorporada. La demostración sin golf no dude en hacerlo lo más breve posible.PostgreSQL,
246, 245 bytesSalida:
Ingrese si alguien está interesado:
Normalmente lo usaría
MODE() WITHIN GROUP(...)
y será mucho más corto, pero violará:EDITAR:
Manejo
'
:SqlFiddleDemo
Salida:
fuente
R, 115 bytes
Esta es una función que acepta una cadena y devuelve una cadena si una sola palabra aparece con más frecuencia que otras y de lo
NULL
contrario. Para llamarlo, asígnelo a una variable.Sin golf:
fuente
Retina, 97 bytes
Las reglas siguen cambiando ...
Pruébalo en línea!
Banco de pruebas.
fuente
a
ser la palabra más común allí)Python, 132 bytes
El código anterior supone que la entrada tiene al menos dos palabras.
fuente
\w
incluye guiones bajos.PHP, 223 bytes
fuente
Python 2, 218 bytes
Asume más de 2 palabras. Deshacerme de la puntuación me destruyó ...
fuente
',-
etc.?sorted
a una tupla en lugar de tener que indexar manualmente en la matriz?Matlab (225)
.
Toolbox es necesario para ejecutar esto.
¿Cómo funciona esto? Uno de los mejores privilegios de regex reemplaza en matlab: ejecuta tokens en el campo llamando a funciones ambientales externas parametrizadas por los tokens capturados en el entorno interno, por lo que cualquier secuencia de
"Word_A Word_B .."
se reemplaza por enteros"A0 A1 A2 B0 B1 B2 ..."
donde el primer entero es la firma numerica ascii de la palabra, el segundo es el índice inicial, el tercero es el índice final, estos dos últimos enteros no se reduplican en toda la secuencia, así que aproveché esta ventaja para transponerlo a una matriz, luego lo modelé y luego busqué el dar como resultado esa matriz, por lo que los índices iniciales / finales seguirán en consecuencia.Editar: después de cambiar algunos detalles, el programa se llama función mediante un parámetro de cadena.
20 bytes guardados gracias a @StewieGriffin, 30 bytes añadieron reproches a las lagunas comunes acordadas.
fuente
05AB1E ,
222120 bytesExplicación:
Nota: Si está de acuerdo con las nuevas líneas finales en la salida para cuando se supone que no debe generar nada, elimine
?
al final para guardar un byte.Nota # 2: El programa no funcionará con una sola palabra, pero dudo que esto sea un problema. Si desea solucionar este problema, reemplace
#
conð¡
un byte adicional.05AB1E usa CP-1252 como el juego de caracteres, no UTF-8.
Pruébalo en línea!
fuente
Perl,
60565554 bytesIncluye +3 para
-p
Si una palabra no puede ser solo un número, también puede soltar
a
un puntaje de 53.fuente
-anE
no cuenta? Lo hace en la otra respuesta (+2 bytes para la-p
bandera) ...E
no cuentan. La otra respuesta normalmente solo tendría que hacer +1 bytes para-p
, pero su solución tiene'
que no puede verse como una extensión de-e
o-E
. Por lo tanto, debería contar +3 (no +2) ya que debería contar el espacio y el guión (pero cada opción adicional solo sería +1).[\pL\d-]
parece que podría reducirse a[\w-]
(a menos que nos preocupemos por los guiones bajos) pero cualquiera de las versiones informará enthat
lugar dethat's
othats
para la prueba 4. De lo contrario, debe agregar 4 bytes para insertar\x27
en esa clase de caracteres (a menos que tenga una mejor manera de agregar un apóstrofe)PowerShell (v4), 117 bytes
La primera parte es bastante fácil:
$input
es ~ = stdinGroup
por frecuencia (~ = colecciones de Python. Contador ),Sort
para poner las palabras más frecuentes al final.Manejo si no hay una palabra más frecuente:
Use el campo bool-as-array-index fake-ternary-operator golf
(0,1)[truthyvalue]
, anidado, para elegir "", $ z o $ y como salida, luego tome .Name.fuente
Lua,
232199175 bytesfuente
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
bandera) = 86 bytesUtilizando:
fuente
-p
bandera debe invocar una penalización de 3 bytes. Las reglas son más o menos: cada indicador de línea de comando es +1 byte, ya que esa es la cantidad de bytes adicionales que necesita para extender su-e'code'
línea de comando de estilo libre . Entonces, normalmente-p
es solo +1 byte. Pero aquí tiene su código,'
por lo que no se puede ejecutar simplemente desde la línea de comandos sin escapar. Por lo tanto, no se debe combinar con-e
y el-
y el espacio antes de quep
sean adicionales y también se deben contar-p
marca) si lo invoca en la línea de comando comoperl -pe'…'
(se pone a disposición eliminando lo'
que se indica en los primeros comentarios)Python, 158 bytes
Toma su entrada así:
Debe coincidir con todos los requisitos, aunque falla en cadenas vacías, ¿es necesario verificarlos? Perdón por el retraso.
Consejos / comentarios / consejos de magia negra para guardar bytes son siempre bienvenidos
fuente
That
como ocurrencias de la palabrathat
ya que la primera comienza con mayúsculaT
y la segunda comienza con minúsculat
. Además, esto NO elimina todas las demás formas de puntuación, excepto los guiones (-
) y, opcionalmente, los apóstrofes ('
) y, como resultado, esto NO funcionaría para el cuarto caso de prueba dado en la pregunta.This sentence has no most frequent word.
) como ejemplo, su función se genera[('This', 1)]
, cuando en su lugar no debería generar nada. Podría seguir y seguir sobre más problemas, por lo que recomendaría solucionarlos lo antes posible.\w
incluye guiones bajos.Tcl 8.6, 196 bytes
(Por desgracia, no puedo entender cómo hacerlo más pequeño que eso ...)
Explicación
Utiliza varios modismos oscuros de Tcl para hacer cosas.
[join [read stdin] " "]
- cadena de entrada → lista de palabras separadas por espacios en blancolmap ...
- iterar sobre cada elemento de esa lista. (Más corto queforeach
y efectivamente idéntico ya que el resultado se descarta).[regsub ... [string tolower ...]]
- Convierta la cadena en minúsculas y elimine todos los caracteres, excepto los caracteres de palabras y el guión.[dict incr d ...]
- Crear / modificar un diccionario / palabra → contar histograma.set y ...
- Ordene los valores del diccionario, tome el más grande y devuelva todos los pares (clave, valor) correspondientes.if...
- Debe haber exactamente dos elementos: un solo par (clave, valor), de lo contrario no hay nada que imprimir.puts...
- Imprima la clave en el par de valores clave, si corresponde. (Ninguna palabra tiene espacios).Puedes jugar con él usando CodeChef .
fuente
REXX
109128122 bytesBastante impreso ...
fuente
golpe,
153146131154149137bytesOperación:
declarar una matriz asociativa F de enteros (declarar -iA F)
f es una función que, dado un parámetro de palabra $ 1, incrementa el conteo de frecuencia para esta palabra (T = ++ F [$ 1]) y se compara con el conteo máximo hasta ahora (M).
Si es igual, tenemos un empate, por lo que no consideraremos que esta palabra sea más frecuente (I =)
Si es mayor que el recuento máximo hasta ahora (M), establezca el recuento máximo hasta el momento en el recuento de frecuencia de esta palabra hasta el momento (M = $ T) y recuerde esta palabra (I = $ 1)
Función final f
Leer una línea (leer L) Hacer minúsculas (L = $ {L ,,}) Eliminar cualquier carácter excepto az, 0-9, guión (-) y espacio (L = $ {L // [^ - a-z0- 9]}) Haga una secuencia de sentencias bash que invoque f para cada palabra (printf -vA "f% s;" $ L). Esto se guarda en la variable A. eval A e imprime el resultado (eval $ a; echo $ I)
Salida:
Error: CORREGIDO Tengo un error que no se revela en estos casos de prueba. Si la entrada es
entonces mi código no debería mostrar nada.
Tengo una solución, pero parece que he encontrado un error bash ... Tengo un comportamiento muy extraño si M no se declara un entero: ++ F [$ 1] == M (después de algunas palabras repetidas) incrementa ambos F [$ 1 ] ¡¡y M!!- mi error.fuente
Python 3,
7698100bytesPruébalo en línea
Emite la palabra más común en minúsculas. No incluye apóstrofes porque "no es necesario incluir apóstrofes".
statistics.mode
requiere Python 3.4Desafortunadamente, no
stderr
se permite la salida a , o sería mucho más corto.fuente
STDERR
, a menos que este programa no produzca ningún error de salida?i- test i-
R, 96 bytes
19 bytes más corto que la respuesta R existente , con un enfoque algo diferente.
Lee desde stdin, por lo que la entrada se separa automáticamente por espacios. Convertimos a minúsculas y las usamos
gsub
para eliminar todos los caracteres no alfanuméricos (más-
y'
). Contamos las instancias de cada palabra contable
y guardamos el resultado ent
. A continuación, verificamos si hay más de 1 máximo ent
(al ver si hay más de un elemento que es igual amax(t)
. Si es así, devolvemos la cadena vacía''
. Si no, devolvemos la palabra correspondiente al máximo ent
.fuente