Establecer la hora

27

Imagine el siguiente reloj de 24 horas que puede controlarse con las teclas de flecha:

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

Al presionar la flecha hacia arriba dos veces ( ↑↑) aumentará la entrada de hora enfocada actualmente:

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

Presionando la flecha derecha ( ) enfocará la otra entrada.

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

Al presionar la flecha hacia abajo tres veces ( ↓↓↓) ahora disminuirá esta entrada.

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

En pocas palabras:

  • La flecha hacia arriba ( ) aumentará la entrada actualmente activa.
  • La flecha hacia abajo ( ) disminuirá la entrada activa.
  • La flecha derecha ( ) moverá el foco a la entrada correcta.
  • La flecha izquierda ( ) moverá el foco a la entrada izquierda.
  • El movimiento hacia arriba y hacia abajo se repetirá como se esperaba para una entrada de tiempo.
  • El movimiento hacia la izquierda y hacia la derecha no gira.

El reto

El reloj comienza 00:00con la entrada de hora activa (consulte el primer esquema). Dada una lista de comandos de entrada, genera el tiempo resultante en HH:mmformato.
La entrada puede ser una cadena o una lista (o su idioma equivalente), donde las diferentes direcciones de entrada pueden ser una de las siguientes opciones:

  • ↑↓←→
  • udlr
  • ^v<>
  • la tecla de flecha real presiona si su programa tiene una GUI

Se aplican lagunas estándar.

Casos de prueba

↑↑→↓↓↓ = 02:57
↓→↑←↑→↓ = 00:00
↓→→↓ = 23:59
←←←←→↑ = 00:01
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓→↓ = 23:59
Liendre
fuente
1
@JonathanFrech Una de las opciones dadas, elegir cuatro valores únicos (por ejemplo 0123) facilitaría mucho el desafío en ciertos idiomas sin beneficiar a otros.
Nit
1
@LuisfelipeDejesusMunoz Sí, eso en realidad está escrito bajo las reglas de entrada.
Nit
3
Creo que esto habría sido más desafiante si incluyera segundos. Esto tendría más lógica detrás de la cual uno está actualmente enfocado
Jo King
3
Falta una regla especial para manejar el código de Konami.
coredump
1
@coredump Lo consideró, pero probablemente tomaría más espacio que el núcleo de la respuesta en la mayoría de los idiomas.
Nit

Respuestas:

39

HTML en Google Chrome 67 en chino (simplificado), 39 bytes

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

Captura de pantalla

Chrome muestra diferentes componentes de la interfaz de usuario en diferentes idiomas. Incluso una simple entrada de tiempo: AM / PM se mostrará si está utilizando inglés (EE. UU.). Si quieres probar esto cambiando el idioma de tu Chrome. No masifique cómo volver a cambiarlo.

tsh
fuente
2
amigo !! jajah creo que no es válido aunque
Luis felipe De jesus Munoz
2
Golpear a la derecha dos veces es AM/PMpara mí
Jo King
1
@JoKing ¿Creo que depende de la configuración regional?
Nit
1
@JoKing Eso depende de la configuración regional. ¿Quizás lo intentes cambiando el idioma de tu Chrome a chino simplificado? (No masifique cómo volver a cambiarlo.)
tsh
1
Funciona en firefox 61.0.1
Francisco Hahn
12

C (gcc) , 117107 bytes

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

Pruébalo en línea!

Jonathan Frech
fuente
44
Buen nombre de variables.
Nit
# C (gcc) , 107 bytes <! - 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);} Pruébelo en línea!
l4m2
6

Stax , 36 35 33 32 bytes

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

Ejecutar y depurarlo

Usos lrud .

Explicación:

'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
fuente
5

C # (.NET Core) , 149 132 bytes

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}";}

Pruébalo en línea!

Utilizando ^v<> .

Este me hizo darme cuenta de que el operador de módulo en C # no funciona como se esperaba, porque en C # -1 % 60 = -1, así que necesito hacer esa operación extraña al final.

