Este desafio terminou! Parabéns Flonk !
Eu tinha certeza de que conseguiria uma boa nota, mas, depois de entregar o trabalho de Flonk , meu professor não acreditava que era meu e também não conseguia entender por que era tão complicado ... Eu falhei e minha mãe me impediu de usar o Facebook e o Minecraft. por um mês. Eu não entendo :(
Obrigado por todos os seus envios! Algumas ótimas respostas aqui. O vencedor oficial é Flonk com uma pontuação de 64 . Os 5 principais são:
- Flonk , 64 (Haskell, com matemática eficiente!)
- DigitalTrauma , 40 (A nuvem, o futuro é agora)
- primo , 38 (Python, e meu favorito pessoal - e muito profissional!)
- Sylwester , 20 (Raquete, apesar de janeiro estar esticando!)
- ilmale , 16 (Um algoritmo altamente otimizado em Lua)
Desafio original abaixo.
Por favor me ajude, é muito urgente !!! :(
Preciso converter versões reduzidas dos nomes dos meses em suas representações mais longas (por exemplo, "Dez" -> "Dezembro"), sem distinção entre maiúsculas e minúsculas. No momento estou usando Java; o nome do mês é uma String e eu prefiro não convertê-lo em um objeto Date primeiro. Qualquer idioma serve, no entanto.
Existe uma maneira fácil de fazer isso? Vá com calma, por favor, eu sou um novato em programação!
Este é um concurso de popularidade de trollagem de código (o melhor tipo que existe!). A resposta com mais votos em 8 de abril de 2014 vence.
fonte
Respostas:
É realmente simples com um pouco de interpolação polinomial!
Primeiro, olhei para a lista de nomes curtos de mês
e verificou a soma dos valores ASCII dos caracteres
depois subtraí 300 deles para ter uma idéia do que estou lidando aqui e preparou uma matriz que contém todas as versões mais longas dos nomes dos meses.
Acho que você pode ver o que está acontecendo agora - tudo o que preciso é de uma função getIndex que mapeie 13 para 0, 1 para 1, 20 para 2 e assim por diante, para que eu possa simplesmente fazer
Felizmente, Wolfram | Alpha pode fazer isso por mim ! Os números aumentam um pouco, mas Haskell pode lidar com isso com graça. Só precisamos ter certeza de arredondar os resultados, porque a aritmética de ponto flutuante é um pouco imprecisa! Então, pronto, Haskell rápido, elegante e idiomático:
Execute-o da seguinte maneira:
fonte
interpolating polynomial
.Bash + ferramentas GNU + "a nuvem"
O Google tem a resposta para tudo, e estou com sorte :
Em uso:
fonte
[a-zA-Z]
funcionaria como um substituto[[:alpha:]]
(parece que é assim quando eu tento pelo menos)? Isso economizaria 3 caracteres. Mais alguns caracteres podem ser salvos consultandoask.com
, mas isso pode não ser tão confiável.Python
Como essa função é muito importante, provavelmente será usada muito, portanto você deve tentar fazê-lo o mais rápido possível. Outros pôsteres recomendaram o uso de uma pesquisa por hashmap ... não faça isso! Hashmaps são realmente lentos em comparação com matrizes. Você só precisa converter cada abreviação em um número. Existe uma técnica de hash padrão que pode ser usada para isso:
É quase garantido que ele seja único, e muitas ferramentas profissionais usam isso.
Agora você precisa criar uma função de pesquisa:
E use-o assim:
print month_abbr_to_name("Dec")
→December
HTH!
Trollando
fonte
Raquete
Eu vou para uma solução KISS . Eu testei com o caso de uso do OP "Dec" com todas as maiúsculas para verificar se o resultado correto é retornado. Passou com cores voadoras.
Obviamente, o trolling aqui é que ele só funciona em alguns casos, então é inútil :-)
fonte
LUA
Minha solução funcionará no seu idioma, seu professor ficará feliz
Teste
fonte
Perl
fonte
Java
Você disse que seu código atual está em Java, então pensei em facilitar as coisas para você.
fonte
Bash + coreutils + paq8hp12
A resposta mais votada atualmente tem que acessar a Internet para todas as consultas. Além de ser muito ineficiente, isso também significa que seu script falhará se não houver internet.
É melhor armazenar as informações necessárias no seu disco rígido. Obviamente, você pode armazenar apenas os dados necessários para esse script, mas isso exigiria dados diferentes para tarefas diferentes. É muito melhor armazenar todos os dados que você possa precisar em um único arquivo multiuso.
Trollando
fonte
Python + SQLite
Até agora, muitas das respostas cometem o erro de codificar os nomes dos meses. Mas você nunca sabe quando algum papa ou presidente nos fará mudar para outro calendário e, em seguida, toneladas de código de análise / formatação de datas se tornarão instantaneamente inúteis! (Ou, mais comumente, quando você precisa internacionalizar seu programa.)
O que você precisa é de um banco de dados.
Em seguida, basta escrever um programa simples para consultá-lo.
fonte
SH e um amigo (data)
A função:
Testando:
É curto ... mas calcule a proporção "mal por personagem" ... mwhuaaahahahaaa ...
fonte
date
recursos de formatação de data. Edate
respeita a localização, gera o mês correspondente à localização.-d"a_month_name 1
define a data para o 1º do mês nomeado (talvez o nome abreviado) e o ano que falta é definido para que seja o próximo mês.+%B
é o formato para imprimir a data especificada e significa 'o nome longo do mês'. Todo o tat é envolvido em uma função shell e, como não há nada específico do BASH, o SH será suficiente para executá-lo. Então, basicamente,date
merece todos os aplausos, não eu! E eu não me importo com votos negativos no codegolf! : -Þperl
Que tal uma boa força bruta?
Por que isso é incrível:
o uso da sobrecarga de operador interna do perl (incremento em cadeias) torna esse código tão rápido quanto o código C nativo. Veja todos esses zeros, mostrando o quão rápido ele roda!
O algoritmo é intuitivamente óbvio, e deixo uma prova como exercício para o leitor, mas apenas para garantir que funcione em todos os casos, vamos verificar agosto, um dos últimos meses e um dos diários para garantir que não perdeu nada:
Trollage:
Deixando de lado as práticas de codificação que faria Damian Conway morrer à vista, esse código está intermitentemente errado e intermitentemente extremamente lento. "Feb" executa cerca de 6 ordens de magnitude - um milhão de vezes - mais lento que "may", "jun" ou "jul". Feboapic, Sepibnd, Novgpej e Decabjuj não são meses (embora seja divertido tentar pronunciar).
PS - Eu tive um código que tem uma propagação ainda maior de tempos de execução, mas ele gera a resposta correta em todos os casos, o que é muito menos divertido.
fonte
JavaScript - cluster de nó otimizado com ramos, folhas e barris de cadeia.
fonte
Java, Google e Probabilidade
Estou desapontado por tantas soluções aqui "reinventarem a roda" quando a resposta está facilmente disponível na internet.
Aqui está a saída do meu programa:
Não é perfeito, mas é bom o suficiente para enviar ao controle de qualidade. Consegui alcançar esses resultados alavancando o poder do crowdsourcing:
fonte
Bash + binutils
Eu tentei fazer o óbvio convertendo a entrada em um objeto de data, mas falhei miseravelmente. Finalmente, recorri à abordagem da força bruta.
Execuções de teste:
fonte
Entendo que a verificação dos nomes dos meses é muito difícil e requer muita computação e raciocínio lógico. Aqui está uma versão otimizada do algoritmo de Buzz-Strahlemann para verificar os nomes dos meses .
PHP
Trolls:
Esta resposta;
Não manipula fusos horários e gera uma mensagem de aviso;
Não aceita o mês como entrada, mas você precisa codificá-lo;
Mesmo quando você o codifica, faz distinção entre maiúsculas e minúsculas;
O que esse código tenta fazer é obter o mês atual, obter as três primeiras letras e verificar se ele corresponde
$month
. Se não corresponder, aumenta o carimbo de data e hora em 1 e depois tenta novamente. Isso acaba sendo EXTREMAMENTE LENTO ;Este código não produz nada (exceto o aviso, é claro);
Os comentários são muito enganadores:
time()
não carrega uma biblioteca de tempo estendido, mas obtém o carimbo de data / hora atual;substr($checkThis,1,4)
pula a primeira letra do mês e obtém os 4 seguintes (arch
porMarch
exemplo, por exemplo); A forma correta é a dos comentários;Mesmo quando uma correspondência é encontrada, o código não sai do loop: na verdade, a variável definida
true
é diferente.fonte
arch
nunca será igualMar
?Lote
O que você está pedindo não é trivial. No entanto, eu encontrei a solução perfeita para você! Como isso funciona é baixando uma lista altamente complexa do idioma inglês para o seu disco rígido. A entrada é então comparada com a lista baixada e o nome final do mês é dado! Gênio!
Agora, esse método tem muitos profissionais em relação a outros métodos, alguns sendo:
Jan
ouJanu
para janeiro!O código:
Trollz
fonte
! #/bater
Para fazer seu programa responder mais rapidamente, coloquei os meses com 31 dias antes na lista. Estatisticamente falando, dada uma distribuição uniforme de datas, é mais provável que você esteja em um desses meses.
Eu documentei cada linha para impressionar seu chefe.
Salve isso em um arquivo chamado
lookup_month_script.bash
e copie e cole a seguinte linha para testá-lo:Boa sorte com seu projeto!
fonte
JavaScript - 209
Ele diz para não converter para uma Data, o que não é o que está acontecendo aqui, estou simplesmente usando a Data para gerar a extensão do nome abreviado.
Testes de entrada / saída:
fonte
Java 696, incluindo entrada de teste
fonte
A linguagem de programação "Brainf * ck" é uma ferramenta perfeita para isso! Pode não ser exatamente o que você estava procurando, com certeza, mas faz o trabalho na perfeição!
Tenho certeza que seu professor ficará orgulhoso quando você mostrar isso a ele!
Trollando
fonte
Java
Caro aprendiz de cientista da computação,
Essa é uma tarefa bastante difícil e resolvi apenas parcialmente: acho que isso é para o seu trabalho de tese ou para algum objetivo de pesquisa.
Até agora, tenho apenas a versão beta com alguns bugs menores: às vezes, dá resultados errados, mas tenho certeza que seu professor aceitará seu esforço.
arquivo Month.java:
arquivo Era.java:
Para executá-lo, execute:
saída:
Lembre-se de definir o seu
%JAVAPATH%
caminho para o seuJava
compilador está instalado!fonte
Como o OP está usando Java, darei uma solução Java. A ideia é simples:
Map
nome longo para um nome abreviado.String.equalsIgnoreCase
para verificar se o nome abreviado é o mesmo que o nome abreviado de entrada que ignora os casos. Se sim, sucesso, saia.Aqui está a fonte:
Trollando
fonte
Obrigado por postar esta pergunta instigante e original. Aqueles de nós que postam respostas no Stack Overflow desfrutam da oportunidade de ajudar os pôsteres, pois o objetivo deste site é catalogar todas essas perguntas para tornar obsoleta a necessidade de livros didáticos e aprendizado motivado. Não se assuste com a sua falta de compreensão dessa pergunta em particular, pois ela é um tipo comum de pergunta, devido ao seu truque oculto necessário para resolvê-la efetivamente. Os instrutores geralmente fazem essa pergunta para determinar não apenas sua profundidade de compreensão da linguagem, mas também se você está ciente dessa armadilha comum do programador: a codificação de caracteres. Você entenderá mais completamente depois de ler completamente o link a seguir, como eu sei que você irá: link .
Estou certo de que agora seu professor descreveu detalhadamente a importância da reutilização de código. Assim, ao ler o link de codificação de caracteres que forneci, você está absolutamente convencido de que precisará criar uma classe suficientemente genérica que pode lidar com qualquer idioma, mesmo que a pergunta original não tenha especificado especificamente esse requisito (você também pode aprender sobre a especificação de requisitos, o que o ajudará a entender os requisitos, leia este link: link.
Você é muito inteligente ao sugerir que não use o objeto Date fornecido, pois o uso do código nos idiomas padrão não permitirá que você mostre seu verdadeiro entendimento do idioma ao seu professor.
Para ajudá-lo nessa pergunta difícil, escrevi um aplicativo Groovy que resolverá seu problema e, sem dúvida, fará mais sentido do que o java enigmático. Não se assuste com o uso do Groovy para esta resposta, pois o Groovy também é executado na JVM como o código Java, portanto, você pode facilmente soltar esse código na sua classe java com apenas algumas modificações. Anexei um link para ajudá-lo nesse processo, mas não me preocuparia até a manhã, pois levaria apenas um segundo (aqui está o link para mais tarde: link. Portanto, basta copiar o código por enquanto, pois mostrarei muitos casos de teste do código funcionando adequadamente, para que você possa se sentir confiante em seu envio. Definitivamente, entendo que você é um aluno muito ocupado e ansioso, com muitas obrigações no seu prato. Você provavelmente sabe que os colaboradores aqui trabalham em período integral e são bem remunerados.
Lamento não ter deixado nada para você fazer aqui, me empolguei ao responder sua pergunta instigante. Então, basta copiar e colar esta resposta. Como você pode ver nas seguintes execuções do código, aqui está o que ele pode fazer:
fonte
Julia
Você vai querer usar o poder do envio múltiplo aqui. Primeiro, definiremos um tipo de cada mês. Em seguida, podemos escrever definições simples de função para cada tipo de mês que fornecem a resposta desejada. Isso permitirá que você use a forma conveniente de
nicename(Jan)
sem ter que se preocupar com essas aspas irritantes. Além disso, podemos definir uma função de conveniência para aceitar strings e convertê-las em tipos, reutilizar todo o trabalho que já fizemos para fornecer uma interface totalmente nova.fonte
Python 2.75
A verdadeira beleza está na simplicidade, o que significa baixos requisitos de memória. Esqueça aqueles dicionários e parágrafos de código irritantes. Essa função é tão boa que corresponderá a nomes curtos de mês usando qualquer caso. Observar.
BÔNUS:
Você pode usar mais do que os 3 primeiros caracteres (por exemplo, "sept", "febr" etc.)
fonte
em c #
fonte
Aqui está um pequeno programa que faz o que você solicitou.
Eu escrevi em C ++ porque é isso que eu uso no momento, mas ele converte muito facilmente em Java. Sendo um aluno dedicado, tenho certeza que você pode resolver isso sozinho.
Decidi ser legal e usar
std::string
s em vez dechar*
s. Tenho certeza de que teria confundido você com sintaxe do tipochar*[]
e definitivamente teria me esquecido de ligardelete
ou feito algo estúpido como ligar emdelete
vez dedelete[]
.fonte
C
Algum tipo de transformação genérica de abreviações em palavras completas, basta ajustar a
data
matriz ...fonte
PHP
fonte