แปลงชื่อเดือนสั้น ๆ ให้เป็นคู่หูที่ยาวขึ้น [จบลง]


28

ความท้าทายนี้สิ้นสุดลงแล้ว! ขอแสดงความยินดีFlonk !

ฉันแน่ใจว่าฉันจะได้เกรดที่ดี แต่หลังจากเปลี่ยนงานFlonk ของฉันอาจารย์ของฉันไม่เชื่อว่ามันเป็นของฉันและไม่สามารถเข้าใจได้ว่าทำไมมันถึงซับซ้อนมาก ... ฉันล้มเหลวและแม่ของฉันทำให้ฉันจาก Facebook และ Minecraft เป็นเวลาหนึ่งเดือน ฉันไม่เข้าใจ :(

ขอบคุณสำหรับการส่งทั้งหมดของคุณ! คำตอบที่ดีบางอย่างที่นี่ ผู้ชนะอย่างเป็นทางการFlonkด้วยคะแนนของ64 5 อันดับแรกคือ:

  1. Flonk , 64 (Haskell, กับคณิตศาสตร์ที่มีประสิทธิภาพ!)
  2. DigitalTrauma , 40 (คลาวด์, อนาคตอยู่ในขณะนี้)
  3. primo , 38 (Python, และตัวโปรดของฉัน - และเป็นมืออาชีพมาก!)
  4. Sylwester , 20 (แร็กเก็ต, แม้ว่า Janember ยืดมัน!)
  5. ilmale 16 (A สูงขั้นตอนวิธีการที่ดีที่สุดใน Lua)

ความท้าทายเริ่มต้นด้านล่าง


โปรดช่วยฉันมันเร่งด่วนมาก !!! :(

ฉันต้องแปลงชื่อเดือนแบบย่อให้เป็นรูปแบบที่ยาวขึ้น (เช่น "Dec" -> "ธันวาคม"), แบบไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก ตอนนี้ฉันกำลังใช้ Java; ชื่อของเดือนคือ String และฉันไม่ต้องการแปลงเป็นวัตถุ Date ก่อน ภาษาใด ๆ ก็ตามจะทำได้

มีวิธีง่าย ๆ ในการทำเช่นนี้หรือไม่? ไปง่าย ๆ ฉันเป็นมือใหม่ในการเขียนโปรแกรม!


นี่คือการประกวดรหัสความนิยม (แบบที่ดีที่สุด!) คำตอบที่มีผู้โหวตสูงสุดเมื่อวันที่ 8 เม.ย. 2014 ชนะ


7
"โปรดช่วยฉันมันด่วนมาก !!! :(" <<< ทำการบ้านของฉันทำมันเร็วไหม

13
@yeti เร็วเท่าที่จะทำได้ !! รีบก่อนที่ฉันจะเลิกเรียน!
Jason C

24
ควรมีคุณสมบัติที่จะคัดลอกคำถามเช่นจาก Stackoverflow ไปยัง codegolf.SE พร้อมกับแท็ก code-trolling และจากนั้นให้คำตอบจาก codegolf.SE ถูกโอนกลับไปที่โพสต์ต้นฉบับโดยลบข้อความในสปอยเลอร์แท็ก
daniero

การหลอกล่อโค้ดอยู่ในขั้นตอนของการลบออกตามท่าทางที่เป็นทางการ คำถามนี้ได้รับการโหวตอย่างสูงโดยมีคำตอบมากมายซึ่งหลายข้อให้คะแนนอย่างสูง มันได้รับเพียง 50% "ลบ" โหวตในการสำรวจความคิดเห็นแต่มันก็มีความพิเศษที่จะได้รับคำตอบและโหวตมากมายดังนั้นฉันจึงล็อคไว้เพื่อความสำคัญทางประวัติศาสตร์
Doorknob

คำตอบ:


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
ดีมากและจำนวนเต็มมีประสิทธิภาพมากฉันแน่ใจว่าผู้สอนของฉันจะชอบงานของฉัน!
Jason C

8
+1 interpolating polynomialสำหรับการเรียนการสอนเกี่ยวกับฉัน
โม่

3
ฉันต้องหัวเราะเมื่ออ่านประโยคแรกของคุณ
Anaphory

46

Bash + GNU tools + "คลาวด์"

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 เป็นโซลูชั่น "แบบคลาวด์" แน่นอนว่าไม่มีความจำเป็นอื่น ๆ
บาดเจ็บทางระบบดิจิตอล

4
@DigitalTrauma คุณชายที่รัก Ive ได้ยินเกี่ยวกับคลาวด์และเป็นมืออาชีพมาก! ดีมาก! เชื่อมั่นมาก! Ty -JasonC
Jason C

43

หลาม

เนื่องจากฟังก์ชั่นนี้มีความสำคัญมากมันอาจจะถูกใช้บ่อยดังนั้นคุณควรพยายามทำให้เร็วที่สุด ผู้โพสต์คนอื่น ๆ แนะนำให้ใช้การค้นหา hashmap ... อย่าทำเช่นนี้! 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

HTH!


หลอก

- รหัสนี้ช้าอย่างน่ากลัว แม้ว่าการเข้าถึงอาเรย์จะเร็วกว่าแฮชแมปแน่นอน แต่จะไม่สามารถใช้งานได้หากอาเรย์นั้นมีขนาดใหญ่กว่าแฮชแมพที่จำเป็นหลายพันเท่า
- อาร์เรย์ขนาดใหญ่ที่เหลือเชื่อนี้ถูกสร้างขึ้นอีกครั้งและทุกครั้งที่มีการเรียกใช้ฟังก์ชัน เพื่อเสียเนื้อที่เพิ่มขึ้นเล็กน้อยแต่ละค่าจะเริ่มต้นด้วย "ไม่ทราบ"
- ฟังก์ชั่นการแฮชหมายถึงการไม่คลุมเครือให้กับคนที่ไม่ชอบด้วย Python ฉันเพิ่มว่ามันเป็น "ใช้ในเครื่องมือระดับมืออาชีพมากมาย" เพื่อกีดกันการตรวจสอบ
- ฟังก์ชั่นคร่ำครวญนั้นไม่ซ้ำกันมากพอที่จะแยกแยะระหว่างสิบสองเดือนได้อย่างถูกต้อง แต่จะไม่จับตัวพิมพ์ที่พบบ่อยเช่นตัวละครที่สลับเปลี่ยน - คำว่า "กุมภาพันธ์" สะกดผิด - "ฟังก์ชั่นนี้สำคัญมาก"
- สตริงใด ๆ ที่ยาวเกิน 3 ตัวอักษรจะมีปัญหากับดัชนีอาเรย์นอกขอบเขต


12
ลองดูดีๆ นี่เป็นคำตอบที่เหมาะสมในการหมุนโค้ด ! ps ฉันแน่ใจว่าฉันจะได้เกรดที่ดีด้วยสิ่งนี้และมันจะดีกว่ามากแล้วสคริปต์ Java shell แบบสโลว์ที่ฉันพยายามเขียน?! [ใส่คำอธิบายภาพที่นี่]
Jason C

2
คำว่า "กุมภาพันธ์" สะกดผิด - มีการหลอกล่ออย่างจริงจัง :)
Jaa-c

10
+1 สำหรับการบอกว่าตารางแฮชไม่มีประสิทธิภาพจากนั้นดำเนินการตารางแฮชที่ไม่มีประสิทธิภาพจริงๆ
James_pic

1
"Hashmaps จะจริงๆช้าเมื่อเทียบกับอาร์เรย์. คุณเพียงแค่ต้องแปลงแต่ละย่อไปยังหมายเลข. มีเทคนิคการแปลงแป้นพิมพ์มาตรฐานที่สามารถนำมาใช้สำหรับการนี้คือ ..." ดังนั้นในคำอื่น ๆ reimplement แผนที่กัญชา ฮะ +1
wchargin

25

แร็กเกต

ฉันจะไปหาวิธีการแก้ปัญหา KISS ฉันทดสอบกับกรณีใช้ OP ของ "ธ.ค. " กับตัวพิมพ์ใหญ่ทั้งหมดเพื่อตรวจสอบว่าผลลัพธ์ที่ถูกต้องถูกส่งกลับ มันผ่านไปด้วยสีสันของการบิน

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

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

เห็นได้ชัดว่าการหมุนรอบที่นี่คือมันใช้ได้กับบางกรณีเท่านั้นดังนั้นมันจึงไร้ประโยชน์ :-)


