Réglage de l'heure

27

Imaginez l'horloge de 24 heures suivante qui peut être contrôlée par les touches fléchées:

╔══╗ ┌──┐
║00║:│00│
╚══╝ └──┘
 HH   mm

Appuyez deux fois sur la flèche vers le haut ( ↑↑) pour augmenter l'entrée d'heure actuellement focalisée:

╔══╗ ┌──┐
║02║:│00│
╚══╝ └──┘
 HH   mm

Appuyez sur la flèche droite ( ) pour focaliser l'autre entrée.

┌──┐ ╔══╗
│02│:║00║
└──┘ ╚══╝
 HH   mm

Appuyez trois fois sur la flèche vers le bas ( ↓↓↓) pour diminuer cette entrée.

┌──┐ ╔══╗
│02│:║57║
└──┘ ╚══╝
 HH   mm

En bref:

  • La flèche vers le haut ( ) augmentera l'entrée actuellement active.
  • La flèche vers le bas ( ) diminue l'entrée active.
  • La flèche droite ( ) déplace le focus vers l'entrée droite.
  • La flèche gauche ( ) déplace le focus vers l'entrée gauche.
  • Les mouvements de haut en bas boucleront comme prévu pour une entrée de temps.
  • Les mouvements gauche et droit ne tournent pas autour.

Le défi

L'horloge démarre à 00:00avec l'entrée heure active (voir premier schéma). Étant donné une liste de commandes d'entrée, affichez l'heure résultante au HH:mmformat.
L'entrée peut être une chaîne ou une liste (ou votre équivalent de langue), où les différentes directions d'entrée peuvent être l'une des options ci-dessous:

  • ↑↓←→
  • udlr
  • ^v<>
  • la touche fléchée réelle appuie si votre programme a une interface graphique

Des échappatoires standard s'appliquent.

Cas de test

↑↑→↓↓↓ = 02:57
↓→↑←↑→↓ = 00:00
↓→→↓ = 23:59
←←←←→↑ = 00:01
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓→↓ = 23:59
Lente
la source
1
@JonathanFrech L'une des options données, le choix de quatre valeurs uniques (par exemple 0123) rendrait le défi beaucoup plus facile dans certaines langues tout en ne bénéficiant pas à d'autres.
Nit
1
@LuisfelipeDejesusMunoz Oui, c'est en fait écrit selon les règles d'entrée.
Nit
3
Je pense que cela aurait été plus difficile s'il avait inclus des secondes. Cela aurait plus de logique derrière laquelle on se concentre actuellement
Jo King
3
Il manque une règle spéciale pour gérer le code Konami.
coredump
1
@coredump Le considérait, mais cela prendrait probablement plus d'espace que le cœur de la réponse dans la plupart des langues.
Nit

Réponses:

39

HTML sur Google Chrome 67 en chinois (simplifié), 39 octets

<input type=time value=00:00 autofocus>

Screenshot

Chrome affiche différents composants d'interface utilisateur dans une langue différente. Même une simple saisie de l'heure: AM / PM sera affiché si vous utilisez l'anglais (US). Si vous voulez tester cela en changeant la langue de votre Chrome. Ne groupez pas comment le changer en arrière.

tsh
la source
2
mec !! hahah je pense que ce n'est pas valide tho
Luis felipe De jesus Munoz
2
Frapper deux fois à droite AM/PMme revient
Jo King
1
@JoKing Je pense que cela dépend des paramètres régionaux / locaux?
Nit
1
@JoKing Cela dépend des paramètres régionaux. Essayez peut-être de changer la langue de votre Chrome en chinois simplifié? (Ne regroupez pas comment le changer en arrière.)
tsh
1
Il fonctionne sur Firefox 61.0.1
Francisco Hahn
12

C (gcc) , 117 107 octets

  • Dix octets enregistrés grâce à l4m2 .
t,i,m[8];e(char*_){for(*m=i=2[m]=0;t=*_++;t<63?i=t%4:(i[m]+=t&8?1:'w'));printf("%02d:%02d",*m%24,2[m]%60);}

Essayez-le en ligne!

Jonathan Frech
la source
4
Belle dénomination variable.
Nit
# C (gcc) , 107 octets <! - language-all: lang-c -> t,i,m[8];e(char*_){for(*m=i=2[m]=0;t=*_++;t<63?i=t%4:(i[m]+=t&8?1:119));printf("%02d:%02d",*m%24,2[m]%60);} Essayez-le en ligne!
l4m2
6

