W swoim xkcd na temat standardowego formatu daty ISO 8601 Randall napisał dość dziwną alternatywną notację:
Duże liczby to wszystkie cyfry, które pojawiają się w bieżącej dacie w ich zwykłej kolejności, a małe liczby są 1-wskaźnikowymi wskaźnikami występowania tej cyfry. Powyższy przykład reprezentuje 2013-02-27
.
Zdefiniujmy reprezentację ASCII dla takiej daty. Pierwszy wiersz zawiera indeksy od 1 do 4. Drugi wiersz zawiera „duże” cyfry. Trzeci wiersz zawiera indeksy od 5 do 8. Jeśli w jednym gnieździe znajduje się wiele indeksów, są one wymienione obok siebie, od najmniejszej do największej. Jeśli m
w jednym polu jest co najwyżej indeks (tj. Na tej samej cyfrze i w tym samym wierszu), każda kolumna powinna mieć m+1
szerokość znaków i wyrównanie do lewej:
2 3 1 4
0 1 2 3 7
5 67 8
Zobacz także wyzwanie towarzyszące dla odwrotnej konwersji.
Wyzwanie
Podając datę w notacji xkcd, wypisz odpowiednią datę ISO 8601 ( YYYY-MM-DD
).
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Można zakładać, że wejście jest jakaś ważna data w latach 0000
i 9999
włącznie.
Na wejściu nie będzie żadnych spacji wiodących, ale możesz założyć, że linie są wypełnione spacjami do prostokąta, który zawiera co najmniej jedną końcową kolumnę spacji.
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
2 3 1 4
0 1 2 3 7
5 67 8
2013-02-27
2 3 1 4
0 1 2 4 5
5 67 8
2015-12-24
1234
1 2
5678
2222-11-11
1 3 24
0 1 2 7 8
57 6 8
1878-02-08
2 4 1 3
0 1 2 6
5 678
2061-02-22
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
3564-10-28
1234
1
5678
1111-11-11
1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30
1
Jest powyżej2
, więc pierwsza cyfra to2
.2
jest powyżej0
, więc drugą cyfrą jest0
.3
jest powyżej1
,4
jest powyżej3
, więc otrzymujemy2013
jako pierwsze cztery cyfry. Teraz5
jest poniżej0
, więc piąta cyfra jest0
,6
i7
obie są poniżej2
, więc obie te cyfry są2
. I w końcu8
jest poniżej7
, więc ostatnia cyfra jest8
, a my kończymy na2013-02-27
. (Łączniki są ukryte w notacji xkcd, ponieważ wiemy, w jakich pozycjach się pojawiają.)Odpowiedzi:
CJam, 35 bajtów
Wypróbuj tutaj . Oczekuje, że linie wejściowe zostaną wypełnione spacjami.
Wyjaśnienie
ll
odczytuje dwa wiersze danych wejściowych i{1$e>}*
wykonuje „skanowanie” na drugim: pobiera wszystkie prefiksy danych wejściowych i oblicza maksimum każdego prefiksu. W przypadku linii wejściowej"0 1 2 7 8"
popycha to"0001112227778"
. Nasz stos wygląda teraz tak:Musimy sami ponownie uchwycić wartości na liście
]
; przechwytuje to także naszą pierwszą linię, więc wyskakujemy za pomocą(
, aby uzyskaćzgodnie z oczekiwaniami.
eelee+
wylicza ten wiersz, a następnie robi to samo dla trzeciego wiersza wejściowego i konkatenuje wyniki, pozostawiając coś takiego na górze stosu:Teraz nasz stos jest
["0001112227778" X]
, gdzieX
jest powyżej lista wyliczeniowy.Przerzucamy każdą parę w
X
(Wf%
), sortujemy pary leksykograficznie ($
) i zostawiamy ostatnie 8 par-8>
. To daje nam coś takiego:Działa to, ponieważ sortowanie umieszcza wszystkie pary z kluczem
'
(spacją) przed wszystkimi cyframi w porządku rosnącym.Są to „ x- pozycje” znaków
12345678
w pierwszym i trzecim wierszu: wystarczy pobrać znaki z naszej (zmodyfikowanej) drugiej linii, które są do nich wyrównane pionowo.Aby to zrobić, bierzemy każdą pozycję (
Wf=
), indeks do ciągu, który wykonaliśmy wcześniej (\f=
). Mamy"20610222"
teraz na stosie: aby dodać kreski, najpierw dzielimy na segmenty o długości dwa (2/
), drukujemy pierwszy segment bez nowej linii ((o
) i łączymy pozostałe segmenty z myślnikami ('-*
).EDYCJA : fajna sztuczka skanowania, Martin! Zapisano cztery bajty.
EDIT 2 : zapamiętanych jeszcze dwa bajty, zastępując
eelee+
zl+ee
; to działa, ponieważ linie wszyscy mają takie same długości i indeksacji w CJam lista jest automatycznie modulo długość listy, więc indeksyn+0
,n+1
,n+2
... ładnie odwzorowane na0
,1
,2
...EDYCJA 3 : Martin zapisał kolejny bajt na ostatnim etapie procesu. Miły!
źródło
Pyth,
4843Pakiet testowy
Wymaga wypełnienia spacjami prostokąta.
Nie sądzę, że jest to najlepsze podejście, ale zasadniczo zapisuje środkową wartość do indeksu w ciągu wskazanym przez górną lub dolną wartość. Wydaje mi się, że miałem wystarczająco dużo czasu na grę w golfa w większości oczywistych rzeczy, które widziałem. : P
źródło
JavaScript (ES7), 115
Funkcja anonimowa. Używając ciągów szablonów, istnieje nowa linia, która jest znacząca i jest uwzględniona w liczbie bajtów.
Warunek: środkowy wiersz wejściowy nie może być krótszy niż pierwszy lub ostatni. To wymaganie jest spełnione, gdy dane wejściowe są wypełnione spacjami, aby utworzyć prostokąt.
ES6 wersja 117 z .map zamiast interpretacji tablic
Mniej golfa
Testowy fragment kodu
źródło
Haskell,
125106103 bajtyWymaga wypełnienia spacjami do pełnego prostokąta.
Przykład użycia:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Jak to działa:
źródło
JavaScript ES6, 231
Przypadki testowe .
źródło
Perl, 154 bajtów
Niegolfowane i wyjaśnione
źródło
JavaScript (ES6), 131 bajtów
Wyjaśnienie
Wymaga wypełnienia danych wejściowych spacjami w celu utworzenia prostokąta.
Test
Pokaż fragment kodu
źródło
PowerShell, 119 bajtów
Skrypt testowy bez golfa:
Wynik:
źródło
Galaretka , 38 bajtów
Wypróbuj online!
Pomocnik jest tylko po to, aby ułatwić wprowadzanie; to właściwie pełny program. Pamiętaj, aby dbać o :
'''
), a także wiersze obok nich (puste, tam dla przejrzystości).źródło