Po uruchomieniu uruchom emoji zegara najbliższe bieżącej godzinie

20

Mogę mieć duży if/elsewarunek na każde 30 minut, ale szukam więcej rozwiązań opartych na matematyce i Unicode.

Oto emoji zegara: 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧. Jeśli brakuje odpowiedniego wsparcia renderowania, możesz zobaczyć je poniżej (nie są w tej samej kolejności i mogą wyglądać inaczej niż to, co widzisz) lub na wykresie Unicode , strona 4. Odpowiadają punktom kodowym U + 1F550 (ZEGAR FACE ONE OCLOCK) do U + 1F567 (CLOCK FACE TWELVE-THIRTY).

Wyzwanie polega na napisaniu programu, który wyśle ​​do STDOUT najbliższy emoji tarczy zegara do bieżącego czasu systemowego (AM i PM należy traktować tak samo). Na przykład, jeśli czas tto [5:15 <t <5:45), wyświetlisz emoji 5:30 🕠.

To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach. Możesz podać sposób łatwego określenia czasu na przetestowanie kodu.

Przypadki testowe Edge

Time   Output  Written
----------------------
11:48  🕛       12:00
3:15   🕞       3:30
9:45   🕙       10:00

wprowadź opis zdjęcia tutaj

Mohsen
źródło
7
To pytanie nie jest obecnie na ten temat, ale prawdopodobnie jest to łatwa poprawka. Potrzebujesz obiektywnego warunku wygranej, ale jeśli oznaczysz pytanie kodem golfowym, zwycięzcą będzie ten, kto napisze najkrótszy program. Jest również nieco niedokładny, ale można powiedzieć „skrypt, który emituje emoji zegara najbliższe aktualnemu czasowi po uruchomieniu” i powinno to wystarczyć. Ponadto, choć nie jest to technicznie wymagane, zalecamy zezwolenie na przesyłanie zgłoszeń w innych językach. (Ktoś prawdopodobnie i tak zrobi w Bash.)
metro
Wiersz polecenia systemu Windows nie obsługuje emotikonów :(
stokastic,
2
Zredagowałem twój post, aby starał się, aby spełniał nasze standardy, wyjaśniając zasady i czyniąc go golfowym. Możesz go edytować, jeśli coś źle zinterpretowałem.
NinjaBearMonkey
3
Jak należy zaokrąglić xx: 15 i xx: 45?
Peter Taylor,
1
@PeterTaylor Jak widać w przypadkach testowych, należy je zaokrąglić w górę (tj. 1:45 => 2:00)
NinjaBearMonkey

Odpowiedzi:

9

Rubinowy - 61 54 bajtów

Python 3 - 79 77 75 74 bajtów

edycja: Okazuje się, że jest to znacznie krótsze w Rubim, ponieważ Timenie trzeba go importować, a domyślny jest podział na liczby całkowite.

a=(Time.now.to_i/900-3)/2%24
puts""<<128336+a/2+a%2*12

Arytmetyka:

  • Time.now.to_i: Sekundy od epoki.
  • /900: Połącz czas w 15-minutowe segmenty.
  • -3: -4ponieważ postacie zaczynają się o godzinie pierwszej, +1więc zaokrąglanie odbywa się do najbliższej pół godziny, a nie w dół.
  • /2: Połącz w półgodzinne segmenty.
  • %24: Uzyskaj bieżący segment półgodzinny z 12 godzin.
  • a/2 + a%2*12: Uwzględnij fakt, że znaki całogodzinne pojawiają się w bloku przed znakami półgodzinnymi.

Wersja czasu lokalnego, 69 bajtów:

n=Time.now
a=((n.to_i+n.gmtoff)/900-3)/2%24
puts""<<128336+a/2+a%2*12

Oryginalna wersja Python 3:

import time
a=int((time.time()/900-3)/2%24)
print(chr(128336+a//2+a%2*12))

Drukuje aktualny czas UTC. Python 2 chrakceptuje tylko 0-255 i unichrtylko 0-65535. W Pythonie 3 /zawsze jest dzieleniem zmiennoprzecinkowym i //zawsze jest dzieleniem całkowitym.

colevk
źródło
Można wyciąć z parens 12*(a%2)jeśli robisz to w drugiej kolejności: a%2*12.
xnor
7

Bash + Coreutils, 60 bajtów

date +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

Emoji są dobrze renderowane na terminalu OSX, ale w przypadku Linuksa (Ubuntu 14.04) musisz to zrobić sudo apt-get install ttf-ancient-fonts

Aby przetestować różne czasy, wstaw -d $timedo polecenia date. np. do testowania 12:59:

date -d 12:59 +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4
Cyfrowa trauma
źródło
5

JavaScript - 137 117 107 102 95

To będzie łatwe do pokonania, ale postaram się tutaj jak najlepiej.

EDYCJA 1 : Teraz drukuje w UTC jak odpowiedź Pythona, aby zaoszczędzić 20 bajtów.

EDIT 2: Zmieniono new Date().getTime()aby Date.now()zapisać 10 bajtów.

EDIT 3: Zmieniono Math.round(x)aby ~~(x+.5)zaoszczędzić 5 bajtów.

EDYCJA 4: Usunąłem niepotrzebne (i &1023)pozostawiłem ze starej wersji programistycznej, w której zrobiłem bardziej uniwersalne kodowanie UTF-16, aby zaoszczędzić 7 bajtów.

d=~~(Date.now()/18e5+.5)%24;d+=d<2?24:0;alert(String.fromCharCode(55357,56655+(d%2?23+d:d)/2));

JavaScript nie pozwalają na emotikony, ale w UTF-16, który koduje je jako dwa znaki. Na szczęście możemy po prostu zdefiniować je jako dwie postacie; pierwszy znak jest również stały ( 0xD83D), podczas gdy inne się zmieniają.

Alternatywnie, wydruki w czasie lokalnym, 137 132 125:

PurkkaKoodari
źródło
Czy to nie (d%2?23+d:d)to samo co d+d%2*23?
Neil
4

CJam, 50 bajtów

"🕐":i~et3=C%60*et4=+30d/mo2m24+24%_2%24*+2/+]:c

Algorytm jest prosty, zaokrąglij czas do najbliższych 30 minut, policz, ile minęło 30 minut od godziny 12 AM / PM, jeśli liczba jest nieparzysta, następnie dodaj do niej 24, podziel podłogę przez 2 i zwiększ początkową Unicode o tyle punkty kodowe, aby uzyskać odpowiednią tarczę zegara.

Upewnij się także, że zaczynasz od 1 AM / PM zamiast 12, więc weź tam przesunięcie.

Do celów testowych użyj następującego kodu:

3:H;45:M;"🕐":i~HC%60*M+30d/mo2m48+48%_2%24*+2/+]:c

Gdzie 3:H;część jest bieżącą godziną, a 45:M;część jest bieżącą minutą godziny. Wystarczy wymienić 3i 45żądaną wartość.

Wypróbuj online tutaj

Nie wszystkie znaki Unicode mogą drukować poprawnie w wersji online, w zależności od przeglądarki i systemu operacyjnego oraz zainstalowanych czcionek. Ale dla mnie wszystko drukuje się dobrze w przeglądarce Firefox z systemem Windows 7.

Optymalizator
źródło
@ user23013 Nice !. Myślę, że powinieneś opublikować to jako nową odpowiedź, ponieważ nie grałem w golfa :)
Optimizer
3

CJam, 31 bajtów

"🕐")et5<60b675+30/24%2mdC*++

Możesz zmienić czas w następującym programie, aby go przetestować:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
jimmy23013
źródło