Stax , 36 35 33 32 octets

áXò↑─↨√▓|êóÇiU&≡Q#┤Æ⌡⌠╟C▐╜√⌡∟▄╩╠

Exécuter et déboguer

Utilise lrud.

Explication:

'l/{'r/Bs$2lmM{${:14-m|+i36*24+%2|zm':* Full program,
'l/                                     Split the string on "l"
   {        m                           Map over the resulting array
    'r/                                   Split at "r"
       B                                  Uncons left, first on TOS (top of stack)
        s                                 Swap to get tail to top
         $                                Flatten; this removes multiple 'r's
          2l                              Listify two items, BOS (bottom of stack) is first element
             M                          Transpose: get [hour commands, minute commands]
              {                    m    Map:
               $                          Flatten
                {    m                    Map over single commands:
                 :1                         Number of set bits: 5 for 'u', 3 for 'd'
                   4-                       Subtract 4: u -> 1, d -> -1
                      |+                  Sum
                        i                 Iteration index: hours -> 0, minutes -> 1
                         36*24+           Multiply by 36, add 24: 0 -> 24, 1 -> 60
                               %          Modulo, this does -5 % 60 = 55
                                2|z       Stringify, left-padding with "0" to length 2
                                    ':* Join on ":"
                                        Implicit output
wastl
la source
6

Python 2 , 105 octets

h=m=p=0
for c in map(' ^<>'.find,input()):w=1/c;m+=w*p;h+=w-w*p;p=[c-2,p][w]
print'%02d:%02d'%(h%24,m%60)

Essayez-le en ligne!

ovs
la source
5

C # (.NET Core) , 149 132 octets

s=>{var p=0;int[]h={0,0};foreach(var c in s)h[p=c<63?c/2%2:p]+=c>62?c>95?-1:1:0;return$"{(h[0]%24+24)%24:D2}:{(h[1]%60+60)%60:D2}";}

Essayez-le en ligne!

Utilisation ^v<>.

Celui-ci m'a fait réaliser que l'opérateur modulo en C # ne fonctionne pas comme prévu, car en C # -1 % 60 = -1, j'ai donc besoin de faire cette opération étrange à la fin.

Charlie
la source
(H [1]% 60 + 60)% 60 ne peut-il pas être remplacé par (h [1] +60)% 60?
IanF1
2
@ IanF1 non, vous ne pouvez pas. Que faire si l'utilisateur appuie 100 fois sur le bouton bas? Ou 1000 fois?
Charlie
merci d'avoir clarifié :) c'est surprenant pour moi que cette méthode soit plus courte que d'appliquer le modulo à la volée (avec 59 à la place de -1).
IanF1
5

Lua (framework love2d), 311 308 octets

l,b,d,t,f,a=love,{24,60},{1,-1},{0,0},1,{"left","right","up","down"}function c(n,i)t[f]=(n+d[i])%b[f]end function l.draw()h,m=t[1],t[2]l.graphics.print((h<10 and 0 ..h or h)..":"..(m<10 and 0 ..m or m),0,0)end function l.keypressed(k)for i,n in pairs(a)do f=k==n and(i>2 and(c(t[f],i-2)or f)or i)or f end end

Version sans fil:

--initialize all needed values
l,b,d,t,f,a=love,{24,60},{1,-1},{0,0},1,{"left","right","up","down"}

--increase the numbers depending on the focus and up or down
function c(n,i)
  t[f]=(n+d[i])%b[f]
end 

--draw the time to the screen
function l.draw()
  h,m=t[1],t[2]
  l.graphics.print((h<10 and 0 ..h or h)..":"..(m<10 and 0 ..m or m),0,0)
end

--get the keys and check if it is an arrow key
function l.keypressed(k)
  for i,n in pairs(a)do
    f=k==n and(i>2 and(c(t[f],i-2)or f)or i)or f 
  end 
end

Probablement toujours pas 100% facile à lire car tous les ifs sont échangés avec une instruction trinaire (..et ..or) :)

s'il a commencé dans un main.lua avec amour, une fenêtre apparaîtra et vous pouvez appuyer sur les touches fléchées pour modifier les chiffres

Lycea
la source
pourriez-vous également publier une version étendue pour plus de lisibilité
aaaaa dit réintégrer Monica
bien sûr, j'ai ajouté une version étendue sans problème :)
Lycea
4

MATL , 57 56 55 octets

1Oi9\"@5<?y@3-ZS*+}wx7@-X^w]]wx&Zjh24 60h\'%02d:%02d'YD

Essayez-le en ligne!

Représente l'heure et les minutes en utilisant des nombres complexes, la partie réelle étant les heures et la partie imaginaire minutes.

Avec commentaires:

1     % Push 1 on the stack
      % represents which timer box we're in, starts at hour box
      % imaginary number j would represent minutes box
O     % Push initial hour and minutes 0+0j
i9\   % Fetch input, mod each character's ASCII value by 9.
      % Gives 4 1 8 6 for ^ v > < respectively
"     % iterate through (modded) input
  @5<?     % Push current input, see if it's < 5 
           % if so, it's an up or down time change
    y        % so copy out the box indicator (1 or j)
    @3-      % Subtract 3 from the current input
    ZS       % Take the result's sign (-1 for v, 1 for ^)
    *        % Multiply indicator with that
    +        % Add the result to the time value
  }        % else, it's a right or left arrow
    wx       % so bring out the box indicator and delete it
    7@-      % Subtract current input from 7. 1 for < and -1 for >
    X^       % Take the square root of that. 1 for < and j for >
    w        % switch stack to bring time value on top again
  ]       % end if
]     % end loop
wx    % bring box indicator out, delete it
&Zj   % split the complex time value to real and imaginary
h     % then concatenate them into an array
24 60h\ % mod hour and minute values by 24 and 60 respectively
'%02d:%02d'YD % sprintf the time array with 0-padding
Sundar - Rétablir Monica
la source
4

PHP , 145 134 133 octets

(-11 octets par plus de golf)

(-1 octet en utilisant la méthode de boucle de David )

<?for($h=$m=0,$a=h;$c=$argv[++$i];)$c<l?$$a--:($c>r?$$a++:$a=$c<r?h:m);$h%=24;$m%=60;printf('%02d:%02d',$h<0?$h+24:$h,$m<0?$m+60:$m);

Pour l'exécuter:

php -n -d error_reporting=0 <filename> <command_1> <command_2> ... <command_n>

Exemple:

php -n -d error_reporting=0 time_setter.php u u r d d d l d

Ou essayez-le en ligne!

Remarques:

  • Pour économiser quelques octets, j'ai utilisé des chaînes sans guillemets simples / doubles comme wrapper de chaîne. Ainsi, l' error_reporting=0option est utilisée pour ne pas générer d'avertissements.
  • Commandes d'entrée: u d l r
Nuit2
la source
128 octets, -6: essayez-le en ligne! (Nice solution, btw :)
David
@ David: Merci, mais votre mise à jour a deux problèmes. Tout d'abord, $ h n'est pas défini, donc la diminuer au démarrage échoue: essayez-le en ligne!
Night2
@David: Et le deuxième problème se produit lorsque nous passons les heures / minutes plus ou moins de 24/60 fois: Essayez-le en ligne!
Night2
@ David: Mais grâce à votre méthode de boucle, j'ai pu réduire 1 octet de plus: Essayez-le en ligne!
Night2
ah, bien, désolé, cela n'a pas complètement fonctionné :)
Davіd
4

JavaScript, 104 103 octets

Prend l'entrée comme un tableau de caractères, en utilisant <>^v .

a=>(a.map(z=>z<"^"?a=z<">":a?x+=z<"v"||23:y+=z<"v"||59,x=y=0),g=n=>`0${n}`.slice(-2))(x%24)+`:`+g(y%60)

Essayez-le en ligne

Hirsute
la source
3

Haskell, 236 octets

f=u 0 0
k _ _ _ _ _ h m[]=z h++':':z m
k a b c d e h m(q:s)=case q of{'^'->e(a h)(b m)s;'v'->e(c h)(d m)s;'>'->v h m s;'<'->u h m s}
u=k(o(+)24)id(o(-)24)id u
v=k id(o(+)60)id(o(-)60)v
o f m x=mod(f x 1)m
z n|n<10='0':show n
z n=show n

fest la fonction principale et a le type String -> String:

*Main> f "^^>vvv"
"02:57"
*Main> f "v>^<^>v"
"00:00"
*Main> f "v>>v"
"23:59"
*Main> f "<<<<>^"
"00:01"
*Main> f "vvvvvvvvvvvvvvvvvvvvvvvvv>v"
"23:59"

Essentiellement uet vsont des fonctions de type mutuellement récursives Integer -> Integer -> String -> String. Ils prennent l'heure, la minute et une liste de caractères sur l'ensemble {v,^,<,>}, et renvoient la chaîne de temps. uagit comme si le cadran de l' heure est en surbrillance, appelant récursive usi la tête de la liste est {v,^}, et vsi la tête de la liste est en {<,>}. vest similaire mais pour le cadran des minutes.

Tout le reste ne fait que sauver des personnages.

AlexJ136
la source
3

Lua , 132 octets

loadstring's,t,m=1,{0,0},{24,60}for c in(...):gmatch"."do t[s]=(t[s]+(("d u"):find(c)or 2)-2)%m[s]s=("lr"):find(c)or s end return t'

Essayez-le en ligne!


Explication

Il s'agit d'une fonction anonyme (une manière de l'utiliser est indiquée sur le lien).

s=1 -- s will control the selection (1 is hour and 2 min)
t={0,0} -- is the time itself
m={24,60} -- is the maximum for each 'box' (hour or min)
-- I've actually used Lua's multiple variable assignment: s,t,m=1,{0,0},{24,60}

for c in (...):gmatch(".") do -- go through each character of the input
  t[s] = (t[s] + (("d u"):find(c) or 2)-2) % m[s] -- set the current 'box' as
          t[s] +   -- itself plus ...
                  ("d u"):find(c) or 2   -- it's index on the string "d u" (that means it's going to be 1 or 3)
                                         -- or 2 if it wasn't found (if the current character doesn't sum or subtract from the box)
                                       -2   -- this adjusts the result 1, 2 or 3 to being -1, 0 or 1
                                            -- making the inputs 'd' and 'u' as -1 and +1 respectively, and an input different from both as 0
         (                               ) % m[s]   -- modulo of the maximum of the selected 'box'

  s=("lr"):find(c) or s
    ("lr"):find(c)   -- if the current input character is l or r, then set 's' (the 'box' selection) to being 1 or 2.
                   or s   -- else let it as is
