Wyzwanie
Napisz najkrótszy program, który konwertuje czytelny dla człowieka przedział czasu na datę składników formularza:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Przykładowe przypadki
Każdy przypadek testowy ma dwa wiersze, dane wejściowe i dane wyjściowe:
1 year 2 months 3 seconds
{1|2|0|0|0|3}
-2 day 5 year 8months
{5|8|-2|0|0|0}
3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}
Zasady
- Nie można użyć
strtotime
ani żadnej wbudowanej funkcji, która wykonuje całą pracę. - Najkrótszy kod wygrywa (bajty)
- Możesz wydrukować swój wynik
stdout
lub plik, wynik może być również zwrócony przez funkcję, to zależy od Ciebie - Token może być w liczbie pojedynczej lub mnogiej.
- Komponenty mogą być w losowej kolejności
- Pomiędzy liczbą a tokenem może nie być białych znaków
- Znak jest opcjonalny, gdy przedział czasu jest dodatni (wejście i wyjście)
- Jeśli składnik pojawia się więcej niż jeden raz, należy dodać wartości
- Każdy element ma swój własny znak
- Elementy należy traktować osobno (np.
80 minutes
Pozostaje na wyjściu jako 80) - Dane wejściowe są gwarantowane małymi literami
Wesołego golfa!
Sign is optional when the time interval is positive
Czy to oznacza, że dane wejściowe mogą zawierać+
znaki?Odpowiedzi:
CJam, 60 bajtów
Po tym, jak utknąłem w latach 60-tych, w końcu udało mi się zmniejszyć to do 60 bajtów. Wystarczająco dobry! Wyślij to!
Wypróbuj online
Squished:
Rozszerzony i skomentowany:
Początkowo zacząłem stosować podejście oparte na tokenach, ale utknęło to dość mocno w ... 61 bajtach. Westchnienie. Więc całkowicie zmieniłem biegi i przeszedłem na podejście oparte na postaciach, które i tak jest o wiele bardziej interesujące.
Moja metoda analizowania polega na dodawaniu do bufora dowolnych osiągniętych znaków numerycznych (
0
-9
i-
) oraz analizowaniu bufora jako liczby całkowitej po osiągnięciu określonego znaku z jednej z nazw jednostek czasu. Te znaki sąy
,t
,d
,h
,i
, ic
, które wszystkie spełniają warunki, które pojawiają się w nazwie jednostki czasu i nie pojawiają się przed znakiem rozpoznawczym w żadnej innej nazwie jednostki czasu. Innymi słowy, gdy osiągnięty zostanie jeden z tych znaków rozpoznawania jednostki czasu, bufor numeryczny zostanie wypełniony ostatnią widzianą liczbą, jeśli faktycznie oznacza jednostkę czasu, lub bufor numeryczny będzie pusty, jeśli pojawi się on, ale nie powinien sygnał t, inna jednostka czasu. W obu przypadkach bufor numeryczny jest analizowany jako liczba całkowita lub 0, jeśli był pusty, i jest dodawany do odpowiedniej wartości jednostki czasu. Tak więc znaki rozpoznające pojawiające się w innych jednostkach czasu po znaku rozpoznającym nie mają żadnego efektu.Inne szalone hacki to:
Dla każdego, kto jest ciekawy mojego rozwiązania opartego na tokenach, które utknęło na 61 bajtach, opublikuję to tutaj. Jednak nigdy nie starałem się go rozszerzać ani komentować.
CJam, 61 bajtów
źródło
Perl: 61 znaków
Dzięki @nutki.
Przykładowy przebieg:
Moje słabe wysiłki:
7877 znakówźródło
s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
(m.|.)
->m?(.)
oszczędza dodatkowe 4.Ruby,
119106868584 bajtówJeden bajt zapisany dzięki Sp3000.
Jest to funkcja bez nazwy, która przyjmuje dane wejściowe jako ciąg znaków i zwraca wynik (również jako ciąg znaków). Możesz to przetestować, przypisując go
f
, powiedzmy, i nazywając takźródło
Python 2, 99 bajtów
Jest to funkcja lambda, która pobiera ciąg znaków i po prostu używa wyrażenia regularnego, aby wyodrębnić niezbędne liczby.
Dzięki Martinowi za wskazanie, że to
\s*
może być po prostu<space>*
. Łatwo zapomnieć, że wyrażenia regularne pasują do spacji dosłownie ...źródło
JavaScript 100
105 112Edytuj Dodawanie ciągów szablonów (pierwszy wdrożony grudzień 2014, tak ważny dla tego wyzwania) - wtedy ich nie znałem
Edytuj Eurekę, w końcu zrozumiałem
m?
wszystkie pozostałe odpowiedzi!Test
źródło
R 197 bajtów
Zdaję sobie sprawę, że to wcale nie jest konkurencja, w większości chciałem tylko znaleźć rozwiązanie w R. Wszelkie skrócenie pomocy jest oczywiście mile widziane.
Podobnie jak odpowiedź Martina, jest to funkcja bez nazwy. Aby to nazwać, przypisz go do
f
i przekaż ciąg.Jest to dość ohydne, więc spójrzmy na wersję bez gry w golfa.
W oparciu o samą strukturę łatwo jest zobaczyć, co się dzieje, nawet jeśli nie jesteś zbyt zaznajomiony z R. Omówię niektóre z dziwniejszych aspektów.
paste0()
jest jak R łączy ciągi bez separatora.str_extract_all()
Funkcja pochodzi z Hadley Wickhamastringr
opakowaniu. Obsługa wyrażeń regularnych przez R w pakiecie podstawowym pozostawia wiele do życzenia, i to tam, gdziestringr
przychodzi. Ta funkcja zwraca listę dopasowań wyrażeń regularnych w ciągu wejściowym. Zauważ, jak regex jest otoczony funkcją -perl()
to tylko mówi, że regex jest w stylu Perla, a nie w stylu R.gsub()
wykonuje wyszukiwanie i zamianę za pomocą wyrażenia regularnego dla każdego elementu wektora wejściowego. Mówimy tutaj, aby zastąpić wszystko, co nie jest liczbą lub znakiem minus, pustym ciągiem.I masz to. Dalsze wyjaśnienia z przyjemnością udzielimy na żądanie.
źródło
library(stringr)
w swoim źródle?Kobra - 165
źródło
C ++ 14,
234229 bajtówEdytować: zmniejsz 5 bajtów, używając deklaracji w starym stylu zamiast
auto
.Wiem, że zwycięzca został już wybrany i że będzie to najdłuższy jak dotąd zgłoszenie, ale po prostu musiałem opublikować rozwiązanie C ++, ponieważ założę się, że nikt się w ogóle nie spodziewał :)
Szczerze mówiąc, jestem bardzo zadowolony z tego, jak krótki okazał się (według pomiarów C ++, oczywiście) i jestem pewien, że nie może być krótszy (tylko z jedną uwagą, patrz poniżej) . Jest to także całkiem niezła kolekcja nowych funkcji w C ++ 11/14.
Nie ma tu bibliotek stron trzecich, używana jest tylko biblioteka standardowa.
Rozwiązanie ma postać funkcji lambda:
Nie golfowany:
Z jakiegoś powodu musiałem pisać
zamiast po prostu
ponieważ iterator zwróciłby tylko jedno dopasowanie, jeśli przekażę obiekt tymczasowy. Nie wydaje mi się to właściwe, więc zastanawiam się, czy jest problem z implementacją wyrażenia regularnego GCC.
Pełny plik testowy (skompilowany z GCC 4.9.2 z
-std=c++14
):Wynik:
źródło
PHP, 141 bajtów
pobiera dane wejściowe z argumentu pierwszego wiersza poleceń; używa
[,]
dla danych wyjściowych zamiast{|}
. Uruchom z-r
.awaria
źródło