Перетворити короткі імена на місяць у більш довгі аналоги [Закінчено]


28

Цей виклик закінчився! Вітаємо Флонка !

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

Дякуємо за всі ваші подання! Тут є кілька чудових відповідей. Офіційний переможець - Флонк з рахунком 64 . Топ-5:

  1. Flonk , 64 (Haskell, з ефективною математикою!)
  2. DigitalTrauma , 40 (Хмара, майбутнє зараз)
  3. primo , 38 (Python, і мій особистий фаворит - і дуже професійний!)
  4. Сільвестер , 20 (Ракетка, хоча Джанембер це розтягує!)
  5. ilmale , 16 ( Високо оптимізований алгоритм у Луї)

Оригінальний виклик нижче.


Будь ласка, допоможіть мені, це дуже терміново !!! :(

Мені потрібно конвертувати скорочені версії назв місяців у їх більш довгі представлення (наприклад, "Грудень" -> "Грудень"), не залежними від регістру. Зараз я використовую Java; ім'я місяця - це рядок, і я краще не спершу перетворюю його в об'єкт Date. Будь-яка мова буде робити, хоча.

Чи є простий спосіб це зробити ?? Ідіть легко, будь ласка, я новачок у програмуванні!


Це конкурс популярності кодового тролінгу (найкращий вид!). Відповідь з найбільшою кількістю результатів 8 квітня 2014 року виграє.


7
"Будь ласка, допоможіть мені, це дуже терміново !!! :(" <<< зробіть домашнє завдання, зробіть це швидко?

13
@yeti Якнайшвидше !! Поспішайте, перш ніж я пройду свій клас!
Джейсон C

24
Повинна бути функція, яка б таємно копіювала такі запитання з Stackoverflow в codegolf.SE з тегом коду, а потім відповіді з codegolf.SE переносили назад у початковий пост із вилученим текстом у тегах спойлера.
daniero

Кодек-тролінг у процесі видалення, згідно з офіційною позицією. Це питання дуже високо проголосовано з багатьма відповідями, багато з яких є надзвичайно високо проголосованими. Він отримав трохи більше 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)

На щастя, Вольфрам | Альфа може це зробити для мене ! Цифри стають трохи більшими, але Хаскелл з цим виграшно впорається. Нам просто потрібно переконатись у тому, щоб округлити результати, адже арифметика з плаваючою комою трохи неточна! Отож, ви їдете, швидкий, елегантний та безглуздий 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
Дуже добре, цілі числа - дуже ефективні. Я впевнений, що моєму інструктору сподобається моя робота!
Джейсон C

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, що було б важливо, якби це був код гольфу
undergroundmonorail

7
@JasonC Це "хмарне" рішення. Звичайно, ніяких інших обґрунтувань не потрібно.
Digital Trauma

4
@DigitalTrauma Шановний пане Ive чув про хмару, і це дуже професійно! Дуже добре! Дуже переконаний! Ty -JasonC
Jason C

43

Пітон

Оскільки ця функція дуже важлива, вона, ймовірно, буде використовуватися багато, тому слід постаратися зробити її якомога швидше. Інші плакати рекомендують використовувати добірку хешмапу ... не робіть цього! Хешмапи дійсно повільні порівняно з масивами. Вам просто потрібно перетворити кожну абревіатуру в число. Існує стандартна техніка хешування, яка може бути використана для цього:

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

HTH!


Тролінг

- Цей код жахливо повільний. Хоча доступ до масиву дійсно швидший, ніж хешмапи, це не застосовується, якщо масив у тисячі разів більший, ніж необхідний хешмап.
- Цей неймовірно великий масив створюється знову, і знову, кожного разу, коли функція викликається. Щоб витратити трохи більше місця, кожне значення ініціалізується символом "Невідомо".
- Функція хешування призначена для того, щоб бути незрозумілою для когось, хто не знає Python. Додаю, що він "використовується у багатьох професійних інструментах", щоб відмовити на розслідування.
- Функція хешування достатньо унікальна, щоб правильно перебирати між дванадцятьма місяцями, але не зможе зафіксувати багато поширених помилок, наприклад, замінених символів.
- Приблизно будь-яка рядок довше 3 символів буде вибиватися з індексу масиву поза межами.
- "Febuary" написано неправильно.
- "Ця функція дуже важлива". Незначний его-руб для ОП.


12
Погляньте добре, люди; це правильна відповідь про кодування ! Пс. Я впевнений, що я отримаю хорошу оцінку з цим і його набагато краще, ніж слоу- скрипт оболонки Java, який я намагаюся писати?! [Введіть тут опис зображення]
Джейсон C

