Ce défi est terminé! Félicitations Flonk !
J'étais sûr que j'obtiendrais une bonne note, mais après avoir rendu mon travail à Flonk , mon professeur ne croyait pas que c'était le mien et ne pouvait pas comprendre pourquoi c'était si compliqué ... J'ai échoué et ma mère m'a échoué sur Facebook et Minecraft pour un mois. Je ne comprends pas. :(
Merci pour toutes vos soumissions! Quelques bonnes réponses ici. Le vainqueur officiel est Flonk avec un score de 64 . Les 5 premiers sont:
- Flonk , 64 ans (Haskell, avec des mathématiques efficaces!)
- DigitalTrauma , 40 (Le cloud, l'avenir est maintenant)
- primo , 38 (Python, et mon préféré - et très professionnel!)
- Sylwester , 20 ans (Raquette, bien que janvier l'étire!)
- ilmale , 16 (Un algorithme hautement optimisé dans Lua)
Défi original ci-dessous.
Aidez-moi, c'est très urgent !!! :(
J'ai besoin de convertir des versions abrégées des noms de mois en leurs représentations plus longues (par exemple, "Dec" -> "December"), sans tenir compte de la casse. En ce moment, j'utilise Java; le nom du mois est une chaîne et je préfère ne pas le convertir d'abord en objet Date. N'importe quelle langue fera l'affaire.
Y a-t-il un moyen facile de faire ceci?? Allez-y doucement, je suis un débutant en programmation!
Il s'agit d'un concours de popularité de code à la traîne (le meilleur qui soit!). La réponse avec le plus de votes positifs le 8 avril 2014 gagne.
la source
Réponses:
C'est vraiment simple avec une petite interpolation polynomiale!
Tout d'abord, j'ai regardé la liste des noms de mois courts
et vérifié la somme de leurs caractères ASCII
puis soustrait 300 de ceux-ci pour avoir une idée de ce que je traite ici, et préparé un tableau qui contient toutes les versions plus longues des noms des mois.
Je suppose que vous pouvez voir ce qui se passe maintenant - tout ce dont j'ai besoin est une fonction getIndex qui mappe 13 à 0, 1 à 1, 20 à 2, etc., donc je peux simplement faire
Heureusement, Wolfram | Alpha peut le faire pour moi ! Les chiffres deviennent un peu grands, mais Haskell peut gérer cela avec grâce. Nous devons juste nous assurer d'arrondir les résultats, car l'arithmétique à virgule flottante est un peu imprécise! Alors voilà, Haskell rapide, élégant et idiomatique:
Exécutez-le simplement comme ceci:
la source
interpolating polynomial
.Bash + outils GNU + "le cloud"
Google a la réponse à tout, et je me sens chanceux :
Utilisé:
la source
[a-zA-Z]
fonctionnerait pas en remplacement de[[:alpha:]]
(semble de cette façon quand je l'essaye au moins)? Cela permettrait d'économiser 3 caractères. Quelques caractères supplémentaires pourraient être enregistrés en interrogeantask.com
, mais cela pourrait ne pas être aussi fiable.Python
Parce que cette fonction est très importante, elle sera probablement beaucoup utilisée, vous devriez donc essayer de la rendre aussi rapide que possible. D'autres affiches ont recommandé d'utiliser une recherche de hashmap ... ne faites pas ça! Les Hashmaps sont vraiment lents par rapport aux tableaux. Il vous suffit de convertir chaque abréviation en nombre. Il existe une technique de hachage standard qui peut être utilisée pour cela:
C'est presque garanti d'être unique, et de nombreux outils professionnels l'utilisent.
Vous devez maintenant créer une fonction de recherche:
Et utilisez-le comme ceci:
print month_abbr_to_name("Dec")
→December
HTH!
Pêche à la traîne
la source
Raquette
Je choisis une solution KISS . Je l'ai testé avec le cas d'utilisation OP "Dec" avec toutes les majuscules pour vérifier si le résultat correct est retourné. Il est passé avec brio.
Évidemment, la pêche à la traîne ici est que cela ne fonctionne que pour quelques cas, donc c'est inutile :-)
la source
LUA
Ma solution fonctionnera dans votre langue locale, votre professeur sera heureux
Tester
la source
Perl
la source
Java
Vous avez dit que votre code actuel est en Java, alors j'ai pensé que je vous faciliterais les choses.
la source
Bash + coreutils + paq8hp12
La réponse qui est actuellement la plus votée doit accéder à Internet pour chaque requête. En plus d'être très inefficace, cela signifie également que votre script échouera s'il n'y a pas d'Internet.
Il est préférable de stocker les informations nécessaires sur votre disque dur. Bien sûr, vous pouvez stocker uniquement les données nécessaires à ce script, mais cela nécessiterait des données différentes pour différentes tâches. Il est préférable de stocker toutes les données dont vous pourriez avoir besoin dans un seul fichier polyvalent.
Pêche à la traîne
la source
Python + SQLite
Jusqu'à présent, la plupart des réponses font l'erreur de coder en dur les noms des mois. Mais, vous ne savez jamais quand un pape ou un président va nous faire passer à un autre calendrier, et alors des tonnes de code d'analyse / de formatage de date deviendront instantanément sans valeur! (Ou, plus généralement, lorsque vous devez internationaliser votre programme.)
Vous avez besoin d'une base de données.
Ensuite, écrivez simplement un programme simple pour l'interroger.
la source
SH et un ami (date)
La fonction:
Le tester:
C'est court ... mais calculez que c'est le ratio "mal par personnage" ... mwhuaaahahahaaa ...
la source
date
fonctionnalités de formatage de date de. Etdate
respecte la localisation, il génère le mois correspondant à la localisation.-d"a_month_name 1
définit la date au 1er du mois nommé (peut-être un nom court) et l'année manquante est définie pour que ce soit le mois suivant.+%B
est le format pour imprimer la date donnée et signifie «le nom long du mois». Tout le tat est enveloppé dans une fonction shell et parce qu'il n'y a rien de spécifique à BASH, SH sera suffisant pour l'exécuter. Donc,date
mérite fondamentalement tous les applaudissements, pas moi! Et je me fiche des downvotes dans codegolf! : -Þperl
Que diriez-vous d'une bonne force brute?
Pourquoi c'est génial:
l'utilisation de la surcharge d'opérateur intégrée de perl (incrément sur les chaînes) rend ce code aussi rapide que le code C natif. Regardez tous ces zéros, montrant à quelle vitesse il fonctionne!
L'algorithme est intuitivement évident, et je laisse une preuve comme exercice au lecteur, mais juste pour nous assurer qu'il fonctionne dans tous les cas, vérifions août, l'un des mois -ber et l'un des -uaries pour nous assurer que nous n'a rien manqué:
Trollage:
Laissant de côté les pratiques de codage qui feraient mourir Damian Conway à vue, ce code est par intermittence erroné et par intermittence extrêmement lent. "Février" court environ 6 ordres de grandeur - un million de fois - plus lentement que "mai", "juin" ou "juillet". Feboapic, Sepibnd, Novgpej et Decabjuj ne sont pas des mois (bien qu'ils soient amusants à essayer de prononcer).
PS - J'avais du code qui a une répartition encore plus grande des temps d'exécution, mais il affiche ennuyeusement la bonne réponse dans tous les cas, ce qui est beaucoup moins amusant.
la source
JavaScript - cluster de nœuds optimisé avec des branches, des feuilles et des barils de chaîne.
la source
Java, Google et Probabilité
Je suis déçu que tant de solutions ici "réinventent la roue" alors que la réponse est facilement disponible sur Internet.
Voici la sortie de mon programme:
Pas parfait, mais assez bon pour envoyer au QA. J'ai pu atteindre ces résultats en tirant parti de la puissance du crowdsourcing:
la source
Bash + binutils
J'ai essayé de faire l'évidence en convertissant l'entrée en un objet date, mais j'ai échoué lamentablement. Enfin, j'ai eu recours à une approche par force brute.
Essais:
la source
Je comprends que la vérification des noms des mois est très difficile et nécessite beaucoup de calcul et de réflexion logique. Voici une version optimisée de l' algorithme Buzz-Strahlemann pour vérifier les noms des mois .
PHP
Trolls:
Cette réponse;
Ne gère pas les fuseaux horaires et affichera un message d'avertissement;
N'accepte pas le mois comme entrée, mais vous devez le coder en dur;
Même lorsque vous le codez en dur, il est sensible à la casse;
Ce que ce code essaie de faire est d'obtenir le mois en cours, d'obtenir les trois premières lettres et de vérifier s'il correspond
$month
. S'il ne correspond pas, il incrémente l'horodatage de 1, puis réessaye. Cela finit par être EXTRÊMEMENT LENT ;Ce code ne produit rien (sauf l'avertissement, bien sûr);
Les commentaires sont très trompeurs:
time()
ne charge pas une bibliothèque de temps étendue, mais obtient l'horodatage actuel;substr($checkThis,1,4)
saute la première lettre du mois et obtient les 4 suivants (arch
pourMarch
, par exemple); La forme correcte est celle des commentaires;Même lorsqu'une correspondance est trouvée, le code ne quitte pas la boucle: en fait, la variable qui est définie sur
true
est différente.la source
arch
que ne sera jamais égalMar
?Lot
Ce que vous demandez n'est pas anodin. Cependant, j'ai trouvé la solution parfaite pour vous! Comment cela fonctionne est en téléchargeant une liste très complexe de la langue anglaise sur votre disque dur. L'entrée est ensuite vérifiée par rapport à la liste téléchargée et le nom final du mois est donné! Génie!
Maintenant, cette méthode a de nombreux avantages par rapport aux autres méthodes, certaines étant:
Jan
ouJanu
pour janvier!Le code:
Trollz
la source
! #/frapper
Pour que votre programme réponde plus rapidement, j'ai mis les mois avec 31 jours plus tôt dans la liste. Statistiquement parlant, étant donné une distribution uniforme des dates, vous êtes plus susceptible d'être dans l'un de ces mois.
J'ai documenté chaque ligne pour impressionner votre patron.
Enregistrez-le dans un fichier appelé
lookup_month_script.bash
et copiez-collez la ligne suivante pour le tester:Bonne chance pour votre projet!
la source
JavaScript - 209
Cela dit de ne pas convertir en date, ce qui n'est pas le cas ici, j'utilise simplement Date pour générer l'extension du nom court.
Tests entrée / sortie:
la source
Java 696 avec entrée de test
la source
Le langage de programmation "Brainf * ck" est un outil parfait pour cela! Ce n'est peut-être pas exactement ce que vous cherchiez, bien sûr, mais cela fait le travail sans problème!
Je suis sûr que votre professeur sera fier lorsque vous lui montrez cela!
Pêche à la traîne
la source
Java
Cher apprenti informaticien,
C'est une tâche assez difficile, et je n'ai résolu que partiellement: je suppose que c'est pour votre travail de thèse ou à des fins de recherche.
Jusqu'à présent, je n'ai qu'une version bêta avec quelques bugs mineurs: cela donne parfois de mauvais résultats, mais je suis sûr que votre professeur acceptera votre effort.
fichier Month.java:
fichier Era.java:
Pour l'exécuter, exécutez:
sortie:
N'oubliez pas de définir votre
%JAVAPATH%
sur le chemin où votreJava
compilateur est installé!la source
Puisque l'OP utilise Java, je vais donner une solution Java. L'idée est simple:
Map
nom long en nom court.String.equalsIgnoreCase
de vérifier si le nom abrégé est le même que le nom abrégé d'entrée en ignorant les cas. Si oui, succès, quittez.Voici la source:
Pêche à la traîne
la source
Merci d'avoir posté cette question originale et stimulante. Ceux d'entre nous qui publient des réponses sur Stack Overflow profitent de la possibilité d'aider les affiches, car le but de ce site Web est de cataloguer toutes ces questions pour rendre obsolète le besoin de manuels et d'apprentissage autonome. Ne soyez pas alarmé par votre manque de compréhension de cette question particulière, car il s'agit d'un type de question courant posé en raison de son astuce cachée requise pour la résoudre efficacement. Les instructeurs poseront généralement cette question pour déterminer non seulement votre niveau de compréhension de la langue, mais aussi si vous étiez au courant de cet écueil commun des programmeurs: l'encodage des caractères. Vous comprendrez plus complètement après avoir lu attentivement le lien suivant, comme je sais que vous le ferez: lien .
Je suis sûr maintenant que votre professeur a décrit en détail l'importance de la réutilisation du code.Ainsi, après avoir lu le lien de codage de caractères que j'ai fourni, vous comprenez absolument que vous devrez créer une classe suffisamment générique pour peut gérer n'importe quelle langue, même si la question d'origine ne spécifiait pas spécifiquement cette exigence (vous pouvez également en savoir plus sur la spécification des exigences, qui vous aidera à comprendre les exigences, lisez ce lien: lien.
Vous étiez très intelligent en suggérant de ne pas utiliser l'objet Date fourni, car l'utilisation du code dans les langues par défaut ne vous permettra pas de montrer votre véritable compréhension de la langue à votre professeur.
Pour vous aider à traverser cette question difficile, j'ai écrit une application Groovy qui résoudra votre problème et aura sans aucun doute plus de sens que cette java cryptique. Ne vous inquiétez pas de l'utilisation de Groovy pour cette réponse, car Groovy s'exécute également sur la JVM tout comme le code Java, vous pouvez donc facilement déposer ce code dans votre classe java avec seulement quelques modifications. J'ai joint un lien pour vous aider dans ce processus, mais je ne m'en inquiéterai que le matin, car cela ne devrait prendre qu'une seconde (voici le lien pour plus tard: lien. Donc, copiez simplement le code pour le moment, car je vais vous montrer de nombreux cas de test du code fonctionnant correctement, afin que vous puissiez avoir confiance en votre soumission. Je comprends certainement que vous êtes un étudiant très occupé et très occupé, avec de nombreuses obligations dans votre assiette. Vous savez probablement que les cotisants travaillent ici à temps plein et sont bien rémunérés.
Désolé de ne vous avoir rien laissé faire ici, je me suis laissé emporter en répondant à votre question stimulante. Il vous suffit donc de copier et coller cette réponse. Comme vous pouvez le voir à partir des exécutions suivantes du code, voici ce qu'il peut faire:
la source
Julia
Vous allez vouloir utiliser le pouvoir de l'envoi multiple ici. Nous allons d'abord définir un type de chaque mois. Ensuite, nous pouvons écrire des définitions de fonctions simples pour chaque type de mois qui donnent la réponse souhaitée. Cela vous permettra d'utiliser la forme pratique de
nicename(Jan)
sans avoir à vous soucier de ces guillemets ennuyeux. De plus, nous pouvons définir une fonction pratique pour accepter les chaînes et les convertir en types, réutiliser tout le travail que nous avons déjà fait pour fournir une interface totalement nouvelle.la source
Python 2,75
La vraie beauté réside dans la simplicité, ce qui signifie de faibles besoins en mémoire. Oubliez ces satanés dictionnaires et paragraphes de code. Cette fonction est si bonne qu'elle correspondra aux noms de mois courts dans tous les cas. Observer.
PRIME:
Vous pouvez utiliser plus que les 3 premiers caractères (par exemple "sept", "febr", etc.)
la source
en c #
la source
Voici un petit programme qui fait ce que vous avez demandé.
Je l'ai écrit en C ++ parce que c'est ce que j'utilise en ce moment, mais il se convertit assez facilement en Java. Étant un étudiant dévoué, je suis sûr que vous pouvez travailler vous-même un peu.
J'ai décidé d'être gentil et d'utiliser
std::string
s au lieu dechar*
s. Je suis sûr que je vous aurais confondu avec la syntaxe commechar*[]
et j'aurais certainement oublié d'appelerdelete
, ou fait quelque chose de stupide comme appeler à ladelete
placedelete[]
.la source
C
Une sorte de transformation générique des abréviations en mots entiers, ajustez simplement le
data
tableau ...la source
PHP
la source