เรียงลำดับเดือนของปี


19

เขียนฟังก์ชั่นหรือโปรแกรมที่ใช้ปัจจัยการผลิตสายเต็มสะกดชื่อภาษาอังกฤษเดือนในกรณีที่ชื่อเรื่อง: January, February, Marchฯลฯ (null / CR / LF ยกเลิกตกลงคั่นด้วยกับบางส่วนของตัวละครที่ไม่ใช่อัลฟาดังนั้นหากคุณเลือก) และทั้ง

  • เปรียบเทียบสองอินพุตคืนค่าจริงถ้าอินพุทที่สองมากกว่า (เรียงตามลำดับเดือน) มากกว่าอินพุทแรก ค่าที่เท่ากันส่งผลให้ค่า Falsey

  • หรือเรียงลำดับตามลำดับ (รายการ, สตริงที่คั่น, ฯลฯ ) ของลำดับตามลำดับเวลา

(ปมของความท้าทายคือการกำหนดวิธีการ / การแสดงออกที่ให้เรียงลำดับพจนานุกรมที่ถูกต้องบางภาษาอาจมีคำตอบที่สั้นกว่ากับหนึ่งหรืออื่น ๆ )

คุณไม่สามารถใช้วิธีการแยกวิเคราะห์ภายในเวลาใดก็ได้ (เช่นstrptime) เพื่อแปลชื่อเดือนเป็นตัวเลขหรือการทำแผนที่กระป๋องของชื่อเดือน ใช้คุณสมบัติของสตริงเองตารางการค้นหาที่คุณกำหนดหรือสิ่งที่ฉลาด

ตัวอย่าง

ตัวอย่างการใช้งานแม้ว่ากฎข้อแรกจะถูกห้ามใช้ ...

import datetime
def is_later_month(a, b):
    '''
    Example of prohibited code because it relies on language 
    features about how to parse month names
    '''
    return datetime.strptime(a, '%B') < datetime.strptime(b, '%B') 

รุ่นด้านล่างนั้นใช้ได้เนื่องจากเราใช้รหัสนั้น

months = {
    'January':  1, 'February':  2, 'March':      3,
    'April':    4, 'May':       5, 'June':       6,
    'July':     7, 'August':    8, 'September':  9,
    'October': 10, 'November': 11, 'December':  12,
}
def is_later_month(a, b):
    """
    Returns True/False when comparing two months.
    """
    return months[a] < months[b]

หรือคุณสามารถทำฟังก์ชั่นการเรียงลำดับ

months = {'as above...'}
def sort_months(l):
    """
    Sorts list and returns it. Different input and output than the above, 
    but equally valid. Sorting versus comparing might be shorter in your
    favorite language.
    """
    return sorted(l, key=lambda x: months[x]) 

ตัวอย่างการทดสอบ

assert is_later_month('January', 'February')
assert is_later_month('January', 'December')
assert is_later_month('November', 'December')
assert not is_later_month('July', 'July')
assert not is_later_month('October', 'September')

คุณไม่สามารถใช้วิธีการแยกวิเคราะห์ภายในเวลาใดก็ได้ (เช่น strptime) เพื่อแปลชื่อเดือนเป็นตัวเลข มันค่อนข้างชัดเจน เราสามารถใช้ตัวอักษรที่กำหนดไว้ล่วงหน้าของภาษาที่มีชื่อเดือนหรือไม่
Luis Mendo

ฉันจะลบคำตอบของฉันแล้ว แต่ก็ยังไม่ชัดเจนว่าจะอนุญาตอะไรและไม่อะไร
Luis Mendo

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

สิ่งที่ฉันแสดงออกชัดเจนหรือไม่ ถ้า Python มี builtin monthsที่เป็นรายชื่อชื่อ Month ทั้งหมดฉันต้องการห้ามmonths[x] < months[y]เป็นคำตอบ รายการชื่อเดือนมีคุณสมบัติแปลก ๆ (ความยาวแปรปรวนสามัญ) ที่ทำให้การท้าทายง่ายขึ้น / ยากขึ้นกว่าสตริงที่สร้างแบบสุ่ม
Nick T

