Meine Lieblingszeiten finden

15

Ich mag wirklich Zeiten, die bestimmten Mustern folgen. Insbesondere mag ich Zeiten, in denen alle Ziffern gleich sind oder sich alle Ziffern rechnerisch von links nach rechts um eins erhöhen. Außerdem hasse ich es, wenn Leute Briefe in meine Zeit stecken, so dass all dieser Unsinn von AM / PM für mich tot ist. So sind meine Lieblingszeiten:

0000 0123 1111 1234 2222 2345

Zu meiner Beruhigung müssen Sie mir ein einzelnes Programm schreiben, das unter Berücksichtigung der aktuellen Zeit als Eingabe beide: (A) Wenn es jetzt nicht eine meiner Lieblingszeiten ist, sagt es mir beide (i) wie viele Minuten es sind seit meiner letzten Lieblingszeit und (ii) in wie vielen Minuten wird meine nächste Lieblingszeit eintreten; und (B) , wenn es ist jetzt eine meiner Lieblings - Zeiten liefert einen einzigen ‚Signalwert‘.

Eingang

Ihr Programm sollte (mit welcher Methode auch immer: Funktionsargument stdin, Befehlszeilenargument usw.) die aktuelle Uhrzeit in einem der folgenden Formate akzeptieren :

  • Eine vierstellige Zeit als Zeichenfolge

  • Eine Ganzzahl, die links mit Nullen aufgefüllt werden kann, um eine vierstellige Zeit als Zeichenfolge zu erhalten

  • Eine Folge von vier (oder weniger) Ganzzahlen, die so angeordnet sind, dass die erste Ganzzahl in der Folge die am weitesten links stehende (signifikante) Ziffer in der Zeiteingabe ist (z. B. 0951als [0, 9, 5, 1]oder gültig dargestellt werden könnte [9, 5, 1]).

    • Die Darstellung 0000als Sequenz mit der Länge Null ist akzeptabel

Im Fall einer Zeichenfolge-Eingabe sollte sie nur Ziffern enthalten, keine Doppelpunkte oder andere Satzzeichen. Es kann davon ausgegangen werden, dass Eingaben immer rund um die Uhr gültig sind:, HHMM where 0 <= HH <= 23und 0 <= MM <= 59. Ignorieren Sie die Möglichkeit einer Schaltsekunde.

Ausgabe

Ihr Programm muss stdoutentweder (A) oder (B) liefern (Funktionsrückgaben usw. sind in Ordnung) , je nachdem, ob der Eingabewert eine Zielzeit ist oder nicht.

Für ein):

Geben Sie zwei numerische Werte in einem sinnvollen Format an, z. B .:

  • Single-String-Ausgabe mit passendem Begrenzer

  • Sequentielle Ganzzahl- / Zeichenfolgenausgaben, z. B. bashDrucken von zwei Zeilen nach stdout:

    49
    34
    
  • Sortierte Rückgabewerte der Länge zwei, z. B. eine Python-Liste, ein C-Array usw .: [49, 34]

Die Werte können in beliebiger Reihenfolge angegeben werden. Beispielsweise wären beide der folgenden Ausgaben gültige Ausgaben für eine Eingabe von 1200:

49 34
34 49

Die Reihenfolge und das Trennzeichen müssen jedoch für alle Eingabewerte gleich sein!

Für (B):

Produzieren Sie ein sonst unerreichbares Ergebnis. Es muss jedoch für alle sechs Zielzeiten das gleiche Ergebnis erzielt werden. Endlosschleifen sind ausgeschlossen.

Beispieleingänge / -ausgänge

YAY!!! wird hier als anschauliches Beispiel verwendet und ist nicht vorschreibend.

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

Das ist , also gewinnt der kürzeste Code in Bytes. Standardlücken sind nicht zulässig.

hBy2Py
quelle
Ist es in Ordnung, für eine Lieblingszeit nichts zurückzugeben?
James Holderness
1
@JamesHolderness Fictional-me wird ärgerlich, wenn ich von einer Anwendung überhaupt nichts zurückbekomme (was ist, wenn der Interpreter fehlerhaft ist?!?!), Also muss ein Wert oder eine Ausgabe generiert werden.
hBy2Py

Antworten:

2

Jelly , 34 33 32 31 28 Bytes

3 Bytes dank Mr. Xcoders .ịund ³Tricks.

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

Probieren Sie es online!

Einige Teile sind genau wie in Jonathan Allans Antwort , aber ich poste sie, da ich denke, dass sie sich ausreichend von der Antwort unterscheidet und unabhängig von meiner Pyth-Antwort geschrieben wurde (und kürzer: D). Sollte auch Raum für Verbesserungen haben.

Die Eingabe ist eine Ganzzahl, die Ausgabe ist ein Array der vorherigen und nächsten Zeiten oder das leere Array für bestimmte Zeiten.

