W doskonałej i fascynującej książce Vernor Vinge A Deepness in the Sky (którą, nawiasem mówiąc, gorąco polecam 1 ), Qeng Ho , kultura obejmująca różne układy gwiezdne, nie ma pojęcia „dni”, „miesiące”, „ lata ”itd., a zatem ma unikalny system pomiaru czasu, który mierzy czas całkowicie w sekundach. Najbardziej powszechnie stosuje się jednostki są Ksec (kilosecond) Msec (megasecond) i Gsec (gigasecond). Oto przydatny wykres z mojej własnej kopii książki (ponieważ nie mogę go znaleźć w Internecie):
Lecisz obecnie na Pham Nuwen i właśnie otrzymałeś wiadomość z dziwnej, nieznanej planety o nazwie „ Ziemia ”. 2 Używają innych jednostek czasu niż ty, a twoje komputery ich nie rozpoznają. Jako rezydent-programista-archeolog statku, twoim zadaniem jest załatanie kodu czasu, tak aby rozpoznawał ziemskie jednostki czasu.
Oczywiście, ponieważ nie możesz zasnąć tylko przez kilka kolejnych Kseków, chcesz, aby Twój kod był jak najkrótszy, aby można go było szybko napisać. Na szczęście, jako międzygwiezdna kultura handlowa, Qeng Ho ma dostęp do każdego wynalezionego języka programowania.
Wejście
Dane wejściowe będą pojedynczym ciągiem zawierającym jeden lub więcej komponentów oddzielonych spacją
. Składnik jest zdefiniowany jako liczba całkowita> 0 i ≤ 255, a następnie miejsca, i następnie jeden z second
, minute
, hour
, day
, week
, month
,
year
, decade
, i century
, ewentualnie mnogiej (z dodatkowym s
, a
centuries
w ostatnim przypadku).
Oto kilka przykładowych danych wejściowych:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Możesz przyjąć następujące dane wejściowe:
Pluralizacja jednostek zawsze będzie zgodna z odpowiednią liczbą.
Jeśli na wejściu znajduje się wiele komponentów , zawsze będą one w malejącej kolejności długości.
Oto, co oznaczają różne jednostki wejściowe na potrzeby tego wyzwania:
unit relative absolute
---------------------------------------
second 1 second 1 second
minute 60 seconds 60 seconds
hour 60 minutes 3600 seconds
day 24 hours 86400 seconds
week 7 days 604800 seconds
month 30 days 2592000 seconds
year 365 days 31536000 seconds
decade 10 years 315360000 seconds
century 10 decades 3153600000 seconds
Wydajność
Oto jednostki Qeng Ho, które Twój kod musi obsługiwać:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Użyj następującego algorytmu, aby określić wyjście kodu:
Najpierw zsumuj całkowity czas reprezentowany przez dane wejściowe.
Znajdź największą jednostkę Qeng Ho, która jest krótsza lub ma tyle samo czasu co dane wejściowe - w zasadzie znajdź największą jednostkę, z której jest co najmniej jedna.
Przelicz całkowity czas podany na wejściu na tę jednostkę i wyślij wynik zaokrąglony do trzech miejsc po przecinku.
Możesz wybrać jedną z następujących metod: zaokrąglanie w górę, zaokrąglanie w dół, zaokrąglanie od zera lub zaokrąglanie w kierunku ∞ lub -∞. Jeśli zaokrąglony wynik kończy się na 0
, możesz albo usunąć końcowe zera, albo zachować tyle, ile chcesz (lub zrobić jedno i drugie, zależnie od danych wejściowych).
Jeśli wynik jest dokładnie zaokrąglone 1.000
, należy użyć formy liczby pojedynczej ( second
, Ksec
, Msec
, Gsec
); w przeciwnym razie, należy liczbę mnogą ( seconds
,
Ksecs
, Msecs
, Gsecs
).
W niektórych przypadkach może być używana jednostka, na przykład Ksec, ale uzyskany zaokrąglony wynik to 1000 000 Kseków. W takim przypadku możesz po prostu wydrukować
1000.000 Ksecs
zamiast 1 Msec
.
Zawsze możesz założyć, że dane wejściowe są w malejącej kolejności jednostek (wiek, dekada, rok itp.); ponadto element występujący po dowolnej jednostce będzie zawsze krótszy (to znaczy, że 1 decade 20 years
będzie nieprawidłowy).
Przypadki testowe
Uwaga: wyniki oznaczone gwiazdką ( *
) mogą różnić się nieznacznie ze względu na różnice w zaokrąglaniu.
input output
-------------------------------------------------------------
1 hour 3.600 Ksecs
1 day 86.400 Ksecs
2 weeks 1.210 Msecs
1 year 31.536 Msecs
32 years 1.009 Gsecs *
1 second 1.000 second
1 century 6 decades 5.046 Gsecs *
255 centuries 804.168 Gsecs
2 weeks 6 days 1 hour 19 minutes 4 seconds 1.733 Msecs
1 week 3 days 3 hours 7 minutes 875.220 Ksecs
1 week 4 days 13 hours 46 minutes 40 seconds 1.000 Msec
2 months 2 hours 5.191 Msecs *
16 minutes 39 seconds 999.000 seconds
Zasady
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
1: oczywiście tylko jeśli lubisz twarde scifi. W takim przypadku polecam najpierw przeczytać A Fire Upon the Deep , który jest (moim zdaniem) jeszcze bardziej fantastyczny.
2: technicznie rzecz biorąc, „Stara Ziemia” jest kilkakrotnie wspominana w A Deepness in the Sky , ale ...
2 months 2 hours
jako „2 miesiące * 2 godziny”.Odpowiedzi:
APL (Dyalog APL) ,
157156154151154141142 142 bajtówDzięki ngn za golenie 13 bajtów.
Musi mieć
⎕IO←0
, co jest domyślne w wielu aplikacjach APL.Wypróbuj online!
źródło
⌊1E3⍟
→,⌊(z←1E3)⍟
a następnie zapisze 2 na każdym następnym1E3
→z
.JavaScript (ES6) 255
źródło
Python,
366363 bajtówźródło
q=eval(i,d);f={};l=1
linii, które psują kod. Poza tym możesz zapisać 2 bajty za pomocą10.
i73.
zamiast10.0
i73.0
. Ponadto nie ma już potrzeby zajmowania miejscaprint
.SpecBAS -
476471 bajtówPonieważ nic nie mówi „kulić się przed naszą przewagą technologiczną” lepiej niż numery linii i oświadczenia GOTO :-)
źródło
C # (w LinqPad jako funkcja), 460 bajtów
bez golfa:
źródło
Mathematica
296281 bajtówh
: Po rozbiciu ciągu wejściowego na listę wielkości wielkości i jednostekCapitalize
orazPluralize
przekonwertowanie jednostek wejściowych na MathematicaQuantity
, na podstawie których obliczana jest całkowita liczba sekund.d
konwertuje sekundy na odpowiednie jednostki. Finałs
jest usuwany, jeśli czas odpowiada 1 jednostce (dowolnego rodzaju).Po drobnych zmianach w kodzie podejście to powinno działać w celu konwersji danych w języku naturalnym na dowolny system pomiarowy, konwencjonalny lub nie.
Umieść w formie tabeli:
źródło
Haskell,
565555 bajtówJestem dość pewny, że tracę tu tak wiele okazji do gry w golfa ... Chyba cena początkującego golfa.
Moja odpowiedź to funkcja przyjmująca ciąg znaków zawierający czas ziemski jako parametr wejściowy i zwracająca czas Qeng Ho.
PS: Głupio zapomniałem o 3 cyfrowej precyzji… która zwiększa liczbę bajtów.
PPS: Lepiej wybrane wyrażenia najwyższego poziomu straciły 10 bajtów… i powinno być teraz dokładne uruchamianie.
źródło
Matlab 315 bajtów
Test:
Wynik:
źródło