Trouver mes moments préférés

15

J'aime vraiment les moments qui suivent certains modèles. En particulier, j'aime les moments où tous les chiffres sont identiques, ou tous les chiffres augmentent de manière arithmétique de un de gauche à droite. De plus, je déteste viscéralement quand les gens mettent des lettres à mon époque, donc tout ce non-sens AM / PM est mort pour moi. Ainsi, mes moments préférés sont:

0000 0123 1111 1234 2222 2345

Pour ma tranquillité d'esprit, j'ai besoin que vous m'écriviez un seul programme qui, étant donné l'heure actuelle en entrée, à la fois: (A) si ce n'est pas maintenant l'un de mes moments préférés, me dit à la fois (i) combien de minutes c'est depuis mon dernier temps favori ainsi que (ii) combien de minutes à partir de maintenant mon prochain temps favori se produira; et (B) si elle est maintenant l' un de mes moments préférés, fournit une « valeur de signal » unique.

Contribution

Votre programme doit accepter (par n'importe quelle méthode: argument de fonction,, stdinargument de ligne de commande, etc.) l'heure actuelle, dans l'un des formats suivants:

  • Un temps à quatre chiffres sous forme de chaîne

  • Un entier qui peut être complété par un zéro sur la gauche pour créer un temps à quatre chiffres sous forme de chaîne

  • Une séquence de quatre (ou moins) entiers, ordonnée de telle sorte que le premier entier de la séquence soit le chiffre le plus à gauche (significatif) dans l'entrée de temps (par exemple, 0951pourrait être valablement représenté par [0, 9, 5, 1]ou [9, 5, 1])

    • Représenter 0000comme une séquence de longueur nulle est acceptable

Dans le cas d'une entrée de chaîne, elle ne doit contenir que des chiffres, pas de deux-points ou d'autres signes de ponctuation. On peut supposer que les entrées sont toujours valides sur 24 heures:, HHMM0 <= HH <= 23et 0 <= MM <= 59. Ignorez la possibilité d'une seconde intercalaire.

Production

Votre programme doit fournir (les retours de fonction stdout, etc. sont très bien) soit (A) ou (B) , selon que la valeur entrée est ou non une heure cible.

Pour un):

Fournissez deux valeurs numériques dans n'importe quel format raisonnable, telles que:

  • Sortie à une chaîne avec un délimiteur approprié

  • Sorties séquentielles entières / chaînes, par exemple, bashimpression de deux lignes pour stdout:

    49
    34
    
  • Valeurs de retour ordonnées de longueur deux, telles qu'une liste Python, un tableau C, etc.: [49, 34]

Les valeurs peuvent venir dans l'un ou l'autre ordre. Par exemple, les deux éléments suivants seraient des sorties valides pour une entrée de 1200:

49 34
34 49

Cependant, l'ordre et le séparateur doivent être les mêmes pour toutes les valeurs d'entrée!

Pour (B):

Produisez tout résultat autrement inaccessible. Le même résultat doit cependant être produit pour les six temps cibles. Les boucles infinies sont exclues.

Exemples d'entrées / sorties

YAY!!! est utilisé ici comme exemple démonstratif et n'est pas normatif.

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

C'est le , donc le code le plus court en octets l'emporte. Les failles standard ne sont pas autorisées.