ใช่ฉันคิดว่าชัดเจน ฉันแค่กลัวว่าอาจมีกรณีอื่นที่คล้ายคลึงกันซึ่งคุณยังไม่ได้ปกครองออกมาอย่างชัดเจน (แต่ฉันไม่รู้ว่าคนใด)
Luis Mendo

คำตอบ:


41

เยลลี่ขนาด 19 ไบต์

11ị“bMAanlseovc”iµÞ

นี่คือลิงก์ monadic ที่รับรายการเป็นอาร์กิวเมนต์และเรียงลำดับ ลองออนไลน์!

พื้นหลัง

เจลลี่ใช้การทำดัชนีแบบโมดูลาร์ 1 หากเราทำซ้ำชื่อเดือนบ่อยครั้งพอที่จะได้รับ 11 ตัวอักษรเราจะได้รับอาร์เรย์ต่อไปนี้

J a n u a r y J a n u
F e b r u a r y F e b
M a r c h M a r c h M
A p r i l A p r i l A
M a y M a y M a y M a
J u n e J u n e J u n
J u l y J u l y J u l
A u g u s t A u g u s
S e p t e m b e r S e
O c t o b e r O c t o
N o v e m b e r N o v
D e c e m b e r D e c

ในช่วง 11 ปีบริบูรณ์ (ที่ผ่านมา) คอลัมน์ทุกตัวอักษรที่แตกต่างกันเพื่อให้เราสามารถใช้พวกเขาเพื่อแจ้งคำสั่งของเดือนต่อไป

มันทำงานอย่างไร

11ị“bMAanlseovc”iµÞ  Monadic link. Argument: A (array of months)

                 µ   Combine the preceding chain into a link.
                  Þ  Sort A by that link.
11ị                    Select the 11th character of the month's name.
   “bMAanlseovc”       Find the index of that character in "bMAanlseovc".
                       For 'u' ("January"), this returns 0 (not found).

1
แค่อยากรู้อยากเห็นคุณจะจัดอันดับเดือนด้วย "bMAanlseovc" อย่างไร ดัชนีของการจับคู่อักขระแรก?
ljeabmreosn

ฉันได้เพิ่มคำอธิบายแล้ว
เดนนิส

8
ว้าวมันฉลาดจริงๆ!
ljeabmreosn

15

รหัสเครื่อง x86, 26 25 ไบต์

hexdump:

ff 32 8b 01 34 c0 68 30 5f 43 01 59 f7 e1 91 5a
80 f2 c0 f7 e2 3b c8 d6 c3

รหัสการประกอบ:

    push dword ptr [edx];
    mov eax, [ecx];
    xor al, 0xc0;
    push 0x01435f30;
    pop ecx;
    mul ecx;
    xchg eax, ecx;
    pop edx;
    xor dl, 0xc0;
    mul edx;
    cmp ecx, eax;
    _emit 0xd6;
    ret;

ฟังก์ชันแฮชต่อไปนี้เกิดขึ้นเพื่อใส่ชื่อเดือนในลำดับที่ถูกต้อง (พบโดยกำลังดุร้าย):

(x ^ 0xc0) * 0x01435f30

มันถูกใช้กับ 4 ไบต์แรก (32 บิต) ของสายป้อนข้อมูลซึ่งจัดเรียงตามลำดับแบบเอนด์เอนด์ จากนั้นเปรียบเทียบผลลัพธ์กับการใช้SALCเพื่อตั้งค่าผลลัพธ์ (al):

  • -1 (จริง) ถ้าเดือนอยู่ในลำดับ
  • 0 (เท็จ) หากเดือนที่สองนำหน้าเดือนแรก (หรือเหมือนกัน)

