Преобразуйте короткие названия месяцев в их более длинные аналоги [Завершено]


28

Этот вызов закончился! Поздравляем Flonk !

Я был уверен, что получу хорошую оценку, но после сдачи моей работы Флонка мой профессор не верил, что она моя, а также не мог понять, почему это так сложно ... Я потерпел неудачу, и моя мама вытащила меня из Facebook и Minecraft на месяц. Я не понимаю :(

Спасибо за все ваши представления! Некоторые отличные ответы здесь. Официальный победитель - Флонк с результатом 64 . Топ 5:

  1. Flonk , 64 (Haskell, с эффективной математикой!)
  2. DigitalTrauma , 40 (Облако, будущее уже сейчас)
  3. primo , 38 (Питон и мой личный фаворит - и очень профессиональный!)
  4. Сильвестр , 20 (Ракетка, хотя Янембер ее растягивает!)
  5. ilmale , 16 ( Высоко оптимизированный алгоритм в Lua)

Оригинальный вызов ниже.


Пожалуйста, помогите мне, это очень срочно! :(

Мне нужно преобразовать сокращенные версии названий месяцев в их более длинные представления (например, «Декабрь» -> «Декабрь») без учета регистра. Прямо сейчас я использую Java; имя месяца - это строка, и я бы не стал сначала преобразовывать его в объект Date. Любой язык подойдет, хотя.

Есть простой способ сделать это?? Успокойся, пожалуйста, я новичок в программировании!


Это конкурс популярности кодового троллинга (лучший вид!). Ответ с наибольшим количеством голосов 8 апреля 2014 года выигрывает.


7
«Пожалуйста, помогите мне, это очень срочно !!! :(» <<< сделать домашнее задание, сделать это быстро?

13
@yeti Как можно быстрее! Спешите, прежде чем я провалюсь на уроке!
Джейсон С

24
Должна быть функция, которая тайно копировала бы такие вопросы из Stackoverflow в codegolf.SE с тегом контроля кода, а затем передавала ответы из codegolf.SE обратно в исходное сообщение с удаленным текстом в тегах спойлера.
Даниеро,

Код-троллинг находится в процессе удаления согласно официальной позиции. За этот вопрос проголосовали очень многие, многие из которых чрезвычайно высоко проголосовали. Он получил чуть более 50% «исключенных» голосов в опросе , но он уникален тем, что получил так много ответов и голосов, поэтому я фиксирую его на историческом значении.
Ручка двери

Ответы:


74

Это действительно просто с небольшой полиномиальной интерполяцией!

Сначала я посмотрел список коротких названий месяцев

["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]

и проверил сумму своих символов ASCII значений

[313,301,320,323,327,333,331,317,328,326,339,300]

затем вычел 300 из них, чтобы понять, с чем я здесь имею дело, и подготовил массив, содержащий все более длинные версии названий месяцев.

[13,1,20,23,27,33,31,17,28,26,39,0]
mons = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

Я думаю, вы можете видеть, что происходит сейчас - все, что мне нужно, это функция getIndex, которая отображает 13 на 0, 1 на 1, 20 на 2 и так далее, так что я могу просто сделать

getMonthName shortname = mons !! (getIndex shortname)

К счастью, Wolfram | Alpha может сделать это для меня ! Числа становятся немного большими, но Haskell может справиться с этим с изяществом. Нам просто нужно округлить результаты, потому что арифметика с плавающей точкой немного неточна! Итак, поехали, быстрый, элегантный и идиоматичный Haskell:

import Data.Char

getIndex x = round $ 11 -
    (220797068189915461*x)/11644212222720 +
    (184127469431441671621*x^2)/6982771136140800 -
    (8800438195450444577647153*x^3)/1013060436431307264000 +
    (2826703553741192361967823*x^4)/2026120872862614528000 -
    (269098602165195540339443*x^5)/2026120872862614528000 +
    (13744405529566098359*x^6)/1692665725031424000 -
    (13060656886070844161*x^7)/39727860252208128000 +
    (5939638907108115199*x^8)/675373624287538176000 -
    (303426664924585177*x^9)/2026120872862614528000 +
    (2983240583426137*x^10)/2026120872862614528000 -
    (12901227927103*x^11)/2026120872862614528000

mons = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
getMonthName = (mons!!).getIndex.subtract 300.fromIntegral.sum.fmap (ord.toLower)

Запустите его просто так:

λ> getMonthName "DeC"
"December"

λ> getMonthName "jan"
"January"

3
Очень хорошо и целые числа очень эффективны, я уверен, что моему преподавателю понравится моя работа!
Джейсон С

8
+1 за то, что научил меня interpolating polynomial.
Прим

3
Я должен был смеяться, когда читал ваше первое предложение.
Анафоры

46

Bash + инструменты GNU + "облако"

У Google есть ответ на все вопросы, и мне повезло :

wget -qU Mozilla -O- "http://www.google.com/search?q=$1+month&btnI" | grep -Eo "<title>[[:alpha:]]+" | cut -d\> -f2

В использовании:

$ ./longmonth.sh jan
January
$ ./longmonth.sh feb
February
$

1
Хорошо сыграно, сэр!
ojblass

Не будет [a-zA-Z]работать в качестве замены [[:alpha:]](кажется, таким образом, когда я пытаюсь по крайней мере)? Это спасло бы 3 символа. Можно запросить еще несколько символов ask.com, но это может быть не так надежно.
Майкл

7
@Mic, который имел бы значение, если бы это был код гольф
подземный

7
@JasonC Это «облачное» решение. Конечно, никаких других оправданий не требуется.
Цифровая травма

4
@DigitalTrauma Дорогой сэр, я слышал об облаке, и оно очень профессионально! Очень хорошо! Очень убежден! Ty-JasonC
Джейсон C

43

питон

Поскольку эта функция очень важна, она, вероятно, будет использоваться очень часто, поэтому вам следует постараться сделать ее как можно быстрее. Другие авторы рекомендовали использовать поиск по хэш-карте ... не делайте этого! Hashmaps действительно медленны по сравнению с массивами. Вам просто нужно преобразовать каждую аббревиатуру в число. Для этого можно использовать стандартную технику хеширования:

index = reduce(int.__mul__, (ord(c) for c in abbr))

Это почти наверняка будет уникальным, и многие профессиональные инструменты используют это.

Теперь вам нужно создать функцию поиска:

def month_abbr_to_name(abbr):
  months = ["Unknown"] * 2000000

  months[679932]  = "December"
  months[692860]  = "Febuary"
  months[783315]  = "August"
  months[789580]  = "January"
  months[829920]  = "April"
  months[851466]  = "March"
  months[903749]  = "May"
  months[907236]  = "October"
  months[935064]  = "July"
  months[938896]  = "September"
  months[952380]  = "June"
  months[1021644] = "November"

  index = reduce(int.__mul__, (ord(c) for c in abbr))

  month_name = months[index]

  if month_name == "Unknown":
    raise ValueError("Invalid month abbreviation!")

  return month_name

И используйте это так:

print month_abbr_to_name("Dec")December

НТН!


Троллинг

- Этот код ужасно медленный. Хотя доступ к массиву действительно быстрее, чем к хеш-картам, это не применимо, если массив в тысячи раз больше необходимого хэш-карты.
- Этот невероятно большой массив создается снова и снова, каждый раз, когда вызывается функция. Чтобы тратить немного больше места, каждое значение инициализируется с помощью «Неизвестно».
- Функция хеширования предназначена для того, чтобы быть неясной для кого-то, кто не знаком с Python. Я добавляю, что он «используется во многих профессиональных инструментах», чтобы препятствовать расследованию.
- Функция хеширования достаточно уникальна, чтобы правильно распределить данные между двенадцатью месяцами, но не улавливает многих распространенных опечаток, таких как поменялись местами символы.
- Почти любая строка длиннее 3 символов будет падать в индексе массива за пределами границ.
- «Февраль» написан с ошибкой.
- «Эта функция очень важна». Незначительное эго-трение для ОП.


12
Внимательно посмотрите, ребята; это правильный ответ кода троллинг ! Ps. Я уверен, что получу хорошую оценку с этим, и это будет намного лучше, чем скрипт Java- сервера sloooow, который я пытаюсь написатьE?! [Введите описание изображения здесь]
Jason C

2
«Февраль» написан с ошибкой. - немного серьезного троллинга :)
Jaa-c

10
+1 за то, что говорят, что хеш-таблицы неэффективны, а затем реализуют действительно неэффективные хеш-таблицы
James_pic

1
«Хеш-карты действительно медленны по сравнению с массивами. Вам просто нужно преобразовать каждую аббревиатуру в число. Для этого можно использовать стандартную технику хеширования ...», то есть, другими словами, переопределить хэш-карту. Хах. +1
wchargin

25

рэкет

Я иду на решение KISS . Я протестировал его с использованием сценария использования OP "Dec" со всеми заглавными буквами, чтобы проверить, вернется ли правильный результат. Это прошло с летающими цветами.

(define (long-month short-month)
  (define end "ember")   
  (string-titlecase 
   (string-append short-month end)))

;; Test OP's use case
(long-month "DEC") ;;==> "December"

Очевидно, троллинг здесь заключается в том, что он работает только в нескольких случаях, поэтому он бесполезен :-)


Вероятно потому, что из тики троллинг кода вики «Задача состоит в том, чтобы дать код, который работает, но бесполезен, серьезно расстраивает ОП». Ваш код даже не работает. Здесь, есть еще один downvote.
user12205

@ace Не выдает никаких ошибок и возвращает правильный ответ «Декабрь». В вопросе не указано, что он должен работать в течение других месяцев или каких длинных имён они будут иметь, поэтому я ожидаю, что добавление «тлеющего» в конце - хороший ответ тролля.
Сильвестр

1
Из вопроса «Мне нужно преобразовать сокращенные версии названий месяцев в их более длинные представления (например,« Декабрь »->« Декабрь »)« Декабрь - это пример, но не во всех случаях. Ваша программа должна работать для всех названий месяцев.
user12205

9
@ace И это делает. Он превращает «Ян» в «Январь». Глядя на пример, именно то, что хочет ОП. Я действительно не могу понять, как можно понизить ответ для тегов троллинга кода, так как «Умышленное неверное истолкование вопроса» и «измена вопросу» являются хорошими способами ответить на него.
Сильвестр

7
Это именно то решение, которое я хотел предложить, с «заявлением об отказе: вы сказали, что это срочно, поэтому я поспешил и проверил только 3 случая, но все прошло успешно».
AShelly

22

LUA

Мое решение будет работать на вашем языке, ваш профессор будет счастлив

input = ...
found = false
input = string.lower(input)

i = 12
while i > 0 do
   abb = os.date("%b")
   if string.lower(abb) == input then
      print(os.date("%B"))
      return
   end
   os.execute('sleep 28d')
   i = i - 1
end
print('not found')

Тест

lua 25207.lua aPr
April

Проверьте аббревиатуру текущего месяца, если правильно, верните длинную строку, в противном случае попробуйте снова.


Brilliant! Напоминает мне время моей старой работы, когда я был <<< Ошибка: истекло время соединения. >>>
joeytwiddle

13

Perl

use re 'eval';$_=lc<>;
s/b/br/;s/an|br/$&uary/;s/(?<!u)ar/arch/;s/r$/ril/;s/p$/pt/;s/t|v|c$/$&ember/;
s/ju(.)/$&.$1=~tr\/nl\/ey\/r/e;s/(?<=g)/ust/;s/ctem/cto/;
print ucfirst;

- Регулярно, черт возьми. Я надеюсь, что регулярное выражение не считается "троллингом по неясному языку".
- Чрезвычайно хрупкий. Вам будет трудно добавить поддержку Bugsember.
- не читается. Узор внутри узора делает его еще более привлекательным.
- Сжатие июня и июля в одно утверждение фактически ничего не сжимает.
- случайное использование вида lookbehind g, в то время как другие повторяют шаблон в замене.
- use re 'eval'на самом деле не нужен; он используется только тогда, когда требуется переменный шаблон. Кроме того, использование evalдля «усиления» немного «сжатия».


17
Выглядит как нормальный Perl для меня ...
Питер Олсон

1
@PeterOlson язык был выбран в соответствии с алгоритмом, но алгоритм совсем не подходит для задачи, вы согласны? :-)
Джон Дворжак

10

Джава

Вы сказали, что ваш текущий код написан на Java, поэтому я решил, что вам будет проще.

// The standard library's there, so you should use it
import static java.util.Calendar.*;

public class MonthConverter {

  private static int shortNameToNumber(String shortName) {
    int i;
    switch (shortName) {
      case "jan": i = 1;
      case "feb": i = 2;
      case "mar": i = 3;
      case "apr": i = 4;
      case "may": i = 5;
      case "jun": i = 6;
      case "jul": i = 7;
      case "aug": i = 8;
      case "sep": i = 9;
      case "oct": i = 10;
      case "nov": i = 11;
      case "dec": i = 12;
      default: i = 0;
    }
    return i;
  }

  private static String numberToLongName(int month) {
    switch (month) {
      case JANUARY: return "January";
      case FEBRUARY: return "February";
      case MARCH: return "March";
      case APRIL: return "April";
      case MAY: return "May";
      case JUNE: return "June";
      case JULY: return "July";
      case AUGUST: return "August";
      case SEPTEMBER: return "September";
      case OCTOBER: return "October";
      case NOVEMBER: return "November";
      case DECEMBER: return "December";
      default: return "Unknown";
    }
  }

  public static String fullName(String shortName) {
    return numberToLongName(shortNameToNumber(shortName));
  }

  public static void main(String[] args) {
    // Always test your code
    System.out.println("jan is: " + fullName("jan"));
    assert fullName("jan").equals("January");
  }
}

У класса Calendar есть забавный маленький гоч, где месяцы нумеруются, начиная с 0 - так JANUARY == 0. Однако это явно не может повлиять на наш код, как мы его тестируем, верно? Обратите внимание, что в shortNameToNumber есть непреднамеренное падение переключателя, что означает, что каждый месяц заканчивается 0. Удобно JANUARY == 0, так что наш тест проходит.


1
О, боже, я не заметил отсутствия разрывов в заявлении переключателя. Прошло так много времени с тех пор, как я использовал переключатель.
Джо З.

10

Bash + coreutils + paq8hp12

Ответ, который в настоящее время проголосовал больше всего, имеет доступ к Интернету для каждого запроса. Помимо того, что он очень неэффективен, это также означает, что ваш скрипт не будет работать, если нет интернета.

Лучше хранить необходимую информацию на жестком диске. Конечно, вы можете хранить только данные, необходимые для этого самого сценария, но для этого потребуются разные данные. Гораздо лучше хранить все данные, которые могут вам понадобиться, в одном многоцелевом файле.

# This script is supposed to output only the wanted information, so we'll have to close
# STDERR and make sure accidental keyboard presses don't show any characters on the screen.

exec 2>&-
stty -echo

# Unfortunately, Bash doesn't have goto labels. Without them, it's impossible to use if
# statements, so we'll implement them.

goto()
{
    exec bash <(egrep -A 1000 "^: $1" $0) $BASH_ARGV
}

# We'll need enwik8, a magic file containing all the important Wikipedia data. EVERYTHING
# can be found on Wikipedia, so this file contains all the information any script could
# possibly need.

ls | grep -q enwik8 && goto alreadydownloaded

# Too bad.

wget http://mattmahoney.net/dc/enwik8.zip
unzip enwik8.zip

# ZIP is a very wasteful format and hard disk space is expensive. It is best to compress
# the file using a more efficient algorithm.

wget http://mattmahoney.net/dc/paq8hp12any_src.zip
unzip paq8hp12any_src.zip

# Make the compression program executable and compress the magic Wikipedia file.

chmod +x paq8hp12_l64
./paq8hp12_l64 enwik8.paq8 enwik8

: alreadydownloaded

# Extract the enwik8 file from the paq archive.

./paq8hp12_l64 enwik8.paq8 enwik8

# Now we use a simple POSIX Basic Regular Expression to find the required information in
# the file.

cat enwik8 | egrep -io "[0-9].[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?[a-z]?.[0-9]" | sort | uniq -c | sort -n | tac | egrep -o "$1[a-z]*" | sort | uniq -c | sort -n | tac | head -n 1 | cut -d ' ' -f 7

# We're done.

Троллинг

  • Закрывает STDERR, поэтому мы не сможем отладить скрипт, если он потерпит неудачу.

  • Отключает эхо ввода, которое сохраняется после завершения сценария. Если выполняется из терминала, вы должны выполнить команду stty echo, чтобы ваш терминал снова начал работать. Если не выполняется из терминала, это может привести к сбою сценария.

  • Требуется реализация goto в первую очередь. Как будто это не было достаточно плохо само по себе, функция goto не будет работать, если имя файла скрипта содержит пробелы.

  • Мы не будем загружать архив, если в текущем каталоге есть файл, содержащий строку enwik8 . Это может сработать.

  • Загрузка файла размером 100 МБ (даже если он сжат до 36 МБ) явно не подходит для этой задачи. Кроме того, enwik8 содержит первые 100 МБ из дампа Википедии объемом 4 ГБ, поэтому для конкретной задачи вряд ли будет содержаться какая-либо полезная информация.

  • Сжатие файла с помощью paq8hp12 уменьшает его до 16 МБ, но сжатие и распаковка занимают один час. Это на самом деле будет делать оба раза при первом запуске этого скрипта.

  • Сценарий не удаляет сжатую или необработанную версию enwik8 , поэтому сокращение его до 16 МБ заняло еще больше места на жестком диске.

  • Утилита сжатия будет работать только на 64-битных процессорах.

  • Он оставляет все файлы, которые были загружены или извлечены в текущем каталоге.

  • Это не объясняет самую сложную часть сценария, которая является монстром regex-pipe. Он в основном извлекает все строки длиной от 4 до 19 байтов, которые имеют начальную и конечную цифры, сортирует эти строки по количеству вхождений, фильтрует строки, содержащие краткое имя месяца, снова сортирует по количеству вхождений и отображает наиболее часто встречающиеся.

  • Даже если вышеупомянутое было хорошей идеей, cat вначале не нужен, egrep довольно медленный для этой задачи, регулярное выражение вернет много ложных срабатываний (все может быть сделано с одним регулярным выражением), первый вид | uniq -c | сортировать -n | TAC абсолютно ничего не делает, он использует сортировку | tac вместо sort -r и cut не будет работать надежно, поскольку число пробелов в начале является переменным.

  • Регулярное выражение является расширенным регулярным выражением POSIX, поэтому поиск в синтаксисе BRE не поможет.

  • Возвращает ноябрь вместо ноября и 6 вместо августа .


1
Это очень полезный совет! Конечно, это более эффективно, и мой инструктор сказал мне, что профессионалы делают данные многоразовыми для ООП, а ООП - быстрее и лучше!
Джейсон С

9

Python + SQLite

Многие из ответов до сих пор делают ошибку в жестком кодировании названий месяцев. Но вы никогда не знаете, когда какой-нибудь папа или президент заставит нас переключиться на другой календарь, и тогда тонны кода разбора / форматирования даты мгновенно станут бесполезными! (Или, чаще, когда вам нужно интернационализировать вашу программу.)

Что вам нужно, это база данных.

CREATE TABLE tblShortMonthNames (
   MonthAbbr CHAR(3) PRIMARY KEY NOT NULL COLLATE NOCASE,
   MonthID   INTEGER NOT NULL
);

CREATE TABLE tblFullMonthNames (
   MonthID   INTEGER PRIMARY KEY,
   MonthName VARCHAR(9) NOT NULL
);

INSERT INTO tblFullMonthNames VALUES (1, 'January');
INSERT INTO tblFullMonthNames VALUES (2, 'February');
INSERT INTO tblFullMonthNames VALUES (3, 'March');
INSERT INTO tblFullMonthNames VALUES (4, 'April');
INSERT INTO tblFullMonthNames VALUES (5, 'May');
INSERT INTO tblFullMonthNames VALUES (6, 'June');
INSERT INTO tblFullMonthNames VALUES (7, 'July');
INSERT INTO tblFullMonthNames VALUES (8, 'August');
INSERT INTO tblFullMonthNames VALUES (9, 'September');
INSERT INTO tblFullMonthNames VALUES (10, 'October');
INSERT INTO tblFullMonthNames VALUES (11, 'November');
INSERT INTO tblFullMonthNames VALUES (12, 'December');

INSERT INTO tblShortMonthNames
   SELECT SUBSTR(MonthName, 1, 3), MonthID FROM tblFullMonthNames;

Затем просто напишите простую программу для запроса.

import sqlite3
import sys

QUERY = """SELECT tblFullMonthNames.MonthName
FROM tblShortMonthNames INNER JOIN tblFullMonthNames USING (MonthID)
WHERE tblShortMonthNames.MonthAbbr = ?"""

with sqlite3.connect('months.db') as db:
    for abbr in sys.argv[1:]:
        row = db.execute(QUERY, [abbr]).fetchone()
        if row:
            print(row[0])
        else:
            print(abbr + ' is not a valid month name.')

5

SH & друг (дата)

Функция:

longmonth() {
    date +%B -d"$1 1"
}

Тестирование это:

$ echo $LANG
de_DE.utf8
$ for i in jan feb mar apr may jun jul aug sep oct nov dec ; do longmonth $i ; done
Januar
Februar
März
April
Mai
Juni
Juli
August
September
Oktober
November
Dezember
$ LANG=C
$ for i in jan feb mar apr may jun jul aug sep oct nov dec ; do longmonth $i ; done
January
February
March
April
May
June
July
August
September
October
November
December

Это коротко ... но посчитайте, что это соотношение "зло на персонажа" ... mwhuaaahahahaaaa ...


Я не знаю языка, поэтому не вижу здесь ничего злого. Я предполагаю, что ваши отрицательные отзывы от других в аналогичном положении. Пожалуйста, объясните, что происходит и почему это зло. Мне любопытно.
Уровень River St

Это (n) (ab) использование dateвозможностей форматирования даты в России. И dateучитывает локализацию, он генерирует месяц, соответствующий локализации. -d"a_month_name 1устанавливает дату на 1-й из названного месяца (возможно, короткое имя), а пропущенный год устанавливается так, что это будет следующий такой месяц. +%Bявляется форматом для отображения данной даты и означает «длинное имя месяца». Все таты обернуты в функцию оболочки, и поскольку там нет специфической вещи BASH, SH будет достаточно для ее запуска. Так что в основном dateзаслуживает всех аплодисментов, а не меня! И мне плевать на отрицательные голоса в Codegolf! : -Þ

Мне это нравится! Обидчик.
ojblass

4

Perl

Как насчет хорошей старой силы?

$|++;

use List::Util qw(reduce);

sub hash {
    my $t=9;
    (reduce { $a*$b*log(++$t+$a) } map { ord() } split//, shift)%54321098
}

my @m = (qw( january february march april may june
             july august september october november december ) );
my %targets = map { hash($m[$_]) => 1 } (0..$#m);

chomp(my $in = lc <>);

print ucfirst $in;

my $r;
if(!$targets{hash($in)}) {
  $r = "a";
  ++$r until $targets{hash($in.$r)};
}
print "$r\n";

Почему это круто:

  • грубая сила - это всегда самый мужественный способ сделать это.
  • для вашего удобства напечатайте частичный ответ, как только он узнает его (держу пари, что вы не знали, что «февраль» - это сокращение от «февраль ...» ???)
  • Пользовательская функция хеширования для максимальной безопасности.
  • Использование встроенной в Perl перегрузки операторов (приращение строк) делает этот код таким же быстрым, как и собственный код Си. Посмотрите на все эти нули, показывая, насколько быстро он работает!

    ski@anito:/tmp$ for m in mar apr may jun jul  ; do echo $m | time -f "%U user" perl brute.pl ; done 
    March
    0.00 user
    April
    0.00 user
    May
    0.00 user
    June
    0.00 user
    July
    0.00 user
    
  • Алгоритм интуитивно понятен, и я оставляю доказательство в качестве упражнения для читателя, но просто для того, чтобы убедиться, что он работает во всех случаях, давайте проверим август, один из месяцев, и один из, чтобы убедиться, что мы ничего не пропустил

    ski@anito:/tmp$ for m in aug jan oct ; do echo $m | perl brute.pl  ; done 
    August
    January
    October
    

Trollage:

Оставляя в стороне методы кодирования, которые могли бы привести к гибели Дамиана Конвея, этот код периодически ошибочен и периодически крайне медленен. «Фев» работает примерно на 6 порядков - в миллион раз медленнее, чем «май», «июнь» или «июль». Feboapic, Sepibnd, Novgpej и Decabjuj - это не месяцы (хотя их забавно пытаться произносить).

    ski@anito:/tmp$ for m in jan feb mar apr may jun jul aug sep oct nov dec ; do echo $m | time -f "%U user" perl  brute.pl  ; done 
    January
    3.14 user
    Feboapic
    62.77 user
    March
    0.00 user
    April
    0.00 user
    May
    0.00 user
    June
    0.00 user
    July
    0.00 user
    August
    0.10 user
    Sepibnd
    1.33 user
    October
    2.22 user
    Novgpej
    1.11 user
    Decabjuj
    4.27 user

PS - у меня был какой-то код, который имеет еще больший разброс времени выполнения, но он скучно выводит правильный ответ во всех случаях, что гораздо менее весело.


3

JavaScript - оптимизированный кластер узлов с ветвями, листьями и строковыми бочками.

// fullMon - Converts month key names to full names using a highly optimized tree for fast traversal.
function fullMon(key) {

    // Initialize the full month string
    var fullMonth = "";

    // Make sure the key is capitalized.
    key = key.substr(0,1).toUpperCase() + key.substr(1).toLowerCase();

    // Set the current node to the tree root.
    var current = fullMon.tree;

    // Traverse the characters in key until we can go no further.
    for (var i = 0; i < key.length; i++) {
        var c = key.charAt(i)
        fullMonth += c
        if (typeof current[c] === "undefined") return key // no full month for this key
        current = current[c]
    }

    // The remaining leaves are the characters in the full month.
    while (current !== null) {
        for (c in current) fullMonth += c
        current=current[c]
    }
    return fullMonth
}

// fullMon.treeBuilder - Builds a character node tree of full month names.
fullMon.treeBuilder = function() {
    // Set a barrel of month keys.
    var barrel = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

    // Root node for letter tree.
    var tree = {};

    // Loop through all month keys.    
    for (var i = 0; i < barrel.length; i++) {

        // Get the next month key and do a barrel roll by
        // splitting into an array of single character strings.
        var monKey = barrel[i].split("");

        // Set the current branch to the tree root.
        var branch = tree;

        // Climb branches in the tree by looping through
        // month key characters and doing leaf wipes.
        for (var c = 0; c < monKey.length; c++) {

            // The next character is the next leaf of the branch.
            var leaf = monKey[c];

            // Wipe this leaf on the branch if it doesn't already exist.
            if (typeof branch[leaf] === "undefined") {
                // If the leaf is the last character then it's not sticky should be set to null.
                branch[leaf] = (c === (monKey.length-1)) ? null : {};
            }

            // Switch to the next branch.
            branch = branch[leaf];
        }
    }
    return tree;
}

fullMon.tree = fullMon.treeBuilder();

fullMon.demo = function () {
    // Demonstrates keys that are not found "none" and found keys.
    var short = ["none","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];
    for (var i = 0; i < short.length; i++) {
        console.log(fullMon(short[i]));
    }
    // Shows the optimized tree for fast lookups.
    console.log(JSON.stringify(fullMon.tree));
}

fullMon.demo();

3

Java, Google и вероятность

Я разочарован тем, что многие решения здесь «изобретают велосипед», когда ответ легко доступен в Интернете.

Вот вывод моей программы:

The short version of jan is january
The short version of feb is february
The short version of mar is margin
The short version of apr is april
The short version of may is mayinhistory
The short version of jun is june
The short version of jul is july
The short version of aug is august
The short version of sep is september
The short version of oct is october
The short version of nov is november
The short version of dec is december

Не идеально, но достаточно хорошо, чтобы отправить в QA. Я смог достичь этих результатов, используя возможности краудсорсинга:

public static String expandMonthName(String shortMonthName) {
    try {
        // First, we ask Google for the answer

        String query = "https://www.google.com/search?q="
                + "what+month+is+" + shortMonthName;
        String response = curl(query);

        // now sift through the results for likely answers.
        // The best way to parse HTML is regex.

        List<String> possibleMonths = new ArrayList<>();
        Pattern pattern = Pattern.compile(shortMonthName + "[A-Za-z]+");
        Matcher matcher = pattern.matcher(response);
        while (matcher.find())
            possibleMonths.add(matcher.group(0));

        // And finally, choose the likeliest answer using 
        // the ineluctable laws of probability

        return possibleMonths.get(new Random().nextInt(possibleMonths.size()));

    } catch (Exception e) { return "August";}   // well, we tried.
}

Если неясно, expandMonthName ("jan") возвращает случайным образом выбранное слово, начинающееся с "jan" из результата Google для "какой месяц является jan". Если вы не используете прокси-сервер, в этом случае возвращается «Август».


2

Bash + binutils

Я изо всех сил пытался сделать очевидное, преобразовав входные данные в объект даты, но с треском провалился. Наконец-то я прибег к грубой силе.

while read -e line; do
  [[ "${line,,}" == "${1,,}"* ]] && o=$line && break
done < <(strings /bin/date)
o=${o:=$1}
o=${o,,}
echo ${o^}

Тестовые прогоны:

$ bash getmonth.sh jan
January
$ bash getmonth.sh may
May
$ bash getmonth.sh DEC
December

2

Я понимаю, что проверка названий месяцев очень сложна и требует много вычислений и логического мышления. Вот оптимизированная версия алгоритма Buzz-Strahlemann для проверки названий месяцев .

PHP

$month = "Jan"; //Change this to search for a different month, noob :)
$time = time(); //This loads an extended time library
$ivefoundthismonthnowexit = false;
while (!$ivefoundthismonthnowexit) {
    $checkThis = date('F', $time); //"F" stands for "Find it"
    if (substr($checkThis, 1, 4) == $month) $ivefondthismonthnowexit = true; //You can also replace it with ($checkThis, 0, 3)
    //since PHP understands if you are counting from 0 or 1!
    $time++;
}

Тролли:

  • Этот ответ;

  • Не обрабатывает часовые пояса и выдаст предупреждающее сообщение;

  • Не принимает месяц как ввод, но вам нужно жестко его кодировать;

  • Даже когда вы жестко его кодируете, он чувствителен к регистру;

  • Этот код пытается получить текущий месяц, первые три буквы и проверить, соответствует ли он $month. Если он не совпадает, он увеличивает временную метку на 1, а затем повторяет попытку. Это заканчивается очень медленно ;

  • Этот код ничего не выводит (кроме предупреждения, конечно);

  • Комментарии очень вводят в заблуждение: time()не загружает расширенную библиотеку времени, но получает текущую временную метку; substr($checkThis,1,4)пропускает первую букву месяца и получает следующие 4 ( archдля March, например); Правильная форма - та, что в комментариях;

  • Даже когда совпадение найдено, код не выйдет из цикла: на самом деле переменная, для которой установлено значение true, отличается.


3
-1: из тики троллинга кода: «Задача состоит в том, чтобы дать код, который работает, но бесполезен, серьезно расстраивает ОП». Ваш код даже не работает.
user12205

1
Хм? Это работает, и это бесполезно. Ждать 10 лет, пока не закончится бесконечный цикл, не достаточно разочаровывает? «Это работает» означает (по крайней мере, для меня), что код компилируется и выполняется успешно, это не значит, что он должен закончиться или дать какое-либо решение.
Vereos

@ace (я забыл упомянуть вас в предыдущем комментарии); В этом комментарии я пытаюсь сказать, что хотел бы лучше понять, что вы имеете в виду, потому что это правильно с моей точки зрения.
Vereos

Возможно, потому archчто никогда не будет равных Mar?
user12205

Таким образом, ваш код не может конвертировать названия месяцев, поэтому он не работает.
user12205

2

партия

То, что вы просите, нетривиально. Однако я нашел идеальное решение для вас! Как это работает, загрузив очень сложный список английского языка на свой жесткий диск. Затем входные данные сверяются с загруженным списком и дается окончательное название месяца! Genius!

Теперь этот метод имеет много плюсов по сравнению с другими методами, некоторые из которых:

  • Вы можете иметь любое сокращение слова! Например , Janили Januза январь!
  • «Вы никогда не знаете, когда какой-нибудь папа или президент заставит нас переключиться на другой календарь, и тогда тонны кода разбора / форматирования даты мгновенно станут бесполезными!» Это никогда не проблема с нашим методом!
  • Пользователю высылаются подсказки с подтверждением, лучше, чем потом сожалеть!

Код:

@ECHO OFF
setlocal EnableDelayedExpansion
REM Remove this at the end ^^^
REM First off, we have to get the user's input
set /p abbreviatedUserInput= Please input your abbreviated form of the month: 
REM echo out confirmation message. Without this, the thing won't work
SET /P variableThatIsUsedForConfirmation= Are you sure you want to look for %abbreviatedUserInput% (Y/N)? 
REM if the user said no, send him elsewhere
if /i {%variableThatIsUsedForConfirmation%}=={n} (goto :hell)
REM to keep things clean, we clear the screen!
cls
ECHO Prepare for launch!
REM make sure the user reads what we wrote, we spent time on this and the user must understand that... 
REM BTW this pings an incorrect ip address and waits 3000 millisex for the output
ping 1.1.1.1 -n 1 -w 3000 > nul
REM to keep things clean, we clear the screen!
cls
REM We must inform the user that something is going on, otherwise they might get bored and quit the app
ECHO LOA-DING!
REM Now, how this works is by utilizing the dictionary.. I believe we all know what that is. First of all, let's get a dictionary!
powershell -Command "(New-Object Net.WebClient).DownloadFile('http://www.mieliestronk.com/corncob_caps.txt', 'dic.txt')"
REM to keep things clean, we clear the screen!
cls
REM The user probably already got bored, let's inform them that we're still working...
ECHO STILL WORKING...
REM wait what?!! The dictionary is all caps!! Lets fix that...
REM Lets loop through the file like so:

for /F "tokens=*" %%A in (dic.txt) do (
    SET "line=%%A"
    REM replace ALL the letters!!
    SET "line=!line:A=a!"
    SET "line=!line:B=b!"
    SET "line=!line:C=c!"
    SET "line=!line:D=d!"
    SET "line=!line:E=e!"
    SET "line=!line:F=f!"
    SET "line=!line:G=g!"
    SET "line=!line:H=h!"
    SET "line=!line:I=i!"
    SET "line=!line:J=j!"
    SET "line=!line:K=k!"
    SET "line=!line:L=l!"
    SET "line=!line:M=m!"
    SET "line=!line:N=n!"
    SET "line=!line:O=o!"
    SET "line=!line:P=p!"
    SET "line=!line:Q=q!"
    SET "line=!line:R=r!"
    SET "line=!line:S=s!"
    SET "line=!line:T=t!"
    SET "line=!line:U=u!"
    SET "line=!line:V=v!"
    SET "line=!line:W=w!"
    SET "line=!line:X=x!"
    SET "line=!line:Y=y!"
    SET "line=!line:Z=z!"
    ECHO !line! >> dic-tmp.txt
)

REM to keep things clean, we clear the screen!
cls
REM The user probably already got bored, let's inform them that we're still working...
:lookup
ECHO WOW! THAT TOOK LONG! ALMOST THERE...
REM Alright, now we need to find the correct date in the dictionary, we might need the users help in this...
REM Lets loop through ALL the lines again
set match=seriously?
for /F "tokens=*" %%a in (dic-tmp.txt) do (
    SET "line=%%a"
    REM to keep things clean, we clear the screen!
    cls
    REM replace the user input with some other stuff...
    SET "test=!line:%abbreviatedUserInput%=lol!"
    REM if the original line does not equal the test variable, then we have a match!
    IF NOT !line!==!test! (
        REM ask the user if the match is correct..
        set /P variableThatIsUsedForConfirmation= "Did you mean !line!? (Y/N): "
        REM if the user entered "y"
        IF /i {!variableThatIsUsedForConfirmation!}=={y} (
            REM set the variable "match" to the current line and goto the matchFound section...
            set match=!line!
            goto :matchFound
        )
    )
)
:matchFound
REM to keep things clean, we clear the screen!
cls
REM give the user their match
Echo Here's your month's full name: %match%
PAUSE
:hell
ECHO screw you!

Trollz

- Пакетное ... - Загрузка списка слов, потому что мы не можем набрать месяцы вручную ... - Не использовать взломать регистр переключателя - ОЧЕНЬ МЕДЛЕННО - преобразовать текстовый файл в нижний регистр и сохранить его в другом файле - запустить его во второй раз без удаления созданных текстовых файлов, и это будет еще медленнее - что-то помечает скрипт при преобразовании файла dic.txt в нижний регистр, это возвращает эхо обратно - эта вещь спойлера испортила форматирование, кстати ...


2

! # / Баш

! #/bash

# Make the MONTH variable equal to the $1 variable
MONTH="$1"

# Run grep passing the $MONTH variable and the -i flag
# Then use the << operator followed by a list of months
grep -i "$MONTH" << January
March
May
July
August
0ctober
December
April
June                                      
September
November
February
January

Чтобы ваша программа реагировала быстрее, я включил в список месяцы на 31 день раньше. По статистике, при равномерном распределении дат, вы, скорее всего, окажетесь в одном из этих месяцев.

Я задокументировал каждую строку, чтобы произвести впечатление на вашего босса.

Сохраните это в файле с именем lookup_month_script.bashи скопируйте и вставьте следующую строку, чтобы проверить это:

bash $PWD/lookup_month_script.bash "0ct"

Удачи с вашим проектом!


- Не работает в январе, несмотря на то, что он указан в списке дважды . (Мы фактически используем Januaryв качестве разделителя для начала и конца heredoc.)

- Также не работает в октябре. Никто не может понять почему.

- Если ввод оказался пустым, возвращает все 11 месяцев.

- Если скрипт вставлен в копию, июньский ответ будет содержать 42 символа.

Незначительный:

- Шебанг несколько неверен, но предупреждения не дано.

- Комментарии, которые являются комментариями, которые говорят, что говорит строка под ними.

- Даже если программа ответит раньше на более ранние записи, она все равно не будет завершена быстрее.


1

JavaScript - 209

В нем говорится не преобразовывать в Date, что здесь не происходит, я просто использую Date для генерации расширения короткого имени.

function m(s){c=s.charAt(0).toUpperCase()+s.substr(1).toLowerCase();a="ember,ember,ober,tember,ust,y,e,,il,ch,uary,uary".split(",");b=[];for(i=12;i--;)b[(""+new Date(1,i,1)).slice(4,7)]=11-i;return c+a[b[c]];}

Тесты ввода / вывода:

jan: January
feb: Febuary
mar: March
apr: April
may: May
Jun: June
JUL: July
AuG: August
sEp: September
OCT: October
nov: November
dec: December

3
Я также, кажется, троллил февраль - r :) Нарочно, конечно ...
Мэтт

Похоже, у кого-то есть дело о Вандже.
Джейсон С

5
@Matt Разве ты не имеешь в виду "На месте"?
Джастин

Of couse @Quincunx
Мэтт

1

Java 696, включая тестовый ввод

public class DateConverter {
    String months[] = 
    {
        "January", "February","March","April","May","June","July",
        "August","September","October","November","December"
    };
    DateConverter(){}
    String LongMonth(String shortMonth)
    {
        String m = "Invalid";
        for(int i=0;i<months.length;i++)
        {
            if(months[i].toLowerCase().contains(shortMonth.toLowerCase()))
            {
                m=months[i];
                break;
            }
        }
        return m;
    }

    public static void main(String[] args) {

        String input[] = {"jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
        for(int i=0; i<input.length; i++)
        {
            System.out.println((new DateConverter()).LongMonth(input[i]));
        }
    }
}

1

Язык программирования "Brainf * ck" является идеальным инструментом для этого! Конечно, это может быть не совсем то, что вы искали, но работа сделана безупречно!

>+<+[>[>[-]+<-]>[<+>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<->-]>>>>>>>>>>>>>>>>>>>>>
[<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+

This is the debug part of the code used when looping more than once

>>+++++++++++++++[>+++++>+++++++>++>+++++++>+++<<
<<<-]>--.>+++++.++.+++++.-.>++.<.>>-.---.<.<.>>+++.<<--.>>---..>.<<<------.>>.
<<++++++++..>>.<<--.>.>----.+..<<.>>+++.<<++++.>>++++.--------
.<<--.>>++++++++.<<-----.-.>+.>>[-]<[-]<[-]<[-]<[-]<++++++++++.[-]

It takes a dummy argument due to the nature of my interpreter 
If you're using some other intepreter I can rewrite the code for you

>>>>>>>>>>>>>>>>>>>>>>>,<+<<<<<<<<<<<<<<<<<<<<<<<<->-]>>>>>>>>>>>>>>>>>
[<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+

This is the normal part of the code, used when starting the programme the first time

>>+++++++++++++++[>+++++>+++++++>++>+++++++>+++<<<<<-]>--.>
+++++.++.+++++.-.>++.<.>>-.---.<.<.>>+++.<<--.>>---..>.<<<------.>>.<<++++++++..>>.<<-
-.>.>----.+..<<.>>+++.<<++++.>>++++.--------.<<--.>>++
++++++.<<-----.-.>+.>>[-]<[-]<[-]<[-]<[-]<++++++++++.[-]<-]>>>>>>>>>>>>>>>>>>>>>>>
[<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>-]<<<<<<
<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+

Here we take three arguments and assign them to variables; This is the three-letter 
abbreviation of the month

>>>>>>>>>>>>>>,<,<,

Now we check if the abbreviation is good; note that it will fail if it doesn't begin 
with a capital letter and isn't followed by two lowercase letters
In general it will print an error message and wait for you to input a letter 
(or just hit enter) before it exits

<<<[-]>>>>>[<<<<<+<<<<<<<+>>>>>>>>>>>>-]<<<<<<<<<<<<[>>>>>>>>>>>>+<<<<<<<
<<<<<-]>>>>>>>----------------------------------------------------------------->[-]    
<[<<<+>>>-]->[<<<<<<<+>+<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<
<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>
[>>>+<<<[-]]<<<[-]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>
>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]
<[>[-]+<-]>[<+>>+++++++++++[>++++++>++++++++++>+++<<<-
]>+++.>++++..---.+++.>.[-]<[-]<[-]<++++++++++.[-]>>>>>>>>>>>>>>>,,<<<<<<<<<<<<<<<<<-<-
>>-]>>>>>>>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<<<<+>>>
>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>[-]>>>>[<<<<+    
<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>
>>>>>-------------------------------->[-    
]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<[<<<+>>>-]>    
[<<<<<<<+>+<<+>>>>>>>>
-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]
<<<[>>[-]+<<-]>>-]<[>>>>>>-<<<<<<[-]]>>>[-]>>>>[-]>>
>[<<<+<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>>>>>>---------------
----------------->[-]+++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<[<<<<+>>>>-]>[<<<<<<<<+>+
<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>[>>[<+<<
<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>>>-<<<<[-]]<<<[-
]>>>>>>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>-<<<<<<<[-]]>
>>>>>>>[<<<<<<<<+>+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]<[>>>>>>>[-]-<<<<<<<[-]]->>>>>>>
[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>
>>>>>>+<<<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>+++++++++++
[>++++++>++++++++++>+++<<<-]>+++.>++++..---.+++.>.[-]<[-]<[-]<+
+++++++++.[-]>>>>>>>>>>>>>>>,,<<<<<<<<<<<<<<<<<-<->>-]>>>>>>>>>>>>>>>>>>
[<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<[>[-]+<
-]>[<+>>>>>>>>>[-]>>>[<<<+<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>-    
------------------------------->[-]+++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++<[<<<+>>>-]>[<<<<<<<+>+<<+>>>>>>>>-]
<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+
<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]<[>>>>>>-<<<<<<[-]]>>>[-]>>>>[-]>>[<<+
<<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-
]>>>>>>>>-------------------------------->[-
]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<[<<<
<+>>>>-]>[<<<<<<<<+>+<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>[>>[<+<<<+>>>>-]
<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>
-]>>[>>>>-<<<<[-]]<<<[-]>>>>>>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>-<<<<<<<[-]]>>>>>>>>
[<<<<<<<<+>+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]<[>>>>>>>[-
]-<<<<<<<[-]]->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>>>>>+
<<<<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[
<+>>+++++++++++[>++++++>++++++++++>+++<<<-]>+++.>++++..---.+++.>.[-]<[-]<[-]<++++++++++.    
[-]>>>>>>>>>>>>>>>,,<<<<<<<<<<<<<<<<<-<->>-]>>>>>>>>
>>>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+

This part of the code handles special exceptions to the pattern

>>>>>>>>>[-]>>>>>[<<<<<+<<<<<<<+>>>>>>>>>>>>-]<<<<<<<<<<<<[>>>>>>>>>>>>+<<<<<<<<<<<<-
]>>>>>>>>[-]++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++<[<<<<<<+>>>>>>-]->[<<<<<<<-<+>>>>>>>>-]    
<<<<<<<<[>>>>>>>>+<<<<<<<<-]>[>>>>>>+<<<<<<[-]]>>>>>>>[-]>
>>[<<<+<<<<<<<<+>>>>>>>>>>>-]<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>>>>>>>[-    
]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++<[<<<<<<<+>>>>>>>-]->[<<<<<<<<-<+>>>>>>>>>-]
<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>>+<<<<<<<[-]]>>>>>>[<<
<<<<<+>>>>>>>-]<<<<<<<[[-]>>>>>>>>[<<<<<<<<+>+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]
<[>>>>>>>-<<<<<<<[-]]]>>>>>>>>[-]>>[<<+<<<<<<<<+>>>>>>>>>>-]
<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>>>[-
]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++<[<<<<<<<+>>>>>>>-]->[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+
<<<<<<<<<-]>[>>>>>>>+<<<<<<<[-]]>>>>>>[<<<<<<<+>>>>>>>-]<<<<
<<<[[-]>>>>>>>>[<<<<<<<<+>+>>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]<[>>>>>>>-<<<<<<<[-]]]-
>>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>
>[>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++++++++
[>++++++>++++++++>+++++++++<<<-]>++.>+.>++.+++++++.<
.>---.+++++++.[-]<[-]<[-]<++++++++++.[-]>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<->-
]>>>>>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>-
]<<<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+

This part of the code handles the regular pattern

>>>>>>>>>[-]>>>>>[<<<<<+<<<<<<<+>>>>>>>>>>>>-]<<<<<<<<<<
<<[>>>>>>>>>>>>+<<<<<<<<<<<<-]>>>>>>>.[-]>>>>[<<<<+<<<<<<<+>>>>>>>>>>>-]       
<<<<<<<<<<<[>>>>>>>>>>>+<<<<<<<<<<<-]>>>>>>>.[-]>>>[<<<+<<<<<<<+>>>>
>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>.<<<<<<<++++++++++++
[>++++++++++>++++++++<<-]>---.>+.<---.+++++++.>[-]<[-]<++++++++++.[-]>>
>>>>>>>>>>>>+<<<<<<<<<<<<<<<<->-]<[>[-]+<-]>[<+

Here the programme checks if you want to insert another abbreviation or are done with the programme

>-]>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<[>[-]+<-]>
[<+>>+++++++++++++++[>+++++>++++++++>++>+++++++>++++>+
+++++<<<<<<-]>--.>-----.>++.<+.>>-.-------.<<.>.>.<<--------..>>>+++.<<.>>>+.--.
<<<+++++++++++++++.<<+++++.>>>----.>>[-]<[-]<[-]<[-]<[-]<[-]
<++++++++++.[-]>>>>>>>>>>>>>>>>>>>>>>>,<<<<<<<<<<,<<<<<<[-]>>>>>>[<<<<<<+
<<<<<<<+>>>>>>>>>>>>>-]<<<<<<<<<<<<<[>>>>>>>>>>>>>+<<<<<<<<<<<<<-]>
>>>>>>>[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<[<<<<<<+>>>>>>-]->[<<<<<<<-<+>>>>>>>>-]<<<<<<<<[>>>
>>>>>+<<<<<<<<-]>[>>>>>>+<<<<<<[-]]>>>>>>[>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>
[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>>>>>>>>[-]>>>>>>[<<<<<
<+<<<<<<<+>>>>>>>>>>>>>-]<<<<<<<<<<<<<[>>>>>>>>>>>>>+<<<<<<<<<<<<<-]>>>>>>>>[-
]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++<[<<<<<<+>>>>>>-]->[<<<<<<<-<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+
<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>
-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<-
>>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+-<->>-]>>>>>>>>>>>>>>>>
>>>>>>>>>[<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>-]
<<<<<<<<<<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>++++++>++++++++++>+++
<<<-]>+++.>++++..---.+++.>.[-]<[-]<[-]<++++++++++.[-]<<<->>-]<<]

Я уверен, что ваш учитель будет горд, когда вы покажете ему это!


Троллинг

Программа, во-первых, довольно плохо написана. Я сделал несколько циклов, которые вызывают случайные отпечатки ошибок и общую неработоспособность из-за отсутствия лучшего слова. Требуется небольшая очистка, чтобы получить прилично работающий код (в основном в первых двух абзацах), который в любом случае бесполезен, так как дает длинные имена как «аббревиатура +« uary »» (январь, февраль, мариус и т. Д.). включает избыточный код для «января» (определяется как исключение и кодируется отдельно). Первый ответ на Stackexchange, поэтому я надеюсь, что это соответствует критериям


1

Джава

Уважаемый ученик компьютерного ученого,

Это довольно сложная задача, и я решил только частично: я думаю, это для вашей дипломной работы или какой-то исследовательской цели.

До сих пор у меня есть только бета-версия с некоторыми незначительными ошибками: иногда она дает неправильные результаты, но я уверен, что ваш профессор примет ваши усилия.

файл Month.java:

/**
 * This bean keep track of a month-code (e.g. Apr) and month-name (e.g. April)
 * pair.
 */
public class Month{
    String month_name;
    String month_code;
    public void Month(monthName,monthCode){
        setMonthName(monthName);
        setMonthCode(monthCode);
    }
    public String getMonthName(){
        return this.monthName;
    }
    public void setMonthName(String monthName){
        this.monthName=monthName;
    }
    public String getMonthCode(){
        return this.monthCode;
    }
    public void setMonthCode(String monthCode){
        this.monthCode=monthCode;
    }

файл Era.java:

/**
 * This bean keep contains every couple of month-code,month-name in a year.
 */
public class Era{
    List <Month>months;
    public void Era(){
        months.add(new Month("Jan","January"));
        months.add(new Month("Feb","Febrary"));
        months.add(new Month("Apr","March"));
        months.add(new Month("May","May"));
        months.add(new Month("June","June"));
        months.add(new Month("Jul","July"));
        months.add(new Month("Aug","August"));
        months.add(new Month("Sep","September"));
        months.add(new Month("Oct","October"));
        months.add(new Month("Nov","Novemeber"));
        months.add(new Month("Dec","December"));
   }
   public String getMonthByCode(String monthName){

       return String.format("[%s]",months.get(new Random().nextInt((11) + 1) + 0));
   }
   public static void main(String ... argv){
        String monthCode="jan";
       System.out.println(String.format("%s: %s",monthCode, new Era().getMonthByCode(monthCode));
   }

Для запуска выполните:

javac Month.java
javac Era.java
java Era jan

выход:

jan: [January]

Не забудьте установить %JAVAPATH%путь, по которому вашJava компилятор!

Это просто вернуть случайный месяц. На самом деле я даже не проверял это. Я думаю, что некоторые импортные товары отсутствуют.


1

Поскольку OP использует Java, я дам решение Java. Идея проста:

  1. Создать Map от длинного имени к короткому имени.
  2. Создайте случайную строку, сопоставьте ее с коротким именем.
  3. Используйте, String.equalsIgnoreCaseчтобы проверить, совпадает ли короткое имя с входным коротким именем, игнорируя регистры. Если это так, успех, выход.
  4. В противном случае перейдите к шагу 2.

Вот источник:

import java.util.*;

public class Short2Long {
    static final Map<String, String> long2Short = new HashMap<String, String>();
    static {
        long2Short.put("Janurary", "jan");
        long2Short.put("February", "feb");
        long2Short.put("March", "mar");
        long2Short.put("April", "apr");
        long2Short.put("May", "may");
        long2Short.put("June", "jun");
        long2Short.put("July", "jul");
        long2Short.put("August", "aug");
        long2Short.put("September", "sep");
        long2Short.put("October", "oct");
        long2Short.put("November", "nov");
        long2Short.put("December", "dec");
    }

    static Random rand = new Random();

    static String genString() {
        int len = rand.nextInt(9-3) + 3;
        StringBuffer res = new StringBuffer(len);
        res.append((char)('A' + rand.nextInt(26)));
        for (int i = 1; i < len; i ++) {
            res.append((char)('a' + rand.nextInt(26)));
        }
        return res.toString();
    }

    public static void main(String[] args) {
        String s = args[0];
        while (true) {
            String l = genString();
            if (s.equalsIgnoreCase(long2Short.get(l))) {
                System.out.println(s + " -> " + l);
                break;
            }
        }
    }
}

Троллинг

Программе нужен быстрый процессор и ваш пациент. Когда вы научитесь многопоточности и у вас будет многоядерный процессор, вы можете попробовать сделать его быстрее.


1


Спасибо за размещение этой провокационной мысли и оригинального вопроса. Те из нас, кто публикует ответы на Stack Overflow, пользуются возможностью помочь постерам, поскольку цель этого веб-сайта состоит в том, чтобы каталогизировать все такие вопросы, чтобы сделать ненужными учебники и самостоятельное обучение. Не беспокойтесь из-за того, что вы не понимаете этот конкретный вопрос, так как это типичный вопрос, задаваемый из-за его скрытого трюка, необходимого для его эффективного решения. Инструкторы обычно задают этот вопрос, чтобы определить не только вашу глубину понимания языка, но и то, знаете ли вы об этой распространенной ловушке программиста: кодировке символов. Вы поймете более полно после того, как внимательно прочитаете следующую ссылку, как я знаю, вы будете: ссылка .

К настоящему времени я уверен, что ваш профессор очень подробно описал важность повторного использования кода, поэтому, прочитав предоставленную мною ссылку на кодировку символов, вы абсолютно точно поймете, что вам придется создать достаточно общий класс, который может работать с любым языком, даже если в исходном вопросе не было конкретно указано это требование (вы также можете узнать о спецификации требования, которая поможет вам понять требования, прочитайте эту ссылку: ссылка.

Вы очень умны, предлагая не использовать предоставленный объект Date, так как использование кода на языках по умолчанию не позволит вам показать свое истинное понимание языка своему профессору.

Чтобы помочь вам в этом сложном вопросе, я написал приложение на Groovy, которое решит вашу проблему и, несомненно, будет иметь больше смысла, чем та загадочная Java. Не пугайтесь использования Groovy для этого ответа, так как Groovy также работает на JVM точно так же, как код Java, поэтому вы можете легко перенести этот код в свой класс Java с помощью всего лишь нескольких модификаций. Я приложил ссылку, чтобы помочь вам в этом процессе, но я не буду беспокоиться об этом до утра, так как это займет всего секунду (вот ссылка на потом: ссылка, Итак, просто скопируйте код на данный момент, так как я покажу множество тестовых примеров кода, работающего надлежащим образом, чтобы вы могли чувствовать себя уверенно в своем представлении. Я определенно понимаю, что вы очень, очень занятый ученик, с множеством обязательств на вашей тарелке. Вы, вероятно, знаете, что авторы здесь работают полный рабочий день и получают хорошую компенсацию.

//Definetely leave the comments in so your instructor
//can see how well you document your code!

//see how easy it is to specify other languages!
//the users of your software will probably have an IDE just
//like yours, so they can easily come into the source
//code and edit these to their liking, That's Code Reuse!
def EnglishNames ="""January
February
March
April
May
June
July
August
October
November
December
"""

//change this to use other encodings, as discussed above
final String encodingToUseSoThatOurCodeIsSuperRobust = "UTF-8"

//it is a good idea to number your lists for clarity,
//just in case you need more
def list1 = []
def list2 = []

//specifying the method name like this will help make it
//easy to add more languages, another method for another
//language

//this is called a 'Closure', which is pretty much identical
//to that cool new Java thing called the 'Lambda', so if you
//wanted to turn this into Java code, it would be soo easy!
EnglishNames.eachLine() {
    //You probably remember you instructor telling you
    //never to do this String 1 == String 2
    //So to get around that, we will convert the String
    //to bytes, Easy huh!
    list1.add(it.getBytes(encodingToUseSoThatOurCodeIsSuperRobust))
}

//change this to run a different test, the IDE no doubt makes
//it very easy to do this!
//See the very very descriptive variable name for readability?
def iAmLookingForThisCountriesLongNameWithThisShortName = "Dec"
def theFoundAnswerInTheListIs

//this is the real important part as you can easily see
for(BigInteger index = 0; index < list1.size(); index ++){
    for(BigInteger indeX = 0; indeX < list1[index].size(); indeX ++){
        list2[index] = [list1[index][0],list1[index][1],list1[index][2]]
    }
}

boolean foundTheAnswerSoDontDoAnymore = false

//now we just find the correct answer in the list!
for(BigInteger index = 0; index < list1.size(); index ++){
    for(BigInteger indeX = 0; indeX < list1[index].size(); indeX ++){
        //see how readable the following code is!
        if((list2.get(index)) == iAmLookingForThisCountriesLongNameWithThisShortName.getBytes(encodingToUseSoThatOurCodeIsSuperRobust)){
            //see how we can now use the == so we can compare the two strings!
            if(!(new Boolean(foundTheAnswerSoDontDoAnymore))){
                println new String(list1[index], encodingToUseSoThatOurCodeIsSuperRobust)
                foundTheAnswerSoDontDoAnymore = true
            }
        }
    }
}

Извините, что я ничего не оставил вам здесь делать, я увлекся, отвечая на ваш вопрос, заставляющий задуматься. Так что просто скопируйте и вставьте этот ответ. Как вы можете видеть из следующих прогонов кода, вот что он может сделать:

input: Dec, output: December
input: Jan, output: January
input: Feb, output: February

1

Юлия

Вы захотите использовать силу множественной отправки здесь. Сначала мы определим тип каждого месяца. Затем мы можем написать простые определения функций для каждого типа месяца, которые дают желаемый ответ. Это позволит вам использовать удобную форму, nicename(Jan)не беспокоясь об этих раздражающих кавычках. Кроме того, мы можем определить вспомогательную функцию для приема строк и преобразования их в типы, повторного использования всей работы, которую мы уже проделали, для обеспечения совершенно нового интерфейса.

abstract Month
abstract Jan <: Month
abstract Feb <: Month
abstract Mar <: Month
abstract Apr <: Month
abstract May <: Month
abstract Jun <: Month
abstract Jul <: Month
abstract Aug <: Month
abstract Sep <: Month
abstract Oct <: Month
abstract Nov <: Month
abstract Dec <: Month
nicename(::Type{Jan})="January"
nicename(::Type{Feb})="February"
nicename(::Type{Mar})="March"
nicename(::Type{Apr})="April"
nicename(::Type{May})="May"
nicename(::Type{Jun})="June"
nicename(::Type{Jul})="July"
nicename(::Type{Aug})="August"
nicename(::Type{Sep})="September"
nicename(::Type{Oct})="October"
nicename(::Type{Nov})="Novermber"
nicename(::Type{Dec})="December"

nicename(s::String)=nicename(eval(symbol(ucfirst(s))))



nicename(Jan)
nicename("jan")

Какой это язык?
Угорен

Джулия, глупая вещь, которую нужно оставить.
gggg

0

Python 2.75

def getMonthName(short):
    from time import time, gmtime, strftime
    time = time()
    while not (lambda t:strftime("%B",t).upper().startswith(short.upper()))(gmtime(time)): time += 1
    return strftime("%B",gmtime(time))

Истинная красота в простоте, что означает низкие требования к памяти. Забудьте эти надоедливые словари и параграфы кода. Эта функция настолько хороша, что в любом случае она будет соответствовать коротким названиям месяцев. Обратите внимание.

>>> getMonthName("Apr")
'April'
>>> getMonthName("apr")
'April'
>>> getMonthName("APR")
'April'

БОНУС:

Вы можете использовать более 3 первых символов (например, «sept», «febr» и т. Д.)

Это будет циклически повторяться каждую секунду с момента запуска этого кода, проверяя совпадение в начале имени, поэтому запуск будет длиться вечно, если ожидаемый результат не ваш текущий месяц. Также многочисленные ошибки стиля.


0

в с #

 var Dictonery = "january,febuary,March,April,May,June,July,August,September,October,November,December";
                     var input = "jan";
                     var outpt= Regex.Match(Dictonery , input + "[a-z]*",
RegexOptions.IgnoreCase).Value;

0

Вот небольшая программа, которая делает то, что вы просили.

Или на самом деле 13 из них.

Я написал это на C ++, потому что это то, чем я сейчас пользуюсь, но он довольно легко конвертируется в Java. Будучи самоотверженным студентом, я уверен, что вы можете справиться с этим самостоятельно.

#include <iostream>
#include <fstream>
#include <cstdlib>

int main()
{
   std::string months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };

   for(int i = 0; i <= 12; ++i)
   {
       std::string filename = months[i] + ".cpp";
       std::ofstream myfile;
       myfile.open( filename.c_str() );
       myfile << "#include <iostream>\n\nint main()\n{\n\tstd::cout << \"" << months[i] << "\" << std::endl;\n return " << i << ";\n}";
       myfile.close();

       std::string compile = "g++ " + months[i] + ".cpp -o " +  months[i].substr(0, 3);
       system( compile.c_str() );
   }

   system("Dec");

   return 0;
}

О, и я мог пропустить небольшую ошибку смещения в цикле.

Я решил быть хорошим и использовать std::strings вместо char*s. Я уверен, что я бы перепутал вас с синтаксисом вроде, char*[]и я бы определенно забыл позвонить delete, или сделал бы что-то глупое, как вызов deleteвместо delete[].


0

С

Какое-то общее преобразование сокращений в полные слова, просто настройте dataмассив ...

#include <stdio.h>
#include <string.h>
#include <stdint.h>

const char* getLong(char *shrt) {
    size_t position;
    size_t found = 0;
    static int32_t data[19];

    data[000] = 0x756e614a;
    data[001] = 0x46797261;
    data[002] = 0x75726265;
    data[003] = 0x4d797261;
    data[004] = 0x68637261;
    data[005] = 0x69727041;
    data[006] = 0x79614d6c;
    data[007] = 0x656e754a;
    data[010] = 0x796c754a;
    data[011] = 0x75677541;
    data[012] = 0x65537473;
    data[013] = 0x6d657470;
    data[014] = 0x4f726562;
    data[015] = 0x626f7463;
    data[016] = 0x6f4e7265;
    data[017] = 0x626d6576;
    data[020] = 0x65447265;
    data[021] = 0x626d6563;
    data[022] = 0x00597265;

    for (position = 0; position < strlen(shrt); position++) {
        shrt[position] = position < 1 ? (shrt[position] >= 97 ?
        shrt[position] - 97 + 65 : shrt[position]) : (
        shrt[position] <= 90 ? shrt[position] - 90 + 122 : shrt[position]);
    }

    for (position = 0; position < strlen(((char*)data)); position++) {
        if (((char*)data)[position] == shrt[found]) {
            found++;
            if (found == strlen(shrt)) {
                found = position;
                position -= strlen(shrt);
                for (;((char*)data)[found] > 90; found++);
                ((char*)data)[found] = 0;
                return &(((char*)data)[position + 1]);
            }
        } else {
            found = data[0] - data[1] - 0x2EF4EEE9;
        }
    }
    return "not a month";
}

int main(int argc, char *argv[]) {
    if (argc != 2) return 1;
    printf("%s is %s\n", argv[1], getLong(argv[1]));
    return 0;
}

0

PHP

$month = strtolower($month);
if($month = 'jan') {
return 'January';
}
if($month = 'feb') {
return 'February';
}
if($month = 'mar') {
return 'March';
}
if($month = 'apr') {
return 'April';
}
if($month = 'may') {
return 'May';
}
if($month = 'jun') {
return 'June';
}
if($month = 'jul') {
return 'July';
}
if($month = 'aug') {
return 'August';
}
if($month = 'sep') {
return 'September';
}
if($month = 'oct') {
return 'October';
}
if($month = 'nov') {
return 'November';
}
if($month = 'dec') {
return 'December';
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.