Erläuterung

Beispieleingabe verwenden 1200.

  • wandelt die Zeit , um die Basis 100, in Stunden und Minuten: [12,0].
  • ḅ60Konvertiten von der Basis 60 gesamt Minuten zu erhalten: 720.
  • ;15Paare mit 15: [720, 15].
  • 83,588Erstellt das Array [83, 588].
  • ṁ5macht es Länge 5: [83, 588, 83, 588, 83].
  • ¤kombiniert die beiden oben genannten Aktionen. Nur eine technische Sache.
  • jschließt sich das Paar mit dem Array: [720, 83, 588, 83, 588, 83, 15].
  • _\subtrahiert jeden Array Wert aus dem ersten und bekommt Zwischenergebnisse: [720, 637, 49, -34, -622, -705, -720].
  • ṠÞ stabil sortiert diese nach signum: [-34, -622, -705, -720, 720, 637, 49].
  • Animmt die absoluten Werte: [34, 622, 705, 720, 720, 637, 49].
  • µstartet eine neue monadische Kette. Auch hier eine technische.
  • .ịnimmt die letzten und ersten Produkte [49, 34].
  • ×Ạwiederholt , dass einmal , wenn es keine Nullen oder Null mal anders: [49, 34].
PurkkaKoodari
quelle
@JamesHolderness Behoben für keine Größenänderung (geändert ,in, ;seitdem es als Listenliteral aufgenommen wurde).
PurkkaKoodari
Lustigerweise habe ich versucht, Ihre Pyth-Antwort auf Jelly zu portieren, und ich habe 28 Bytes erhalten . Ich denke nicht, dass es anders ist, als eine separate Antwort, also zögern Sie nicht, es zu verwenden (und die süße Testsuite: P). (beachten Sie, dass die Verwendung ³anstelle von 100ist erlaubt ) Der YAY!!!Wert ist [0, 0]immer gleich.
Mr. Xcoder
Nett, danke! Ich denke, die Hauptverbesserung ist der Trick der Halbindizierung, über den ich nie nachgedacht habe.
PurkkaKoodari
Planen Sie ein Update mit meinen Vorschlägen? (Nur zur Erinnerung, ich habe das Gefühl, dass Sie vergessen haben, zu bearbeiten?)
Mr. Xcoder
@ Mr.Xcoder Ja, habe vergessen zu bearbeiten. Ich werde verwenden xẠals Null - Filter , da ich von Art bevorzugen []über , [0, 0]weil es deutlich anders.
PurkkaKoodari
2

JavaScript (ES6), 87 83 Bytes

4 Bytes gespart dank @ l4m2

Übernimmt die Eingabe als Zeichenfolge. Gibt entweder 0ein Array mit zwei Elementen zurück.

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]

Testfälle

Wie?

Das Ergebnis der .every()Schleife interessiert uns nicht . Sofern die Eingabe gültig ist, ist sie immer falsch. Was uns wirklich interessiert, ist, wann wir diese Schleife verlassen.

Wir verlassen das Menü, sobald wir eine Lieblingszeit i(in Minuten) gefunden haben, die größer oder gleich der Referenzzeit ist k(die tin Minuten umgerechnete Eingabezeit ). Wir kommen dann zurück, 0wenn i == koder die 2 Verspätungen anders sind.

Arnauld
quelle
2
t%100+(t/25>>2)*60=>t-(t/100|0)*40
14m2
2

Befunge-93, 88 85 86 80 74 Bytes

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

Probieren Sie es online!

Gibt die Anzahl der Minuten seit der letzten bevorzugten Zeit aus, gefolgt von der Anzahl der Minuten bis zur nächsten bevorzugten Zeit (getrennt durch die zweistellige Folge: Leerzeichen, Bindestrich). Wenn es bereits eine Lieblingszeit ist, wird eine einzelne Null zurückgegeben.

James Holderness
quelle
1

C 121 Bytes

*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("");}

Gibt eine neue Zeile aus, wenn die Zeit eine Lieblingszeit ist.

Probieren Sie es online!

Steadybox
quelle
1

Sauber , 126 Bytes

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)

Definiert die Funktion ?, Entgegennehmen Intund Zurückgeben (Int, Int).
Wenn das Argument eine Lieblingszeit ist, stürzt das aufrufende Programm mit ab hd of [].

Probieren Sie es online!

Οurous
quelle
1

Pyth, 48 45 42 Bytes

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

Probieren Sie es online aus. Testsuite.

Der Code nimmt einen Zeitstring auf und gibt das vorherige und das nächste Mal als Array aus, oder 0wenn die Zeit speziell ist.

Interessanterweise ist ein imperativer Ansatz auch 42 Bytes:

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

