Simule meu estúpido despertador antigo


25

Eu tenho um velho despertador estúpido com dois botões: houre minute. O hourbotão incrementa a hora de um alarme definido e minuteaumenta a hora em minutos de um alarme definido. No entanto, alguns designers inteligentes perceberam que pressionar os dois botões ao mesmo tempo deveria ter um significado e decidiram que pressionar houre minutesimultaneamente faria com que o alarme fosse definido como 12:00 am/ 0:00. Sua tarefa é simular esse comportamento.

Tarefa

Dada a hora de início e uma sequência de estados dos botões, calcule a hora de término.

A partir da hora de início, aumente a hora para cada ocorrência de (1,0), aumente o minuto para cada ocorrência de (0,1)e defina a hora 0:00para cada ocorrência de (1,1). Os estados (0,0)devem ser ignorados porque correspondem a nenhum botão sendo pressionado.

Ao adicionar minutos e horas, se o minuto / hora ultrapassar o máximo, defina-o como 0, isto é, incrementar um valor minuto de 59deve definir o valor minuto 0e incrementar um valor de hora 23deve definir o valor da hora 0. Incrementar valores de minuto / hora acima de seus limites não afeta o outro valor, por exemplo, incrementar o minuto de 10:59rendimentos 10:00, não 11:00.

Exemplo

Dado o tempo de entrada 13:58e as etapas [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). Isso corresponde a minuteser pressionado. A hora é agora 13:59.
  2. (0,1). Isso corresponde a minuteser pressionado. A hora é agora 13:00.
  3. (0,1). Isso corresponde a minuteser pressionado. A hora é agora 13:01.
  4. (0,0). Isso corresponde a nenhum botão sendo pressionado. A hora, não afetada, é agora13:01
  5. (1,1). Isso corresponde aos dois botões sendo pressionados. A hora é agora 0:00.
  6. (1,0)Isso corresponde a hourser pressionado. A hora é agora 1:00.

Desde que terminamos 1:00, é a saída.

I / O

A entrada consistirá em um tempo e uma sequência de estados dos botões. A saída é uma única vez.

O tempo de entrada e o tempo de saída podem ser

  • uma tupla de duas horas (hour, minute)ou (minute, hour)em um 24horário, como (13, 30)( hourvaria de 0a 23e minutevaria de 0a 59)
  • igual ao tempo anterior, mas em uma 12hora, e um interruptor booleano am/ pm( hourvaria de 0para 11ou para 12e com de para ).111minute059
  • alguns minutos desde 0:00810 (de 0 a 1439, inclusive)
  • qualquer outro formato que codifique a mesma informação

A sequência dos estados dos botões é uma representação de uma lista de 2 tuplas booleanas, por exemplo:

  • uma lista de tuplas: [(0,1),(1,0),(0,0),(1,1)]
  • uma sequência delimitada por espaço: "01 10 00 11"
  • uma linha: "01100011"
  • em Quaternário: [1,2,0,3]
  • convertido em um número inteiro: 99
  • qualquer outro formato que codifique a mesma informação

Casos de teste

