Znalezienie moich ulubionych czasów

15

Naprawdę lubię czasy, które podążają za pewnymi wzorami. W szczególności lubię czasy, w których wszystkie cyfry są takie same lub gdy wszystkie cyfry zwiększają się arytmetycznie o jeden od lewej do prawej. Co więcej, nienawidzę z pasją, kiedy ludzie wkładają listy w moje czasy, więc wszystkie te bzdury AM / PM są dla mnie martwe. Tak więc moje ulubione czasy to:

0000 0123 1111 1234 2222 2345

Dla spokoju ducha potrzebuję, żebyś napisał mi pojedynczy program, który biorąc pod uwagę aktualny czas jako dane wejściowe, oba: (A) jeśli nie jest to teraz jeden z moich ulubionych czasów, mówi mi oba (i) ile minut to jest był od mojego ostatniego ulubionego czasu, a także (ii) ile minut od teraz nastąpi mój następny ulubiony czas; i (B) jeśli jest to teraz jeden z moich ulubionych czasów, dostarcza pojedynczą „wartość sygnału”.

Wejście

Twój program powinien zaakceptować (dowolną metodą: argument funkcji, argument stdinwiersza poleceń itp.) Bieżący czas, w dowolnym z następujących formatów:

  • Czterocyfrowy czas jako ciąg

  • Liczba całkowita, która może być zerowana po lewej stronie, aby utworzyć czterocyfrowy czas jako ciąg

  • Sekwencja czterech (lub mniej) liczb całkowitych, uporządkowana w taki sposób, że pierwsza liczba całkowita w sekwencji jest lewą (znaczącą) cyfrą na wejściu czasu (np. 0951Może być poprawnie reprezentowana jako [0, 9, 5, 1]lub [9, 5, 1])

    • 0000Dopuszczalna jest reprezentacja jako sekwencja zerowej długości

W przypadku łańcucha wejściowego powinien on zawierać tylko cyfry, bez dwukropków i innych znaków interpunkcyjnych. Można założyć, że dane wejściowe będą zawsze ważne 24-godzinne:, HHMM gdzie 0 <= HH <= 23i 0 <= MM <= 59. Pomiń możliwość skoku sekund.

Wynik

Twój program musi podać (wszystkie funkcje stdoutsą w porządku) (A) lub (B) , odpowiednio do tego, czy wartość wejściowa jest czasem docelowym.

Dla):

Podaj dwie wartości liczbowe w dowolnym rozsądnym formacie, takie jak:

  • Wyjście jednołańcuchowe z odpowiednim ogranicznikiem

  • Sekwencyjne wyjścia liczb całkowitych / ciągów, np. bashDrukowanie dwóch linii do stdout:

    49
    34
    
  • Dwie zwrócone wartości długości, takie jak lista Python, tablica C itp .: [49, 34]

Wartości mogą występować w dowolnej kolejności. Na przykład oba poniższe parametry byłyby poprawnymi danymi wyjściowymi dla danych wejściowych 1200:

49 34
34 49

Jednak kolejność i separator muszą być takie same dla wszystkich wartości wejściowych!

Dla (B):

Wywołaj jakikolwiek inny nieosiągalny wynik. Ten sam wynik należy jednak uzyskać dla wszystkich sześciu czasów docelowych. Nieskończone pętle są wykluczone.

Przykładowe wejścia / wyjścia

YAY!!! jest tu wykorzystywany jako przykład demonstracyjny i nie ma charakteru nakazowego.

Input      Output
------    --------
 0000      YAY!!!
 0020      20 63
 0105      65 18
 0122      82 1
 0123      YAY!!!
 0124      1 587
 0852      449 139
 1111      YAY!!!
 1113      2 81
 1200      49 34
 1234      YAY!!!
 1357      83 505
 1759      325 263
 1800      326 262
 1801      327 261
 2222      YAY!!!
 2244      22 61
 2345      YAY!!!
 2351      6 9

To jest , więc wygrywa najkrótszy kod w bajtach. Standardowe luki są niedozwolone.

