จับคู่นาฬิกาโดดเด่น


14

บทนำ:

ที่บ้านเรามีนาฬิกาที่นัดเวลาตามที่ระบุไว้ในแต่ละชั่วโมง แต่ก็นัดกันทุกครึ่งชั่วโมง ดังนั้นจาก 0:01 ถึงและรวมถึง 12:00 มันนัดในลำดับนี้:

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

ท้าทาย:

ได้รับจำนวนเต็มออกรายการของกรอบเวลาที่นัดรวมเท่ากับn nนอกจากนี้ให้เริ่มอย่างน้อย 1 นาทีก่อนกำหนดกรอบเวลานี้และสิ้นสุดอย่างน้อย 1 นาทีหลังจากกรอบเวลานี้ (และไม่เกิน 29 นาที)
ตัวอย่างเช่นถ้าอินพุตn=8เอาต์พุตอาจเป็น:

[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]

ซึ่งกรอบเวลาเหล่านี้มีผลรวมต่อไปนี้เท่ากับทั้งหมด8:

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

กฏท้าทาย:

  • ผลผลิตมีความยืดหยุ่น คุณสามารถส่งออกเป็นวัตถุ Time (หรือ Date / DateTime), timestamps, strings (โดยมีหรือไม่มีเลขศูนย์นำหน้า), ทศนิยมด้วย.29/ .31/ .59/.01 (เช่น0.29-3.01แทน00:29-03:01) เป็นต้นตราบใดที่มันชัดเจนก่อนและหลังกรอบเวลา .
    นอกจากนี้คุณสามารถเลือกจำนวนเงินด้วยตัวเอง ในตัวอย่างทั้งหมดของฉันฉันใช้ 1 นาที แต่คุณสามารถเลือก 5 นาที 15 นาทีเป็นต้นซึ่งหมายความว่าคุณสามารถใช้.4/ .6/ .9/ .1(เช่น0.4-3.1แทน00:24-03:06) ได้ รายการนี้ยังมีความยืดหยุ่น สามารถเป็นลิสต์ / คอลเลกชัน, อาเรย์, สตริงที่คั่นด้วยตัวคั่น, การพิมพ์ต่อบรรทัดไปยัง STDOUT, ฯลฯ
    โปรดระบุตัวเลือกผลลัพธ์ที่คุณได้เลือกไว้หมายเหตุ: คุณไม่ได้รับอนุญาตให้แสดงผลรวมของกรอบเวลาดังกล่าวข้างต้นซึ่งจะกล่าวถึงเป็นการชี้แจงเท่านั้น คุณต้องส่งออกกรอบเวลารวมถึงก่อนและหลังเล็กน้อย
  • นัดไม่ห่อรอบจากไป12:00 00:30ดังนั้นถ้าn=14สองช่วงเวลาเป็น11:29-00:31และ11:59-01:01และ
  • อินพุตจะอยู่ในช่วง 1 <= n <= 90โดยที่ 90 คือผลรวมของการโจมตีที่เป็นไปได้ทั้งหมด
  • กรอบเวลาที่คุณส่งคืนสามารถอยู่ในลำดับใดก็ได้

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • ใช้กฎมาตรฐานสำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ:

(ทั้งหมดใช้ 1 นาทีก่อน / หลังกรอบเวลาและเลขศูนย์นำหน้า)

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
ฉันจะไปเพื่ออะไรก็ตามที่ยืดหยุ่นที่สุด ซึ่งรวมถึงตัวเลขชั่วโมงทศนิยมตราบใดที่ตัวเลขผลลัพธ์อยู่ระหว่างสองครั้ง
Adám

@ Adámเดาว่าคุณพูดถูก ฉันแก้ไขคำตอบของฉันแล้ว คุณควรมีเวลาอย่างน้อย 1 นาทีและไม่เกิน 29 นาทีจึงอนุญาตให้.4/ .6/ .9/ .1(เป็น 6 นาทีตามที่คุณระบุไว้: :24/ :36/ :54/ :06)
Kevin Cruijssen

1
อาจพูดถึงว่าคู่เวลาอาจถูกส่งคืนในลำดับใด ๆ
Adám

Ok n อยู่ใน 0..90 ฉันไม่พบชัดเจนว่าช่วงเวลาใดในการคำนวณการนัดหยุดงาน n: มันคือ 12 ชั่วโมง? พวกเขาคือ 24 ชั่วโมง? 48 ชั่วโมงหรือ อนุญาตให้ส่งคืนเวลามากกว่าในรูปแบบ 0..24: 0..60 หรือไม่
RosLuP

