Phù hợp với đồng hồ nổi bật


14

Giới thiệu:

Ở nhà, chúng tôi có một chiếc đồng hồ tấn công số tiền đã nêu mỗi giờ, nhưng cũng có một lần bấm vào mỗi nửa giờ. Vì vậy, từ 0h01 đến và bao gồm 12:00, nó đình công theo thứ tự này:

1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12

Thử thách:

Cho một số nguyên n, xuất ra một danh sách các khung thời gian trong đó tổng số lần đình công bằng n. Ngoài ra, luôn luôn bắt đầu ít nhất 1 phút trước khung thời gian này và kết thúc ít nhất 1 phút sau khung thời gian này (và nhiều nhất là 29 phút).
Ví dụ: nếu đầu vào là n=8, đầu ra có thể là:

[00:59-03:01, 01:29-03:31, 02:59-04:01, 05:29-06:31, 06:29-07:01, 06:59-07:31, 07:59-08:01]

Trong đó các khung thời gian này có các khoản tiền sau, tất cả đều bằng nhau 8:

[1+1+2+1+3, 1+2+1+3+1, 3+1+4, 1+6+1, 1+7, 7+1, 8]

Quy tắc thử thách:

  • Đầu ra là linh hoạt. Bạn có thể xuất ra dưới dạng các đối tượng Thời gian (hoặc Ngày / Ngày), dấu thời gian, chuỗi (có hoặc không có số 0 đứng đầu), số thập phân có .29/ .31/ .59/ .01(tức là 0.29-3.01thay vì 00:29-03:01), v.v ... Miễn là nó rõ ràng trước và sau khung thời gian .
    Ngoài ra, bạn có thể tự chọn số tiền. Trong tất cả các ví dụ của tôi, tôi sử dụng 1 phút, nhưng bạn cũng có thể chọn 5 phút, 15 phút, v.v. Điều này cũng có nghĩa là bạn có thể sử dụng .4/ .6/ .9/ .1(tức là 0.4-3.1thay vì 00:24-03:06) chẳng hạn. Danh sách này cũng linh hoạt. Có thể là một danh sách / bộ sưu tập, mảng, chuỗi được phân tách bằng dấu phân cách, in trên mỗi dòng thành STDOUT, v.v.
    Vui lòng cho biết lựa chọn đầu ra nào bạn đã thực hiện.Lưu ý: Bạn không được phép xuất tổng của các khung thời gian như trên, điều này chỉ được đề cập dưới dạng làm rõ. Bạn phải xuất các khung thời gian, bao gồm một chút trước và sau nó.
  • Các cuộc đình công làm bao quanh từ 12:00đến 00:30. Vì vậy, nếu n=14, hai trong số các khung thời gian là 11:29-00:3111:59-01:01.
  • Đầu vào sẽ nằm trong phạm vi 1 <= n <= 90, trong đó 90 là tổng của tất cả các cuộc đình công có thể.
  • Khung thời gian bạn trả về có thể theo thứ tự bất kỳ.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

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

(tất cả sử dụng 1 phút trước / sau khung thời gian và số 0 đứng đầu)

Input: 8
Ouput:
[00:59-03:01, 01:29-03:31, 02:59-04:01, 05:29-06:31, 06:29-07:01, 06:59-07:31, 07:59-08:01]

Input: 14
Output:
[00:29-04:01, 00:59-04:31, 02:59-05:01, 04:29-06:31, 05:59-07:01, 11:29-00:31, 11:59-01:01]

Input: 90
Output:
[00:29-00:01, 00:59-00:31, 01:29-01:01, 01:59-01:31, 02:29-02:01, 02:59-02:31, 03:29-03:01, 03:59-03:31, 04:29-04:01, 04:59-04:31, 05:29-05:01, 05:59-05:31, 06:29-06:01, 06:59-06:31, 07:29-07:01, 07:59-07:31, 08:29-08:01, 08:59-08:31, 09:29-09:01, 09:59-09:31, 10:29-10:01, 10:59-10:31, 11:29-11:01, 11:59-11:31]

Input: 1
Output:
[00:29-00:31, 00:59-01:01, 01:29-01:31, 02:29-02:31, 03:29-03:31, 04:29-04:31, 05:29-05:31, 06:29-06:31, 07:29-07:31, 08:29-08:31, 09:29-09:31, 10:29-10:31, 11:29-11:31]