อาจเป็นเพราะจากวิกิแท็กการหมุนรอบรหัส "งานคือการให้รหัสที่ใช้งานได้ แต่ไม่มีประโยชน์ทำลาย OP อย่างรุนแรง" รหัสของคุณใช้งานไม่ได้ ที่นี่มี downvote อื่น
user12205

@ace มันไม่ได้โยนข้อผิดพลาดใด ๆ และจะส่งกลับคำตอบที่ถูกต้อง "ธันวาคม" คำถามไม่ได้ระบุว่าควรใช้กับเดือนอื่น ๆ หรือชื่อยาว ๆ พวกเขาคาดหวังว่าการเพิ่ม "ember" ต่อท้ายเป็นคำตอบที่ดี
Sylwester

1
จากคำถามที่ว่า "ฉันต้องแปลงชื่อเดือนแบบย่อให้เป็นรูปแบบที่ยาวขึ้น (เช่น" Dec "->" ธันวาคม ")" ธันวาคมเป็นตัวอย่างไม่ใช่ทุกกรณี โปรแกรมของคุณควรใช้กับชื่อทุกเดือน
user12205

9
@ace และมันทำ มันเปลี่ยน "Jan" เป็น "Janember" ดูตัวอย่างว่า OP ต้องการอะไร ฉันไม่เห็นว่าจะมีคำตอบ downvote สำหรับแท็กการหมุนรหัสได้อย่างไรเนื่องจาก "การตีความคำถามอย่างผิด ๆ " และ "การโกงคำถาม" เป็นทั้งวิธีที่ดีในการตอบคำถาม
Sylwester