@RosLuP กรอบเวลาเป็นนาฬิกาอะนาล็อกทั่วไปตั้งแต่ 00:01 ถึง 12:00 ดังนั้นแทนที่จะเป็น 0..24: 0..60 ควรเป็น 0..12: 0..60 วิธีการที่จะล้างความสับสนใด ๆ
Kevin Cruijssen

คำตอบ:


3

APL (Dyalog Classic) , 34 ไบต์SBCS

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

ลองออนไลน์!

วิธีนี้ใช้ ⎕io←1 (การสร้างดัชนีแบบ 1 ฐาน)

จากขวาไปซ้าย:

⍳12 คือ 1 2 3...12

เปลี่ยนมันให้เป็นเมทริกซ์ขนาด 12x1 ที่บาง

1, เพิ่มคอลัมน์ 1s ไปทางซ้าย

⍪⍨ เชื่อมเมทริกซ์เดียวกันเข้าด้วยกันในแนวตั้งดังนั้นมันจึงเป็นเมทริกซ์ 24x2

, ทำให้เมทริกซ์แบนตามลำดับแถวหลักมันจะกลายเป็นเวกเตอร์ขนาด 48: 1 1 1 2 1 3...1 12 1 1 1 2...1 12

+\ ผลรวมบางส่วน: 1 2 3 5 6 9...

∘.-⍨ ความแตกต่างระหว่างองค์ประกอบแต่ละคู่คือเมทริกซ์ 48x48

transpose

⎕=บูลีนเมทริกซ์ 48x48 ที่มี 1 วินาทีทุกครั้งที่อินพุตที่ประเมิน ( ) เกิดขึ้น

คู่ของพิกัดที่ 1s อยู่

.5× ลดลงครึ่งหนึ่ง

.4 .1∘+¨ เพิ่ม 0.4 ลงในพิกัดแรกและ 0.1 ถึงพิกัดที่สองในแต่ละคู่

12| โมดูโล 12

เป็นเอกลักษณ์


ช่วงเวลาแสดง.1ในเอาต์พุตคืออะไร? นอกจากนี้คำตอบที่ดี
Erik the Outgolfer

2
โอ้และนี่คือสิ่งที่ทำให้เป็นไปได้ที่ 34 ไบต์อาจต้องการเชื่อมโยงหรือเขียน<sup>SBCS</sup>เหมือนคำตอบของAdám
Erik the Outgolfer

@EriktheOutgolfer ปัญหาอนุญาตให้. 1 / .4 / .6 / .9 แทน: 01 /: 29 /: 31 /: 59 ฉันไม่ต้องการการเข้ารหัสพิเศษสำหรับคำตอบนี้มันอยู่ใน Dyalog Classic ซึ่งมีการเข้ารหัสไบต์เดียวของตัวเอง
ngn

ไม่ได้อยู่ใน Dyalog Classic และใช่ฉันรู้ว่าได้รับอนุญาตอย่างชัดเจนฉันแค่อยากจะรู้ว่ากี่นาที0.1ในการส่งออก;)
Erik the Outgolfer

@EriktheOutgolfer เพิ่ม "SBCS" แล้วขอบคุณ; .1 × 60 นาทีคือ 6 นาที
ngn

5

JavaScript (ES6), 104 ไบต์

พิมพ์ช่วงเวลาในH.MM,H.MMรูปแบบ

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)

ลองออนไลน์!

ใช้อัลกอริทึมเป็นหลักเหมือนกับเวอร์ชันที่ไม่ใช่แบบเรียกซ้ำด้านล่าง


รุ่นที่ไม่ใช่แบบเรียกซ้ำ 117 ไบต์

ส่งออกสตริงช่วงเวลาที่คั่นด้วยช่องว่างในH.MM,H.MMรูปแบบ

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

กรณีทดสอบ

แสดงความคิดเห็น

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 ไบต์SBCS

โปรแกรมร่างกายเต็ม nแจ้งให้สำหรับ พิมพ์รายการของรายการสององค์ประกอบโดยใช้ชั่วโมงทศนิยม

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

ลองออนไลน์!

⍳24ɩ ndices 1 ... 24

48⍴ วนr eshape ความยาว 48 คือ 1 ... 12,1 ... 12