Charlie
fuente
¿No se puede reemplazar (h [1]% 60 + 60)% 60 con (h [1] +60)% 60?
IanF1
2
@ IanF1 no, no puedes. ¿Qué pasa si el usuario presiona el botón hacia abajo 100 veces? O 1000 veces?
Charlie
gracias por aclarar :) me sorprende que este camino sea más corto que aplicar el módulo sobre la marcha (con 59 en lugar de -1).
IanF1
5

Lua (marco love2d), 311 308 bytes

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

Versión sin codificar:

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

Probablemente todavía no sea 100% fácil de leer porque todos los ifs se intercambian con una declaración trinaria (..y ..o) :)

si comenzó en main.lua con amor, aparecerá una ventana emergente y puede presionar las teclas de flecha para cambiar los números

Lycea
fuente
¿también podría publicar una versión ampliada para facilitar la lectura?
dice aaaaa reinstalar Monica
Seguro, he añadido una versión ampliada ningún problema :)
Lycea
4

MATL , 57 56 55 bytes

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

Pruébalo en línea!

Representa hora y minutos usando números complejos, siendo la parte real horas y la parte imaginaria minutos.

Con comentarios:

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 - Restablecer a Monica
fuente
4

PHP , 145 134 133 bytes

(-11 bytes por más golf)

(-1 byte utilizando el método de bucle de Davіd )

<?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);

Para ejecutarlo:

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

Ejemplo:

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

O Pruébelo en línea!

Notas:

  • Para guardar algunos bytes, he usado cadenas sin comillas simples / dobles como contenedor de cadenas. Por lo tanto, la error_reporting=0opción se utiliza para no generar advertencias.
  • Comandos de entrada: u d l r
Noche2
fuente
128 bytes, -6: ¡ Pruébelo en línea! (Buena solución, por cierto :)
Davіd
@ David: Gracias, pero su actualización tiene dos problemas. Lo primero es que $ h no está configurado, por lo que al disminuirlo al inicio falla: ¡ Pruébelo en línea!
Noche2
@David: Y el segundo problema ocurre cuando cambiamos la hora / minuto hacia arriba o hacia abajo más de 24/60 veces: ¡ Pruébelo en línea!
Noche2
@ Davіd: Pero gracias a su método de bucle, podría reducir 1 byte más: ¡ Pruébelo en línea!
Noche2
ah, está bien, lo siento, no funcionó por completo :)
Davіd
4

JavaScript, 104 103 bytes

Toma la entrada como una matriz de caracteres, usando <>^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)

Pruébalo en línea

Lanudo
fuente
3

Haskell, 236 bytes

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

fes la función principal y tiene el tipo 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"

Esencialmente uy vson funciones recursivas de tipo recíprocamente Integer -> Integer -> String -> String. Toman la hora, los minutos y una lista de caracteres sobre el conjunto {v,^,<,>}, y devuelven la cadena de tiempo. uactúa como si el marcador de hora estuviera resaltado, llamando recursivamente usi el encabezado de la lista está dentro {v,^}y vsi el encabezado de la lista está dentro {<,>}.ves similar pero para el dial de minutos.

Todo lo demás es solo salvar personajes.

AlexJ136
fuente
3

Lua , 132 bytes

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'

Pruébalo en línea!


Explicación

Esta es una función anónima (una forma de usarla se muestra en el enlace).

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
fuente
La salida debe estar en el HH:mmformato, en lugar de una tabla
Jo King
2

Java 8, 121 bytes

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

La respuesta C del puerto de Jonathan Frech . Acepta . Pruébelo en línea aquí .^v<>

OOBalance
fuente
2

Jalea , 36 bytes

Creo que O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:debería funcionar para 32, pero œṡ parece que actualmente tiene un error .

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

