Écrivez une fonction ou un programme qui prend des entrées de chaînes, entièrement épeautre, les noms de mois Anglais en cas de titre: January
, February
, March
, etc. (null / CR / LF fin OK, délimité par un caractère non-alpha si vous le souhaitez) et soit
compare deux entrées, renvoyant une valeur Truthy si la deuxième entrée est supérieure (dans l'ordre du mois) à la première. Des valeurs égales donnent une valeur Falsey
ou en trie une séquence arbitraire (liste, chaîne délimitée, etc.) dans un ordre chronologique
(Le nœud du défi est de définir une méthode / expression qui donne le bon tri lexicographique. Certaines langues peuvent avoir une réponse plus courte avec l'une ou l'autre)
Vous ne pouvez pas utiliser de méthodes d'analyse temporelle interne (par exemple strptime
) pour traduire le nom du mois en un nombre ou un mappage prédéfini des noms de mois. Utilisez les propriétés des chaînes elles-mêmes, une table de recherche parcimonieuse que vous définissez ou quelque chose d'intelligent.
Exemple
Exemples de fonctionnement, bien que le premier soit interdit par les règles ...
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')
Les versions ci-dessous sont correctes, car nous codons ces informations
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]
Ou vous pouvez faire une fonction de tri
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])
Exemples de tests
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
qui était une liste de tous les noms de mois, je voudrais interdiremonths[x] < months[y]
comme réponse. La liste des noms de mois a des caractéristiques plus particulières (longueur variable, similitude) qui rendent le défi plus facile / plus difficile sur les chaînes générées de manière aléatoire.Réponses:
Gelée , 19 octets
Il s'agit d'un lien monadique qui prend une liste en argument et la trie. Essayez-le en ligne!
Contexte
Jelly utilise une indexation modulaire basée sur 1. Si nous répétons les noms de mois assez souvent pour obtenir 11 caractères, nous obtenons le tableau suivant.
Dans la 11 e (dernière) colonne, tous les caractères sont différents, nous pouvons donc les utiliser pour identifier l'ordre des mois.
Comment ça fonctionne
la source
code machine x86,
2625 octetsHexdump:
Code d'assemblage:
La fonction de hachage suivante arrive à mettre les noms de mois dans le bon ordre (trouvé par force brute):
Il est appliqué aux 4 premiers octets (32 bits) de la chaîne d'entrée, disposés en ordre petit-boutien. Ensuite, comparer le résultat et utiliser
SALC
pour définir le registre de résultat (al):la source
Gelée , 15 octets
Pas de lien d'interprète en ligne ici car il s'agit d'une soumission lente . Le programme utilise la fonction de hachage
354^(input interpreted as base 32 int) % 991
comme clé de tri, ce qui donne des sorties dans le bon ordre. Le programme ne se terminera pas de si tôt car les résultats de l'exponentiation sont géants - pour "septembre", un nombre à 0,24 quadrillion de chiffres doit être calculé!Explication de la gelée:
Script de preuve de concept Python - notez l'utilisation de
pow
pour l'exponentiation modulaire, qui est beaucoup plus efficace:la source
Python,
646157 octetsLe lambda prend deux mois en entrée et les compare. Testez-le sur Ideone .
Merci à @ljeabmreosn pour avoir joué au golf sur 3 octets et ouvert la voie à 3 autres!
la source
s[10%len(s)]
pour(4*s)[10]
travailler?Python,
8171 octetshttps://repl.it/CluN/1
Compare l'indice dans
m
les deuxième et troisième lettres de deux mois.Version 83 octets pour trier une liste de mois:
la source
Rubis, 58 octets
Utilise l'astuce de tri par mois de la réponse de @ atlasologist .
La fonction de comparaison est un peu plus longue, à 63 octets
la source
J,
6665 octetsUtilise le fait que f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) est une fonction valide dans le domaine limité des 12 mois:
Usage:
(En aucun cas, ce n'est la meilleure idée, mais je ne voulais pas voler l'astuce de classement de quelqu'un!)
Voici une version plus courte utilisant la méthode de @ atlasologist :
J, 63 octets
Usage:
Et une version beaucoup plus courte utilisant la méthode intelligente de @ Dennis :
J, 34 octets
la source
Haskell, 74 octets
Mon premier code de golf, yay! L'idée générale de celui-ci est inspirée de la réponse la plus élevée dans Jelly et du fait que lorsque les noms de mois sont cyclés, le 11e caractère est toujours unique.
Voici une version non golfée pour voir comment cela fonctionne:
La
e
fonction représente la fonction eleventhChar (malheureusement ne peut pas supprimer 4 octets en raison de la restriction du monomorphisme, je pense) et la#
fonction infixe correspond à lainOrder
fonction.Une petite solution intéressante, mais il peut y avoir des moyens de raser plus d'octets (j'en ai trouvé juste en écrivant ceci!)
la source
e s=head.drop 10$cycle s
comme vous l'avez fait dans votre explication en utilisant au.
lieu de$
:e=head.drop 10.cycle
. Cependant, l'utilisation de l'opérateur d'index de liste!!
est encore plus courte:e=(!!10).cycle
Java,
133123Golfé:
Je cherchais une technique intelligente comme dans la réponse de l'assembleur, mais cela prenait trop de temps à comprendre, alors j'ai opté pour la même technique que tout le monde a utilisée.
Non golfé:
la source
substring
place sicharAt
"" +
car il n'y a plus dechar
s bruts .Langage machine ARM sous Linux
4440 octetsJ'ai utilisé une fonction de hachage différente de la solution d ' anatolyg et j'ai essayé d' utiliser les instructions du pouce pour économiser quelques octets (bien que j'ai soufflé 8 octets en mode pouce).
Vous pouvez essayer cela sur un appareil Raspberry Pi ou Android avec GNURoot.
Pour exécuter, entrez quelque chose comme
La version actuelle gère désormais correctement le cas d'égalité (et d'autres).
la source
bfac
fait?ite ge
exécute conditionnellement l'instruction suivante (movge r0, #0
) sir3 >= r0
, sinon l'instruction suivante qui est exécutée (movlt r0, #1
). Je pense qu'il y a de la place pour supprimer quelques octets ici, mais je n'ai pas eu le temps d'y travailler :-)Perl 6 , 55 octets
Il faudrait quelques octets de plus pour les versions de comparaison:
Tester:
la source
Haskell, 118 caractères
Utilise le fait que le nom de chaque mois est unique dans ses premier et quatrième caractères (ou 3ème pour mai) pour définir un type de données qui peut être automatiquement analysé et comparé par la langue. La fonction «r» convertit une chaîne en saisissant les quatre premiers caractères (ou moins), puis en sélectionnant simplement le premier et le dernier. Alors 'a # b' est un opérateur pour comparer les valeurs:
Cela pourrait probablement être fait de manière plus efficace, mais je voulais essayer de le faire en utilisant un type de données utile pour représenter les mois.
la source
PowerShell,
968863 octetspar exemple
Maintenant, le deuxième défi consiste à trier une liste dans l'ordre; les versions précédentes faisaient la comparaison du test de deux mois:
Basé sur les deux seconds caractères du nom du mois.
la source
Python
8382 octetsTest: https://repl.it/repls/TimelyDecimalBrowsers
Obtient la somme des 3 premiers caractères et crée un seul caractère à rechercher.
la source
Javascript, 118 octets
Pourrait être joué au golf plus probablement en se débarrassant
c
et en utilisantarray.map
, mais c'est ce que j'ai pour l'instant ...la source
for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
Bash, 101 octets
c'est une fonction comme is_later
tester
la source
k4, 29
Un port de @ Dennis's Jelly répond .
C'est le trieur, pas le comparateur; intéressant, le comparateur est trivialement implémentable par le même algorithme, et un seul octet de plus:
la source
Bash + coreutils,
94 octets93 octetsIl s'agit d'une tentative de proposer une transformation qui trie lexicographiquement. Si vous regardez attentivement la clé de transformation,
FMAyulgSOND
vous pouvez voir les mois de février à décembre (janvier devient vide après la transformation; il est tiré vers le haut en utilisant «B» comme séparateur). Inverser, tronquer et supprimer des lettres non saisies permet de réaliser cette astuce.90 octets utilisant C Locale
... où ␉ est le caractère de tabulation.
80 octets utilisant C Locale
... en utilisant la méthode de @ atlasolog. Lié comme un moyen d'utiliser cette approche pour travailler avec plus de paramètres régionaux.
Test / utilisation
les sorties:
la source