7
นี่คือประเภทของการแก้ปัญหาที่ฉันคิดว่าจะนำเสนอด้วย "ข้อจำกัดความรับผิดชอบ: คุณบอกว่ามันเป็นเรื่องเร่งด่วนดังนั้นฉันจึงรีบและทดสอบเพียง 3 ราย แต่มันผ่านไปแล้วสำหรับพวกเขาทั้งหมด"
AShelly

22

ลัวะ

ทางออกของฉันจะทำงานในภาษาของคุณอาจารย์ของคุณจะมีความสุข

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;

- นรกของ Regex ฉันหวังว่า regex จะไม่นับเป็น "การหมุนรอบด้วยภาษาที่คลุมเครือ"
- เปราะบางอย่างยิ่ง คุณมีปัญหาในการเพิ่มการสนับสนุนสำหรับ Bugsember
- อ่านไม่ได้ ลวดลายด้านในทำให้รูปแบบมากยิ่งขึ้นไปอีก
- การบีบอัดของเดือนมิถุนายนและกรกฎาคมเป็นคำสั่งเดียวไม่ได้บีบอัดอะไรเลย
- การใช้งานแบบสุ่มของ lookbehind สำหรับgในขณะที่คนอื่นทำซ้ำรูปแบบในการทดแทน
- use re 'eval'ไม่จำเป็นจริงๆ มันจะใช้เฉพาะเมื่อต้องการรูปแบบตัวแปร นอกจากนี้ยังใช้evalเพื่อ "ได้รับ" การบีบอัด "เล็กน้อย"


17
ดูเหมือนปกติ Perl เพื่อฉัน ...
ปีเตอร์โอลสัน

1
@ PeterOlson ภาษาถูกเลือกให้เหมาะสมกับอัลกอริทึม แต่อัลกอริทึมไม่เหมาะกับงานเลยคุณไม่เห็นด้วยใช่ไหม :-)
John Dvorak

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

