Khi nào đèn nhấp nháy?


10

Hãy tưởng tượng bạn có hai đèn. Các đèn này nhấp nháy và tắt ở một tỷ lệ cụ thể:

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

Hãy mô phỏng những đèn này trong 2000ms đầu tiên:

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

Các thách thức

Đưa ra một danh sách các cặp theo thứ tự đại diện cho thời gian cho đèn, viết chương trình hoặc chức năng để xuất chuỗi khi chúng nhấp nháy.

Đầu vào

Đầu vào phải ở định dạng sau:

TimeToSimulate
Light0Delay,Light0Period
Light1Delay,Light1Period
...

Trong định dạng này, ví dụ trên sẽ là:

2000
0,1000
500,1000

Đầu ra

Đầu ra phải là một loạt các bộ ba được đặt hàng:

Time,LightNum,LightStatus

LightStatus là một giá trị trung thực nếu đèn bật và giá trị giả nếu đèn tắt.

Đầu ra từ ví dụ trên sẽ là:

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

Nếu hai đèn nhấp nháy cùng một lúc, đèn có số thấp hơn sẽ hiển thị đầu tiên ở đầu ra.

Những thứ khác

  • Các định dạng đầu vào và đầu ra không nghiêm ngặt
  • Mã không nên tạo ra bất kỳ lỗi nào
  • Giải pháp không nên dựa vào điều kiện chủng tộc
  • Không có sơ hở tiêu chuẩn
  • Đây là , nên giải pháp ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm

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

Đoạn bảng dẫn:


Bao nhiêu đầu ra là đủ?
aschepler

@aschepler Ý bạn là gì? Đầu vào chỉ định một lượng thời gian để "mô phỏng"
Daniel M.

Câu trả lời:


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

Dùng thử trực tuyến

Đã lưu một byte nhờ Shaggy - sử dụng cú pháp nhập liệu currying.


Lưu một byte với currying : a=>b=>.
Xù xì

@ Shaggy. Bạn nhanh quá, tôi đang chuẩn bị chỉnh sửa.

Nguyên tắc nhỏ: nếu có 2 đầu vào, luôn luôn là cà ri!
Xù xì


2

Thạch ,  26  25 byte

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

Một liên kết dyadic lấy một danh sách các danh sách delay, periodsố và một số khung thời gian và trả về một danh sách các time, light, actionsố nguyên.

Các đèn được lập chỉ mục 1 và 0đại diện cho hành động 'tắt', trong khi 1đại diện cho hành động 'bật'.

Hãy thử trực tuyến!

Làm sao?

Ḣ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

2

Python 2 , 206 214 byte

  • Đã thêm tám byte để tuân thủ các quy tắc (lấy đầu vào qua 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))

Hãy thử trực tuyến!

Mã này tạo ra một danh sách không có thứ tự chứa thời gian chuyển đổi của ánh sáng, đệm thời gian đó và số nhận dạng ánh sáng, sắp xếp danh sách đã nói và xuất ra nó.


Theo quy tắc tiêu chuẩn, bạn phải lấy đầu vào mà bạn không thể mong đợi nó tồn tại trước trong một biến. Có lẽ bạn sẽ thấy rằng việc sử dụng input()sẽ cho phép bạn cắt giảm việc đếm ngược byte (không cần phải phân tích cú pháp chuỗi vì Python 2 input()eval(raw_input())) :).
Jonathan Allan

... Ngoài ra nếu bạn sử dụng các số thay vì các chuỗi trong Ochúng sẽ sắp xếp, điều này có thể cũng sẽ cắt giảm số byte,
Jonathan Allan

@Jonathan ALLan Cảm ơn bạn đã nhận thấy sự khác biệt về quy tắc; Tôi sẽ không kết hợp các đề xuất của bạn vì hiện tại có câu trả lời Python 2 ngắn hơn đáng kể.
Jonathan Frech


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

Hãy thử trực tuyến.

Đây là chương trình tôi bắt đầu từ:

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)

Và trước khi chơi golf cuối cùng, tôi đã rút ngắn nó thành:

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

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}

Hãy thử trực tuyến!

Giải trình:

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

Luồng chứa tại [1]các giá trị điểm theo thứ tự sau:

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

Luồng chứa tại [2]các giá trị điểm theo thứ tự sau:

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

Luồng chứa tại [3]các mảng điểm với cấu trúc sau:

[time, light-id, on_or_off]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.