Quando as luzes piscam?

10

Imagine que você tem duas luzes. Essas luzes piscam e acendem a uma taxa específica:

Light 0: Delay 0ms and then blink every 1000ms
Light 1: Delay 500ms and then blink every 1000ms

Vamos simular essas luzes nos primeiros 2000ms:

0ms:    Light 0 on
500ms:  Light 1 on
1000ms: Light 0 off
1500ms: Light 1 off
2000ms: Light 0 on

O desafio

Dada uma lista de pares ordenados representando o tempo das luzes, escreva um programa ou função para produzir a sequência para quando piscarem.

Entrada

A entrada deve estar no seguinte formato:

TimeToSimulate
Light0Delay,Light0Period
Light1Delay,Light1Period
...

Nesse formato, o exemplo acima seria:

2000
0,1000
500,1000

Resultado

A saída deve ser uma série de triplos ordenados:

Time,LightNum,LightStatus

LightStatus é um valor verdadeiro se a luz acender e um valor falso se a luz se apagar.

A saída do exemplo acima seria:

0,0,True
500,1,True
1000,0,False
1500,1,False
2000,0,True

Se duas luzes piscarem ao mesmo tempo, a luz com o número mais baixo deve aparecer primeiro na saída.

Outras coisas

  • Os formatos de entrada e saída não são rigorosos
  • O código não deve produzir erros
  • A solução não deve depender das condições da corrida
  • Sem brechas padrão
  • Isso é , então a solução mais curta vence!

Casos de teste

Input:

2000
0,1000
500,1000

Output:

0,0,True
500,1,True
1000,0,False
1500,1,False
2000,0,True

----

Input:

2
0,1
0,1

Output:

0,0,True
0,1,True
1,0,False
1,1,False
2,0,True
2,1,True

----

Input:

500
100,50
200,100
300,150

Output:

100,0,True
150,0,False
200,0,True
200,1,True
250,0,False
300,0,True
300,1,False
300,2,True
350,0,False
400,0,True
400,1,True
450,0,False
450,2,False
500,0,True
500,1,False

----

Input:

1000
23,345
65,98
912,12
43,365

Output:

23,0,True
43,3,True
65,1,True
163,1,False
261,1,True
359,1,False
368,0,False
408,3,False
457,1,True
555,1,False
653,1,True
713,0,True
751,1,False
773,3,True
849,1,True
912,2,True
924,2,False
936,2,True
947,1,False
948,2,False
960,2,True
972,2,False
984,2,True
996,2,False

Snippet da tabela de classificação:

Daniel M.
fonte
Quanta saída é suficiente?
aschepler
@aschepler O que você quer dizer? A entrada especifica uma quantidade de tempo para "simular"
Daniel M.

Respostas:

3

JavaScript, 98 97 bytes

a=>b=>[...Array(a+1)].map((_,i)=>b.map((d,j)=>d[0]--||c.push([i,j,d[d[0]=d[1]-1,2]^=1])),c=[])&&c

Experimente online

Salvei um byte graças a Shaggy - use a sintaxe de entrada de curry.


fonte
Salvar um byte com currying: a=>b=>.
Shaggy
@Shaggy. Você é tão rápido, eu estava preparando uma edição.
Regra geral: se houver 2 entradas, sempre faça caril!
Shaggy
3

Python 2 , 93 bytes

lambda t,l:sorted(sum([zip(range(x[0],-~t,x[1]),[i]*-~t,[1,0]*t)for i,x in enumerate(l)],[]))

Experimente online!

Cajado
fonte
2

Geléia ,  26  25 bytes

Ḣrm⁸ð€µ;€€"J;"J$€€ẎẎḂ0¦€Ṣ

Um link diádico que obtém uma lista de listas de delay, periodnúmeros e um número de período e retorna uma lista de time, light, actionnúmeros inteiros.

As luzes são indexadas em 1 e 0representam a ação 'off', enquanto 1representam a ação 'on'.

Experimente online!

Como?

Ḣrm⁸ð€µ;€€"J;"J$€€ẎẎḂ0¦€Ṣ - Link: [[delay, period],...], time-frame 
    ð€                    - for €ach [delay, period]:
Ḣ                         -   head (get the delay and modify the item to [period])
 r                        -   inclusive range to time-frame = [delay,delay+1,...,time-frame]
   ⁸                      -   chain's left argument = [period]
  m                       -   modulo slice = [delay, delay+period, delay+2*period, ...]
      µ                   - monadic chain separation, call that v
           J              - range(length(v)) = [1,2,...,nLights]
          "               - zip with:
       ;€€                -   concatenate for €ach for €ach (add light indexes to times)
               $€€        - last two links as a monad for €ach for €ach:
              J           -   range (length(switch-times-for-a-light))
             "            -   zip with:
            ;             -     concatenation (i.e. append a 1-based index)
                  ẎẎ      - tighten & tighten again (flatten by 2 to a list of triples)
                      |€  - sparse application of (for €ach):
                     0    - ...to indexes: 0 (=last entry)
                    Ḃ     - ...action: modulo by 2 (even appended indexes ->0s; odds -> 1s)
                        Ṣ - sort the resulting list of triples