ชั้นปฏิทินมี gotcha เล็ก ๆ น้อย ๆ ที่สนุกที่เดือนมีหมายเลขเริ่มต้นที่ 0 - JANUARY == 0ดังนั้น อย่างไรก็ตามสิ่งนี้ไม่สามารถส่งผลกระทบต่อรหัสของเราได้อย่างชัดเจนในขณะที่เราทดสอบใช่ไหม ขอให้สังเกตว่ามีข้อผิดพลาดในการเปลี่ยนสวิตช์โดยไม่ตั้งใจใน shortNameToNumber ซึ่งหมายความว่าทุก ๆ เดือนจะมีค่าเป็น 0 อย่างรวดเร็วJANUARY == 0ดังนั้นการทดสอบของเราจึงผ่านไป


1
โอ้พระเจ้าฉันไม่ได้สังเกตเห็นการขาดการแบ่งในคำสั่งเปลี่ยน มันนานมากแล้วตั้งแต่ฉันใช้สวิตช์
Joe Z.

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 MB (แม้ว่าบีบอัดเป็น 36 MB) จะเห็นได้ชัดว่าเกินความจำเป็นสำหรับงานนี้ ยิ่งกว่านั้นenwik8มีการถ่ายโอนข้อมูล Wikipedia ขนาด 4 MB ขึ้นไป 100 MB แรกดังนั้นสำหรับงานเฉพาะมันไม่น่าจะมีข้อมูลที่เป็นประโยชน์

  • การบีบอัดไฟล์ด้วย paq8hp12 ลดขนาดไฟล์ลงเหลือ 16 MB แต่การบีบอัดและคลายการบีบอัดใช้เวลาหนึ่งชั่วโมง มันจะทำทั้งในครั้งแรกที่สคริปต์นี้ทำงาน

  • สคริปต์ไม่ได้ลบรุ่นenwik8 ที่ซิปหรือแบบดิบดังนั้นจึงลดขนาดเป็น 16 MB ที่ใช้เนื้อที่ฮาร์ดดิสก์มากยิ่งขึ้น

  • ยูทิลิตี้การบีบอัดจะทำงานกับโปรเซสเซอร์ 64 บิตเท่านั้น

  • มันทำให้ไฟล์ทั้งหมดที่ได้รับการดาวน์โหลดหรือแยกในไดเรกทอรีปัจจุบัน

  • มันไม่ได้อธิบายถึงส่วนที่ยากที่สุดของสคริปต์ซึ่งเป็นสัตว์ประหลาด regex-pipe โดยทั่วไปจะแยกสตริงทั้งหมดระหว่าง 4 ถึง 19 ไบต์ที่มีตัวเลขนำหน้าและต่อท้ายเรียงลำดับสตริงเหล่านั้นตามจำนวนที่เกิดขึ้นกรองสตริงที่มีชื่อเดือนสั้นเรียงลำดับอีกครั้งตามจำนวนครั้งที่เกิดขึ้นและแสดงบ่อยที่สุด

  • แม้ว่าข้างต้นเป็นความคิดที่ดีแมวจะไม่จำเป็นที่จุดเริ่มต้นegrepค่อนข้างช้าสำหรับงานนี้ regex จะกลับมากบวกเท็จ (ทุกอย่างที่สามารถทำได้ด้วยหนึ่ง regex) เป็นครั้งแรกที่จัดเรียง | uniq -c | เรียง -n | tac ไม่ทำอะไรเลยอย่างแน่นอนมันใช้sort | tacแทนsort -rและcutจะไม่ทำงานอย่างน่าเชื่อถือเนื่องจากจำนวนช่องว่างที่จุดเริ่มต้นเป็นตัวแปร

  • regex เป็นExtended POSIX Regular Expression ดังนั้นการ googling ไวยากรณ์ BRE จะไม่ช่วยอะไรเลย

  • ส่งกลับพฤศจิกายนแทนพฤศจิกายนและ6แทนสิงหาคม