2
"Febuary" неправильно написано. - якийсь серйозний тролінг :)
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"

Очевидно, що тролінг тут полягає в тому, що він працює лише для кількох випадків, тому марно :-)


Можливо, тому, що з wiki тега кодування тролінгу "Завдання полягає в тому, щоб дати код, який працює, але марний, сильно засмучує ОП". Ваш код навіть не працює. Тут є ще один голос.
користувач12205

@ace Це не видає помилок і повертає правильну відповідь "Грудень". У запитанні не було визначено, чи має він працювати протягом інших місяців, або які довгі назви вони мали б, тому я очікую, що додати "ember" до кінця - це хороша відповідь троля.
Сільвестер

1
З питання: "Мені потрібно конвертувати скорочені версії назв місяців у їх довші представлення (наприклад," Грудень "->" Грудень ")" Грудень - це приклад, не у всіх випадках. Ваша програма повинна працювати на всі місяці імен.
користувач12205

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

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


Блискуче! Нагадує про час на моїй старій роботі, коли я був <<< Помилка: час з'єднання вичерпано. >>>
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.
- Нечитабельна. Візерунок всередині візерунка робить його ще більше.
- Стиснення червня та липня до однієї заяви фактично нічого не стискає.
- випадкове використання погляд позаду g, а інші повторюють схему підстановки.
- use re 'eval'насправді не потрібен; він використовується лише тоді, коли потрібен змінний шаблон. Крім того, використання evalдля "трохи" стиснення ".


17
Схоже, нормальний для мене Перл ...
Пітер Олсон

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

10

Java

Ви сказали, що ваш діючий код на 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");
  }
}

У класі "Календаря" є маленька весела готча, де місяці нумеруються починаючи з 0 - так JANUARY == 0. Однак це явно не може вплинути на наш код, коли ми його тестуємо, правда? Зауважте, що у короткому імені NomeToNumber є ненавмисне перемикання перемикачів, що означає, що кожен місяць закінчується 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-бітних процесорах.

  • Він залишає всі файли, які були завантажені або вилучені в поточному каталозі.

  • Це не пояснює найскладнішу частину сценарію, яка є монстром-регексом. В основному він витягує всі рядки між 4 і 19 байтами, які мають провідну і кінцеву цифру, сортує ці рядки за кількістю входів, фільтрує рядки, що містять коротку назву місяця, впорядковує знову за кількістю подій та відображає найбільш часті.

  • Навіть якщо вищезгадане було гарною ідеєю, кішка на початку непотрібна, egrep досить повільний для цього завдання, регулярний вираз поверне безліч помилкових позитивних результатів (все можна було б зробити одним регексом), перший сорт | uniq -c | сортувати -n | tac не робить абсолютно нічого, він використовує сортування | tac замість сортування -r та cut не працюватимуть надійно, оскільки кількість пробілів на початку мінлива.

  • Регекс - це розширений регулярний вираз POSIX, тому гуглювання синтаксису BRE зовсім не допоможе.

  • Повертається листопад замість листопада та 6 замість серпня .


1
Це дуже корисні поради! Безумовно, це більш ефективно, і мій інструктор сказав мені, що професіонали роблять багаторазові дані для OOP і OOP - це швидко і краще!
Джейсон C

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

Це коротко ... але порахуйте, що це співвідношення "зло на персонажа" ... mwhuaaahahahaaa ...


Я не знаю мови, тому я не бачу тут нічого зла. Я припускаю, що ваші голоси від інших у подібному положенні. Поясніть, будь ласка, що відбувається і чому це зло. Мені цікаво.
Рівень Св. Св.

Це (n) (ab) використання dateфункцій форматування дати. І dateповажає локалізацію, вона генерує місяць, що відповідає локалізації. -d"a_month_name 1встановлює дату 1-го числа названого місяця (можливо, коротку назву), а рік відсутній встановлюється, тому це буде наступний такий місяць. +%B- це формат друку даної дати і означає "довге ім'я місяця". Весь тат загорнутий у функцію оболонки, і оскільки в ньому немає конкретної речі BASH, SH буде достатньо для його запуску. Так що в основному dateзаслуговує на всі оплески, а не я! І мені не байдуже нивотів у кодегольфі! : -Þ

Мені це подобається! Зловмисник.
ojblass

4

перл

Як щодо доброї грубої сили?

$|++;

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";