.5× คูณครึ่งด้วย

 ใส่ (เพื่อใช้ทั้งอาร์เรย์นี้เป็นอาร์กิวเมนต์ที่ถูกต้องสำหรับแต่ละอาร์กิวเมนต์ซ้าย)

(... ),/¨ สำหรับแต่ละรายการต่อไปนี้ให้คืนค่ารายการย่อยทั้งหมดของความยาวนั้น:

⍳48ɩ ndices 1 ... 48

l← เก็บในl(สำหรับl engths)

ตอนนี้เรามีรายการวิ่งทั้งหมดที่เป็นไปได้สำหรับการวิ่งยาวแต่ละครั้งที่เป็นไปได้

,/ concatenate (lit. concatenation-reduction) รายการของรายการย่อย

 เปิดเผย (เพราะการลดการลดอันดับจาก 1 เป็น 0)

(...  ใช้ฟังก์ชันต่อไปนี้กับแต่ละรายการ:

⊢/ องค์ประกอบสุดท้าย (ลดน้อยลงไปทางขวา) (เวลาสิ้นสุด)

⊃, เสริมองค์ประกอบแรก (เวลาเริ่มต้น)

¯.1 .1+ เพิ่มสิบในเชิงลบและบวกให้กับเหล่านั้น

(... )/ กรองคู่เริ่มต้นเหล่านั้นด้วย:

⍳12ɩ ndices 1 ... 12

1,¨ เติม a 1ให้แต่ละอัน

ε nlist (เรียบ)

48⍴ วนr eshape ความยาว 48 คือ 1,1,1,2 ... 1,11,1,12

 ใส่ (เพื่อใช้ทั้งอาร์เรย์นี้เป็นอาร์กิวเมนต์ที่ถูกต้องสำหรับแต่ละอาร์กิวเมนต์ซ้าย)

l+/¨ สำหรับแต่ละl(1 … 48) คืนค่าผลรวมของรายการย่อยทั้งหมดของความยาวนั้น

ε nlist (เรียบ)

⎕= เปรียบเทียบอินพุตตัวเลขกับสิ่งนั้น

 ส่งคืนเฉพาะองค์ประกอบที่ไม่ซ้ำกัน (คู่เริ่มต้น)


0.1 0.5สามารถเป็น.1 .5
user41805

@ Cowquack ใช่ฉันสังเกตเห็นด้วย ขอบคุณ
Adám

3

Python 3 , 118 116 ไบต์

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]

ลองออนไลน์!

ระยะเวลาที่จะแสดงเป็น(t1, t2), t1และt2เป็นทศนิยมคิดเป็นชั่วโมง ชดเชยคือ.1หรือ 6 นาที


1

แบตช์ 196 ไบต์

@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%

คำอธิบาย: tเป็นเวลาชั่วโมงครึ่งเริ่มต้นที่สำหรับ0 00:30จำนวนนัดที่เวลา t คือแล้ว1, 1, 1, 2, 1, 3ฯลฯ การลบ1ให้ลำดับ0, 0, 0, 1, 0, 2ฯลฯ ซึ่งเป็นจำนวนเต็มบรรณนิทัศน์ด้วยศูนย์ สิ่งนี้สามารถหาได้จากการคูณลำดับของเทอ0ร์0มินัล,,1 , 1, 2, 2ฯลฯ ด้วยลำดับ0, 1, 0, 1, 0,1ฯลฯ ทั้งสองของลำดับเหล่านี้จะคำนวณได้อย่างง่ายดายโดยใช้แบบโมดูโลและ (จำนวนเต็ม) ส่วน

จากนั้นก็จะวนซ้ำไปตามเวลาเริ่มต้นที่เป็นไปได้ทั้งหมด 23 ครั้งจากนั้นใช้เวลาในการตีทั้ง 24 ครั้งและลบจำนวนการนัดหยุดงานจากอินพุตการพิมพ์เวลาที่ผลลัพธ์เป็นศูนย์

รหัสผ่านหลังจากวนรอบ แต่ไม่มีอันตรายใด ๆ เกิดขึ้นเนื่องจากอินพุตไม่สามารถมากกว่า 90


1

APL NARS, 559 ไบต์

∇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) หรือ l (n) ส่งคืนช่วงเวลาการเป็นตัวแทนทั้งหมดใน 0-24 ชั่วโมงที่มีการตอกเข็มนาฬิกา h (n) มีรูปแบบนาฬิกาเป็น 0..11.0..59; แทน l (n) มีรูปแบบนาฬิกาเป็น 0..23.0..59 ทดสอบ

  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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.