end
return t -- returns 't', a table with hour and minutes respectively
Visckmart
la source
La sortie doit être au HH:mmformat, plutôt qu'une table
Jo King
2

Java 8, 121 octets

c->{int i=0,m[]={0,0,0};for(int t:c)if(t<63)i=t%4;else m[i]+=(t&8)>0?1:119;return"".format("%02d:%02d",m[0]%24,m[2]%60);}

Port de Réponse C Jonathan Frech . Accepte ^v<>. Essayez-le en ligne ici .

OOBalance
la source
2

Gelée , 36 octets

Je pense que cela O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:devrait fonctionner pour 32, maisœṡ semble avoir actuellement un bug .

O%5;4ṣ3i€4$œṖ"$Z%3’§§%"“ð<‘DŻ€ṫ€-j”:

Un programme complet imprimant le résultat sur STDOUT (en tant que lien monadique, il retourne en fait une liste mixte d'entiers (quoique à un chiffre) et de caractères (le : ).

Utilise le udlr option d'entrée.

Essayez-le en ligne!Ou consultez une suite de tests .

Comment?

O%5;4ṣ3i€4$œṖ"$Z%3’§§%"“ð<‘DŻ€ṫ€-j”: - Link: list of characters (in 'udlr')
O                                    - to ordinals
 %5                                  - modulo five  ...maps u:2, d:0, l:3, r:4
   ;4                                - concatenate a 4 (to always end up with both hrs & mins - even when no r is ever pressed)
     ṣ3                              - split at threes (the l presses)
       i€4$œṖ"$                      - a replacement for œṡ€4 (split each at first occurrence of)...
              $                      - | last two links as a monad:
          $                          - |   last two links as a monad:
         4                           - |     literal four
       i€                            - |     for €ach get first index of (4) else yield 0
             "                       - |   zip with:
           œṖ                        - |     partition at indices
               Z                     - transpose (to get a list of two lists of lists)
                %3                   - modulo by three. To replace any 4(r) with 1
                                     -  ...while keeping any 0(d) as 0, or 2(u) as 2
                  ’                  - decrement. All r are now 0, d are -1 and u are 1
                   §                 - sum each
                    §                - sum each. Now we have the total increase value as
                                     -    ...integers for each of hrs and mins
                       “ð<‘          - code-page indices list = [24,60]
                      "              - zip with:
                     %               -   modulo
                           D         - to decimal lists
                            Ż€       - prepend each with a zero (to cater for values less than ten)
                              ṫ€-    - tail each from index -1. Keeps rightmost two digits of each only)
                                  ”: - literal character ':'
                                 j   - join
                                     - as full program implicit print (smashes the digits and characters together)
