Escribir una función o programa que toma entradas de string, totalmente espelta, nombres ingleses mes en el caso del título: January
, February
, March
, etc (nulo / CR / LF terminado bien, delimitado con un poco de carácter no-alfa si así lo desea) y, o bien
compara dos entradas, devolviendo un valor de Verdad si la segunda entrada es mayor (en orden de mes) que la primera. Los valores iguales dan como resultado un valor de Falsey
o ordena una secuencia arbitraria (lista, cadena delimitada, etc.) de ellos en orden cronológico
(El quid del desafío es definir un método / expresión que proporcione el tipo lexicográfico correcto. Algunos idiomas pueden tener una respuesta más corta con uno u otro)
No puede utilizar ningún método de análisis de tiempo interno (p strptime
. Ej. ) Para traducir el nombre del mes en un número o una asignación preestablecida de nombres de mes. Utilice las propiedades de las cadenas en sí, una tabla de búsqueda parsimoniosa que defina o algo inteligente.
Ejemplo
Ejemplos de funcionamiento, aunque el primero está prohibido por las reglas ...
import datetime
def is_later_month(a, b):
'''
Example of prohibited code because it relies on language
features about how to parse month names
'''
return datetime.strptime(a, '%B') < datetime.strptime(b, '%B')
Sin embargo, las siguientes versiones están bien, porque codificamos esa información
months = {
'January': 1, 'February': 2, 'March': 3,
'April': 4, 'May': 5, 'June': 6,
'July': 7, 'August': 8, 'September': 9,
'October': 10, 'November': 11, 'December': 12,
}
def is_later_month(a, b):
"""
Returns True/False when comparing two months.
"""
return months[a] < months[b]
O podrías hacer una función de clasificación
months = {'as above...'}
def sort_months(l):
"""
Sorts list and returns it. Different input and output than the above,
but equally valid. Sorting versus comparing might be shorter in your
favorite language.
"""
return sorted(l, key=lambda x: months[x])
Pruebas de ejemplo
assert is_later_month('January', 'February')
assert is_later_month('January', 'December')
assert is_later_month('November', 'December')
assert not is_later_month('July', 'July')
assert not is_later_month('October', 'September')
months
de todos los nombres de Mes, me gustaría prohibirlamonths[x] < months[y]
como respuesta. La lista de nombres de mes tiene algunas características más peculiares (longitud variable, características comunes) que hacen que el desafío sea más fácil / difícil que las cadenas generadas aleatoriamente.Respuestas:
Jalea , 19 bytes
Este es un enlace monádico que toma una lista como argumento y la ordena. Pruébalo en línea!
Antecedentes
Jelly utiliza indexación modular basada en 1. Si repetimos los nombres de los meses con la frecuencia suficiente para obtener 11 caracteres, obtenemos la siguiente matriz.
En la 11 ª columna (última), todos los personajes son diferentes, por lo que podemos utilizar para identificar el orden de los meses.
Cómo funciona
fuente
código de máquina x86,
2625 bytesHexdump:
Código de montaje:
La siguiente función hash pone los nombres de los meses en el orden correcto (encontrado por la fuerza bruta):
Se aplica a los primeros 4 bytes (32 bits) de la cadena de entrada, organizados en orden little-endian. Luego, compare el resultado y use
SALC
para establecer el registro de resultados (al):fuente
Jalea , 15 bytes
No hay un enlace de intérprete en línea aquí porque esta es una presentación lenta . El programa utiliza la función de hash
354^(input interpreted as base 32 int) % 991
como la tecla de clasificación, que da resultados en el orden correcto. El programa no terminará pronto porque los resultados de la exponenciación son gigantes: para "septiembre", ¡se debe calcular un número con 0.24 billones de dígitos!Explicación de gelatina:
Script de prueba de concepto de Python: tenga en cuenta el uso de
pow
la exponenciación modular, que es mucho más eficiente:fuente
Python,
646157 bytesLa lambda toma dos meses como entrada y los compara. Pruébalo en Ideone .
¡Gracias a @ljeabmreosn por jugar 3 bytes y allanar el camino para 3 más!
fuente
s[10%len(s)]
a(4*s)[10]
trabajar?Python,
8171 byteshttps://repl.it/CluN/1
Compara el índice en
m
la segunda y tercera letra de dos meses.Versión de 83 bytes para ordenar una lista de meses:
fuente
Ruby, 58 bytes
Utiliza el truco de clasificación mensual de la respuesta de @ atlasologist .
La función de comparación es un poco más larga, con 63 bytes.
fuente
J,
6665 bytesUtiliza el hecho de que f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) es una función válida en el dominio limitado de los 12 meses:
Uso:
(¡De ninguna manera esta es la mejor idea, pero no quería robar el truco de clasificación de nadie!)
Aquí hay una versión más corta usando el método de @ atlasologist :
J, 63 bytes
Uso:
Y una versión mucho más corta que usa el método inteligente de @ Dennis :
J, 34 bytes
fuente
Haskell, 74 bytes
Mi primer código de golf, ¡sí! La idea general de este se inspira en la respuesta principal en Jelly, y en el hecho de que cuando se completan los nombres de los meses, el undécimo personaje siempre es único.
Aquí hay una versión sin golf para ver cómo funciona:
La
e
función representa la undécima función de Char (lamentablemente no puedo eliminar 4 bytes debido a la restricción de monomorfismo, creo) y la#
función infijo corresponde a lainOrder
función.Una pequeña solución ordenada, pero puede haber formas de eliminar más bytes (¡encontré algunas al escribir esto!)
fuente
e s=head.drop 10$cycle s
igual que lo hizo en su explicación usando.
en lugar de$
:e=head.drop 10.cycle
. Sin embargo, usar el operador de índice de lista!!
es aún más corto:e=(!!10).cycle
Java,
133123Golfizado:
Estaba buscando una técnica inteligente como en la respuesta del ensamblador, pero me estaba tomando demasiado tiempo entenderlo, así que seguí con la misma técnica que todos los demás usaban.
Sin golf:
fuente
substring
lugar, podría usar sicharAt
"" +
ya que ya no haychar
s sin procesar .Lenguaje de máquina ARM en Linux
4440 bytesHe utilizado una función hash diferente que anatolyg 's solución y trató de instrucciones de uso del pulgar para ahorrar unos pocos bytes (aunque Soplé 8 bytes que entran en el modo de pulgar).
Puede probar esto en un dispositivo Raspberry Pi o Android con GNURoot.
Para correr ingrese algo como
La versión actual ahora maneja el caso de igualdad (y otros) correctamente.
fuente
bfac
?ite ge
ejecuta condicionalmente la siguiente instrucción (movge r0, #0
) sir3 >= r0
, de lo contrario, la instrucción que sigue se ejecuta (movlt r0, #1
). Creo que hay espacio para eliminar un par de bytes aquí, pero no he tenido tiempo de trabajar en esto :-)Perl 6 , 55 bytes
Requeriría unos pocos bytes más para las versiones de comparación:
Prueba:
fuente
Haskell, 118 caracteres
Utiliza el hecho de que el nombre de cada mes es único en su primer y cuarto caracteres (o el 3 de mayo) para definir un tipo de datos que el idioma puede analizar y comparar automáticamente. La función 'r' convierte una cadena al agarrar los primeros cuatro caracteres (o menos), luego solo elige el primero y el último. Entonces 'a # b' es un operador para comparar los valores:
Probablemente podría hacerse de una manera más eficiente, pero quería intentar hacerlo utilizando un tipo de datos útil para representar los meses.
fuente
PowerShell,
968863 bytesp.ej
Ahora hace el segundo desafío de ordenar una lista en orden; versiones anteriores hicieron la comparación de la prueba de dos meses:
Basado en los dos segundos caracteres del nombre del mes.
fuente
Python
8382 bytesPrueba: https://repl.it/repls/TimelyDecimalBrowsers
Obtiene la suma de los primeros 3 caracteres y crea un único carácter para buscar.
fuente
Javascript, 118 bytes
Podría jugar más golf, probablemente al deshacerse de él
c
y usarloarray.map
, pero esto es lo que tengo por ahora ...fuente
for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
Bash, 101 bytes
esta es una función como is_later
prueba
fuente
k4, 29
Un puerto de respuesta de @ Dennis's Jelly .
Este es el clasificador, no el comparador; Curiosamente, el comparador es trivialmente implementable por el mismo algoritmo, y solo un byte más:
fuente
Bash + coreutils,
94 bytes93 bytesEste es un intento de llegar a una transformación que se clasifique lexicográficamente. Si observa de cerca la clave de transformación
FMAyulgSOND
, puede ver los meses de febrero a diciembre (enero se vacía después de la transformación; se tira hacia arriba mediante el uso de 'B' como separador). Invertir, truncar y eliminar letras sin clave permiten realizar este truco.90 bytes usando C Locale
... donde ␉ es el carácter de tabulación.
80 bytes usando C Locale
... usando el método de @ atlasolog. Obligado a ser una forma de utilizar este enfoque para trabajar con más configuraciones regionales.
Prueba / uso
salidas:
fuente