Ajustando a hora

27

Imagine o seguinte relógio de 24 horas que pode ser controlado por teclas de seta:

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

Pressionar a seta para cima duas vezes ( ↑↑) aumentará a entrada de hora focada no momento:

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

Pressionar a seta para a direita ( ) focalizará a outra entrada.

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

Pressionar a seta para baixo três vezes ( ↓↓↓) agora diminuirá esta entrada.

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

Em breve:

  • A seta para cima ( ) aumentará a entrada atualmente ativa.
  • A seta para baixo ( ) diminuirá a entrada ativa.
  • A seta direita ( ) moverá o foco para a entrada direita.
  • A seta esquerda ( ) moverá o foco para a entrada esquerda.
  • O movimento para cima e para baixo girará como esperado para uma entrada de tempo.
  • Os movimentos esquerdo e direito não circulam.

O desafio

O relógio começa 00:00com a entrada da hora ativa (consulte o primeiro esquema). Dada uma lista de comandos de entrada, produza a hora resultante em HH:mmformato.
A entrada pode ser uma sequência ou uma lista (ou o idioma equivalente), onde as diferentes direções de entrada podem ser uma das opções abaixo:

  • ↑↓←→
  • udlr
  • ^v<>
  • a tecla de seta real pressiona se o seu programa tiver uma GUI

Aplicam-se brechas padrão.

Casos de teste

↑↑→↓↓↓ = 02:57
↓→↑←↑→↓ = 00:00
↓→→↓ = 23:59
←←←←→↑ = 00:01
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓→↓ = 23:59
Nit
fonte
1
@JonathanFrech Uma das opções fornecidas, escolher quatro valores únicos (por exemplo 0123) facilitaria muito o desafio em determinados idiomas, sem beneficiar outros.
Nit
1
@LuisfelipeDejesusMunoz Sim, isso é realmente escrito de acordo com as regras de entrada.
Nit
3
Eu acho que isso teria sido mais desafiador se incluísse segundos. Este teria mais lógica por trás qual está em foco
Jo rei
3
Falta uma regra especial para lidar com o código da Konami.
Coredump
1
@coredump Considerou, mas provavelmente levaria mais espaço do que o núcleo da resposta na maioria dos idiomas.
Nit

Respostas:

39

HTML no Google Chrome 67 em chinês (simplificado), 39 bytes

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

Captura de tela

O Chrome mostra diferentes componentes da interface do usuário em um idioma diferente. Mesmo uma entrada de tempo simples: AM / PM será mostrado se você estiver usando o inglês (EUA). Se você quiser testar isso, altere o idioma do seu Chrome. Não entenda como alterá-lo novamente.

tsh
fonte
2
cara !! hahah eu acho que não é válido tho
Luis felipe De jesus Munoz
2
Bater direito duas vezes vai AM/PMpara mim
Jo King
1
@JoKing Eu acho que depende da localidade / configurações?
Nit
1
@JoKing Isso depende da localidade. Talvez tente alterar o idioma do Chrome para chinês Simplificar? (Não desenvolva como alterá-lo novamente.)
tsh
1
Funciona no firefox 61.0.1
Francisco Hahn
12

C (gcc) , 117 107 bytes

  • Economizou dez bytes graças a 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);}

Experimente online!

Jonathan Frech
fonte
4
Nomeação de variável agradável.
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);} Experimente on-line!
L4m2 18/07/19
6

Stax , 36 35 33 32 bytes

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

Execute e depure

Usos lrud.

Explicação:

'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
fonte
6

Python 2 , 105 bytes

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)

Experimente online!

ovs
fonte
5

JavaScript (Node.js) , 103 bytes

Recebe a entrada como uma string, usando udlr.

s=>(Buffer(s).map(n=>n%6?s%4?m+=n%2||59:h+=n%2||23:s=n,h=m=0),g=n=>('0'+n).slice(-2))(h%24)+':'+g(m%60)

Experimente online!

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

Experimente online!

Usando ^v<>.