Чому це дивовижно:

  • груба сила - це завжди найлегший спосіб зробити це.
  • для вашої зручності друкує часткову відповідь, як тільки вона це знає (я думаю, ви не знали, що "Feb" короткий для чогось, що починається з "Feb ..." ???)
  • спеціальна функція хешування для максимальної безпеки.
  • використання вбудованого оператора перевантаження (perl на рядках) perl робить цей код таким же швидким, як і власний код C. Подивіться на всі ці нулі, показуючи, як швидко він працює!

    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 на "місяць, який є січень". Якщо ви не знаходитесь за проксі-сервером, у такому випадку він повертається "Серпень".


2

Bash + бітуті

Я дуже намагався зробити очевидне, перетворивши вхід на об’єкт дати, але не вдавався. Нарешті я вдався до грубої сили підходу.

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: З вікі-тегу кодового тролінгу "Завдання полягає в тому, щоб надати код, який працює, але марний, сильно засмучує ОП". Ваш код навіть не працює.
користувач12205

1
Гм? Це працює і марно. Очікування 10 років, коли нескінченна петля закінчиться, недостатньо розчарує? "Це працює" означає (принаймні, для мене це означає), що код збирається та працює успішно, це не означає, що він повинен закінчувати чи давати якесь рішення.
Вереос

@ace (я забув згадати вас у попередньому коментарі); Що я намагаюся сказати в цьому коментарі, це те, що я хотів би краще зрозуміти, що ти маєш на увазі, оскільки це правильно з моєї точки зору.
Вереос

Можливо, тому arch, що ніколи не зрівняється Mar?
користувач12205

Тож ваш код не може конвертувати імена місяця, тому він не працює.
користувач12205

2

Партія

Те, що ви просите, - нетривіальне. Однак я знайшов ідеальне рішення для вас! Як це працює, завантаживши на свій жорсткий диск дуже складний список англійської мови. Потім вхід перевіряється на завантажений список і вказується кінцева назва місяця! Геніальність!

Зараз у цього методу є багато плюсів порівняно з іншими методами:

  • Ви можете мати будь-яку абревіатуру слова! Наприклад, 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!

Троллц

- Пакетна ... - Завантаження списку слів, тому що ми не можемо вводити місяці вручну ... - Не використовуючи перемикання регістру вимикань - ДУЖЕ СЛІД - перетворення текстового файлу в малі та збереження його в інший файл - запустіть його вдруге, не видаляючи створені текстові файли, і це буде ще повільніше - щось відмічає скрипт під час перетворення файлу 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як роздільник для початку та кінця гередока.)

- Також не працює в жовтні. Ніхто не може зрозуміти, чому.

- Якщо вхід порожній, повертається всі 11 місяців.

- Якщо сценарій буде вставлено копію, відповідь у червні матиме 42 символи.

Неповнолітня:

- Шебанг дещо неправильний, але попередження не подається.

- коментарі - це коментарі, які говорять про те, що говорить рядок під ними.

- Навіть якби програма реагувала раніше на попередні записи, вона все одно не завершиться швидше.


1

JavaScript - 209

Це говорить не перетворювати на дату, що тут не відбувається, я просто використовую 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 :) Навмисно, звичайно ...
Метт

Здається, що у когось є випадок «Вендсдей».
Джейсон C

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

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

Я впевнений, що ваш вчитель буде пишатися, коли ви покажете йому це!


Тролінг

Програма, насамперед, досить погано написана. Я зробив кілька циклів, які викликають випадкові відбитки помилок та загальну непрацюючість через відсутність кращого слова. Потрібно трохи очистити, щоб отримати гідно працюючий код (насамперед у перших двох його пунктах), який у будь-якому разі марний, оскільки він дає довгі назви як "абревіатура +" уарі "" (січень, Febuary, Maruary тощо). Програма також включає надмірний код для "січня" (визначається як виняток і кодується окремо). Перша відповідь на Stackexchange, тож сподіваюся, що це відповідає критеріям


1

Java

Шановний учень комп'ютерного вченого,

Це досить непросте завдання, і я вирішив лише частково: я думаю, це для вашої дипломної роботи або з якоюсь метою дослідження.

На даний момент у мене є лише бета-версія з незначними помилками: іноді це дає неправильні результати, але я впевнений, що ваш професор прийме ваші зусилля.

файл 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

Оскільки в ОП використовується 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, яка вирішить вам проблему, і безперечно матиме більше сенсу, ніж ця криптована ява. Не турбуйтеся про використання 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")

Яка мова?
ugoren

Джулія, нерозумна річ.
gggg

0

Пітон 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

в c #

 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.