Un programa completo que imprime el resultado en STDOUT (como enlace monádico, en realidad devuelve una lista mixta de enteros (aunque de un solo dígito) y caracteres (el : ).

Utiliza el udlr opción de entrada.

Pruébalo en línea!O ver un pruebas .

¿Cómo?

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
fuente
2

QBasic , 229 bytes

Un script que toma entradas como pulsaciones de teclas y salidas a la consola.

Nota: los terminales "se incluyen solo para resaltar la sintaxis y no contribuyen al recuento de bytes

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

Comentado

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
fuente
1
¿No debería ser eso (m+y)?
Neil
En la nota, ¿no se debe hacer ?
Jonathan Frech
@ JonathanFrech - Sí, debería ser. Gracias por mantener mi gramática bajo control
Taylor Scott
Lo siento, pensé que mfue por minutos por alguna razón ... Veo que tu versión comentada es más legible.
Neil
2

PowerShell, 109 103 bytes

-6 byte gracias 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 prueba:

$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"
}

Salida:

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

Explicación

La idea básica es utilizar a [hashtable], que keysson comandos de control y valuesbloques de script. El código ejecuta el bloque de script para cada comando a partir de argumentos.

mazzy
fuente
1
Puede deshacerse de $i=0convertir su índice de matriz como $t[+$i]para guardar algunos bytes. Pruébalo en línea!
AdmBorkBork
2

Perl 6 , 101 91 89 86 bytes

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

Pruébalo en línea!

Bloque de código anónimo que toma una cadena de uldrcaracteres y regresa en el formato dado

Jo King
fuente
1

perl -F // -E, 72 bytes

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

fuente
1

Python, 120 bytes

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 dice reinstalar a Mónica
fuente
Esto parece un fragmento que toma datos en una variable. Como regla general, requerimos respuestas para presentar un programa completo (tomando la entrada de los argumentos del programa o la entrada estándar) o una función (tomando la entrada de los parámetros de la función).
OOBalance
1
Además, ¿esto no chocará con una pared cuando una entrada de, digamos, ldo rruhace ique abandone el rango (0,1) y luego o[i]se accede a ella?
OOBalance
@OOBalance oh gracias por recordarme que necesitas función o unput(). A partir de los requisitos, pensé que las acciones L y R nunca se repetirán (es decir, no LL)
aaaaa dice que reinstalará a Monica el
@aaaaaa Sin bucle significa lllque no es lo mismo que r. Tener llo rres entrada válida, también está en los casos de prueba, vea el tercero, por ejemplo.
Nit
Esta respuesta actualmente tiene un IndexError en el tercer caso de prueba en lugar de generar 23:59. Pruébalo en línea!
0
1

Haskell , 186 bytes

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

Pruébalo en línea!

Laikoni
fuente
1

R, 368355 bytes

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

Definitivamente no es el mejor enfoque, pero funciona.

Funcionalidad: Ejecute la función, escriba cada letra en el pliegue (in / de) o muévase hacia la izquierda / derecha, escribiendo "s" finaliza el "juego". El problema es que aceptará una y solo una letra a la vez.

-13 bytes Consolidó algunos valores en una fila, sobrescribió T como F en lugar de usar break, encontró varios espacios para eliminar y en su lugar se almacenó una cadena en una variable

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

También estoy editando un formato alternativo para aceptar una cadena R y / o un vector, publicaremos la próxima semana.

Sumner18
fuente
1

SmileBASIC, 123 bytes

@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() devuelve un número entero donde cada bit representa un botón

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

BUTTON(2) solo devuelve los botones que se presionaron (no se mantienen)

WAIT se requiere porque BUTTON solo se actualiza una vez por fotograma (1/60 de segundo). De lo contrario, la misma presión del botón se detectaría varias veces.

Esto definitivamente puede ser más corto

12Me21
fuente
0

05AB1E , 38 37 bytes

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

Usa udlrlas instrucciones, pero también podría usar ^v<>el mismo número de bytes (los caracteres ↑↓←→no forman parte de la página de códigos de 05AB1E, por lo que usarlos aumentaría mucho el número de bytes, ya que la codificación debería cambiarse a ASCII).

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

'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)

Ver este consejo 05AB1E mío (sección Cómo comprimir grandes números enteros? ) Para entender por qué Ž9¦es 2460.

Kevin Cruijssen
fuente