1
คำแนะนำเหล่านี้มีประโยชน์มาก! แน่นอนว่ามันมีประสิทธิภาพมากกว่าและผู้สอนของฉันบอกฉันว่าผู้เชี่ยวชาญทำให้ข้อมูลที่ใช้ซ้ำได้สำหรับ OOP และ OOP นั้นรวดเร็วและดีกว่า!
Jason 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 ...


ฉันไม่รู้ภาษาดังนั้นฉันจึงไม่เห็นสิ่งชั่วร้ายที่นี่ ฉันคิดว่า downvotes ของคุณมาจากคนอื่นในตำแหน่งที่คล้ายกัน โปรดอธิบายว่าเกิดอะไรขึ้นและทำไมมันถึงชั่วร้าย ฉันอยากรู้.
เลเวลริเวอร์เซนต์

มันเป็น (n) (ab) การใช้dateคุณสมบัติการจัดรูปแบบวันที่ และdateเคารพการแปลก็จะสร้างเดือนที่ตรงกับการแปล -d"a_month_name 1กำหนดวันที่เป็นวันที่ 1 ของเดือนที่มีชื่อ (อาจเป็นชื่อย่อ) และปีที่ขาดหายไปจะถูกตั้งค่าดังนั้นจึงเป็นเดือนถัดไป +%Bเป็นรูปแบบสำหรับการ prnting วันที่ที่กำหนดและหมายถึง 'ชื่อยาวของเดือน' ททททั้งหมดถูกห่อไว้ในฟังก์ชั่นของเชลล์และเนื่องจากไม่มีสิ่งใดใน BASH ที่เฉพาะเจาะจงในนั้น SH จะเพียงพอที่จะเรียกใช้ ดังนั้นโดยทั่วไปdateสมควรได้รับเสียงปรบมือทั้งหมดไม่ใช่ฉัน! และฉันไม่สนใจเกี่ยวกับ downvote ใน codegolf! : -Þ

ฉันรักสิ่งนี้! abuser
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";

ทำไมสิ่งนี้ถึงยอดเยี่ยม:

  • กำลังดุร้ายอยู่เสมอวิธีที่เร็วที่สุดที่จะทำมัน
  • เพื่อความสะดวกของคุณพิมพ์คำตอบบางส่วนทันทีที่รู้ (ฉันพนันว่าคุณไม่รู้ว่า "Feb" สั้นสำหรับบางสิ่งที่เริ่มต้นด้วย "Feb ... " ???)
  • ฟังก์ชันแฮชแบบกำหนดเองเพื่อความปลอดภัยสูงสุด
  • การใช้ตัวดำเนินการมากเกินไปของ 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:

นอกเหนือจากการเข้ารหัสที่ทำให้ Damian Conway ตายสายตารหัสนี้ผิดพลาดเป็นระยะ ๆ และช้ามากเป็นระยะ ๆ "Feb" รันคำสั่งขนาดประมาณ 6 รายการ - หนึ่งล้านครั้ง - ช้ากว่า "พฤษภาคม", "jun" หรือ "jul" 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

ป.ล. - ฉันมีรหัสบางส่วนที่มีการกระจายของ runtimes มากขึ้น แต่น่าเบื่อเอาท์พุทคำตอบที่ถูกต้องในทุกกรณีซึ่งน่าสนุกน้อยกว่ามาก


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 ฉันสามารถบรรลุผลลัพธ์เหล่านี้โดยใช้ประโยชน์จากพลังของ crowdsourcing:

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 สำหรับ "what month is 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 algorythm สำหรับตรวจสอบชื่อของเดือนสำหรับชื่อตรวจสอบเดือน

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++;
}