hBy2Py
źródło
Czy nic nie można zwrócić za ulubiony czas?
James Holderness
1
@JamesHolderness Fikcyjne-ja zaczyna się denerwować, jeśli nic nie dostanę z aplikacji (a jeśli interpreter się zepsuje?!?!), Więc musi zostać wygenerowana pewna wartość lub wynik.
hBy2Py

Odpowiedzi:

2

Galaretka , 34 33 32 31 28 bajtów

3 bajty dzięki Mr. Xcoder .ịi sztuczkom ³.

d³ḅ60;15j83,588ṁ5¤_\ṠÞAµ.ịxẠ

Wypróbuj online!

Niektóre części są dokładnie takie same jak w odpowiedzi Jonathana Allana , ale zamieszczam je, ponieważ uważam, że jest wystarczająco różne od niego i niezależnie napisane na podstawie mojej odpowiedzi w Pythonie (i krócej: D). Powinien również mieć miejsce na ulepszenia.

Dane wejściowe są liczbami całkowitymi, dane wyjściowe są tablicami poprzednich i następnych czasów lub pustą tablicą na specjalne okazje.

Wyjaśnienie

Za pomocą przykładowego wejścia 1200.

  • przekształca czas podstawy 100, w godzinach i minutach: [12,0].
  • ḅ60Konwersja z bazy 60 minut, aby uzyskać całkowite: 720.
  • ;15pary z IT 15: [720, 15].
  • 83,588tworzy tablicę [83, 588].
  • ṁ5sprawia, że długość 5: [83, 588, 83, 588, 83].
  • ¤łączy dwie powyższe czynności. Po prostu technika.
  • jłączy się parę z tablicy: [720, 83, 588, 83, 588, 83, 15].
  • _\odejmowanie od każdej wartości macierzy pierwszego i pobiera wyniki pośrednie: [720, 637, 49, -34, -622, -705, -720].
  • ṠÞ stabilnie sortuje je przez signum: [-34, -622, -705, -720, 720, 637, 49].
  • Aprzyjmuje wartości absolutnych [34, 622, 705, 720, 720, 637, 49].
  • µrozpoczyna nowy łańcuch monadyczny. Znów techniczność.
  • .ịzajmuje ostatnie i pierwsze elementy: [49, 34].
  • ×Ạpowtarza, że raz, jeśli nie ma zera lub zerowe czasy inaczej: [49, 34].
PurkkaKoodari
źródło
@JamesHolderness Naprawiono brak zmiany rozmiaru (zmieniono ,na, ;ponieważ był pobierany jako literał listy).
PurkkaKoodari
Co zabawne, próbowałem przenieść twoją odpowiedź Pyth do Jelly i mam 28 bajtów . Nie sądzę, że jest wystarczająco inny, aby być osobną odpowiedzią, więc możesz go użyć (i ładny pakiet testowy: P). (zwróć uwagę, że użycie ³zamiast 100jest dozwolone ) YAY!!!Wartość jest [0, 0]zawsze taka sama.
Pan Xcoder,
Fajnie dzięki! Myślę, że główną poprawą jest sztuczka półindeksowania, nigdy o tym nie myślałem.
PurkkaKoodari
Czy planujesz zaktualizować moje sugestie? (Przypominam, mam wrażenie, że zapomniałeś edytować?)
Pan Xcoder
@ Mr.Xcoder Tak, zapomniałem edytować. Użyję xẠjako filtr zerowej odkąd rodzaju wolą []nad [0, 0]ponieważ jest to bardziej wyraźnie różne.
PurkkaKoodari
2

JavaScript (ES6), 87 83 bajtów

Zaoszczędzono 4 bajty dzięki @ l4m2

Pobiera dane wejściowe jako ciąg. Zwraca albo 0tablicę 2-elementową.

t=>[i=0,83,588,83,588,83,15].every(d=>(k=t-(t/25>>2)*40)>(j=i,i+=d))|i-k&&[k-j,i-k]

Przypadki testowe

W jaki sposób?

Nie obchodzi nas wynik .every()pętli. Pod warunkiem, że dane wejściowe są prawidłowe, zawsze będzie to fałsz. Co tak naprawdę zainteresowany jest kiedy mamy wyjść z tej pętli.