time,steps -> output
06:49,[(0, 1)] -> 06:50
12:23,[(1, 0)] -> 13:23
02:23,[(0, 1), (1, 0)] -> 03:24
21:40,[(0, 1), (0, 1), (0, 1), (0, 1)] -> 21:44
13:10,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 1), (0, 1), (0, 1)] -> 00:02
21:33,[(1, 0), (0, 1), (1, 0), (0, 1)] -> 23:35
14:21,[(0, 1), (0, 1), (0, 1)] -> 14:24
02:39,[(0, 0), (0, 1)] -> 02:40
16:07,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 19:16
17:55,[(0, 1), (1, 0), (0, 1)] -> 18:57
15:55,[(1, 0), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0)] -> 23:00
22:11,[(0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 00:19
03:58,[(1, 0), (0, 0), (0, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1)] -> 07:03
13:02,[(0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0)] -> 16:06
04:37,[(1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (1, 0)] -> 08:47
00:01,[(0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 03:08
02:58,[(1, 0), (1, 0), (0, 1)] -> 04:59
01:43,[(0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1)] -> 04:52
07:54,[(1, 0), (0, 1), (1, 0), (1, 0), (1, 1)] -> 00:00
09:33,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 10:38
09:01,[(0, 1), (0, 1)] -> 09:03
19:04,[(0, 1), (1, 0), (0, 1), (1, 0)] -> 21:06
11:17,[(0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 1), (0, 1), (0, 1)] -> 00:02
19:32,[(0, 1), (1, 0), (0, 1), (1, 0), (1, 0), (1, 0)] -> 23:34
17:31,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 0), (1, 1), (0, 1)] -> 00:01
06:46,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)] -> 18:16



Um formato de entrada dos dois conjuntos de dados como uma lista é aceitável? Por exemplo [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan

@JonathanAllan Sim.
fireflame241

O que 1200am significa em tempo digital normal?
precisa saber é o seguinte

Respostas:


8

Gelatina , 13 bytes

_`+Ạ}?/%24,60

Experimente online!


Observe, não tenho certeza de que podemos simplesmente seguir em frente e usar esse formato de entrada (então perguntei), pois o OP indica "A sequência de estados dos botões é uma representação de uma lista".
Jonathan Allan

@JonathanAllan Se sim, então OP vai comentar sobre a minha resposta, mas eu estou usando o formato exato que você usou em seu comentário ... às vezes é que OP é preguiçoso ou se esqueceu de atualizar o desafio
Erik o Outgolfer

6

C, 89 87 bytes

Agradecemos a Jonathan Frech por salvar dois bytes!

f(h,m,s)char*s;{for(;*s;++s)*s++&1?*s&1?h=m=0:++h:*s&1&&++m;printf("%d %d",h%24,m%60);}

Experimente online!


6

Gelatina ,  21  (17?) 19 bytes

17 bytes? - Se o formato de entrada: [[initHour, initMinute], [a1, b1], [a2, b2], ...]for aceitável, teríamos um link monádico e poderemos removerW; do início da segunda linha.

Nota: Isso agora está convergindo para a resposta da Erik the Outgolfers Jelly , por isso não vou me preocupar mais em jogar golfe (eu não a tinha visto) ...

N⁹⁹Ạ¤?+⁸
W;ç/%24,60

Um link diádico que obtém uma lista da hora inicial como números inteiros [hour, minute](24 horas) à esquerda e uma lista de estados de botão [[hourPressed, minPressed], ...]à direita
que retorna uma lista da hora do resultado final como números inteiros, novamente [hour, minute](24 horas).

Experimente online! ou veja a suíte de testes

Quão?

N⁹⁹Ạ¤?+⁸ - Link 1, nextState: list, currentState [cH, cM]; list, presses [pH, pM]
     ?   - if:
    ¤    - ...condition: nilad followed by link(s) as a nilad:
  ⁹      -   chain's right argument, presses
   Ạ     -   all truthy? (1 for [1,1] 0 otherwise)
N        - ...then: negate (the left argument, currentState, i.e. [-cH, -cM])
 ⁹       - ...else: chain's right argument, presses
       ⁸ - chain's left argument, currentState
      +  - add
           i.e.: if presses was [1,1] then [cH+-cH,cM+-cM]=[0,0]
                 otherwise [cH+pH,cM+cM]

W;ç/%24,60
     24,60 - literal list of integers [24,60]
    %      - modulo by (vectorises)

-1 byte substituindo ⁹Ạ¤por Ạ}. Outro -2 para usar um formato permitido. Finalmente, um outro -1 porque a cadeia a antes µaqui é chamado como uma díade ..
Erik a Outgolfer


5

Retina , 75 bytes

.*,1:1
:
\d+
$*
O`\D1*
,

1>`:

+`1{24}:|:1{60}
:
(?<=^|:)1*
$.&
\b\d\b
0$&

Experimente online! O link inclui casos de teste. Explicação:

.*,1:1
:

Exclua tudo, inclusive o último pressionamento do botão duplo, substituindo-o por um tempo vazio (caso esse seja o último pressionamento do botão).

\d+
$*

Converta para unário.

O`\D1*

Ordene os minutos até o fim.

,

Adicione as horas juntos.

1>`:

Adicione os minutos, mas mantenha as horas separadas.

+`1{24}:|:1{60}
:

Reduza as horas e minutos do módulo 24 ou 60, conforme apropriado.

(?<=^|:)1*
$.&

Converta para decimal.

\b\d\b
0$&

Formate para dois dígitos.


4

Python 3, 135 117 115 bytes

-20 bytes graças a Jonathan Frech

def a(m,f):
 for b,c in f:
  if b&c:m=[0,0]
  elif b:m[0]=-~m[0]*(m[0]<23)
  elif c:m[1]=-~m[1]*(m[1]<59)
 return m

Experimente online!

Leva o tempo como uma lista no formulário [hour, minute].


Você pode substituir (m[0]+1)por -~m[0]e if m[0]<23 else 0com *(m[0]<23).
Jonathan Frech 16/09

Além disso, como be csempre são valores booleanos, você pode substituir b+c>1por b&c.
Jonathan Frech 16/09

76 bytes (link encurtado, devido a TIO sendo a grande para a caixa de comentário)
Halvard Hummel


4

JavaScript (ES6), 55 bytes

t=>a=>a.map(x=>x>2?t=[0,0]:t[x-1]++)&&[t[0]%60,t[1]%24]

Recebe entrada na sintaxe de curry, com o horário de início no formato da matriz [min, hour]e as etapas como uma matriz quaternária. O tempo de saída está no mesmo formato que o tempo de entrada.

Casos de teste


3

Perl 6 , 40 bytes

{.reduce({(@^a Z+@^b)X*!@b.min})Z%24,60}

Experimente online!

Leva uma lista contendo a hora de início seguida pelo pressionamento do botão. Retorna o horário final. Tempos e botões são (hour, minute)pares. 24 horas.


3

Perl 5 , 70 bytes

69 bytes de código + 1 para -nsinalizador

s/.*d/0:0/;/(.*):(\d+)/;printf"%02d:%02d",($1+y/c//)%24,($2+y/b//)%60

Experimente online!

Formato de entrada

hh:mm,abcdabcdabcdaddccbbaa

Onde:

hh=start hour
mm=start minute
 a = (0, 0) = no buttons pressed
 b = (0, 1) = minute button pressed
 c = (1, 0) = hour button pressed
 d = (1, 1) = both buttons pressed

Espaços ou outros separadores entre as prensas são insignificantes.

Explicação

s/.*d/0:0/;    # If both buttons were ever pressed, previous presses
               # don't matter.  Get rid of them and set start time to midnight.
/(.*):(\d+)/;  # Extract start hour and minute
printf"%02d:%02d",            # Output numbers with leading 0
($1+y/c//)%24,                # Take starting hour, add number of presses, remainder 24
($2+y/b//)%60                 # Take starting minute, add number of presses, remainder 24

3

Rápido , 106 96 bytes

-10, graças ao Xcoder

func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}

Experimente em ideone!

A função assumirá o valor inicial e a matriz de tuplas e retornará a hora final.


96 bytes , por impressão a stdOut vez: func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}. Isso também se livra typealias.
Xcoder

1
A propósito, bem-vindo ao PPCG! Primeira resposta incrível.
Xcoder

muito obrigado, na verdade eu usei print () primeiro ... mas esqueci depois de alternar entre diferentes implementações. Obrigado novamente por sua ajuda.
Naresh

1

Logotipo da tartaruga, 304 bytes

Não otimizado; muitos espaços.

MAKE "M :B MAKE "H :A LABEL "L IF EMPTY? :I OP LIST :H :M MAKE "C FIRST :I IF AND ((ITEM 2 :C)=1) ((ITEM 1 :C) = 0) MAKE "M :M+1 IF :M=60 MAKE "M 0 IF AND ((ITEM 1 :C) = 1) ((ITEM 2 :C)=1 MAKE "M 0 MAKE "H 0 IF AND ((ITEM 1 :C)-1) ((ITEM 2 :C) = 0) MAKE "H :H + 1 IF :H = 23 MAKE "H 0 MAKE "I BF :I GO "L

Leva uma lista como sua primeira entrada e a hora inicial + minuto (entradas separadas) como segunda e terceira, respectivamente.

Não consigo copiar + colar do Terrapin Logo, pois é uma versão de teste, então é isso :(


1

R , 61 bytes

function(I,B){for(b in B)I=I+"if"(sum(b)>1,-I,b)
I%%c(24,60)}

Toma Icomo um vetor comprimento-2 c(H,M)e Bcomo uma lista de vetores comprimento-2 para os botões c(H,M),. Repete B, definindo Icomo c(0,0)se a soma é 2. Então mods no final. Há também uma função no cabeçalho para traduzir o pressionamento de botão no formato R certo, se você quiser testá-los todos; leva a matriz[(H,M),...] como uma string.

Experimente online!


1

C # (.NET Core) , 93 bytes

(n,l)=>{for(int i=0,x;i<n.Length;){x=n[i++];if(x>1)l[0]=l[1]=0;else{l[x]=++l[x]%(24+36*x);}}}

Experimente online!

Recebe entrada como em trinário, com 0 == (1,0), 1 == (0,1), 2 == (1,1) e o tempo em uma matriz com o índice 0 sendo horas e 1 sendo minutos. Modifica o intervalo de tempo no local.



0

Mathematica, 54 bytes

Switch[#2,a={0,0},#,a+1,a,_,Mod[+##,{24,60}]]&~Fold~#&

Função anônima. Toma uma lista de 2 tuplas como entrada e retorna uma 2 tuplas como saída.


0

Scala , 116 bytes

Então, apenas tomo a hora de início como dois primeiros parâmetros da minha func ( he m) e tomo a sequência de entrada como uma matriz [Tuple2].

var x=h
var y=m
for(u<-a)u match{case (0,1)=>y=(y+1)%60
case (1,0)=>x=(x+1)%24
case (1,1)=>{x=0;y=0}
case _=>}
(x,y)

Gostaria de saber ... devo contar a declaração de funções ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={mais o final} ) na contagem de bytes?

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.