Input: 2
Output:
[00:29-01:01, 00:59-01:31, 01:59-02:01]

1
Tôi muốn đi bất cứ điều gì linh hoạt nhất. Điều này bao gồm số giờ thập phân, miễn là số kết quả rơi vào giữa hai lần đổ chuông.
Adám

@ Adám Đoán bạn đúng. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. Bạn nên có ít nhất 1 phút và tối đa 29 phút, vì vậy .4/ .6/ .9/ .1được cho phép (là 6 phút như bạn đã nêu: :24/ :36/ :54/ :06).
Kevin Cruijssen

1
Có lẽ đề cập rằng các cặp thời gian có thể được trả lại theo thứ tự nào?
Adám

Ok n là trong 0,90, tôi không tìm thấy rõ khoảng thời gian để tính các lần đình công n: Đó là 12 giờ? Họ là 24 giờ? Là 48 giờ? Hơn thời gian trả lại được phép ở định dạng 0..24: 0..60?
RosLuP

@RosLuP Khung thời gian là đồng hồ analog thông thường, do đó, từ 00:01 đến 12:00. Vì vậy, thay vì 0..24: 0..60, nó phải là 0..12: 0..60. Làm thế nào mà xóa bất kỳ sự nhầm lẫn.
Kevin Cruijssen

Câu trả lời:


3

APL (Dyalog Classic) , 34 byte SBCS

12|.4 .1∘+¨.5×⍸⎕=⍉∘.-⍨+\,⍪⍨1,⍪⍳12

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

Giải pháp này sử dụng ⎕io←1(lập chỉ mục dựa trên 1).

Từ phải qua trái:

⍳121 2 3...12

biến nó thành một ma trận 12x1 mỏng cao

1, thêm một cột 1s ở bên trái

⍪⍨ nối cùng một ma trận theo chiều dọc, vì vậy giờ đây nó là ma trận 24x2

, làm phẳng ma trận theo thứ tự chính hàng, nó trở thành một vectơ có kích thước 48: 1 1 1 2 1 3...1 12 1 1 1 2...1 12

+\ tổng một phần: 1 2 3 5 6 9...

∘.-⍨ sự khác biệt giữa mỗi cặp phần tử, ma trận 48x48

hoán vị

⎕=một ma trận boolean 48x48 với 1s bất cứ nơi nào xảy ra đầu vào được đánh giá ( )

các cặp tọa độ của 1s

.5× giảm một nửa

.4 .1∘+¨ thêm 0,4 vào tọa độ thứ nhất và 0,1 cho tọa độ thứ hai trong mỗi cặp

12| modulo 12

độc nhất


Khoảng thời gian được đại diện bởi .1trong đầu ra là gì? Ngoài ra, câu trả lời tốt đẹp.
Erik các Outgolfer

2
Ồ, và đây là điều khiến nó có thể là 34 byte, có thể muốn liên kết với nó hoặc viết <sup>SBCS</sup>giống như câu trả lời của Adám.
Erik the Outgolfer

@EriktheOutgolfer vấn đề rõ ràng cho phép .1 / .4 / .6 / .9 thay vì: 01 /: 29 /: 31 /: 59. Tôi không cần mã hóa đặc biệt cho câu trả lời này, đó là trong Dyalog Classic có mã hóa một byte riêng.
ngn

không có trong Dyalog Classic. Và vâng, tôi biết điều đó được cho phép rõ ràng, tôi chỉ muốn biết đầu ra có bao nhiêu phút 0.1;)
Erik the Outgolfer 7/1/18

@EriktheOutgolfer "SBCS" đã thêm, cảm ơn; .1 × 60 phút là 6 phút
ngn

5

JavaScript (ES6), 104 byte

In các khoảng thời gian trong H.MM,H.MMđịnh dạng.

F=(n,f=0,s=n,t=f++)=>t<f+23?F(n,f,s-=t&1||t/2%12+1,++t,s||alert([f/2%12+.01,-~t/2%12+.01])):f<24&&F(n,f)

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

Về cơ bản sử dụng thuật toán tương tự như phiên bản không đệ quy dưới đây.


Phiên bản không đệ quy, 117 byte

Xuất ra một chuỗi các khoảng thời gian được phân định bằng không gian theo H.MM,H.MMđịnh dạng.