Wychodzimy, gdy tylko znajdziemy ulubiony czas i(wyrażony w minutach), który jest większy lub równy czasowi odniesienia k(czas wejściowy tprzeliczony na minuty). Następnie zwracamy 0if i == klub 2 inaczej.

Arnauld
źródło
2
t%100+(t/25>>2)*60=>t-(t/100|0)*40
l4m2
2

Befunge-93, 88 85 86 80 74 bajtów

&:"d"/58**-:"S"-:"b"6*-:"S"v
@._v#!:<\-*53:-"S":-*6"b":-<
:$#<$$\^@.._\#`0

Wypróbuj online!

Zwraca liczbę minut od ostatniego ulubionego czasu, a następnie liczbę minut do następnego ulubionego czasu (oddzielone dwiema sekwencjami znaków: spacją, łącznikiem). Jeśli jest to już ulubiony czas, zwracane jest pojedyncze zero.

James Holderness
źródło
1

C, 121 bajtów

*p,l[]={0,83,671,754,1342,1425,1440};f(t){t=t%100+t/100*60;for(p=l;t>*p;++p);*p-t?printf("%d %d",t-p[-1],*p-t):puts("");}

Wysyła nowy wiersz, jeśli czas jest ulubionym czasem.

Wypróbuj online!

Steadybox
źródło
1

Czysty , 126 bajtów

import StdEnv
f=[1440,1425,1342,754,671,83,0]
?t#t=t rem 100+t/100*60
=(\(a,b)=(t-hd b,last a-t))(span(\a=t<a||isMember t f)f)

Definiuje funkcję ?, przyjmowanie Inti powrót (Int, Int).
Kiedy argument jest ulubionym czasem, powoduje zawieszenie programu wywołującego hd of [].

Wypróbuj online!

Obrzydliwe
źródło
1

Pyth, 48 45 42 bajtów

&*FJ.u-NY+P*3,83 588 15isMcz2 60,eK._DJ_hK

Wypróbuj online. Zestaw testowy.

Kod pobiera ciąg czasu i wyświetla poprzednie i następne czasy jako tablicę lub 0jeśli czas jest wyjątkowy.

Co ciekawe, imperatywne podejście ma również 42 bajty:

V+_isMcz2 60+P*3,83 588 15KZIg0=-ZNIZK)_ZB

Wyjaśnienie

  • cz2dzieli input ( z) na dwuznakowe elementy.
  • sM ocenia je jako liczby całkowite.
  • i60Analizuje wynikową tablicę dwuelementową jako bazę 60.
  • ,83 588reprezentuje tablicę [83, 588].
  • *3trzykrotnie to [83, 588, 83, 588, 83, 588].
  • Pusuwa ostatni 588.
  • +15Dodaje 15do końca.
  • .u-NYzaczyna się od przeanalizowanej liczby, odejmuje od niej każdą liczbę w tablicy i zwraca wartości pośrednie. Są to różnice z każdego specjalnego czasu.
  • Jprzypisuje te różnice do J.
  • *Foblicza iloczyn różnic. Będzie to 0, jeśli czas był wyjątkowy.
  • & zatrzymuje tutaj ocenę i zwraca 0, jeśli czas był wyjątkowy.
  • ._DJ stable-sortuje różnice według znaku.
  • Kzapisuje tę tablicę K.
  • e pobiera ostatni element w tablicy.
  • _hK bierze pierwszy element z tablicy i neguje go.
  • , zwraca dwa jako tablicę.
PurkkaKoodari
źródło
I to jest świetny, podstępny sposób wchłaniania znaku ujemnego.
hBy2Py
Zapisz bajt, przełączając z cz2 60na c2z60(są one równoważne z listami 4-elementowymi)
Pan Xcoder
1

Galaretka ,  33 32  34 bajtów

 +3  +2 bajty do naprawy, aby wszystkie lubiane dane wyjściowe czasu były równe.

musi być krótsza droga!