4
ฉันประทับใจ. โค้ดสั้น ๆ โดยไม่ใช้ภาษาเฉพาะของโค้ดกอล์ฟ
ShuberFu

13

เยลลี่ 15 ไบต์

Oḅ32 354*%991µÞ

ไม่มีลิงค์ล่ามออนไลน์ที่นี่เพราะการส่งช้า โปรแกรมใช้ฟังก์ชัน hashing 354^(input interpreted as base 32 int) % 991เป็นคีย์การเรียงลำดับซึ่งเกิดขึ้นเพื่อให้ผลลัพธ์ในลำดับที่ถูกต้อง โปรแกรมจะไม่เสร็จสิ้นเร็ว ๆ นี้เนื่องจากผลลัพธ์ของการยกกำลังนั้นสูงมาก - สำหรับ "กันยายน" ต้องคำนวณจำนวน 0.24 ล้านล้านหลัก!

คำอธิบายของเยลลี่:

              Þ         Sort by...
             µ          Monadic link consisting of...

O                       Convert month string to code points
 ḅ32                    Take base 32
     354*               Perform 354 to the power of the result
         %991           Take modulo 991

Python Proof ของสคริปต์แนวคิด - บันทึกการใช้powสำหรับการยกกำลังแบบแยกส่วนซึ่งมีประสิทธิภาพมากขึ้น:

import random

def base_convert(string, base):
    total = 0

    for c in string:
        total = total * base + ord(c)

    return total

def month_hash(month):
    return pow(354, base_convert(month, 32), 991)

months = ["January", "February", "March", "April", "May", "June", "July",
    "August", "September", "October", "November", "December"]
random.shuffle(months)

print(months)
print(sorted(months, key=month_hash))

5
"ไม่มีลิงก์ล่ามออนไลน์ที่นี่เพราะนี่เป็นเพียงการส่งช้า " ในกรณีนี้คุณอาจเรียงลำดับเดือนด้วยมือ ;-)
owacoder

บางทีคุณอาจจะประชาสัมพันธ์คำขอคุณสมบัติในการเพิ่มประสิทธิภาพธาร / mod ...
นิคที

@NickT มันเป็นความคิดที่ยอดเยี่ยม แต่น่าเสียดายที่วิธีการตั้งค่าของล่าม (ด้วยตัวดำเนินการแยกกัน) ซึ่งอาจเป็นเรื่องยุ่งยากเล็กน้อย และเยลลี่ก็ใช้งานไม่ได้กับผู้ให้บริการที่มีข้อโต้แย้งมากกว่าสองข้อดังนั้นการกำหนดโอเปอเรเตอร์แยกต่างหากก็ไม่ได้ผลเช่นกัน ...
Sp3000

ไม่ใช่ตัวดำเนินการแยกต่างหากหรือสิ่งใด ๆ เพียงแค่ใคร่ครวญอย่างลึกซึ้งยิ่งขึ้นเพื่อดูว่าการใช้พลังงานนั้นตามมาด้วยการแบ่งส่วนแบบแยกส่วน ฟังดูง่ายไหม : P
Nick T

5

Python, 64 61 57 ไบต์

lambda x,y,g='bMAanlseovc'.find:g((x*4)[10])<g((y*4)[10])

แลมบ์ดาใช้เวลาสองเดือนในการป้อนข้อมูลและเปรียบเทียบ ทดสอบบนIdeone

ขอบคุณ @ljeabmreosn สำหรับการตีกอล์ฟขนาด 3 ไบต์และปูทางไปอีก 3 ลูก!


2
ในที่สุดคุณเปิดเผยความลับเบื้องหลังเวทมนตร์ดำที่คุณใช้เพื่อคำนวณเดือนที่ถูกต้องในคำตอบของ Jelly!
หมึกมูลค่า

1
จะเปลี่ยนs[10%len(s)]ไป(4*s)[10]ทำงานเหรอ
ljeabmreosn