Jonathan Allan
la source
2

QBasic , 229 octets

Un script qui prend les entrées sous forme de touches et les sorties vers la console.

Remarque: les terminaux "sont inclus uniquement pour la coloration syntaxique et ne contribuent pas au décompte.

z$=CHR$(0)
DO
x=0
y=0
SELECT CASE INKEY$
CASE z$+"K"
r=0
CASE z$+"M"
r=1
CASE z$+"H"
x=1
y=1
CASE z$+"P"
x=23
y=59
END SELECT
IF r THEN m=(m+y)MOD 60ELSE h=(h+x)MOD 24
CLS
?RIGHT$("00000"+LTRIM$(STR$(h*1000+m)),5)
LOCATE 1,3
?":"
LOOP

Commenté

z$=CHR$(0)                                      ''  Set var to null char
DO                                              ''
    x=0                                         ''  Set Hours Shift to 0 
    y=0                                         ''  Set Minutes Shift to 0 
    SELECT CASE INKEY$                          ''  Take keystroke input
        CASE z$+"K"                             ''  If is Left Arrow
            r=0                                 ''    Bool to modify right (minutes) 
        CASE z$+"M"                             ''  If is Right Arrow
            r=1                                 ''    Bool to modify left (hours)
        CASE z$+"H"                             ''  If is Up Arrow
            x=1                                 ''    Set Hours Shift to 1 
            y=1                                 ''    Set Minutes Shift to 1
        CASE z$+"P"                             ''  If is Down Arrow
            x=23                                ''    Set Hours Shift to 23 
            y=59                                ''    Set Minutes Shift to 23 
    END SELECT                                  ''
    IF r THEN m=(m+y)MOD 60ELSE h=(h+x)MOD 24   ''  Shift Minutes If `r=1` Else Shift Hours
    CLS                                         ''  Clear Screen
    ?RIGHT$("00000"+LTRIM$(STR$(h*1000+m)),5)   ''  Use math to concat Hours and Minutes 
                                                ''  then Convert to String and prepend 0s 
                                                ''  to a length of 5
    LOCATE 1,3                                  ''  Cursor to the the third digit
    ?":"                                        ''  Overwrite that digit with a `:`