โทรลล์:

  • คำตอบนี้;

  • ไม่จัดการเขตเวลาและจะส่งข้อความเตือน

  • ไม่ยอมรับการป้อนข้อมูลเดือน แต่คุณต้องฮาร์ดโค้ด

  • แม้ในขณะที่คุณ hardcode มันเป็นกรณี ๆ ไป;

  • $monthอะไรรหัสนี้พยายามที่จะทำคือการได้รับเดือนปัจจุบันได้รับตัวอักษรสามตัวแรกและตรวจสอบว่าตรงกับ หากไม่ตรงกันจะเพิ่มการประทับเวลาทีละ 1 แล้วลองใหม่ เรื่องนี้จบลงที่จะช้ามาก;

  • รหัสนี้ไม่มีผลอะไร (ยกเว้นคำเตือนแน่นอน);

  • ความคิดเห็นที่ทำให้เข้าใจผิดมาก: time()ไม่โหลดห้องสมุดเวลาขยาย แต่ได้รับการประทับเวลาปัจจุบัน substr($checkThis,1,4)ข้ามตัวอักษรตัวแรกของเดือนและได้รับ 4 ต่อไปนี้ ( archสำหรับMarchเช่น); แบบฟอร์มที่ถูกต้องเป็นสิ่งหนึ่งในความคิดเห็น

  • แม้ว่าจะพบการจับคู่รหัสจะไม่ออกจากลูป: อันที่จริงตัวแปรที่ได้รับการตั้งค่าให้trueแตกต่างกัน


3
-1: จากวิกิแท็กการหมุนแท็กรหัส "งานคือการให้รหัสที่ใช้งานได้ แต่ไม่มีประโยชน์ทำลาย OP อย่างรุนแรง" รหัสของคุณใช้งานไม่ได้
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 ตัวอักษร

ผู้เยาว์:

- shebang ค่อนข้างไม่ถูกต้อง แต่ไม่มีการเตือนใด ๆ

- ความคิดเห็นที่เป็นความคิดเห็นที่พูดสิ่งที่บรรทัดด้านล่างพวกเขากำลังพูด

- แม้ว่าโปรแกรมจะตอบสนองได้เร็วขึ้นสำหรับรายการก่อนหน้านี้ แต่ก็ยังไม่เสร็จเร็วขึ้น


1

JavaScript - 209

มันบอกว่าจะไม่แปลงเป็นวันที่ซึ่งไม่ใช่สิ่งที่เกิดขึ้นที่นี่ฉันเพียงแค่ใช้วันที่เพื่อสร้างส่วนขยายของชื่อย่อ

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 :) แน่นอนว่าแน่นอน ...
Matt

ดูเหมือนว่าใครบางคนจะมีกรณีของ Wendsdays
Jason C

5
@Matt คุณไม่หมายถึง "On pupose" หรือ
Justin

ของ couse @Quincunx
Matt

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 ที่จะช่วยแก้ปัญหาของคุณได้ อย่าตกใจที่ต้องใช้ Groovy สำหรับคำตอบนี้เนื่องจาก Groovy ยังทำงานบน JVM เช่นเดียวกับรหัส Java ดังนั้นคุณสามารถวางรหัสนี้ลงในคลาส java ของคุณด้วยการแก้ไขเพียงไม่กี่อย่าง ฉันได้แนบลิงค์เพื่อช่วยคุณในกระบวนการนี้ แต่ฉันจะไม่กังวลเกี่ยวกับมันจนกว่าจะถึงเช้าเพราะมันควรจะใช้เวลาเพียงเสี้ยววินาที (นี่คือลิงค์สำหรับภายหลัง: link. ดังนั้นเพียงแค่คัดลอกรหัสในตอนนี้เพราะฉันจะแสดงกรณีทดสอบมากมายของรหัสที่ทำงานอย่างเหมาะสมเพื่อให้คุณมั่นใจในการส่งของคุณ ฉันเข้าใจอย่างแน่นอนว่าคุณเป็นนักเรียนที่กระตือรือร้นมากและมีภาระหน้าที่มากมาย คุณอาจทราบว่าผู้ให้ข้อมูลที่นี่ทำงานเต็มเวลาและได้รับการชดเชยอย่างดี

//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

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

ใน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::stringอัตโนมัติแทนchar*s ฉันแน่ใจว่าฉันจะได้สับสนคุณมีไวยากรณ์เช่นchar*[]และแน่นอนฉันจะลืมโทรdeleteหรือสิ่งที่ทำโง่เช่นโทรแทนdeletedelete[]


0

C

การแปลงตัวย่อบางตัวเป็นคำเต็มเพียงแค่ปรับ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';
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.