1
@ljeabmreosn นั่นใช้งานได้จริง ขอบคุณ!
เดนนิส

1
ยังไม่เห็นการใช้ <strike> ab </strike> ของการขัดแย้งเริ่มต้นในแลมบ์ดา: P
Nick T

4

Python ขนาด81 71 ไบต์

lambda x,y,m='anebarprayunulugepctovec':m.index(x[1:3])<m.index(y[1:3])

https://repl.it/CluN/1

เปรียบเทียบดัชนีในmของตัวอักษรที่สองและสามของสองเดือน

รุ่น 83 ไบต์เพื่อเรียงรายการเดือน:

lambda x:sorted(x,key=lambda i:'JanFebMarAprMayJunJulAugSepOctNovDec'.index(i[:3]))

3

ทับทิม 58 ไบต์

ใช้เดือนเรียงลำดับเคล็ดลับจาก@ atlasologist ของคำตอบ

->a{a.sort_by{|i|"anebarprayunulugepctovec".index i[1,2]}}

ฟังก์ชั่นการเปรียบเทียบนั้นยาวกว่าเล็กน้อยที่63 ไบต์

->a,b{m=->i{"anebarprayunulugepctovec".index i[1,2]};m[a]<m[b]}

3

J, 66 65 ไบต์

ใช้ความจริงที่ว่า f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) เป็นฟังก์ชันที่ถูกต้องในโดเมนที่ จำกัด ของ 12 เดือน:

