O dziwo, to proste zadanie nie wydaje się już istnieć, więc ...
Twoim zadaniem jest napisanie programu, który pobiera jako dane wejściowe 12 godzinny czas i konwertuje go na „czas wojskowy” lub 24-godzinny format czasu.
Dane wejściowe będą miały postać:
HH:MM am/pm
Chociaż dopuszczalne są niewielkie różnice:
Przestrzeń oddzielająca am / pm od reszty czasu jest opcjonalna.
Ostatnią częścią może być „am” / „pm” lub „a” / „p”.
Wszelkie wielkie litery są w porządku.
Wyjściem będzie czas wprowadzony, przekształcony do formatu 24-godzinnego. Może to być liczba lub ciąg znaków.
Zarówno dla wejścia jak i wyjścia:
Zera na pierwszym miejscu są opcjonalne. 0 w ostatnich 3 miejscach jest obowiązkowe.
ogranicznikiem oddzielającym godziny i minuty może być „:”, „” (spacja) lub nic.
Inne notatki:
Północ może być wyrażona jako 0000 lub 2400.
Północ będzie uważana za „przed południem”, a południe za „po południu”.
Twój program może być funkcją lub pełnym programem i powinien albo zwrócić wynik, albo wypisać go na standardowe wyjście. Końcowe białe znaki są w porządku.
Przykłady (nie musisz obsługiwać każdego formatu):
12:00am -> 0000
1200 pm -> 1200
1234Am -> 00:34
134a -> 134
01:34PM -> 13 34
1234pm -> 1234
To jest kod golfowy, więc wygrywa najmniejsza liczba bajtów. Ponieważ jest to tak trywialne do rozwiązania za pomocą wbudowanego, fajnie byłoby zobaczyć kod, który ręcznie to rozwiązuje (ale użycie wbudowanych jest w porządku).
Właśnie w celu wyjaśnienia, to nie są zobowiązane do wspierania wszelkich możliwych format. Obsługa tylko jednego wejścia i jednego formatu wyjściowego (do wyboru) jest w porządku. Chciałbym jednak ograniczyć format opisany powyżej (który jest już całkiem darmowy). {1134,'pm'}
byłoby na przykład nie do przyjęcia.
01:54pm
działałoby, ale1:54pm
nie?Odpowiedzi:
V ,
2117 bajtówDzięki @DJMcMayhem za 4 bajty!
Wypróbuj online! Trwa to format
HH:MMx
, gdziex
jest alboa
czyp
i zwraca go w formacieHH:MM
Hexdump:
Wyjaśnienie:
źródło
[1-12]
prawidłowe? W takim przypadku myślę, że możesz to zrobićó^12/0
zamiastcw^R=^R"%12
çp/12^A
co jest równoważne z:g/p/norm 12<C-a>
vimMATL , 4 bajty
Wypróbuj online!
Wyjaśnienie
Wbudowana funkcja: konwersja ciągu daty z automatycznym wykrywaniem formatu wejściowego i formatu wyjściowego
15
, który odpowiada'HH:MM'
. Jest to równoważne z odpowiedzią Octave @ StewieGriffin .źródło
Oktawa,
2117 bajtówZaoszczędź 4 bajty dzięki Luisowi Mendo. Mógłbym podać format 15 zamiast
'HHMM'
.Wyjaśnienie:
Jest to anonimowa funkcja biorąc ciąg
c
jako wkład w formacie:'11:34 AM'
.datestr
rozpoznaje format automatycznie jako jeden ze standardowych formatów daty i wysyła go w określonym formacie 15, czyliHH:MM
.Ponieważ określony format wyjściowy nie ma
AM
lubPM
Octave automatycznie konwertuje go na tak zwany czas wojskowy.Wypróbuj online.
Wersja nieużywająca
datestr
35 bajtówWyjaśnienie:
Pobiera ciąg wejściowy
c
w formacie1134am
.Lub inne podejście do 37 bajtów:
źródło
PowerShell ,
232019 bajtówWypróbuj online!
(Jeśli korzystasz z systemu Windows, możesz pominąć
get-
, aby dostać się do 19 bajtów. W TIO najwyraźniej wymaga to pełnejGet-Date
nazwy).Pobiera dane wejściowe jako ciąg
$args[0]
, wykorzystuje je jako dane wejściowe do poleceniaGet-Date
cmdlet, które analizuje je wdatetime
obiekt .NET . Jest to przekazywane z-f
parametrem ormat,HHmm
aby przekonwertować go na czas wojskowy (stolicaHH
określa czas 24-godzinny). Wynik jest niejawny.Silnik analizujący jest dość solidny, więc dodatkowe dane wejściowe, takie jak
12am
lub12:00am
są dozwolone. Pobaw się z danymi wejściowymi w TIO i zobacz, co jeszcze działa.( Zapisano 3 bajty dzięki @admalledd ... zapisałem kolejny bajt dzięki @briantist )
źródło
$args[0]
i-f
, jak usunąć apostrofów całym ul format:date $args[0]-f HHmm
. Przynajmniej działa to na mojej PowerShell ...Get-Date
ze-f
ktoś przypomniał mi, że nie trzeba cytaty. Oraz dobre połączenie z usunięciem spacji, ponieważ parser traktuje]
koniec jako token. Dzięki!Python 2, 44 bajty
Format wejściowy:,
01:23am
opcjonalnym
i spacje po minutachFormat wyjściowy:
123
źródło
Pyth,
2120 bajtówPobiera dane wejściowe formularza
01 23a
jako „01:23”. Początkowe 0 jest opcjonalne.Dane wyjściowe mają postać
123
, z pominięciem początkowego 0.W pseudokodzie:
Wypróbuj online!
źródło
PHP,
3532 bajtówformat wejściowy: bez rozróżniania wielkości liter, wymaga dwukropka i
m
formatu wyjściowegohhmm
. wykorzystuje wbudowane:pobiera dane wejściowe z argumentu pierwszego wiersza poleceń.
PHP, 45 bajtów, brak wbudowanych
format wejściowy
(h)h:mm a(m)
małe litery, format wyjściowy(h)hmm
.źródło
JavaScript (ES6), 40 bajtów
Dane wejściowe powinny być sformatowane w następujący sposób:
12:32 am
źródło
GNU Coreutils (
1816 bajtów)Ze skryptu powłoki:
Nie akceptuje białych znaków na wejściu
W tym momencie równie dobrze może użyć 1 $ i zignorować dodatkowe argumenty.
Oryginalny
Aby zezwolić na białe znaki na wejściu,
źródło
C #, 46 bajtów
Ciągi znaków są pobierane jako dane wejściowe
12:00 AM
Wykonanie tej samej czynności, ale podciąganie danych wyjściowych z domyślnego wywołania
ToString
(Zakładając kulturęen-GB
), jest o 3 bajty dłuższe na 49 bajtów:źródło
date
, 0 + 8 = 8 bajtówNa temat korzystania z odpowiedniego narzędzia do pracy…
Pobiera dane wejściowe jako argument wiersza poleceń. Uruchom z
+%H%M -d
(kara 8 bajtów). Nie ma tutaj żadnego rzeczywistego programu; całą pracę wykonują argumenty wiersza poleceń. (To całkiem niezły dowód na to, że za argumenty wiersza poleceń grozi kara!)Przykład:
źródło
Java 7,
138106105104 bajtówWypróbuj online!
Dane wejściowe są rozdzielane dwukropkiem i mają spację między czasem a godziną przedpołudniową. Dane wyjściowe nie są rozdzielane dwukropkami.
-1 bajt dzięki Kevin Cruijssen
źródło
HHmm
naHmm
.Japt , 14 bajtów
Wypróbuj online!
Działa to tylko w Chrome. Oto wersja, która działa we wszystkich przeglądarkach:
Jeszcze raz dziękuję ETHproductions za pomoc!
źródło
Perl,
452837bajtów2837 bajtów(c / o @Dada)
(Kod 36 bajtów, 1 bajt dla
-p
przełącznika kompilatora )Akceptuje
0145pm
formaty typów z am / pm lub a / p. Wymagane zera wiodące na wejściach.Test:
Moja oryginalna odpowiedź
(również delikatnie zmieniony)
(Kod 39 bajtów, 1 bajt dla
-p
przełącznika kompilatora ).Akceptuje tylko formę jak 0145p lub 0145a i żadnych innych, i wymaga
perl -p
trybu do działania.test:
źródło
-p
jest potrzebny tylko ), jeśli zmienisz pojedyncze cudzysłowy dla podwójnych cudzysłowów.s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1
(37 bajtów). A tak przy okazji, twoje pierwsze rozwiązanie można trochę pograć w golfa:s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e
(40 bajtów)Commodore 64 BASIC, 301 bajtów przed uruchomieniem, 321 bajtów używanych po uruchomieniu
Aby wprowadzić to na prawdziwym Commodore 64, musisz użyć skrótów BASIC, takich jak LE [shift] F dla
LEFT$
, M [shift] I dlaMID$
itp ... lub możesz spróbować CBM PRG STUDIO.TI$
Zmienna w Commodore Basic przedstawia czas w formacie 24-godzinnym jako GGMMSS po wydrukowaniu. Usunięcie spacji po numerze linii nie oszczędza pamięci, ponieważ Commodore BASIC i tak dodaje ją automatycznie po wyświetleniu listy programu po jej wprowadzeniu.Podczas konwertowania liczby na ciąg za pomocą
STR$
Commodore BASIC doda spację (więc jeśliPRINT A
zobaczysz spację przed wyświetleniem liczby), usunąłem spację otwierającą konwersję numeru na ciąg za pomocąRIGHT$
polecenia. Możesz zapisać kilka bajtów, zmieniając wiersz zero na:więc przed uruchomieniem programu musisz zadeklarować czas na konwersję:
W dowolnym momencie możesz zobaczyć aktualny czas za pomocą:
źródło
Java, 171 bajtów
Format wejściowy to
HH:MM a/p
i format wyjściowy toHHMM
. Nadużywanie faktu, że główna funkcja ma tablicę ciągów, aby podzielić dane wejściowe na 3 sekcje: godzinę, minutę i wskaźnik A / P.Przykładowe dane wejściowe i wyjściowe:
Wersja bez golfa:
źródło
enum
żeby go trzymaćmain
. Fajnie :)REXX, 33 bajty
Posługiwać się:
Można to skrócić o kilka bajtów, jeśli nie zostanie użyty dwukropek jako separator.
źródło
C (brzęk) , 94 bajty
Wypróbuj online!
Jestem tutaj, aby się uczyć, więc wszelkie wskazówki dotyczące optymalizacji kodu są mile widziane.
@ Johan du Toit Dzięki za zaoszczędzenie kilku bajtów!
źródło
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 bajtówZaoszczędź 15 bajtów dzięki @Johan du Toit
Wywołanie
f()
ze zmiennym ciągiem jako argumentem, wejściem jest wyjście.Format to
HH:MMa/p
, gdziea/p
jest małaa
lub mała literap
. Nie ma spacji między czasem a specyfikatorem południka.Wypróbuj na ideone .
źródło
i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
(p[5]!=97)*12;
zamiast(p[5]^97?12:0);
tcl, 45
47Teraz za pomocą wbudowanego:
Testowany na http://rextester.com/TSRXI8802, gdzie jest skrypt, który uruchamia go od 01:00 do 1259
źródło
SmileBASIC, 67 bajtów
Wkład:
HH:MMa/p
Wydajność:
HH MM
źródło
R, 68 bajtów
Odczytuje dane wejściowe ze standardowego wejścia i zakłada się, że jest w jednym z następujących formatów:
12:00 AM
12:00 am
12:00AM
12:00am
a dane wyjściowe mają format:
[1] "00:00"
W większości przypadków
strptime()
dane wyjściowe mają format:"2017-01-06 12:00:00 CET"
gdzie data jest datą lokalną. W związku z tym musimy użyćsubstr()
tylko do zwrócenia czasu, jednak jeśli wejście jest północą (np.12:00am
) Wyjście jest tylko tym,"2017-01-06 CET"
co jest przyczynąif
rzeczy na końcu (musi być jakieś bardziej sprytne obejście).źródło
lubridate
, ale nazwa pakietu jest zbyt długa (wśród innych problemów).C,
159152 bajtówFormat wejściowy:
07:30am
źródło
Pyke, 15 bajtów
Wypróbuj tutaj!
źródło
Mathematica, 33 bajty
Funkcja anonimowa. Pobiera ciąg jako dane wejściowe i zwraca ciąg jako dane wyjściowe. Działa z większością formatów, w tym
hh:mm AM/PM
.źródło
JavaScript, 67 bajtów
Dane wejściowe są jak w przykładzie
źródło
12:00 am
lub12:00 pm
Haskell, 61 znaków
Krótka wersja:
Format wejściowy:
HHMM(a/p)
gdzie(a/p)
jest albo „a”, albo „p” bez nawiasów.Format wyjściowy:
(hs, MM)
- krotka zawierająca godziny jako liczbę całkowitą i MM wciąż jako ciąg.Przykład:
Dłuższa wersja (z bardziej przydatnymi nazwami i jednym podstawieniem
hs
):źródło
Common Lisp (
151122 bajtów)OK, CL nie ma być „zwięzły”, ale jestem zaskoczony, że nie jest to najbardziej gadatliwy w tym przypadku.
Oto wersja 122-bajtowa, która wymaga wprowadzenia stałej pozycji.
0145pm
lub145p
są do zaakceptowania (z wiodącą spacją na pierwszej pozycji znaku).PPRINT:
Ładniejszy, ale większy
Korzystanie tylko z
Common-Lisp
pakietu. Akceptuje (tylko) dane wejściowe w postaci liczb całkowitych (z lub bez wiodących0
), literałów:
, dwucyfrowych minut i opcjonalnego końcowegoam
lubpm
(tylko małymi literami). Zezwala na odstępy między godzinami i wokół AM / PM, ale nie bezpośrednio po:
.Test:
pprint
definicja funkcji:Usunięto zaciemnienie:
źródło
Siatkówka ,
6160 bajtówDane wejściowe są podawane bez dwukropka oddzielającego, obowiązkowe prowadzenie
0
i używanie tylkoa
lubp
zamiastam
lubpm
np.0134a
Jest 01:34. Dane wyjściowe w prostym czasie wojskowym przy użyciu 0000 jako północy. (Mógłbym zaoszczędzić trochę bajtów, jeśli pozwolę na konwersję, na przykład 12:30 rano2430
, ale wątpię, czy to dopuszczalne).Wypróbuj online!
Wyjaśnienie
Pierwsze dwa przypadki dotyczą godzin „12”, ponieważ rano / wieczorem zmienia się na 12:
Jeśli czas jest między północą (12 rano) a 1 rano, zmień go na 00 zamiast 12 i usuń
a
.Jeśli czas jest między południem (12 po południu) a 13 po południu, usuń p, aby uzyskać 24 godziny.
Na każdą inną godzinę:
Jeśli jest godzina, po prostu usuń,
a
aby uzyskać 24 godziny.Jeśli jest godzina po południu, usuń
p
. Konwertuj składnik godziny na unary, dodaj 12 i przekonwertuj z powrotem na dziesiętne. Pozostaw minuty bez zmian.źródło
Partia, 40 bajtów
Pobiera dane wejściowe jako trzy argumenty. Zakłada się drugi argument zerem, gdzie jest to konieczne, trzeci argument jest albo
a
czyp
. Działa, traktując trzeci argument jako nazwę zmiennej pośredniej, dodając go do liczby godzin; liczba minut pozostaje niezmieniona, więc jest po prostu wyprowadzana bezpośrednio. Jeśli mieszanie różnych formatów jest w porządku, ostatnią spację można usunąć, aby zapisać bajt.(Raczej irytujące, to pytanie nie pojawiło się na stronie pytań, gdy je pierwotnie załadowałem, i natknąłem się na nie, ponieważ szukałem innego pytania.)
źródło