LOOP                                            ''  Loop
Taylor Scott
la source
1
N'est-ce pas (m+y)?
Neil
Dans la note, ne devrait pas ne se faire ?
Jonathan Frech
@JonathanFrech - Oui, ça devrait l'être. Merci d'avoir gardé ma grammaire sous contrôle
Taylor Scott
Désolé, je pensais que mc'était pour des minutes pour une raison quelconque ... Je vois que votre version commentée est plus lisible.
Neil
2

PowerShell, 109 103 octets

-6 octets merci AdmBorkBork

$t=0,0
$args|%{$t[+$i]+=. @{l={$i=0};r={$i=1};u={1};d={119}}.$_}
"{0:00}:{1:00}"-f($t[0]%24),($t[1]%60)

Script de test:

$f = {

$t=0,0
$args|%{$t[+$i]+=. @{l={$i=0};r={$i=1};u={1};d={119}}.$_}
"{0:00}:{1:00}"-f($t[0]%24),($t[1]%60)

}

@(
    ,('02:57',('u','u','r','d','d','d'))
    ,('00:00',('d','r','u','l','u','r','d'))
    ,('23:59',('d','r','r','d'))
    ,('00:01',('l','l','l','l','r','u'))
    ,('23:59',('d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','r','d'))
) | % {
    $e, $c = $_
    $r = &$f @c
    "$($r-eq$e): $r"
}

Sortie:

True: 02:57
True: 00:00
True: 23:59
True: 00:01
True: 23:59

Explication

L'idée de base est d'utiliser un [hashtable], qui keyssont des commandes de contrôle et des valuesblocs de script. Le code exécute le bloc de script pour chaque commande à partir d'arguments.

mazzy
la source
1
Vous pouvez vous en débarrasser $i=0en castant votre index de tableau comme $t[+$i]pour économiser quelques octets. Essayez-le en ligne!
AdmBorkBork
2

