¡Este desafío ha terminado! ¡Felicidades Flonk !
Estaba seguro de que obtendría una buena calificación, pero después de entregar el trabajo de Flonk , mi profesor no creía que fuera mío y tampoco podía entender por qué era tan complicado ... Fallé y mi madre me castigó en Facebook y Minecraft por un mes. No entiendo. :(
¡Gracias por todas sus presentaciones! Algunas buenas respuestas aquí. El ganador oficial es Flonk con un puntaje de 64 . Los 5 mejores son:
- Flonk , 64 (¡Haskell, con matemáticas eficientes!)
- DigitalTrauma , 40 (La nube, el futuro es ahora)
- primo , 38 (Python, y mi favorito personal, ¡y muy profesional!)
- Sylwester , 20 (¡Raqueta, aunque Janember lo está estirando!)
- ilmale , 16 (Un algoritmo altamente optimizado en Lua)
Desafío original a continuación.
¡Ayúdenme, es muy urgente! :(
Necesito convertir versiones abreviadas de nombres de mes a sus representaciones más largas (por ejemplo, "Dec" -> "Diciembre"), sin distinción entre mayúsculas y minúsculas. En este momento estoy usando Java; el nombre del mes es una Cadena y prefiero no convertirlo primero en un objeto Fecha. Sin embargo, cualquier idioma servirá.
¿¿Hay una forma fácil de hacer esto?? ¡Ve fácil, por favor, soy un novato en la programación!
Este es un concurso de popularidad de trolling de código (¡el mejor tipo que existe!). La respuesta con más votos a favor el 8 de abril de 2014 gana.
fuente
Respuestas:
¡Es realmente simple con una pequeña interpolación polinómica!
Primero, miré la lista de nombres de meses cortos
y verificó la suma de sus valores ASCII
luego restaron 300 de ellos para comprender lo que estoy tratando aquí, y preparé una matriz que contiene todas las versiones más largas de los nombres de los meses.
Supongo que puedes ver lo que está sucediendo ahora: todo lo que necesito es una función getIndex que asigne 13 a 0, 1 a 1, 20 a 2, y así sucesivamente, así que simplemente puedo hacer
¡Afortunadamente, Wolfram | Alpha puede hacer esto por mí ! Los números se vuelven un poco grandes, pero Haskell puede manejar eso con gracia. Solo necesitamos asegurarnos de redondear los resultados, porque la aritmética de coma flotante es un poco imprecisa. Ahí tienes, Haskell rápido, elegante e idiomático:
Ejecútalo simplemente así:
fuente
interpolating polynomial
.Bash + herramientas GNU + "la nube"
Google tiene la respuesta para todo, y me siento afortunado :
En uso:
fuente
[a-zA-Z]
funcionaría como un reemplazo para[[:alpha:]]
(parece ser así cuando lo intento al menos)? Eso ahorraría 3 caracteres. Se podrían guardar algunos caracteres más mediante consultasask.com
, pero eso podría no ser tan confiable.Pitón
Debido a que esta función es muy importante, probablemente se usará mucho, por lo que debe intentar hacerlo lo más rápido posible. Otros carteles han recomendado usar una búsqueda de hashmap ... ¡no hagas esto! Los hashmaps son realmente lentos en comparación con las matrices. Solo necesita convertir cada abreviatura en un número. Hay una técnica de hashing estándar que se puede usar para esto:
Es casi seguro que será único, y muchas herramientas profesionales lo usan.
Ahora necesita crear una función de búsqueda:
Y úsalo así:
print month_abbr_to_name("Dec")
→December
HTH!
Trolling
fuente
Raqueta
Voy por una solución KISS . Lo probé con el caso de uso de OP "Dec" con mayúsculas para verificar si se devuelve el resultado correcto. Pasó con gran éxito.
Obviamente, el trolling aquí es que solo funciona por unos pocos casos, por lo que es inútil :-)
fuente
LUA
Mi solución funcionará en su idioma local, su profesor estará feliz
Prueba
fuente
Perl
fuente
Java
Dijiste que tu código actual está en Java, así que pensé que te facilitaría las cosas.
fuente
Bash + coreutils + paq8hp12
La respuesta que más se vota actualmente tiene que acceder a Internet para cada consulta. Además de ser muy ineficiente, esto también significa que su script fallará si no hay internet.
Es mejor almacenar la información necesaria en su disco duro. Por supuesto, podría almacenar solo los datos necesarios para este mismo script, pero eso requeriría datos diferentes para diferentes tareas. Es mucho mejor almacenar todos los datos que pueda necesitar en un solo archivo multipropósito.
Trolling
fuente
Python + SQLite
Muchas de las respuestas hasta ahora cometen el error de codificar los nombres de los meses. Pero, nunca se sabe cuándo algún Papa o Presidente nos hará cambiar a otro calendario, ¡y entonces toneladas de código de análisis / formateo de fechas se volverán instantáneamente inútiles! (O, más comúnmente, cuando necesita internacionalizar su programa).
Lo que necesitas es una base de datos.
Luego, solo escriba un programa simple para consultarlo.
fuente
SH y un amigo (fecha)
La función:
Probándolo:
Es corto ... pero calcule su relación de "mal por personaje" ... mwhuaaahahahaaa ...
fuente
date
las funciones de formato de fecha. Ydate
respeta la localización, genera el mes correspondiente a la localización.-d"a_month_name 1
establece la fecha en el 1er del mes nombrado (tal vez nombre corto) y el año que falta se establece para que sea el próximo mes.+%B
es el formato para escribir la fecha dada y significa 'el nombre largo del mes'. Todo tat está envuelto en una función de shell y debido a que no hay nada específico de BASH allí, SH será suficiente para ejecutarlo. ¡Así que básicamentedate
merece todos los aplausos, no yo! ¡Y no me importan los votos negativos en codegolf! : -Þperl
¿Qué tal una buena fuerza bruta?
Por qué esto es asombroso:
El uso de la sobrecarga del operador integrado de Perl (incremento en las cadenas) hace que este código sea tan rápido como el código C nativo. ¡Mira todos esos ceros, que muestran cuán rápido se ejecuta!
El algoritmo es intuitivamente obvio, y dejo una prueba como ejercicio para el lector, pero solo para asegurarnos de que funcione en todos los casos, revisemos agosto, uno de los meses más recientes y uno de los días para asegurarnos de que no te perdiste nada:
Trollage:
Dejando de lado las prácticas de codificación que harían que Damian Conway muriera a la vista, este código es intermitentemente incorrecto y extremadamente lento. "Feb" corre alrededor de 6 órdenes de magnitud, un millón de veces, más lento que "may", "jun" o "jul". Feboapic, Sepibnd, Novgpej y Decabjuj no son meses (aunque es divertido tratar de pronunciarlos).
PD: tuve un código que tiene una extensión aún mayor de tiempos de ejecución, pero produce la respuesta correcta en todos los casos, lo que es mucho menos divertido.
fuente
JavaScript: clúster de nodo optimizado con ramas, hojas y barriles de cuerda.
fuente
Java, Google y probabilidad
Me decepciona que muchas de las soluciones aquí "reinventen la rueda" cuando la respuesta está fácilmente disponible en Internet.
Aquí está la salida de mi programa:
No es perfecto, pero lo suficientemente bueno como para enviarlo a QA. Pude lograr estos resultados al aprovechar el poder del crowdsourcing:
fuente
Bash + binutils
Traté de hacer lo obvio al convertir la entrada en un objeto de fecha, pero fallé miserablemente. Finalmente recurrí al enfoque de fuerza bruta.
Pruebas de funcionamiento:
fuente
Entiendo que verificar los nombres de los meses es muy difícil y requiere mucha computación y pensamiento lógico. Aquí hay una versión optimizada del algoritmo Buzz-Strahlemann para verificar los nombres de los meses .
PHP
Trolls:
Esta respuesta;
No maneja zonas horarias y emitirá un mensaje de advertencia;
No acepta el mes como entrada, pero necesita codificarlo;
Incluso cuando lo codifica, distingue entre mayúsculas y minúsculas;
Lo que este código intenta hacer es obtener el mes actual, obtener las primeras tres letras y verificar si coincide con
$month
. Si no coincide, incrementa la marca de tiempo en 1 y luego vuelve a intentarlo. Esto termina siendo EXTREMADAMENTE LENTO ;Este código no genera nada (excepto la advertencia, por supuesto);
Los comentarios son muy engañosos:
time()
no carga una biblioteca de tiempo extendido, pero obtiene la marca de tiempo actual;substr($checkThis,1,4)
se salta la primera letra del mes y obtiene los siguientes 4 (arch
porMarch
ejemplo); La forma correcta es la de los comentarios;Incluso cuando se encuentra una coincidencia, el código no saldrá del bucle: de hecho, la variable que se establece
true
es diferente.fuente
arch
nunca será igualMar
?Lote
Lo que estás pidiendo no es trivial. Sin embargo, ¡he encontrado la solución perfecta para ti! Esto funciona al descargar una lista muy compleja del idioma inglés en su disco duro. ¡La entrada se compara con la lista descargada y se proporciona el nombre final del mes! ¡Genio!
Ahora, este método tiene muchas ventajas sobre otros métodos, algunos son:
Jan
oJanu
para enero!El código:
Trollz
fuente
! #/golpetazo
Para que su programa responda más rápido, he puesto los meses con 31 días antes en la lista. Estadísticamente hablando, dada una distribución uniforme de fechas, es más probable que esté en uno de esos meses.
Documenté cada línea para impresionar a tu jefe.
Guarde esto en un archivo llamado
lookup_month_script.bash
y copie y pegue la siguiente línea para probarlo:¡Buena suerte con tu proyecto!
fuente
JavaScript - 209
Dice no convertir a una fecha, que no es lo que está sucediendo aquí, simplemente estoy usando la fecha para generar la extensión del nombre corto.
Pruebas de entrada / salida:
fuente
Java 696 incluyendo entrada de prueba
fuente
¡El lenguaje de programación "Brainf * ck" es una herramienta perfecta para esto! Puede que no sea exactamente lo que estaba buscando, claro, ¡pero hace el trabajo sin problemas!
¡Estoy seguro de que tu maestro estará orgulloso cuando le muestres esto!
Trolling
fuente
Java
Estimado aprendiz de informático,
Esta es una tarea bastante difícil, y la he resuelto solo parcialmente: supongo que es para su trabajo de tesis o para algún propósito de investigación.
Hasta ahora solo tengo una versión beta con algunos errores menores: a veces da resultados incorrectos, pero estoy seguro de que su profesor aceptará su esfuerzo.
archivo Month.java:
archivo Era.java:
Para ejecutarlo, ejecute:
salida:
¡Recuerde configurar su
%JAVAPATH%
en la ruta dondeJava
está instalado su compilador!fuente
Como el OP está usando Java, le daré una solución Java. La idea es simple:
Map
nombre largo a nombre corto.String.equalsIgnoreCase
para verificar si el nombre corto es el mismo que el nombre corto de entrada ignorando los casos. Si es así, éxito, salir.Aquí está la fuente:
Trolling
fuente
Gracias por publicar esta pregunta original y estimulante. Aquellos de nosotros que publicamos respuestas en Stack Overflow disfrutamos de la oportunidad de ayudar a los carteles, ya que el propósito de este sitio web es catalogar todas esas preguntas para hacer obsoleta la necesidad de libros de texto y aprendizaje auto motivado. No se alarme por su falta de comprensión de esta pregunta en particular, ya que es un tipo de pregunta común debido a su truco oculto requerido para resolverla de manera efectiva. Los instructores comúnmente harán esta pregunta para determinar no solo su profundidad de comprensión del lenguaje, sino también si usted es consciente de este error común del programador: la codificación de caracteres. Comprenderá más completamente después de leer detenidamente el siguiente enlace, como sé que lo hará: enlace .
Ahora estoy seguro de que su profesor ha descrito con gran detalle la importancia de la reutilización del código, por lo que al leer el enlace de codificación de caracteres que le proporcioné, está entendiendo que tendrá que hacer una clase lo suficientemente genérica que puede manejar cualquier idioma, incluso si la pregunta original no especificaba específicamente este requisito (también puede aprender sobre la especificación de requisitos, que lo ayudará a comprender los requisitos, lea este enlace: enlace.
Usted fue muy inteligente al sugerir no usar el objeto Fecha proporcionado, ya que el uso del código en los idiomas predeterminados no le permitirá mostrar su verdadera comprensión del idioma a su profesor.
Para ayudarlo a resolver esta difícil pregunta, he escrito una aplicación Groovy que resolverá su problema y, sin duda, tendrá más sentido que ese java críptico. No se alarme con el uso de Groovy para esta respuesta, ya que Groovy también se ejecuta en la JVM al igual que el código Java, por lo que puede colocar fácilmente este código en su clase java con solo unas pocas modificaciones. He adjuntado un enlace para ayudarlo a través de este proceso, pero no me preocuparía hasta la mañana, ya que solo debería tomar un segundo (aquí está el enlace para más adelante: enlace. Por lo tanto, solo copie el código por ahora, ya que mostraré muchos casos de prueba del código que funcionan correctamente, para que pueda sentirse seguro de su envío. Definitivamente entiendo que eres un estudiante ansioso, muy ocupado, con muchas obligaciones en tu plato. Probablemente sepa que los contribuyentes aquí trabajan a tiempo completo y están bien compensados.
Lamento no haberte dejado nada para que hagas aquí, me dejé llevar respondiendo a tu pregunta que te hizo pensar. Entonces solo copie y pegue esta respuesta. Como puede ver en las siguientes ejecuciones del código, esto es lo que puede hacer:
fuente
Julia
Vas a querer usar el poder del despacho múltiple aquí. Primero definiremos un tipo de cada mes. Luego podemos escribir definiciones de funciones simples para cada tipo de mes que den la respuesta deseada. Esto le permitirá utilizar la forma conveniente de
nicename(Jan)
sin tener que molestarse con esas comillas molestas. Además, podemos definir una función conveniente para aceptar cadenas y convertirlas en tipos, reutilizar todo el trabajo que ya hicimos para proporcionar una interfaz totalmente nueva.fuente
Python 2.75
La verdadera belleza está en la simplicidad, lo que significa bajos requisitos de memoria. Olvídate de esos molestos diccionarios y párrafos de código. Esta función es tan buena que coincidirá con nombres de meses cortos usando cualquier caso. Observar.
PRIMA:
Puede usar más de los primeros 3 caracteres (por ejemplo, "sept", "febr", etc.)
fuente
en c #
fuente
Aquí hay un pequeño programa que hace lo que solicitó.
Lo he escrito en C ++ porque eso es lo que uso en este momento, pero se convierte fácilmente a Java. Siendo un estudiante dedicado, estoy seguro de que puedes trabajar ese poco tú mismo.
Decidí ser amable y usar
std::string
s en lugar dechar*
s. Estoy seguro de que te habría confundido con una sintaxis comochar*[]
y definitivamente me habría olvidado de llamardelete
o haber hecho algo estúpido como llamar endelete
lugar dedelete[]
.fuente
do
Algún tipo de transformación genérica de abreviaturas a palabras completas, solo ajuste la
data
matriz ...fuente
PHP
fuente