n=>[...Array(24)].map((_,f,a)=>a.map(_=>(s-=t++&1||t/2%12+.5)||(r+=[-~f/2%12+.01,-~t/2%12+.01]+' '),s=n,t=f),r='')&&r

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

Đã bình luận

n =>                           // n = input
  [...Array(24)].map((_, f, a) // FOR f = 0 TO 23:
    => a.map(_ =>              //   FOR t = f TO f + 23:
      (                        //     update s
        s -=                   //       by subtracting:
          t++ & 1 ||           //         - 1 if t is odd (half hour)
          t / 2 % 12 + .5      //         - the current hour if t is even
      ) || (                   //     if s is equal to zero:
        r += [                 //       update the result string by appending:
          -~f / 2 % 12 + .01   //         - the formatted 'from' time
          ,                    //         - a comma
          -~t / 2 % 12 + .01   //         - the formatted 'to' time
        ] + ' '                //       and a padding space
      ),                       //     inner map() initialization:
      s = n,                   //     - s = target number of strikes
      t = f                    //     - 'to' time = 'from' time
    ),                         //   end of inner map()
    r = ''                     //   start with r = empty string
  )                            // end of outer map()
  && r                         // return r

4

APL (Dyalog Unicode) , 62 59 byte SBCS

Toàn thân chương trình. Nhắc nhở cho n. In danh sách các danh sách hai yếu tố sử dụng giờ thập phân.

∪(⎕=∊l+/¨⊂48⍴∊1,¨⍳12)/(¯.1 .1+⊃,⊢/)¨⊃,/(l←⍳48),/¨⊂.5×48⍴⍳24

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

⍳24số 1 1 24

48⍴ chu kỳ r eshape đến chiều dài 48, tức là 1 L 12 12,1 12

.5× nhân một nửa với nó

 kèm theo (để sử dụng toàn bộ mảng này làm đối số bên phải cho mỗi đối số bên trái)

(... ),/¨ cho mỗi người trong số những điều sau đây, trả lại tất cả các tiểu danh sách có độ dài là:

⍳48số 1 1 48

l← lưu trữ trong l(cho l engths)

Bây giờ chúng tôi có tất cả các danh sách thời gian có thể chạy cho mỗi lần chạy có thể.

,/ concatenate (lit. concatenation-less) danh sách các danh sách phụ

 tiết lộ (vì giảm giảm thứ hạng từ 1 xuống 0)

