Kapan lampu berkedip?

10

Bayangkan Anda memiliki dua lampu. Lampu ini berkedip dan mati pada tingkat tertentu:

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

Mari kita simulasikan lampu ini untuk 2000 ms pertama:

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

Tantangan

Diberikan daftar pasangan berurutan yang mewakili waktu untuk lampu, tulislah sebuah program atau fungsi untuk menampilkan urutan ketika mereka berkedip.

Memasukkan

Masukan harus dalam format berikut:

TimeToSimulate
Light0Delay,Light0Period
Light1Delay,Light1Period
...

Dalam format ini, contoh di atas adalah:

2000
0,1000
500,1000

Keluaran

Outputnya harus berupa rangkaian tiga kali lipat yang dipesan:

Time,LightNum,LightStatus

LightStatus adalah nilai kebenaran jika lampu menyala dan nilai palsu jika lampu mati.

Output dari contoh di atas adalah:

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

Jika dua lampu berkedip pada saat yang sama, lampu dengan angka yang lebih rendah akan tampil pertama di output.

Barang lainnya

  • Format input dan output tidak ketat
  • Kode seharusnya tidak menghasilkan kesalahan
  • Solusinya tidak harus bergantung pada kondisi balapan
  • Tidak ada celah standar
  • Ini adalah , sehingga solusi terpendek menang!

Uji kasus

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

Cuplikan Papan:

Daniel M.
sumber
Berapa banyak output yang cukup?
aschepler
@aschepler Apa maksudmu? Masukan tersebut menetapkan jumlah waktu untuk "mensimulasikan"
Daniel M.

Jawaban:

3

JavaScript, 98 97 byte

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

Cobalah online

Menyimpan satu byte berkat Shaggy - gunakan sintaks input currying.


sumber
Menyimpan byte dengan currying: a=>b=>.
Shaggy
@ Shaggy. Anda sangat cepat, saya sedang menyiapkan suntingan.
Rule of thumb: jika ada 2 input, selalu kari!
Shaggy
3

Python 2 , 93 byte

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

Cobalah online!

tongkat
sumber
2

Jelly ,  26  25 byte

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

Tautan diadik yang mengambil daftar delay, perioddaftar-nomor dan nomor kerangka waktu serta mengembalikan daftar time, light, actionbilangan bulat.

Lampu 1-diindeks dan 0mewakili aksi 'mati', sedangkan 1mewakili aksi 'on'.

Cobalah online!

Bagaimana?

Ḣ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
sumber
2

Python 2 , 206 214 byte

  • Menambahkan delapan byte untuk mematuhi aturan (mengambil input melalui 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))

Cobalah online!

Kode ini menghasilkan daftar yang tidak berurutan yang berisi waktu peralihan setiap lampu, mengisi waktu tersebut dan pengidentifikasi cahaya, mengurutkan daftar tersebut dan mengeluarkannya.

Jonathan Frech
sumber
Dengan aturan standar, Anda harus mengambil input yang tidak dapat Anda harapkan sebelumnya dalam variabel. Anda mungkin akan menemukan bahwa menggunakan input()akan memungkinkan Anda untuk memotong byte-menghitung mundur juga (tidak ada string parsing akan diperlukan karena Python 2 input()adalah eval(raw_input())) :).
Jonathan Allan
... juga jika Anda menggunakan angka daripada string di dalam Omereka akan mengurutkan, yang mungkin juga akan memotong jumlah byte,
Jonathan Allan
@JonathanAllan Terima kasih telah memperhatikan perbedaan peraturan; Saya tidak akan memasukkan saran Anda karena ada jawaban Python 2 yang jauh lebih pendek sekarang.
Jonathan Frech
1

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

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

Cobalah online!

Xcali
sumber
1

Haskell, 121 byte

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

Cobalah online.

Ini adalah program yang saya mulai:

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)

Dan sebelum bermain golf terakhir saya telah mempersingkatnya menjadi:

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

Röda , 105 87 85 byte

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

Cobalah online!

Penjelasan:

{|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 */
}

Aliran berisi pada [1]nilai titik dalam urutan berikut:

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

Aliran berisi pada [2]nilai titik dalam urutan berikut:

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

Aliran berisi pada [3]array titik dengan struktur berikut:

[time, light-id, on_or_off]
fergusq
sumber