Erläuterung

  • cz2teilt input ( z) in zwei Zeichen auf.
  • sM wertet sie als ganze Zahlen aus.
  • i60Analysiert das resultierende Array mit zwei Elementen als Basis 60.
  • ,83 588repräsentiert das Array [83, 588].
  • *3verdreifacht das zu [83, 588, 83, 588, 83, 588].
  • PEntfernt den letzten 588.
  • +15Ergänzt 15das Ende.
  • .u-NYBeginnt mit der analysierten Zahl, subtrahiert jede Zahl im Array und gibt die Zwischenwerte zurück. Dies sind die Unterschiede zu jeder besonderen Zeit.
  • Jweist diese Unterschiede zu J.
  • *Fberechnet das Produkt der Differenzen. Dies wird 0 sein, wenn die Zeit speziell war.
  • & stoppt die Auswertung hier und gibt 0 zurück, wenn die Zeit speziell war.
  • ._DJ Stable-Sortiert die Unterschiede nach Vorzeichen.
  • Kspeichert das Array in K.
  • e Nimmt das letzte Element im Array.
  • _hK Nimmt das erste Element im Array und negiert es.
  • , gibt die beiden als Array zurück.
PurkkaKoodari
quelle
Und das ist eine feine, hinterhältige Art, das negative Vorzeichen zu absorbieren.
hBy2Py
Speichern Sie ein Byte, indem Sie von cz2 60auf umschalten c2z60(dies entspricht Listen mit 4 Elementen)
Mr. Xcoder
1

Jelly ,  33 32  34 Bytes

 +3  +2 Bytes zum Korrigieren, damit alle gewünschten Zeitausgaben gleich sind.

muss ein kürzerer Weg sein!

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

Ein monadischer Link, der eine Liste mit vier Ziffern erstellt und eine Liste mit zwei ganzen Zahlen zurückgibt
- wenn es eine beliebte Zeit ist, sind beide Einträge Nullen.

Probieren Sie es online! oder sehen Sie sich die Testsuite an .

Wie?

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
quelle
Ich denke nicht, dass das Eingabeformat (Ziffernfeld) in der Frage erlaubt ist, noch ist die Ausgabe für spezielle Zeiten zu ändern.
PurkkaKoodari
Behoben, aber ich weiß nicht, ob es die wahre Absicht war, solche Transformationen notwendig zu machen ...
Jonathan Allan
Stimmt, aber ich denke, die Antworten sollten immer noch den aktuellen schriftlichen Regeln der Herausforderung entsprechen, auch wenn die ursprüngliche Absicht des OP anders war.
PurkkaKoodari
@ Pietu1998 Ursprünglich hatte ich noch nie eine Ziffernliste als nützliches Eingabeformular angesehen. Gemäß der Diskussion in den Hauptkommentaren habe ich die Abfrage formal überarbeitet, um die Eingabe von Ziffernfolgen zu ermöglichen.
hBy2Py
1

Schale , 36 Bytes

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

Probieren Sie es online!

Vielen Dank an Zgarb , der mir erklärt hat, wie Ternaries im Chat funktionieren. ↑0Ich habe versucht, Golf zu spielen , habe es aber aus irgendeinem Grund nicht zum Laufen gebracht (?). Dies ist meine erste nicht triviale Antwort auf Husk, und abgesehen davon bin ich ziemlich zufrieden damit. Der Wert, der stattdessen verwendet wird, YAY!!!ist [](aber ich hoffe, dass sich dies für Golfzwecke ändern wird).

Erläuterung

? ↑ 2 ↑ 0Πṙ_1 † aÖ ± ↔Ġ - :: 15t * 3e588 83B60 † d½ | Eingabe als Ziffernliste von CLA, Ausgabe an STDOUT.

                                   ½ | Teilen Sie die Liste in zwei Hälften.
                                 † d | Wandle jede Hälfte in eine ganze Zahl zur Basis 10 um.
                              B60 | Konvertiere von Basis 60.
                : | Fügen Sie das Obige an ↓ ([15, 83, 588, 83, 588, 83]) an.
                       e588 83 | Erstellen Sie die Zwei-Elemente-Liste [588, 83].
                     * 3 | Dreimal wiederholen
                    t | Entfernen Sie das erste Element.
                 : 15 | 15 voranstellen.
              Ġ- | Wenden Sie die kumulative Subtraktion von rechts an.
             ↔ | Umkehren.
           Ö ± | Stabile Sortierung nach Vorzeichen (-1, 0 oder 1).
         † a | Absolutwert abbilden.
      ṙ_1 | Drehen Sie eine nach rechts.
? Π | Wenn das Produkt wahr ist, dann:
 ↑ 2 | Nehmen Sie die ersten beiden Elemente.
   ↑ 0 | Ansonsten eine leere Liste zurückgeben.
Mr. Xcoder
quelle
1

Kotlin , 293 Bytes

{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)}}

Verschönert

{
    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)}
}

Prüfung

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
quelle