Recientemente hubo una pregunta sobre Stack Overflow en la que el OP estaba tratando de escribir una función para encontrar la palabra en una cadena que tiene las letras más repetidas. Por supuesto, no es difícil escribir uno en segundos, y escribí uno en Javascript lo más breve posible por diversión. Pero no soy un experto en golf de código, así que me pregunto cuánto más corto puede ser este simple programa.
Desafío
Escriba un programa o función que tome una cadena de palabras y devuelva o imprima la palabra con las letras individuales más repetidas.
Reglas:
Elija la palabra con el mayor número de letras simples repetidas (vea los ejemplos a continuación)
Si ninguna palabra tiene letras repetidas, devuelve -1.
Si dos palabras tienen el mismo número máximo de letras repetidas, elija la más cercana al comienzo de la cadena.
La presentación más corta en bytes gana.
Entrada
Tome como entrada una cadena que consta de una o más palabras delimitadas por espacios. La entrada puede ser de STDIN (o la alternativa más cercana), parámetros de línea de comando o argumentos de función.
Salida
Imprima el resultado en STDOUT para devolverlo.
Ejemplos
Considera la cuerda aaabbb cccc
. Este contiene dos palabras: aaabbb
y cccc
. La palabra aaabbb
tiene 3 a
y 3 b
, y cccc
tiene 4 c
. Entonces, el número máximo de letras repetidas aaabbb
es 3 y el máximo cccc
es 4. Queremos elegir la palabra con el número máximo de letras simples repetidas, por lo que la salida para aaabbb cccc
debería ser cccc
.
Otros casos de prueba:
Today, is the greatest day ever! --> greatest
This is a great day --> -1
aaabbb cccc --> cccc
ever
aabb
tiene 2 letras repetidas. Seaaaabb
consideraría que tiene 4 letras repetidas (2da, 3ra, 4taa
, 2dab
) o 2 letras repetidas (a
yb
).Respuestas:
C - GCC -
159145135 BytesSe actualizará cuando pueda truncarlo un poco
Cómo compilar: gcc -w cg.c
Cómo ejecutar: ./a.out word1 word2 aass ddaaa ssdddd
Salida: ssdddd
Sin salida / sin coincidencia: -1
En primer lugar, hice trampa un poco, al tomar las palabras como argumentos del programa, pero lograr que GCC analizara las palabras y me diera un recuento de palabras gratis fue una recompensa demasiado grande para dejarla pasar.
¿Como funciona?
Tenemos 3 bucles anidados. El primer incremento a través de cada palabra, los siguientes dos están imitando un tipo de burbuja para comparar valores. La primera letra nunca se compara consigo misma, y cada letra subsiguiente se compara con cada letra anterior. Cada vez que una palabra tiene más letras iguales que una palabra anterior, la palabra se almacena en x, y el recuento de cuántas letras también se almacena.
Abuso de CCG
Usamos delimitaciones globales implícitas globales para nuestros enteros. Permitimos que argv sea un int en lugar de un char (actualmente un char, este es un TODO). Hacemos uso de funciones predeterminadas como Put y Getchar. También utilizamos el operador de coma para sobrecargar nuestro operador trinario (condicional).
¿Quieres 2 bytes menos?
Reemplace "-1" con * z y nombre el archivo -1
Programa no ofuscado y no probado:
fuente
Pyth, 14 bytes
Demostración. Prueba de arnés.
fuente
l
antes.-
parece hacerlo.K, 35 bytes (falta el requisito -1, lo acabo de notar, pero es hora de dormir)
cómo funciona:
1 toma
de las palabras indexadas por
los índices para poner en orden ascendente
el maximo
cuenta donde
cadena = char
por cada char en palabra
para cada palabra donde
w
(palabras) sonla cadena dividida por espacios
Obviamente sacrifiqué un poco de precisión por expresividad y legibilidad en la explicación en inglés. Espero que haya sido interesante.
fuente
,-1
al final de la función.#:&:
ya que, por contexto, deberían analizarse como sus formas monádicas. También puede usar@
para indexar en lugar de corchetes, y first (*
) en lugar de1#
.Haskell, 100 bytes
Ejemplo de uso:
f "Today, is the greatest day ever!"
->"greatest"
Cómo funciona:
Haskell,
7977 bytes (no probado)Esto utiliza
sortOn
desdeData.List
v4.8.0.0, que no he instalado, por lo que no puedo probarlo.fuente
CJam, 25 bytes
Pruébalo en línea
Explicación:
fuente
Python 2,
9777 BytesSolución bastante sencilla, solo asigna la entrada (entre comillas) a una tupla que contiene la palabra y el número de caracteres repetidos. Obtiene el máximo e imprime la palabra si la letra más repetida se repite; de lo contrario, imprime -1.
Ahorré 20 (!) Bytes al reorganizar el orden de entrada para que no necesitara una clave para encontrar el máximo.
fuente
SWI-Prolog,
158154149 bytesEjemplo:
a("Today, is the greatest day ever!",R).
salidasR = "greatest" .
.fuente
JavaScript,
86111108 bytesDefinitivamente apto para el golf, toda la cosa -1 agregó unos 20 bytes.
fuente
R, 107 bytes
Esto lee de STDIN e imprime en STDOUT.
Ungolfed + explicación:
fuente
C # 166 Bytes
Codificación sencilla. Nada especial aquí.
C # apesta para golf de código: - /
fuente
JavaScript ( ES7? ), 99
Utilizando la comprensión de matriz, eso se implementa en Firefox pero no se incluye más en EcmaScript 6.
Pruebe utilizando el fragmento a continuación (solo Firefox)
Ungolfed y más compatible
fuente
Pitón, 58
fuente
C (167)
INTENTALO
¿COMO FUNCIONA ESTO?
fuente
Q (44 bytes)
sin golf
fuente
Haskell 96 Bytes
`` `
r
es una función que toma una palabra y devuelve una tupla(n,w)
donden
es el número de ocurrencia del carácter más frecuente en la palabraw
. Por ejemplox="norep", y="dnredundant"
, entoncesr x=(1,norep), r y=(3,ndredundant)
w
es una función que toma una cadena que contiene varias palabras separadas por espacios y:Dividir la lista en el espacio.
words p
cada palabra crea una lista de
(n,w)
tomar la tupla que tiene el mayor
n
(contador de ocurrencia)Si tiene n igual a 1, simplemente devuelve la cadena
-1
, la palabra misma (almacenada en el segundo componente de la tupla) de lo contrario.Por ejemplo, tome
p="Today, is the greatest day ever!"
produce
["Today,","is","the","greatest","day","ever!"]
[(1,"Today,"),(1,"is"),(1,"the"),(2,"greatest"),(1,"day"),(2,"ever!")]
(2, "mayor")
2! = 1 entonces
greatest
es la solución!fuente
Pure Bash (sin comandos externos) 129 bytes
Esto es bastante largo, pero aún se compara favorablemente con algunas de las otras entradas más largas.
No estoy del todo contento con algunos de los elementos, tener que usar ese bucle for interno es molesto. ¿Alguna sugerencia?
fuente