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.


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.

  • d³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].

@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.


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.


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!


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!


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.
  • i… 60Analizuje 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ę.

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

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ę.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.