hBy2Py
la source
Est-il correct de ne rien retourner pour un moment préféré?
James Holderness
1
@JamesHolderness Fictional-me s'inquiète si je ne récupère rien du tout d'une application (et si l'interprète glitch?!?!), Donc il doit y avoir une valeur ou une sortie générée.
hBy2Py

Réponses:

2

Gelée , 34 33 32 31 28 octets

3 octets grâce à M. Xcoder .ịet ³astuces.

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

Essayez-le en ligne!

Certaines parties sont exactement comme dans la réponse de Jonathan Allan , mais je le poste car je pense qu'il est suffisamment différent de lui et écrit indépendamment sur la base de ma réponse Pyth (et plus court: D). Devrait également pouvoir être amélioré.

L'entrée est un entier, la sortie est un tableau des heures précédentes et suivantes ou le tableau vide pour les heures spéciales.

Explication

Utilisation d'un exemple d'entrée 1200.

  • convertit le temps de base 100, en heures et en minutes: [12,0].
  • ḅ60convertis de la base 60 pour obtenir le total minutes: 720.
  • ;15it paires avec 15: [720, 15].
  • 83,588crée le tableau [83, 588].
  • ṁ5rend la longueur 5: [83, 588, 83, 588, 83].
  • ¤combine les deux actions ci-dessus. Juste une technicité.
  • jse joint à la paire avec la matrice: [720, 83, 588, 83, 588, 83, 15].
  • _\soustrait chaque valeur de tableau à partir du premier et obtient des résultats intermédiaires: [720, 637, 49, -34, -622, -705, -720].
  • ṠÞ de manière stable trie ceux - ci par signum: [-34, -622, -705, -720, 720, 637, 49].
  • Aprend des valeurs absolues: [34, 622, 705, 720, 720, 637, 49].
  • µdémarre une nouvelle chaîne monadique. Encore une fois, une technicité.
  • .ịprend les derniers et les premiers éléments: [49, 34].
  • ×Ạrépète qu'une fois s'il n'y a pas de zéros, ou zéro fois autrement: [49, 34].
PurkkaKoodari
la source
@JamesHolderness Corrigé pour aucun changement de taille (changé ,en ;car il était récupéré comme un littéral de liste).
PurkkaKoodari
Curieusement, j'ai essayé de porter votre réponse Pyth à Jelly et j'ai eu 28 octets . Je ne pense pas que ce soit suffisamment différent pour être une réponse distincte, alors n'hésitez pas à l'utiliser (et la jolie suite de tests: P). (notez que l'utilisation ³au lieu de 100est autorisée ) La YAY!!!valeur est [0, 0]toujours la même.
M. Xcoder
Bien, merci! Je pense que la principale amélioration est l'astuce de la demi-indexation, je n'y ai jamais pensé.
PurkkaKoodari
Envisagez-vous de mettre à jour avec mes suggestions? (Juste un rappel, j'ai l'impression que vous avez oublié de modifier?)
M. Xcoder
@ Mr.Xcoder Oui, j'ai oublié de modifier. Je vais utiliser xẠcomme filtre zéro car je préfère genre de []plus [0, 0]parce qu'il est plus clairement différent.
PurkkaKoodari
2

JavaScript (ES6), 87 83 octets

4 octets enregistrés grâce à @ l4m2

Prend l'entrée sous forme de chaîne. Renvoie soit 0un tableau à 2 éléments.

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]

Cas de test

Comment?

Nous ne nous soucions pas du résultat de la .every()boucle. À condition que l'entrée soit valide, elle sera toujours fausse. Ce qui nous intéresse vraiment, c'est lorsque nous quittons cette boucle.

Nous sortons dès que nous trouvons un temps favori i(exprimé en minutes) qui est supérieur ou égal au temps de référence k(le temps d'entrée tconverti en minutes). Nous revenons ensuite 0si i == kou les 2 retards sinon.

Arnauld
la source
2
t%100+(t/25>>2)*60=>t-(t/100|0)*40
l4m2
2

Befunge-93, 88 85 86 80 74 octets

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

Essayez-le en ligne!

Affiche le nombre de minutes depuis la dernière heure préférée, suivi du nombre de minutes jusqu'à la prochaine heure préférée (séparés par la séquence de deux caractères: espace, trait d'union). S'il s'agit déjà d'une heure préférée, un seul zéro est renvoyé.

James Holderness
la source
1

C, 121 octets

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

Génère une nouvelle ligne si l'heure est une heure préférée.

Essayez-le en ligne!

Steadybox
la source
1

Nettoyer , 126 octets

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)

Définit la fonction ?, prise Intet retour (Int, Int).
Lorsque l'argument est un moment favori, il plante le programme appelant avec hd of [].

Essayez-le en ligne!

Οurous
la source
1

Pyth, 48 45 42 octets

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

Essayez-le en ligne. Suite de tests.

Le code prend une chaîne de temps et sort les heures précédentes et suivantes sous forme de tableau, ou 0 si l'heure est spéciale.

Fait intéressant, une approche impérative est également de 42 octets:

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

