Napisz funkcję lub program, który trwa wejściowych ciągów, w pełni orkisz, nazw angielskich miesiąc w przypadku tytułowej: January
, February
, March
, itd. (Null / CR / LF zakończone OK, ograniczony z jakimś charakterze non-alfa, jeśli tak zdecydujesz) i albo
porównuje dwa dane wejściowe, zwracając wartość Prawdy, jeśli drugie dane wejściowe są większe (w kolejności miesiąca) niż pierwsze. Równe wartości dają wartość Falsey
lub sortuje dowolną ich sekwencję (listę, łańcuch rozdzielany itp.) w kolejności chronologicznej
(Istota wyzwania polega na zdefiniowaniu metody / wyrażenia, które daje prawidłowy sort leksykograficzny. Niektóre języki mogą mieć krótszą odpowiedź na jedno lub drugie)
Nie można używać żadnych wewnętrznych metod analizy czasu (np. strptime
), Aby tłumaczyć nazwę miesiąca na liczbę lub wstępnie mapowane nazwy miesięcy. Używaj właściwości samych ciągów, zdefiniowanej przez ciebie oszczędnej tabeli przeglądowej lub czegoś sprytnego.
Przykład
Przykłady działania, choć pierwszy jest zabroniony przez reguły ...
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')
Poniższe wersje są jednak OK, ponieważ kodujemy te informacje
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]
Lub możesz wykonać funkcję sortowania
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])
Przykładowe testy
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')
months
listę, która była listą wszystkich nazw miesięcy, chciałbym zabronićmonths[x] < months[y]
jako odpowiedzi. Lista nazw miesięcy ma kilka bardziej specyficznych cech (różna długość, wspólność), które sprawiają, że wyzwanie jest łatwiejsze / trudniejsze niż losowo generowane ciągi znaków.Odpowiedzi:
Galaretka , 19 bajtów
Jest to monadyczny link, który przyjmuje listę jako argument i sortuje ją. Wypróbuj online!
tło
Galaretka wykorzystuje modułowe indeksowanie 1. Jeśli powtarzamy nazwy miesięcy wystarczająco często, aby uzyskać 11 znaków, otrzymujemy następującą tablicę.
W 11 -tego (ostatniego) kolumny, wszystkie znaki są różne, więc możemy z nich korzystać w celu identyfikacji kolejność miesięcy.
Jak to działa
źródło
kod maszynowy x86,
2625 bajtówHexdump:
Kod zestawu:
Następująca funkcja skrótu powoduje ustawienie nazw miesięcy we właściwej kolejności (znalezionej przez brutalną siłę):
Jest stosowany do pierwszych 4 bajtów (32 bity) ciągu wejściowego, ułożonych w kolejności little-endian. Następnie porównując wynik i używając
SALC
do ustawienia rejestru wyników (al):źródło
Galaretka , 15 bajtów
Brak linku tłumacza online, ponieważ jest to jedno wolne przesyłanie. Program używa funkcji skrótu
354^(input interpreted as base 32 int) % 991
jako klawisza sortowania, który daje wyniki w odpowiedniej kolejności. Program nie zakończy się w najbliższym czasie, ponieważ wyniki potęgowania są gigantyczne - dla „września” należy obliczyć liczbę z 0,24 biliardowymi cyframi!Objaśnienie galaretki:
Skrypt proof of concept w języku Python - zwróć uwagę na użycie
pow
modułowego potęgowania, które jest znacznie wydajniejsze:źródło
Python,
646157 bajtówSonda lambda pobiera dwa miesiące i porównuje je. Przetestuj na Ideone .
Dzięki @ljeabmreosn za grę w golfa na 3 bajtach i torowanie drogi dla kolejnych 3!
źródło
s[10%len(s)]
do(4*s)[10]
pracy?Python,
8171 bajtówhttps://repl.it/CluN/1
Porównuje indeks
m
drugiej i trzeciej litery dwóch miesięcy.Wersja 83-bajtowa do sortowania listy miesięcy:
źródło
Rubinowy, 58 bajtów
Wykorzystuje sztuczkę sortującą według miesiąca z odpowiedzi @ atlasologist .
Funkcja porównania jest nieco dłuższa i ma 63 bajty
źródło
J,
6665 bajtówWykorzystuje fakt, że f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) jest prawidłową funkcją w ograniczonej dziedzinie 12 miesięcy:
Stosowanie:
(W żadnym wypadku nie jest to najlepszy pomysł, ale nie chciałem kraść niczyjej sztuczki rankingowej!)
Oto krótsza wersja z wykorzystaniem metody @ atlasologist :
J, 63 bajty
Stosowanie:
I znacznie krótsza wersja wykorzystująca sprytną metodę @ Dennisa :
J, 34 bajty
źródło
Haskell, 74 bajty
Mój pierwszy golf golfowy, tak! Ogólna idea tego jest zainspirowana najwyższą odpowiedzią w Galaretce oraz faktem, że gdy nazwy miesięcy są cykliczne, jedenasta postać jest zawsze wyjątkowa.
Oto wersja bez golfa, aby zobaczyć, jak to działa:
e
Funkcja odpowiada funkcji eleventhChar (niestety nie odpędzić 4 bajty w związku z ograniczeniem monomorfizm chyba) i#
odpowiada funkcji infiks doinOrder
funkcji.Ładne, małe rozwiązanie, ale mogą istnieć sposoby na zmniejszenie liczby bajtów (znalazłem kilka podczas pisania tego!)
źródło
e s=head.drop 10$cycle s
jak to zrobiłeś w swoim wyjaśnieniem stosując.
zamiast$
:e=head.drop 10.cycle
. Jednak użycie operatora indeksu listy!!
jest jeszcze krótsze:e=(!!10).cycle
Java,
133123Gra w golfa:
Szukałem sprytnej techniki, takiej jak w odpowiedzi asemblera, ale jej znalezienie zajęło mi zbyt wiele czasu, więc wybrałem tę samą technikę, której używali wszyscy inni.
Nie golfowany:
źródło
substring
zamiast tego, jeślicharAt
"" +
ponieważ nie ma już surowychchar
plików.Język maszynowy ARM w systemie Linux
4440 bajtówKiedyś inną funkcję skrótu niż anatolyg „s rozwiązania i próbował instrukcji użycie kciuka, aby zaoszczędzić kilka bajtów (choć wiał 8 bajtów wejściu w tryb kciuka).
Możesz to wypróbować na Raspberry Pi lub urządzeniu z Androidem z GNURoot.
Aby uruchomić, wpisz coś takiego
Obecna wersja poprawnie obsługuje teraz przypadek równości (i inne).
źródło
bfac
robi?ite ge
warunkowo wykonuje następną instrukcję (movge r0, #0
), jeślir3 >= r0
w przeciwnym razie następująca instrukcja jest wykonywana (movlt r0, #1
). Myślę, że jest tu miejsce na zrzucenie kilku bajtów, ale nie miałem czasu nad tymPerl 6 , 55 bajtów
Wymagałoby to jeszcze kilku bajtów dla wersji porównawczych:
Test:
źródło
Haskell, 118 znaków
Wykorzystuje fakt, że nazwa każdego miesiąca jest unikalna pod względem pierwszego i czwartego znaku (lub trzeciego w maju), aby zdefiniować typ danych, który może być automatycznie analizowany i porównywany według języka. Funkcja „r” konwertuje ciąg, chwytając pierwsze cztery znaki (lub mniej), a następnie wybierając pierwszy i ostatni. Zatem „a # b” jest operatorem porównującym wartości:
Prawdopodobnie można to zrobić w bardziej wydajny sposób, ale chciałem to zrobić przy użyciu użytecznego typu danych reprezentującego miesiące.
źródło
PowerShell,
968863 bajtówna przykład
Teraz robi drugie wyzwanie sortowania listy w kolejności; poprzednie wersje przeprowadziły porównanie testu dwumiesięcznego:
Na podstawie dwóch drugich znaków w nazwie miesiąca.
źródło
Python
8382 bajtyTest: https://repl.it/repls/TimelyDecimalBrowsers
Pobiera sumę pierwszych 3 znaków i tworzy pojedynczy znak do przeszukania.
źródło
JavaScript, 118 bajtów
Można by grać w golfa więcej, prawdopodobnie pozbywając się
c
i używającarray.map
, ale to jest to, co na razie mam ...źródło
for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
Bash, 101 bajtów
jest to funkcja taka jak is_later
test
źródło
k4, 29
Port odpowiedzi na galaretkę @ Dennisa .
To jest sortownik, a nie komparator; co ciekawe, komparator jest w prosty sposób implementowany przez ten sam algorytm i tylko o jeden bajt dłużej:
źródło
Bash + coreutils,
94 bajty93 bajtyJest to próba wymyślenia transformacji, która sortuje leksykograficznie. Jeśli przyjrzysz się uważnie kluczowi transformacji
FMAyulgSOND
, zobaczysz miesiące od lutego do grudnia (styczeń staje się pusty po transformacji; jest on ciągnięty do góry za pomocą „B” jako separatora). Odwracanie, obcinanie i usuwanie niekluczowych liter umożliwia wyciągnięcie tej sztuczki.90 bajtów przy użyciu ustawień regionalnych C.
... gdzie ␉ jest znakiem tabulacji.
80 bajtów przy użyciu ustawień regionalnych C.
... przy użyciu metody @ atlasolog. Jest to sposób na wykorzystanie tego podejścia do pracy z większą liczbą lokalizacji.
Test / użycie
wyjścia:
źródło