Este me fez perceber que o operador de módulo em C # não funciona como esperado, porque em C # -1 % 60 = -1, então eu preciso fazer essa operação estranha no final.

Charlie
fonte
Não é possível (h [1]% 60 + 60)% 60 ser substituído por (h [1] +60)% 60?
18718 IanF1
2
@ IanF1 não, você não pode. E se o usuário pressionar o botão para baixo 100 vezes? Ou 1000 vezes?
1877 Charlie
obrigado por esclarecer :) é surpreendente para mim que esse caminho é mais curto do que aplicar o módulo em tempo real (com 59 no lugar de -1).
18718 IanF1
5

Lua (estrutura 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

Versão sem migalhas:

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

Provavelmente ainda não é 100% fácil de ler, porque todos os ifs são trocados com uma declaração trinária (..e ..ou) :)

se iniciado em um main.lua com amor, ele abrirá uma janela e você poderá pressionar as teclas de seta para alterar os números

Lycea
fonte
você também pode postar uma versão expandida para facilitar a leitura
aaaaa diz restabelecer Monica
Claro, eu adicionei uma versão expandida nenhum problema :)
Lycea
4

MATL , 57 56 55 bytes

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

Experimente online!

Representa horas e minutos usando números complexos, com a parte real sendo horas e a parte imaginária da parte.

Com comentários:

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 - Restabelecer Monica
fonte
4

PHP , 145 134 133 bytes

(-11 bytes por mais golfe)

(-1 byte usando o método de loop 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 executá-lo:

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

Exemplo:

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

Ou Experimente online!

Notas:

  • Para salvar alguns bytes, usei cadeias sem aspas simples / duplas como invólucro de cadeia. Portanto, a error_reporting=0opção é usada para não emitir avisos.
  • Comandos de entrada: u d l r
Night2
fonte
128 bytes, -6: Experimente online! (Solução agradável, btw :) #
194 Davіd
@ David: Obrigado, mas sua atualização tem dois problemas. A primeira é que $ h não está definido; portanto, diminuí-lo no início falha: experimente online!
night2
@ David: E a segunda questão acontece quando alternamos horas / minutos para cima ou para baixo mais de 24/60 vezes: Experimente online!
night2
@ David: Mas, graças ao seu método de loop, eu poderia reduzir mais 1 byte: Experimente online!
night2
ah, tudo bem, desculpe, não funcionou completamente :) #
194 Davіd
4

JavaScript, 104 103 bytes

Recebe a entrada como uma 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)

Experimente online

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

fé a função principal e tem o 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"

Essencialmente ue vsão funções mutuamente recursivas do tipo Integer -> Integer -> String -> String. Eles pegam a hora, o minuto e uma lista de caracteres no conjunto {v,^,<,>}e retornam a sequência de horas. uage como se a discagem horária estivesse destacada, chamando recursivamente use o cabeçalho da lista está {v,^}e vse o cabeçalho da lista está {<,>}. vé semelhante, mas para a discagem por minuto.

Tudo o resto é apenas salvar personagens.

AlexJ136
fonte
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'

Experimente online!


Explicação

Esta é uma função anônima (uma maneira de usá-la é mostrada no link).

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
fonte
A saída deve estar no HH:mmformato, em vez de em uma tabela
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);}

Resposta C de Port of Jonathan Frech . Aceita . Experimente online aqui .^v<>

OOBalance
fonte
2

Gelatina , 36 bytes

Eu acredito que O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:deve funcionar para 32, mas œṡ atualmente parece ter um bug .

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