Jonathan Allan
fonte
2

Python 2 , 206 214 bytes

  • Foram adicionados oito bytes para cumprir as regras (recebendo entrada via stdin).
Q=input();D,T=Q[0],[map(int,q.split(","))for q in Q[1:]];O,l=[],len(T)
for j in range(l):
	t,b=T[j][0],9>8
	while t<=int(D):O+="%0*d,%0*d,%s"%(len(D),t,len(str(l)),j,b),;b=not b;t+=T[j][1]
print"\n".join(sorted(O))

Experimente online!

Este código gera uma lista não ordenada contendo os tempos de comutação de cada luz, preenchendo esses horários e o identificador da luz, classifica a lista e a gera.

Jonathan Frech
fonte
Por regras padrão, você deve receber informações que não pode esperar que elas preexistam em uma variável. Você provavelmente descobrirá que o uso input()permitirá reduzir também a contagem de bytes (nenhuma análise de string será necessária, pois o Python 2 input()é eval(raw_input())) :).
Jonathan Allan
... também se você usar números em vez de cordas em Oque eles vão resolver, o que provavelmente também cortar a contagem de bytes,
Jonathan Allan
@ JonathanAllan Obrigado por perceber a discrepância da regra; Não incorporarei suas sugestões, pois já há uma resposta Python 2 significativamente mais curta.
Jonathan Frech
1

Perl 5 , 106 + 1 (-n) = 107 bytes

($a[$i],$b[$i++])=eval for<>;for$i(0..$_){for(0..$#a){$a[$_]+=$b[$_],say"$i,$_,".($s[$_]^=1)if$i==$a[$_]}}

Experimente online!

Xcali
fonte
1

Haskell, 121 bytes

import Data.List
t!l=sort$(zip[0..]l)>>=takeWhile(\(a,_,_)->a<=t).(\(i,(d,w))->iterate(\(t,i,s)->(t+w,i,not s))(d,i,2>1))

Experimente online.

Este é o programa do qual comecei:

import Data.List

type LightId = Int
type Time = Int
type State = Bool
type LightEvent = (Time, LightId, State)

lightSimulation :: Time -> Time -> [(Time, State)]
lightSimulation delay interval = iterate step (delay, True)
  where step (time, state) = (time+interval, not state)

addId :: LightId -> (Time, State) -> LightEvent
addId id (t, s) = (t, id, s)

simulate :: Time -> [(Time, Time)] -> [LightEvent]
simulate timeLimit lights = sort $ concatMap lightSim (zip [0..] lights)
  where withinTimeLimit = ((<=timeLimit) . fst)
        lightSims (id, (delay, interval)) = map (addId id) $ takeWhile withinTimeLimit (lightSimulation delay interval)

E antes do golfe final, reduzi-o para:

import Data.List

light (id,(delay,interval)) = iterate step (delay, id, True)
  where step (time, id, state) = (time+interval, id, not state)

simulate timeLimit lights = sort $ concatMap lightSims (zip [0..] lights)
  where lightSims l = takeWhile(\(a,b,c)->a<=timeLimit)$light l
Cristian Lupascu
fonte
1

Röda , 105 87 85 bytes

{|t|enum|[([_+_]*(t-_1[0]+1))()|enum|(_+_)]|{[[_+_4,_3,_4//_2%2=0]]if[_4%_2=0]}|sort}

Experimente online!

Explicação:

{|t| /* Declare a lambda with one parameter */
/* The input stream contains arrays */
enum| /* For each array in the input, push an ascending number after it */
/* [1] (for stream content in this point, see below) */
[ /* For each array-number pair in the stream: */
    (
        [_+_] /* Create a copy of the array with the number as the last element */
        *(t-_1[0]+1) /* Create copies of the array for every ms simulated */
    )()| /* Push all copies to the stream */
    enum| /* After each copy, push an ascending number to the stream */
    (_+_) /* Append the number to each array before */
]|
/* [2] (for stream content in this point, see below) */
{
    /* Push an on or off event to the stream: */
    [[
        _+_4,      /* delay + time = actual time */
        _3,        /* light-id */
        _4//_2%2=0 /* does the light go on or off? */
    ]] 
    if[_4%_2=0] /* if the light goes on or off (time%period=0) */
}|
/* [3] (for stream content in this point, see below) */
sort /* Sort the events */
}

O fluxo contém [1]valores de ponto na seguinte ordem:

[delay, period], light-id
 _1[0]  _1[1]    _2

O fluxo contém [2]valores de ponto na seguinte ordem:

delay, period, light-id, time
_1     _2      _3        _4

O fluxo contém [3]matrizes de pontos com a seguinte estrutura:

[time, light-id, on_or_off]
fergusq
fonte