Descripción breve y dulce del desafío:
basado en ETAOIN SHRDLU , su desafío es escribir el programa o la función más corta en cualquier idioma que genere las 26 letras del alfabeto inglés en función de su frecuencia en la entrada.
Especificaciones realmente largas, secas y completas:
- Su programa / función recibirá como entrada una cadena de texto, que contendrá una o más letras mayúsculas y / o minúsculas y también puede contener signos de puntuación, números, símbolos y otros caracteres no alfabéticos.
- El programa / función debe generar solo las 26 letras MAYÚSCULAS del alfabeto inglés, incluidas las que no aparecen en la entrada, ordenadas de mayor a menor según la cantidad de veces que aparecen en la entrada.
- Editar: la frecuencia se calcula entre mayúsculas y minúsculas, pero la salida debe estar en mayúsculas.
- Si dos o más letras tienen la misma frecuencia, pueden estar en cualquier orden.
No se permite ninguna otra salida, como el espacio en blanco.- Editar 01/07/2014: Basado en comentarios, estoy modificando esta regla. El único otro resultado permitido es el espacio en blanco inicial y / o final opcional, como una nueva línea final. No se permite ninguna otra salida.
- Se permite un comportamiento indefinido para la entrada que no contiene ninguna letra.
El ganador será elegido dentro de 7 días, ¡así que escribe esos dedos!
Entrada de ejemplo:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.
Salida de ejemplo:
EITUSALNROMCDPVGQBFHJKWXYZ
Nota: hay un vínculo de 5 vías KWXYZ
para esa entrada.
Editar:
¡La competencia ha terminado! Gracias a todos los que participaron. Y ahora para el ganador (s): las respuestas de Dennis 'CJam y de Isaac Pyth llegaron a la friolera de 19 caracteres. (Lo siento, pero no voy a aceptar ninguna de las respuestas porque creo que sería injusto para la otra). Editar: Siguiendo el consejo de Dennis, voy a marcar su respuesta como aceptada porque fue la primera en llegar a 19 caracteres. Las menciones honoríficas van a la respuesta de Golfscript en tercer lugar de Ilmari Karonen en 22 caracteres, así como a la respuesta Python de 75 char de undergroundmonorail que obtuvo la mayor cantidad de votos. Una vez más, ¡gracias a todos los que participaron!
Respuestas:
CJam,
2119 bytesPruébalo en línea.
Ejemplo
(sin nueva línea)
Cómo funciona
Más ocurrencias significa que se eliminan más caracteres, por lo que los caracteres más frecuentes aparecen al comienzo del conjunto.
fuente
Python 2 o 3 -
7775 bytesTenía una respuesta antes de que la información obtenida de STDIN, pero me di cuenta de que técnicamente no era válida. Utilicé el
input()
que obtiene solo una línea, pero la entrada de ejemplo de la pregunta implica que debe manejar varias líneas a la vez. Para cumplir con las especificaciones, convertí mi respuesta en una función que toma un argumento de cadena. Para mi sorpresa, ¡era dos bytes más pequeño! No se me ocurrió esoprint(...)
yinput()
fueron más largos quef=lambda s:
ys
.Esto también hace que la respuesta sea compatible tanto con Python 2 como con Python 3. Originalmente, solo era Python 3, porque se usaba
input()
(que se llamóraw_input()
en 2). Ahora que es una función, funciona en ambos.Explicado
fuente
count
no es una variable ni nada, es una función literal. Tan genial como sería poder multiplicar el valor de retorno de una función-1
pegando un-
frente, esa no es una característica que tiene Python.Bash, 65 bytes
Ejemplo
Cómo funciona
fuente
{A..Z}
. Todos los entornos locales LC_COLLATE funcionan, porque OpenBSD solo tiene LC_COLLATE = C.Pyth 1.0.2 , 19
20Pruébelo aquí: http://ideone.com/fork/YlWpEJ
Obtenga más información sobre Pyth aquí: http://esolangs.org/wiki/Pyth
Ejemplo:
Da:
Explicación:
=ZUw
: Convierta la entrada a mayúsculas y almacene en Z.sV
: Imprime la suma del reverso dem;d
: Las últimas entradas deS
: Ordenados por su primera entrada, en orden crecientem[cZkk)
: Las listas [recuento de k en Z, k]UG
: Para k en mayúsculas.Equivalente a Python:
Esto no es una entrada, solo pensé que a la gente le gustaría verlo. En Pyth 1.0.4, el siguiente programa es una solución en 10 caracteres:
Explicación:
JUw
: Convierta la entrada a mayúsculas y almacene en J.o
: (Imprimir) Ordenar por_cJN
: -1 * (recuento de N en J)UG
: Más de N en letras mayúsculas.No es una solución legal porque varios de los cambios de Pyth 1.0.2 a 1.0.4, incluida la adición de la
o
función Ordenar por, fueron en respuesta a este problema.fuente
Z
para referirse a ella una vez más tarde? ¿Simplemente poner la expresión paraZ
en su lugar hace que la entrada se lea varias veces?Javascript ( ES6 )
119117Editar: (-2) Se eliminó la necesidad de
toUpperCase
usar un RegEx que no distingue entre mayúsculas y minúsculas en lasplit
llamada.Alternativa (misma longitud): condensó el recuento de clasificación y caracteres en una sola función.
Como una función:
105104Editar: (-1) Condensó la ordenación y el recuento de caracteres en una sola función.
fuente
GolfScript, 22 caracteres
Pruébalo en línea.
Explicación:
:?
asigna la cadena de entrada al símbolo?
. (Uso un símbolo de puntuación para que el siguiente número91
no se analice como parte del nombre del símbolo).91,
construye una lista de los números del 0 al 90 (código ASCII deZ
).+
agrega esta lista a la cadena de entrada, convirtiéndola de una matriz de códigos ASCII a una cadena (y convenientemente también eliminando la cadena de entrada de la pila).-26>
toma los últimos 26 caracteres de esta cadena, produciendo una cadena que contiene las letras mayúsculas ASCII deA
aZ
.{ }$
aplica el bloque de código a todos los caracteres en la cadena de entrada, y clasifica los caracteres de acuerdo con el resultado..
duplica el carácter y32+
convierte la copia de mayúsculas a minúsculas. La]
recoge estos dos personajes en una matriz,?\-
toma la cadena de entrada almacenado en?
y elimina todas las apariciones de los personajes de la serie de ella, y,
los recuentos de la longitud de la cadena restante, que será la clave de ordenación. Los caracteres se ordenarán en orden ascendente por esta clave y, por lo tanto, en orden descendente por número de ocurrencias.fuente
91,+-26>
.22
, en lugar de25
:)Haskell, 110 bytes
Ejemplo de uso:
fuente
(/=c)
y deshacerse de la0-
?Ruby 2.0, 53 caracteres
EDITAR : Se corrigió para que funcione correctamente con cadenas multilínea, ¡gracias @ durron597!
Crea una función llamada
f
que se puede usar de la siguiente manera:Impresiones a STDOUT:
fuente
EITASUROLNCMPDVQGBHFKJWXYZ
para el ejemplo en la preguntagets
devuelve una línea a la vez. Se puede solucionar cambiandogets
a,gets$n
pero cambiarlo a una función es 1 char más corto.Perl,
5446 bytesACTUALIZACIÓN: después de otras optimizaciones, podría reducirse a 46 bytes: (thx dennis for
-n
/{}
hack; perl goth chino para<=>
->-
hack)Es para correr con correr con
perl -nE
Solución original (no necesita opciones especiales de Perl):
Verificado en Perl 5.8.3, 5.14.2
Si recibe una advertencia, separe
eg
yfor
con un espacio (+1 caracteres), si le importaejemplo de uso:
EXPLICACIÓN: En cada carácter (
.
) de cada línea de entrada (for<>
), aplicar una sustitución "patrón", que de hecho se evalúa como una expresión (e
bandera de las///
), que incrementos de un (upcaseduc
) carácter (.
/$&
es más corto que más evidente(.)
/$1
) cuenta en el hash (no inicializado) (%h
). Luego, el hash de frecuencia de letras se usa en una función de comparación de clasificación para imprimir el alfabeto en mayúsculas en el orden correcto.fuente
perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
-n
yEND{}
, pero siempre fueron más largas ... siéntase libre de actualizar la respuesta, si lo desea-n
envuelvewhile(<>){...}
el código. Evito editar el código de otros usuarios. Demasiado fácil cometer un error, algunas cosas solo funcionan en algunas computadoras, etc.}{
"inyección", no solo de la conocida-n
opción. Uno no puede esperar que la cadena de código en realidad técnicamente está envuelto por la cadena de código bucle while antes de la ejecución, no sólo es justo que de alguna manera funciona como como si estuviera envuelto ..$h{$b}<=>$h{$a}
con$h{$b}-$h{$a}
R, 123 bytes
El código se mejora gracias a las sugerencias de @RichieCotton.
Salida:
fuente
C ++,
185183179177 bytesNo se espera que gane, por supuesto (¿puede C ++ ganar alguna vez?), Pero no obstante es un ejercicio divertido.
Explicación:
fuente
VBScript
181109Actualizado para usar un algoritmo completamente diferente. Beats JavaScript!
Bonita:
Golfizado:
fuente
J
4135 BytesManifestación:
Explicación:
La clave es agregar la matriz izquierda, de modo que todas las letras estén disponibles y en orden. Una consecuencia divertida de usar un sustantivo como tercer diente del tenedor es que funciona como verbo y como frase.
fuente
Groovy -
1301231151129892Según el consejo de @ cfrick (¡dos veces!):
Una pequeña prueba (robada descaradamente de @jpjacobs):
Y la prueba propuesta también está pasando
fuente
f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}
para 104it.grep(~/(?i)$c/)
lugar deit.toUpperCase().grep(c)
toUpperCase
estaba molestando muchísimo.SAS - 217 (creo)
La entrada debe colocarse en la línea después de la declaración cards4, o en las tarjetas perforadas apropiadas para su sistema. Creo que este enfoque ahorra algunos caracteres en lugar de intentar citar la entrada.
Soy consciente de que esto no cumple con la especificación completa, ya que solo devuelve caracteres que aparecen en la cadena de entrada. Podría necesitar repensar esto un poco.
fuente
AppleScript, 278
Noté que eso
"a" = "A"
es cierto en AppleScript. Puedo usar esto en el código de golf, pero el resto del script es demasiado prolijo. Usé AppleScript 1.8.3.Esto define una función
f
. Si agregaf("a string")
en la parte inferior del script y lo ejecuta en el Editor de Script, mostrará el resultado.Formateado y comentado:
fuente
VBScript
157156bytesEditar: cambió msgbox (p) a msgbox p
Más legible:
Golfizado: (155 caracteres + 1 retorno de carro)
Lo tenía en 171 anteriormente con un código que me pareció más interesante, pero cómodamente el método de clasificación de Drei es más corto y requiere len (s), lo que hace un "para" más corto que el "while" para el primer bucle. (bostezo)
fuente
for t=0
debería serlofor t=1
, de lo contrario siempre se imprime el alfabeto completo.J -
3835 caracteresUna función que toma la entrada a la derecha como una cadena. No es un ganador, pero fue divertido escribir.
Explicado:
toupper
es un verbo en la biblioteca estándar que encierra una cadena. Eso se convierte en el argumento correcto del verbo, mientras que el argumento izquierdo es el alfabeto: los puntos de código ASCII 65 a 90.[
y,e.~#])
selecciona (#
) esas letras en el argumento derecho (]
) que son elementos de (e.~
) el izquierdo, y luego antepone (,
) el argumento izquierdo ([
). A saber, mantenemos solo los caracteres en mayúscula y agregamos una sola copia del alfabeto al final, para asegurarnos de que los atrapamos a todos.#/.~@
luego da las frecuencias de cada personaje. Sucede que esto se da en orden alfabético, por lo que inmediatamente podemos ordenar (\:
) el alfabeto (el argumento izquierdo[
).Un ejemplo perezoso rápido a continuación. No dude en probarlo por ti mismo en tryj.tk .
fuente
T-SQL 178
Básicamente, esta es mi solución VBScript pero implementada en SQL.
Esto es abuso de salida XML para concatenar una columna. En uso práctico, se puede unir a una tabla externa para emular
GROUP_CONCAT
funciones en MySQL y otros.Declarando la
@
variable:Código:
fuente
Perl, 78 bytes
Resultado para el ejemplo en la pregunta:
Sin golf:
fuente
echo -e 'x\ny\n\nz\n'
salida, que debería regresarXYZABCDEFGHIJKLMNOPQRSTUVW
, sino que rindeXYABCDEFGHIJKLMNOPQRSTUVWZ
. Adivina por qué .. :)PHP - 105 bytes
Aquí hay un hexdump, debido a los caracteres especiales:
Y una versión un poco menos golfizada:
Ejemplo:
fuente
preg_filter()
trabajo?echo join(array_keys($f));
puede guardar un byteC # en LINQPad - 203 bytes
Tomé un enfoque diferente a la respuesta de Logan Dam. Primero me aseguré de que cada carácter en la cadena de entrada esté ordenado por su apariencia y solo exista una vez en la cadena de salida. Después de eso, agregué todos los caracteres faltantes del alfabeto a la cadena de salida.
Lamentablemente, no superaría la respuesta de Logan Dam si lo hubiera hecho en Visual Studio.
Versión más legible:
fuente
C # (y LINQ)
255226210 BytesUsando el consejo de Patrick Huizinga, la sintaxis de la consulta ahora es más corta:
Explicación:
Sintaxis del método equivalente (217):
Publicación original:
fuente
P
lugar deProgram
y enstring[]a
lugar destring[] args
y enc=>...
lugar de(c)=>...
.using
declaraciones, también puede poner su clase dentro delSystem.Linq
espacio de nombres y eliminar ambas usando declaraciones. Luego puede guardar algunos caracteres y seguirá funcionando bien.namespace
es más largo queusing
y los dos{}
s adicionales me costarán más.namespace System.Linq{}
es claramente más corto queusing System;using System.Linq;
solo mirarlo. La idea es omitir ambos porusing
completo.C ++
701322232 bytesPrimera versión 701 bytes (uso idiomático de STL)
Versión limpia ampliada:
La idea es demostrar un programa C ++ "adecuado" sin ningún truco. Ignora la repetitiva y el hecho de que esto solo se compila en VC ++
Explicacion:
Rellenamos de la A a la Z en una cadena con iota () , esto asegura que cuando contamos las ocurrencias, cada carácter aparece incluso si no está en la entrada.
transform () copia carácter por carácter de la entrada estándar y lo coloca al final de s después de llamar a toupper () en cada uno
El recuento de cada personaje se reduce en el mapa (al mantener los recuentos negativos podemos tener un orden descendente sin código adicional)
Las entradas del mapa de conteos se copian en un conjunto de pares, intercambiando (char, count) a (count, char). Como los conjuntos están ordenados, los ordenamos disminuyendo el recuento de frecuencia
Finalmente copiamos el contenido del conjunto a estándar, usando transform, y usando select2nd () para seleccionar solo el segundo miembro del par.
El código es bastante legible. Una solución C ++ 11 se vería mucho más bonita, ya que podemos usar lambdas
Versión C ++ 11: no se necesitan lambdas, pero las funciones automáticas y basadas en rango hacen las cosas muy limpias (ahora que lo pienso, puede hacer algo muy similar con C ++ 98 normal)
Versión ampliada:
Próxima iteración (por qué leer de stdin cuando tenemos argv):
Versión ampliada:
fuente
Gelatina , 9 bytes (no competitiva)
Explicación
Esto se lee como "ordenar el alfabeto en mayúsculas por el número de ocurrencias en la entrada en mayúscula, invertida", que es una traducción bastante literal del desafío: P
Pruébalo en línea!
Este desafío estaba vinculado a Jelly HyperTraining donde resolvimos el desafío. Publiqué esto porque fui el primero en llegar a 10 bytes.
-1 byte gracias a Erik the Outgolfer (profesor de JHT)
fuente
ØAŒuċ¥@ÞU
C ++ 377
Implementa qsort usando el recuento de letras en la matriz n para ordenar el alfabeto en la matriz A. Ejecutar a través de la línea de comando:
golf.exe < in.txt
fuente
C, 117 (119) bytes
95
con223
, a un costo de 1 byte adicional.char c;
a justc;
y++c
toc=c+1%255
.fuente
PowerShell - 139 caracteres
Primero, no soy un experto en PowerShell. Estoy bastante seguro de que hay más cortos que esto. Pero estaba contento con eso y decidió compartir.
Cómo funciona:
fuente
Ceilán , 98 bytes
fuente
APL,
2620 caracteres⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]
⎕a[⍒+/⎕a∘.=1(819⌶)⍞]
-6 gracias a Adam.
fuente
('\w'⎕r'\u0')
→1(819⌶)