Perl 6 , 101 91 89 86 octets

{$/=[];$!=0;$_>2>($!=$_-3)||($/[$!]+=$_-1)for .ords X%5;($0%24,$1%60).fmt("%02d",":")}

Essayez-le en ligne!

Bloc de code anonyme qui prend une chaîne de uldrcaractères et retourne dans le format donné

Jo King
la source
1

perl -F // -E, 72 octets

$x=H;/u/?$$x++:/d/?$$x--:($x=/l/?H:M)for@F;printf"%02d:%02d",$H%24,$M%60

la source
1

Python, 120 octets

o,i=[0,0],0
for s in list(input()):i=(i+(s=='r')-(s=='l')>=1);o[i]+=(s=='u')-(s=='d')
print'%02d:%02d'%(o[0]%24,o[1]%60)
aaaaa dit réintégrer Monica
la source
Cela ressemble à un extrait de code prenant une entrée dans une variable. En règle générale, nous avons besoin de réponses pour présenter soit un programme complet (en prenant l'entrée des arguments du programme ou une entrée standard) soit une fonction (en prenant l'entrée des paramètres de la fonction).
OOBalance
1
De plus, cela ne se heurtera-t-il pas à un mur lorsqu'une entrée de, disons, ldou rrufait iquitter la plage (0,1) et o[i]est accessible après?
OOBalance
@OOBalance oh merci de me rappeler que vous avez besoin de fonction ou unput(). D'après les exigences, j'ai pensé que les actions L et R ne tourneraient jamais (c'est-à-dire non LL)
aaaaa dit réintégrer Monica
@aaaaaa Aucun moyen de bouclage llln'est différent de r. Avoir llou rrest une entrée valide, c'est aussi dans les cas de test, voir le troisième par exemple.
Nit
Cette réponse a actuellement une IndexError sur le 3e cas de test au lieu de sortir 23:59. Essayez-le en ligne!
0
1

Haskell , 186 octets

f(0,0)'<'
f t i('^':r)=f(i#t$1)i r
f t i('v':r)=f(i#t$ -1)i r
f t i(x:r)=f t x r
f(h,m)_ _=s h++':':s m
('<'#(h,m))n=(mod(24+n+h)24,m)
(_#(h,m))n=(h,mod(60+n+m)60)
s n=['0'|n<10]++show n

Essayez-le en ligne!

Laikoni
la source
1

R, 368 355 octets

f=function(){C=as.character
i=ifelse
p=paste0
r=1:10
h=C(0:23);m=C(0:59)
h[r]=p(0,h[r])
m[r]=p(0,m[r])
x=y=z=1
while(T){print(p(h[x],":",m[y]))
v=1
n="[UDLRS]"
while(!grepl(n,v))v=toupper(readline(n))
if(v=="L")z=1 else if(v=="R")z=0
if(v=="S")T=F
if(v=="U")if(z)x=i(x==24,1,x+1)else y=i(y==60,1,y+1)
if(v=="D")if(z)x=i(x==1,24,x-1)else y=i(y==1,60,y-1)}}

Certainement pas la meilleure approche, mais ça marche.

Fonctionnalité: Exécuter la fonction, taper chaque lettre pour (in / de) plier ou déplacer vers la gauche / droite, en tapant "s" termine le "jeu". Le hic, c'est qu'il acceptera une et une seule lettre à la fois.

-13 octets Consolidé certaines valeurs sur une seule ligne, remplacé T par F au lieu d'utiliser break, trouvé plusieurs espaces à éliminer et une chaîne stockée dans une variable à la place

f=function(){C=as.character                             # Abbreviate functions
i=ifelse
p=paste0
r=1:10                                                  # Initialize and format values
h=C(0:23);m=C(0:59)
h[r]=p(0,h[r])
m[r]=p(0,m[r])
x=y=z=1
while(T){print(p(h[x],":",m[y]))                        # Begin while loop and print time
v=1                                                     # Initial value reset each iteration to retrieve a new direction
n="[UDLRS]"                                             # Used for verification and request
while(!grepl(n,v))v=toupper(readline(n))                # Will only accept proper directions or stopping rule
if(v=="L")z=1 else if(v=="R")z=0                        # Evaluate for hour or minute
if(v=="S")T=F                                           # Stopping rule, overwrite True to False
if(v=="U")if(z)x=i(x==24,1,x+1)else y=i(y==60,1,y+1)    # Rules for Up
if(v=="D")if(z)x=i(x==1,24,x-1)else y=i(y==1,60,y-1)}}  # Rules for Down

Je modifie également un autre format pour accepter une chaîne R et / ou un vecteur, qui sera publié la semaine prochaine.

Sumner18
la source
1

SmileBASIC, 123 octets

@L
B=BUTTON(2)D=(B==1)-(B==2)S=S+!S*(B>7)-S*(B==4)H=(H+D*!S+24)MOD 24WAIT
M=(M+D*S+60)MOD 60?FORMAT$("%02D:%02D",H,M)GOTO@L

BUTTON() renvoie un entier où chaque bit représente un bouton

1 = up
2 = down
4 = left
8 = right
...

BUTTON(2) renvoie uniquement les boutons qui venaient d'être enfoncés (non maintenus)

WAIT est requis car BUTTON ne se met à jour qu'une fois par image (1/60 de seconde). Sinon, la même pression sur un bouton serait détectée plusieurs fois.

Cela peut certainement être plus court

12Me21
la source
0

05AB1E , 38 37 octets

'l¡ε'r¡}0ζćs˜‚€S„udS1®‚:OŽ9¦2ä%T‰J':ý

Utilise udlrpour les directions, mais peut également être utilisé ^v<>pour le même nombre d'octets (les caractères↑↓←→ ne font pas partie de la page de codes de 05AB1E, donc leur utilisation augmenterait considérablement le nombre d'octets, car l'encodage devrait être changé en ASCII).

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

'l¡            '# Split the (implicit) input on "l"
                #  i.e. "lllrurulddd" → ["","","","ruru","ddd"]
   ε   }        # Map each item to:
    'r¡        '#  Split the item on "r"
                #   i.e. ["","","","ruru","ddd"] → [[""],[""],[""],["","u","u"],["ddd"]]
        0ζ      # Zip/transpose; swapping rows/columns, with "0" as filler
                #  i.e. [[""],[""],[""],["","u","u"],["ddd"]]
                #   → [["","","","","ddd"],["0","0","0","u","0"],["0","0","0","u","0"]]
ć               # Head extracted: pop and push the remainder and head-item to the stack
                #  i.e. [["","","","","ddd"],["0","0","0","u","0"],["0","0","0","u","0"]]
                #   → [["0","0","0","u","0"],["0","0","0","u","0"]] and ["","","","","ddd"]
 s              # Swap to get the remainder
  ˜             # Flatten it
                #  i.e. [["0","0","0","u","0"],["0","0","0","u","0"]]
                #   → ["0","0","0","u","0","0","0","0","u","0"]
               # Pair the head and remainder back together
                #  i.e. ["","","","","ddd"] and ["0","0","0","u","0","0","0","0","u","0"]
                #   → [["","","","","ddd"],["0","0","0","u","0","0","0","0","u","0"]]
    S          # Convert each item to a list of characters
                # (implicitly flattens and removes empty strings)
                #  i.e. [["","","","","ddd"],["0","0","0","u","0","0","0","0","u","0"]]
                #   → [["d","d","d"],["0","0","0","u","0","0","0","0","u","0"]]
      udS1®‚:  # Replace all "u" with "1" and all "d" with "-1"
                #  i.e. [["d","d","d"],["0","0","0","u","0","0","0","0","u","0"]]
                #   → [["-1","-1","-1"],["0","0","0","1","0","0","0","0","1","0"]]
              O # Then take the sum of each inner list
                #  i.e. [["-1","-1","-1"],["0","0","0","1","0","0","0","0","1","0"]]
                #   → [-3,2]
Ž9¦             # Push compressed integer 2460
   2ä           # Split into two parts: [24,60]
     %          # Modulo the two lists
                #  i.e. [-3,2] and [24,60] → [21,2]
      T        # Divmod each with 10
                #  i.e. [21,2] → [[2,1],[0,2]]
        J       # Join each inner list together
                #  i.e. [[2,1],[0,2]] → ["21","02"]
         ':ý   '# Join the list with ":" delimiter
                #  i.e. ["21","02"] → "21:02"
                # (and output the result implicitly)

Voir cette astuce de mes 05AB1E (section Comment compresser les grands entiers? ) Pour comprendre pourquoi Ž9¦est 2460.

Kevin Cruijssen
la source