Um programa completo que imprime o resultado em STDOUT (como um link monádico, na verdade, ele retorna uma lista mista de números inteiros (embora com apenas um dígito) e caracteres (o : ).

Usa a udlropção para entrada.

Experimente online!Ou veja uma suíte de testes .

Quão?

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

APL (Dyalog Classic) , 97 84 bytes

5↑∊{¯3'0',':',⍨⍕⍵}¨24 60|A⊣⍎¨'⎕IO←1' '⎕IO←0' 'A[1]+←1' 'A[1]-←1'['←→↑'⍳⍞,'←']⊣A0 0

Experimente online!

Requer ⎕IO←1

Zacharý
fonte
2

QBasic , 229 bytes

Um script que recebe entrada como pressionamentos de tecla e sai para o console.

Nota: o terminal "está incluído apenas para realçar a sintaxe e não contribui para o bytecount

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
fonte
1
Não deveria ser (m+y)?
Neil
Na nota, não deve não ser fazer ?
22618 Jonathan Frech
@ JonathanFrech - Sim, deveria ser. Obrigado por manter a minha gramática em cheque
Taylor Scott
Desculpe, pensei mpor alguns minutos por algum motivo ... Vejo que sua versão comentada é mais legível.
Neil
2

Powershell, 109 103 bytes

-6 bytes graças 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 teste:

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

Saída:

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

Explicação

A idéia básica é usar um [hashtable] , que keyssão comandos de controle e valuessão blocos de script. O código executa o scriptblock para cada comando a partir de argumentos.

confuso
fonte
1
Você pode se livrar $i=0lançando seu índice de matriz como $t[+$i]para salvar alguns bytes. Experimente online!
AdmBorkBork
2

Perl 6 , 101 91 89 86 bytes

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

Experimente online!

Bloco de código anônimo que recebe uma sequência de uldrcaracteres e retorna no formato especificado

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

fonte
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 diz restabelecer Monica
fonte
Parece um fragmento que recebe entrada em uma variável. Como regra geral, precisamos de respostas para apresentar um programa completo (recebendo dados dos argumentos do programa ou entrada padrão) ou uma função (recebendo dados dos parâmetros da função).
OOBalance
1
Além disso, não esta corrida em uma parede quando uma entrada de, digamos, ldou rrucausas ipara deixar o intervalo (0,1) e o[i]é acessado depois?
OOBalance
@OOBalance oh obrigado por me lembrar que você precisa de uma função ou unput(). A partir dos requisitos, imaginei que as ações L e R nunca ocorreriam (isto é, não LL)
aaaaa diz restabelecer Monica
@aaaaaa Nenhum loop significa que lllnão é o mesmo que r. Tendo llou rré uma entrada válida, também está nos casos de teste, veja o terceiro por exemplo.
Nit
Atualmente, esta resposta possui um IndexError no terceiro caso de teste, em vez de emitir 23:59. Experimente online!
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

Experimente online!

Laikoni
fonte
1

R, 368 355 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 não é a melhor abordagem, mas funciona.

Funcionalidade: Execute a função, digite cada letra para (in / de) amassar ou mover para a esquerda / direita, digitando "s" termina o "jogo". O problema é que ele aceita uma e apenas uma letra de cada vez.

-13 bytes Consolidou alguns valores em uma linha, substituiu T como F em vez de usar quebra, encontrou vários espaços para eliminar e uma sequência armazenada em uma variável

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

Também estou editando um formato alternativo para aceitar uma string R e / ou vetor, que será publicada na próxima semana.

Sumner18
fonte
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() retorna um número inteiro em que cada bit representa um botão

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

BUTTON(2) retorna apenas os botões que foram pressionados (não estão sendo mantidos)

WAIT é necessário porque BUTTON somente é atualizada uma vez por quadro (1/60 de segundo). Caso contrário, o mesmo pressionar o botão seria detectado várias vezes.

Definitivamente, isso pode ser mais curto

12Me21
fonte
0

05AB1E , 38 37 bytes

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

Usos udlr as instruções, mas também pode ser usado ^v<>para a mesma contagem de bytes (os caracteres ↑↓←→não fazem parte da página de código do 05AB1E, portanto, usá-los aumentaria muito a contagem de bytes, pois a codificação deveria ser alterada para ASCII).

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Veja este 05AB1E ponta do meu (seção Como comprimir grandes inteiros? ) Para entender por que Ž9¦é 2460.

Kevin Cruijssen
fonte