(...  áp dụng các chức năng sau đây để mỗi:

⊢/ phần tử cuối cùng (giảm bên phải) (thời gian kết thúc)

⊃, chuẩn bị phần tử đầu tiên (thời gian bắt đầu)

¯.1 .1+ thêm phần mười âm và dương cho những

(... )/ lọc những bắt đầu-end cặp với:

⍳12số 1 1 12

1,¨ trả trước 1cho mỗi

ε nlist (flatten)

48⍴ chu kỳ r eshape đến chiều dài 48, tức là 1,1,1,2 Lọ 1,11,1,12

 kèm theo (để sử dụng toàn bộ mảng này làm đối số bên phải cho mỗi đối số bên trái)

l+/¨ cho mỗi l(1 Lọ 48) trả lại tổng của tất cả các danh sách phụ có độ dài đó

ε nlist (flatten)

⎕= so sánh đầu vào số với đó

 chỉ trả về các phần tử duy nhất (cặp bắt đầu)


0.1 0.5có thể trở thành.1 .5
Kritixi Lithos

@Cowsquack Vâng, tôi cũng nhận thấy. Cảm ơn, mặc dù.
Adám

3

Python 3 , 118 116 byte

lambda n:[(a/2+.4,b%24/2+.1)for a in range(24)for b in range(48)if sum((sum(zip([1]*12,range(1,13)),())*2)[a:b])==n]

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

Một khoảng thời gian được biểu diễn dưới dạng (t1, t2), t1t2là số thập phân đại diện cho tiếng đồng hồ. Thời gian bù là .16 phút.


1

Mẻ, 196 byte

@for /l %%i in (0,1,23)do @set s=%1&for /l %%j in (0,1,23)do @call:c %%i %%j
:c
@set/at=%2+%1,s-=t%%2*(t/2%%12)+1,h=%1/2,i=%1%%2*30+15,t=-~t%%24/2,u=-~t%%2*30+15
@if %s%==0 echo %h%:%i% %t%:%u%

Giải thích: tlà thời gian trong tiếng rưỡi, bắt đầu từ 0cho 00:30. Số lượng các cuộc đình công tại thời điểm t là sau đó 1, 1, 1, 2, 1, 3, vv trừ 1cho chuỗi 0, 0, 0, 1, 0, 2vv mà là số nguyên xen kẽ với các số không. Điều này sau đó có thể thu được bằng cách termwise nhân của chuỗi 0, 0, 1, 1, 2, 2vv với chuỗi 0, 1, 0, 1, 0, 1vv Cả hai của những chuỗi được dễ dàng tính toán sử dụng modulo và (số nguyên) chia.

Sau đó, nó vẫn lặp lại trong tất cả 23 lần bắt đầu có thể, sau đó lấy tất cả 24 lần nổi bật và trừ đi số lần đình công từ đầu vào, in số lần khi kết quả bằng không.

Mã rơi qua sau vòng lặp nhưng không có tác hại nào vì đầu vào không thể lớn hơn 90.


1

APL NARS, 559 byte

∇r←l w;t;i;j;c;k;m;p
p←{0=2∣¯1+⍵:.01+2÷⍨¯1+⍵⋄¯0.19+2÷⍨¯1+⍵}
m←{0=2∣¯1+⍵:¯.41+2÷⍨¯1+⍵⋄¯0.21+2÷⍨¯1+⍵}
   r←⍬⋄i←0⋄t←∊(¯1+⍳13),¨13⍴1⋄t←t,2↓t⋄k←⍴t
A: j←i+←1⋄→0×⍳i≥k⋄c←0
B: c+←j⊃t⋄:if(c=w)∧(0≤(m i))∧(24≥(p j))⋄r←r,⊂(m i),(p j)⋄:endif⋄→A×⍳c≥w⋄j+←1⋄→B×⍳j≤k⋄→A
∇
∇r←g w;v;i;k;m
   v←{12≤⌊⍵:⍵-12⋄⍵}
   i←1⋄k←⍴w⋄r←⍬
A: →0×⍳i>k⋄r←r,⊂v¨i⊃w⋄i+←1⋄→A
∇   
h←g∘l

h (n) hoặc l (n) trả về tất cả các khoảng thời gian đại diện trong 0-24 giờ có n lần bấm đồng hồ. h (n) có định dạng đồng hồ là 0..11.0..59; thay vào đó l (n) có định dạng đồng hồ là 0..23.0..59 kiểm tra

  h 8
    0.59 3.01  1.29 3.31  2.59 4.01  5.29 6.31  6.29 7.01  6.59 7.31  
    7.59 8.01  0.59 3.01  1.29 3.31  2.59 4.01  5.29 6.31  6.29 7.01  
    6.59 7.31  7.59 8.01 
  h 14
    0.29 4.01  0.59 4.31  2.59 5.01  4.29 6.31  5.59 7.01  11.29 0.31  
    11.59 1.01  0.29 4.01  0.59 4.31  2.59 5.01 4.29 6.31  5.59 7.01 
  h 90
    0.29 0.01  0.59 0.31  1.29 1.01  1.59 1.31  2.29 2.01  2.59 2.31  
    3.29 3.01  3.59 3.31  4.29 4.01  4.59 4.31  5.29 5.01  5.59 5.31  
    6.29 6.01  6.59 6.31  7.29 7.01  7.59 7.31  8.29 8.01  8.59 8.31  
    9.29 9.01  9.59 9.31  10.29 10.01  10.59 10.31  11.29 11.01  11.59 11.31    
  h 1
    0.29 0.31  0.59 1.01  1.29 1.31  2.29 2.31  3.29 3.31  4.29 4.31  
    5.29 5.31  6.29 6.31  7.29 7.31  8.29 8.31  9.29 9.31  10.29 10.31  
    11.29 11.31  0.29 0.31  0.59 1.01  1.29 1.31  2.29 2.31  3.29 3.31  
    4.29 4.31  5.29 5.31  6.29 6.31  7.29 7.31  8.29 8.31  9.29 9.31  
    10.29 10.31  11.29 11.31 
  h 2
    0.29 1.01  0.59 1.31  1.59 2.01  0.29 1.01  0.59 1.31  1.59 2.01 
  l 2
    0.29 1.01  0.59 1.31  1.59 2.01  12.29 13.01  12.59 13.31  13.59 14.01 
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.