s2Ḍḅ60
83,588ṁ5“¡Ð‘j+\ṡ2>E¥ÞÇḢạÇa\

Monadyczny link, który pobiera listę czterech cyfr i zwraca listę zawierającą dwie liczby całkowite
- jeśli jest to lubiany czas, wynik obu wpisów będzie zerowy.

Wypróbuj online! lub zobacz zestaw testowy .

W jaki sposób?

s2Ḍḅ60 - helper link, getMinuteOfDay: list of digits, D   e.g. [1,2,3,3]
 2     - literal two                                           2
s      - split into chunks of length                           [[1,2],[3,3]]
  Ḍ    - un-decimal (convert from base 10) (vectorises)        [12,33]
    60 - literal sixty                                         60
   ḅ   - un-base (convert from base)                           753

83,588ṁ5“¡Ð‘j+\ṡ2>E¥ÞÇḢạÇa\ - Link: list of digits        e.g. [1,2,3,3]
83,588                      - literal list of integers         [83,588]
       5                    - literal five                     5
      ṁ                     - mould like (implicit range of) [83,588,83,588,83]
        “¡Ð‘                - code-page index list             [0,15]
            j               - join                           [0,83,588,83,588,83,15]
              \             - cumulative reduce with:
             +              -   addition                     [0,83,671,754,1342,1425,1440]
                2           - literal two                      2
               ṡ            - overlapping slices of length     [[0,83],[83,671],[671,754],[754,1342],[1342,1425],[1425,1440]]
                     Ç      - last link (1) as a monad f(D)    753
                    Þ       - sort by:
                   ¥        -   last two links as a dyad:
                 >          -     greater than? (vectorises)    [0, 0] [ 0,  0] [  0,  1] [  1,   1] [   1,   1] [   1,   1]
                  E         -     equal?                          1       1         0         1           1           1
                            -                             -->  [[671,754],[0,83],[83,671],[754,1342],[1342,1425],[1425,1440]]
                      Ḣ     - head                             [671,754]
                        Ç   - last link (1) as a monad f(D)    753
                       ạ    - absolute difference (vectorises) [ 82,  1]
                          \ - cumulative reduce with:
                         a  -   AND                            [ 82,  1]
                            -   -- such that if "liked" then the [0,x] result becomes [0,0] so they are all equal
Jonathan Allan
źródło
Nie sądzę, aby format wejściowy (tablica cyfr) był dozwolony w pytaniu, podobnie jak zmienianie wyników na specjalne czasy.
PurkkaKoodari
Naprawiono, ale nie wiem, czy to prawdziwy zamiar wymagał takich transformacji ...
Jonathan Allan
To prawda, ale myślę, że odpowiedzi powinny nadal odpowiadać obecnym pisemnym regułom wyzwania, nawet jeśli pierwotna intencja PO była inna.
PurkkaKoodari
@ Pietu1998 Pierwotnie nigdy nie uważałem nawet listy cyfr za przydatną formę wprowadzania. Podczas dyskusji w głównych komentarzach formalnie poprawiłem wyzwanie, aby umożliwić wprowadzanie sekwencji cyfr.
hBy2Py
1

Łuska , 36 bajtów

?↑2↑0Πṙ_1†aÖ±↔Ġ-::15t*3e588 83B60†d½

Wypróbuj online!

Dzięki Zgarbowi za wyjaśnienie mi, jak trójskładniki działają na czacie. Próbowałem grać w golfa ↑0, ale z jakiegoś powodu nie udało mi się go uruchomić (?). To moja pierwsza nietrywialna odpowiedź na Łuskę i pomijając wyżej wspomniane, jestem z niej całkiem zadowolony. Wartość użyta zamiast YAY!!!to [](ale mam nadzieję, że zmieni się do celów golfowych).

Wyjaśnienie