>/@:('7/HEäWa<+0'&i.@(3 :'u:<.(#>y)%~+:+/3&u:({.>y),({:>y)')"0)"1

การใช้งาน:

   bigger =: >/@:('7/HEäWa<+0'&i.@(3 :'u:<.(#>y)%~+:+/3&u:({.>y),({:>y)')"0)"1
   bigger ('May'; 'March')
1
   bigger ('May'; 'June')
0

(ไม่เป็นความคิดที่ดีที่สุด แต่ฉันไม่ต้องการขโมยกลอุบายของใคร!)

นี่เป็นรุ่นที่สั้นกว่าโดยใช้วิธีของ @ atlasologist :

J, 63 ไบต์

m=:[:}.3{.]
[:>/(12 2$'anebarprayunulugepctovec')i.([:m[),:[:m]

การใช้งาน:

   bigger =: [:>/(12 2$'anebarprayunulugepctovec')i.([:m[),:[:m]
   'January' bigger 'May'
0
   'June' bigger 'May'
1

และรุ่นที่สั้นกว่ามากโดยใช้วิธีการที่ฉลาดของ @ Dennis :

J, 34 ไบต์

>&:('ubMAanlseov'&i.@:{.@:(10&|.))

3

Haskell, 74 ไบต์

กอล์ฟรหัสแรกของฉันใช่! แนวคิดทั่วไปของสิ่งนี้ได้รับแรงบันดาลใจจากคำตอบที่ดีที่สุดในเยลลี่และความจริงที่ว่าเมื่อชื่อเดือนถูกขี่จักรยานไปแล้วตัวละครที่ 11 นั้นไม่เหมือนใครเสมอไป

e s=head.drop 10$cycle s;a#b=elem(e b)$tail$dropWhile(/=e a)"ubMAanlseovc"

นี่คือเวอร์ชั่นที่ไม่ได้รับการตรวจสอบเพื่อดูวิธีการทำงาน:

order :: String
order = "ubMAanlseovc"

eleventhChar :: String -> Char
eleventhChar
  = head . drop 10 $ cycle

inOrder :: String -> String -> Bool
inOrder m1 m2
  = elem (eleventhChar m2) (tail $ dropWhile (/= eleventhChar m1) order)

eฟังก์ชั่นหมายถึงฟังก์ชั่น eleventhChar (เศร้าไม่สามารถตัดออก 4 ไบต์เนื่องจากข้อ จำกัด monomorphism ผมคิดว่า) และ#สอดคล้องกับฟังก์ชั่นมัดกับinOrderฟังก์ชั่น

คำตอบเล็ก ๆ น้อย ๆ ที่เรียบร้อย แต่อาจจะมีวิธีการโกนที่มากขึ้นไบต์ (ฉันพบบางอย่างในขณะที่เขียนนี้!)


คุณอาจจะสั้นลงe s=head.drop 10$cycle sเช่นคุณได้ในคำอธิบายของคุณโดยใช้.แทน:$ e=head.drop 10.cycleอย่างไรก็ตามการใช้โอเปอเรเตอร์ดัชนี!!จะยิ่งสั้นลง:e=(!!10).cycle
Laikoni

คำแนะนำที่ดี บางครั้งคุณก็มองข้ามสิ่งเหล่านี้ ขอบคุณมาก. จะแก้ไขในไม่ช้า
bower

2

Java, 133 123

แข็งแรงเล่นกอล์ฟ:

boolean f(String a,String b){return h(a)<h(b);}int h(String s){return"anebarprayunulugepctovec".indexOf(s.substring(1,3));}

ฉันกำลังค้นหาเทคนิคที่ชาญฉลาดเหมือนในคำตอบของแอสเซมเบลอร์ แต่มันใช้เวลานานเกินกว่าจะคิดออกได้ดังนั้นฉันจึงใช้เทคนิคเดียวกันกับที่ทุกคนใช้

Ungolfed:

import java.util.Random;

public class SortTheMonthsOfTheYear {

  public static void main(String[] args) {
    // @formatter:off
    String[] MONTHS = new String[] {
        "January", "February", "March",
        "April",   "May",      "June",
        "July",    "August",   "September",
        "October", "November", "December"
    };
    // @formatter:on

    Random r = new Random();
    for (int i = 0; i < 100; ++i) {
      int m1 = r.nextInt(MONTHS.length);
      int m2 = r.nextInt(MONTHS.length);
      System.out.println("Input: " + MONTHS[m1] + " < " + MONTHS[m2]);
      System.out.println("Expected: " + (m1 < m2));
      System.out.println("Actual:   " + new SortTheMonthsOfTheYear().f(MONTHS[m1], MONTHS[m2]));
      System.out.println();
    }
  }

  // Begin golf
  boolean f(String a, String b) {
    return h(a) < h(b);
  }

  int h(String s) {
    return "anebarprayunulugepctovec".indexOf(s.substring(1, 3));
  }
  // End golf

}

คุณสามารถใช้substringแทนถ้าcharAt
Anatolyg

@Anatolyg ขอบคุณฉันไม่แน่ใจว่าวิธีการอย่างใดอย่างหนึ่งหนีฉัน ฉันยังสามารถลบออกได้"" +เนื่องจากไม่มีข้อมูลดิบcharอีกต่อไป

2

ภาษาเครื่องของ ARM บน Linux 44 40 ไบต์

e28fc001     add ip, pc, #1
e12fff1c     bx ip
6803         ldr r3, [r0, #0]
6808         ldr r0, [r1, #0]
4a05         ldr r2, [pc, #20]
f08303dd     eor.w r3, r3, #221
f08000dd     eor.w r0, r0, #221
4353         muls r3, r2
4350         muls r0, r2
4283         cmp r3, r0
bfac         ite ge
2000         movge r0, #0
2001         movlt r0, #1
4770         bx lr
2f68f24c

ผมใช้ฟังก์ชั่นที่แตกต่างกันกว่ากัญชาanatolyg 's วิธีการแก้ปัญหาและพยายามที่จะใช้คำแนะนำหัวแม่มือบันทึกไม่กี่ไบต์ (แม้ว่าฉันพัด 8 ไบต์เข้าสู่โหมดหัวแม่มือ)

คุณสามารถลองใช้ Raspberry Pi หรืออุปกรณ์ Android ด้วย GNURoot

int main(int argc,char**argv){
return ((int(*)(char*,char*))"\
\1\xc0\x8f\xe2\
\x1c\xff\x2f\xe1\
\3\x68\x8\x68\
\5\x4a\x83\xf0\
\xdd\3\x80\xf0\
\xdd\x43\x53\x43\
\x50\x4a\x83\x42\
\xac\bf\0\x20\
\1\x20\x70\x47\
\x4c\xf2\x68\x2f\
")(argv[1],argv[2]);}

เมื่อต้องการเรียกใช้ป้อนสิ่งที่ต้องการ

$ ./foo January February; echo $?

รุ่นปัจจุบันจัดการกับกรณีที่เท่าเทียมกัน (และอื่น ๆ ) อย่างถูกต้อง


ฉันคิดว่าคุณไม่จำเป็นต้องใช้รหัสที่เปลี่ยนเป็นโหมด Thumb อย่างชัดเจน จากสิ่งที่ฉันจำคุณต้องบอก linker ว่าโพรซีเดอร์ของคุณอยู่ในโหมด thumb และ linker จะตั้งค่า LSB ในที่อยู่ของโพรซีเดอร์ของคุณเป็น 1 ดังนั้นโปรเซสเซอร์จะเปลี่ยนเป็นโหมด Thumb โดยอัตโนมัติเมื่อโค้ดของคุณถูกเรียก
Anatolyg

นอกจากนี้จะbfacทำอย่างไร?
Anatolyg

@anatolyg ite geดำเนินการตามคำสั่งถัดไป ( movge r0, #0) อย่างมีเงื่อนไขหากr3 >= r0ไม่เช่นนั้นคำสั่งต่อไปนี้จะถูกดำเนินการ ( movlt r0, #1) ผมคิดว่ามีห้องพักที่จะเคาะออกคู่ของไบต์ที่นี่ แต่ฉันไม่ได้มีเวลาที่จะทำงานใน :-) นี้
ceilingcat

1

Perl 6 , 55 ไบต์

*.sort({index 'anebarprayunulugepctovec',.substr(1,2)})

มันจะต้องมีอีกไม่กี่ไบต์สำหรับรุ่นเปรียบเทียบ:

{[<] @_».&{index 'anebarprayunulugepctovec',.substr(1,2)}}
{[<] .map: {index 'anebarprayunulugepctovec',.substr(1,2)}}

ทดสอบ:

#! /usr/bin/env perl6
use v6.c;
use Test;

my @months = <
  January February March April May June July
  August September October November December
>;

my &month-sort = *.sort({index 'anebarprayunulugepctovec',.substr(1,2)});

plan 100;

for ^100 {
  # 「.pick(*)」 returns all elements in random order
  is-deeply month-sort(@months.pick(*)), @months.List;
}

1

Haskell, 118 ตัวอักษร

data M=Ju|Fr|Mc|Ai|My|Je|Jy|Au|St|Oo|Ne|De deriving(Ord,Eq,Read)
r=read.([head,last]<*>).lines.take 4
a#b=(r a::M)<r b

ใช้ความจริงที่ว่าชื่อแต่ละเดือนไม่ซ้ำกันในอักขระที่หนึ่งและที่สี่ (หรือ 3 สำหรับพฤษภาคม) เพื่อกำหนดชนิดข้อมูลที่สามารถแยกวิเคราะห์โดยอัตโนมัติและเปรียบเทียบภาษา ฟังก์ชั่น 'r' จะแปลงสตริงโดยการจับตัวอักษรสี่ตัวแรก (หรือน้อยกว่า) จากนั้นเลือกตัวอักษรตัวแรกและตัวสุดท้าย จากนั้น 'a # b' เป็นโอเปอเรเตอร์เพื่อเปรียบเทียบค่า:

*Main> "June" # "March"
False
*Main> "June" # "July"
True
*Main> "January" # "July"
True
*Main> "January" # "November"
True
*Main> "December" # "November"
False

อาจจะทำได้อย่างมีประสิทธิภาพมากขึ้น แต่ฉันอยากลองทำโดยใช้ประเภทข้อมูลที่มีประโยชน์เพื่อเป็นตัวแทนของเดือน


1

PowerShell, 96 88 63 ไบต์

$input|Sort{'anebarprayunulugepctovec'.IndexOf((-join$_[1,2]))}

เช่น

PS C:\Code> 'February', 'January', 'December', 'April' | .\monthsort.ps1
January
February
April
December

ตอนนี้ความท้าทายที่สองของการเรียงลำดับรายการเป็นลำดับ รุ่นก่อนหน้าทำการเปรียบเทียบการทดสอบสองเดือน:

v2.
$l,$r=$args|%{-join$_[1,2]};($d='anebarprayunulugepctovec').indexof($l)-lt$d.IndexOf($r)

v1.
$l,$r=$args|%{-join$_[1,2]};$r-match('an|eb|ar|pr|ay|un|ul|ug|ep|ct|ov|ec'-split$l)[1].Trim('|')

e.g.

PS C:\code> .\Test-MonthsInOrder.ps1 January February
True

ขึ้นอยู่กับอักขระสองตัวที่สองในชื่อเดือน



0

Javascript, 118 ไบต์

u=p=>{p=p.split` `.sort();c=[];for(i=0;i<12;i++){c.push(p["4 3 7 0 8 6 5 1 11 10 9 2".split` `[i]]);}return c.join` `}

สามารถเล่นกอล์ฟได้มากขึ้น probobly โดยการกำจัดcและการใช้array.mapแต่นี่คือสิ่งที่ฉันมีตอนนี้ ...


for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
pinkfloydx33

0

Bash, 101 ไบต์

นี่คือฟังก์ชั่นเช่น is_later

f(){ s=ubMAanlseovc a=$1$1$1 b=$2$2$2 c=${a:10:1} d=${b:10:1} e=${s%$c*} f=${s%$d*};((${#e}<${#f}));}

ทดสอบ

$ f January December && echo later || echo not later
not later

0

k4, 29

{x@<"ubMAanlseovc"?(*|11#)'x}

พอร์ตของ@ เดนนิสคำตอบวุ้น

นี่คือตัวเรียงลำดับไม่ใช่ตัวเปรียบเทียบ สิ่งที่น่าสนใจผู้เปรียบเทียบสามารถนำไปใช้งานได้เล็กน้อยโดยอัลกอริทึมเดียวกันและมีเพียงหนึ่งไบต์ที่ยาวกว่า:

{(<)."ubMAanlseovc"?(*|11#)'x}

0

Bash + coreutils, 94 bytes 93 bytes

s(){ x=FMAyulgSOND;for y;{ rev<<<${y:0:3}|tr -d -C $x|tr $x C-M;echo B$y;}|sort|cut -f2 -dB;}

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

90 ไบต์โดยใช้ C Locale

s(){ x=FMAyulgSOND;for y;{ rev<<<${y:0:3}|tr -d -C $x|tr $x C-M;echo \␉$y;}|sort|cut -f2;}

... โดยที่␉คืออักขระแท็บ

80 ไบต์โดยใช้ C Locale

s(){ x=anebarprayunulugepctovec;for y;{ echo ${x%${y:1:2}*}\␉$y;}|sort|cut -f2;}

... ใช้วิธีการของ @ atlasolog ถูกผูกไว้เพื่อเป็นวิธีใช้วิธีนี้เพื่อทำงานกับตำแหน่งที่ตั้งเพิ่มเติม

ทดสอบ / การใช้งาน

s December November October September August July June May April March February January

เอาท์พุท:

January
February
March
April
May
June
July
August
September
October
November
December
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.