Explication

  • cz2divise input ( z) en morceaux de deux caractères.
  • sM les évalue comme des entiers.
  • i60Analyse le tableau à deux éléments résultant en base 60.
  • ,83 588représente le tableau [83, 588].
  • *3le triple [83, 588, 83, 588, 83, 588].
  • Psupprime le dernier 588.
  • +15Ajoute 15à la fin.
  • .u-NYpart du nombre analysé, en soustrait chaque nombre du tableau et renvoie les valeurs intermédiaires. Ce sont les différences de chaque moment spécial.
  • Jattribue ces différences à J.
  • *Fcalcule le produit des différences. Ce sera 0 si le temps était spécial.
  • & arrête l'évaluation ici et renvoie 0 si le temps était spécial.
  • ._DJ stable trie les différences par signe.
  • Kenregistre ce tableau K.
  • e prend le dernier élément du tableau.
  • _hK prend le premier élément du tableau et le nie.
  • , renvoie les deux sous forme de tableau.
PurkkaKoodari
la source
Et c'est une manière fine et sournoise d'absorber le signe négatif.
hBy2Py
Enregistrer un octet en passant de cz2 60à c2z60(ils sont équivalents pour les listes à 4 éléments)
M. Xcoder
1

Gelée ,  33 32  34 octets

 +3  +2 octets à corriger pour que toutes les sorties de temps aimé soient égales.

doit être un moyen plus court!

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

Un lien monadique prenant une liste des quatre chiffres et renvoyant une liste contenant deux entiers
- si c'est une heure appréciée, les deux entrées seront des zéros.

Essayez-le en ligne! ou voir la suite de tests .

Comment?

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
la source
Je ne pense pas que le format d'entrée (tableau de chiffres) est autorisé dans la question, ni la sortie changeante pour des moments spéciaux.
PurkkaKoodari
Corrigé, mais je ne sais pas si c'était vraiment l'intention de nécessiter de telles transformations ...
Jonathan Allan
C'est vrai, mais je pense que les réponses devraient toujours correspondre aux règles écrites actuelles du défi, même si l'intention initiale du PO était différente.
PurkkaKoodari
@ Pietu1998 À l'origine, je n'avais jamais considéré une liste de chiffres comme un formulaire de saisie utile. Par discussion dans les commentaires principaux, j'ai officiellement révisé le défi pour permettre l'entrée de séquence de chiffres.
hBy2Py
1

Husk , 36 octets

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

Essayez-le en ligne!

Merci à Zgarb de m'avoir expliqué comment les ternaires fonctionnent dans le chat. Essayer de jouer au golf ↑0, mais je ne l'ai pas fait fonctionner autrement pour une raison quelconque (?). Ceci est ma première réponse Husk non triviale, et en laissant de côté ce qui précède, j'en suis assez satisfait. La valeur utilisée au lieu de YAY!!!est [](mais j'espère que cela changera pour le golf).

Explication

? ↑ 2 ↑ 0Πṙ_1 † aÖ ± ↔Ġ - :: 15t * 3e588 83B60 † d½ | Entrée sous forme de liste de chiffres à partir de CLA, sortie vers STDOUT.

                                   ½ | Divisez la liste en deux moitiés.
                                 † d | Transformez chaque moitié en un entier de base 10.
                              B60 | Convertir à partir de la base 60.
                : | Ajoutez ce qui précède à ↓ ([15, 83, 588, 83, 588, 83]).
                       e588 83 | Créez la liste des deux éléments [588, 83].
                     * 3 | Répétez trois fois.
                    t | Retirez le premier élément.
                 : 15 | Ajoutez un 15.
              Ġ- | Appliquez la soustraction cumulative de la droite.
             ↔ | Sens inverse.
           Ö ± | Tri stable par le signe (-1, 0 ou 1).
         † a | Carte valeur absolue.
      ṙ_1 | Tournez-en un à droite.
? Π | Si le produit est véridique, alors:
 ↑ 2 | Prenez les deux premiers éléments.
   ↑ 0 | Sinon, renvoyez une liste vide.
M. Xcoder
la source
1

Kotlin , 293 octets

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

Embellie

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

Tester

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
la source