? ↑ 2 ↑ 0Πṙ_1 † aÖ ± ↔Ġ - :: 15t * 3e588 83B60 † d½ | Wprowadź jako listę cyfr z CLA, wyślij do STDOUT.

                                   ½ | Podziel listę na dwie połowy.
                                 † d | Zamień każdą połówkę w liczbę całkowitą 10.
                              B60 | Konwertuj z bazy 60.
                : | Dodaj powyższe do ↓ ([15, 83, 588, 83, 588, 83]).
                       e588 83 | Utwórz listę dwóch elementów [588, 83].
                     * 3 | Powtórz trzy razy.
                    t | Usuń pierwszy element.
                 : 15 | Przygotuj 15.
              Ġ- | Zastosuj odejmowanie skumulowane od prawej strony.
             ↔ | Rewers.
           Ö ± | Sortowanie stabilne według znaku (-1, 0 lub 1).
         † a | Wartość bezwzględna mapy.
      ṙ_1 | Obróć jeden w prawo.
? Π | Jeśli produkt jest prawdziwy, to:
 ↑ 2 | Weź dwa pierwsze elementy.
   ↑ 0 | W przeciwnym razie zwróć pustą listę.
Pan Xcoder
źródło
1

Kotlin , 293 bajty

{fun i(l:List<Int>)=l.all{it==l[0]}|| l.mapIndexed{a,b->b-a}.all{it==l[0]}
val a=(0..1439+0).map{val h=it/60
val m=it%60
listOf(h/10,h%10,m/10,m%10)}+listOf(listOf(0,0,0,0))
val s=a.indexOf(it)
if(i(it))0 to 0 else
s-a.subList(0,s).indexOfLast{i(it)}to a.subList(s,a.size).indexOfFirst{i(it)}}

Upiększony

{
    fun i(l:List<Int>)=l.all { it ==l[0] } || l.mapIndexed { a, b -> b - a }.all { it ==l[0] }
    val a = (0..1439 + 0).map {
        val h = it/60
        val m = it%60
        listOf(h/10,h%10,m/10,m%10)
    } + listOf(listOf(0,0,0,0))
    val s = a.indexOf(it)
    if (i(it)) 0 to 0 else
        s - a.subList(0, s).indexOfLast {i(it)} to a.subList(s, a.size).indexOfFirst {i(it)}
}

Test

var t:(i:List<Int>)-> Pair<Int, Int> =
{fun i(l:List<Int>)=l.all{it==l[0]}|| l.mapIndexed{a,b->b-a}.all{it==l[0]}
val a=(0..1439+0).map{val h=it/60
val m=it%60
listOf(h/10,h%10,m/10,m%10)}+listOf(listOf(0,0,0,0))
val s=a.indexOf(it)
if(i(it))0 to 0 else
s-a.subList(0,s).indexOfLast{i(it)}to a.subList(s,a.size).indexOfFirst{i(it)}}

data class Test(val input: List<Int>, val output: Pair<Int, Int>)

val TEST = listOf(
    Test(listOf(0,0,0,0), 0 to 0),
    Test(listOf(0,0,2,0), 20 to 63),
    Test(listOf(0,1,0,5), 65 to 18),
    Test(listOf(0,1,2,2), 82 to 1),
    Test(listOf(0,1,2,3), 0 to 0),
    Test(listOf(0,1,2,4), 1 to 587),
    Test(listOf(0,8,5,2), 449 to 139),
    Test(listOf(1,1,1,1), 0 to 0),
    Test(listOf(1,1,1,3), 2 to 81),
    Test(listOf(1,2,0,0), 49 to 34),
    Test(listOf(1,2,3,4), 0 to 0),
    Test(listOf(1,3,5,7), 83 to 505),
    Test(listOf(1,7,5,9), 325 to 263),
    Test(listOf(1,8,0,0), 326 to 262),
    Test(listOf(1,8,0,1), 327 to 261),
    Test(listOf(2,2,2,2), 0 to 0),
    Test(listOf(2,2,4,4), 22 to 61),
    Test(listOf(2,3,4,5), 0 to 0),
    Test(listOf(2,3,5,1), 6 to 9)
)

fun main(args: Array<String>) {
    for (t in TEST) {
        val v = t(t.input)
        if (v != t.output) {
            throw AssertionError("$t $v")
        }
    }
}

TIO

TryItOnline

jrtapsell
źródło