Çarpıcı Saati Eşleştirin


14

Giriş:

Evde her saatte belirtilen miktara varan bir saatimiz var, aynı zamanda her yarım saatte bir vuruyor. Yani 0: 01'den 12: 00'a kadar ve bu sıraya göre:

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

Meydan okuma:

Bir tamsayı verildiğinde n, toplam ihtarların eşit olduğu zaman dilimlerinin bir listesini çıktılar n. Ayrıca, her zaman bu zaman diliminden en az 1 dakika önce başlayın ve bu zaman çerçevesinden en az 1 dakika sonra (ve en fazla 29 dakika) sona erdirin.
Örneğin, giriş ise n=8çıkış şu şekilde olabilir:

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

Bu zaman dilimlerinin tümü için eşit olan aşağıdaki toplamlara sahip olduğu 8:

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

Zorluk kuralları:

  • Çıktı esnektir. Zaman (veya Date / DateTime) nesneleri, zaman damgaları, dizeler (baştaki sıfırlarla veya sıfırlar olmadan), .29/ .31/ .59/ .01(yani 0.29-3.01yerine 00:29-03:01) ile ondalıklar vb. Olarak çıktı alabilirsiniz. .
    Ayrıca, miktarı kendiniz seçebilirsiniz. Tüm örneklerimde 1 dakika kullanıyorum, ancak 5 dakika, 15 dakika vb. De seçebilirsiniz. Bu aynı zamanda örneğin .4/ .6/ .9/ .1(yani 0.4-3.1yerine 00:24-03:06) kullanabileceğiniz anlamına gelir . Liste de esnektir. Liste / koleksiyon, dizi, sınırlayıcı ile ayrılmış dize, satır başına STDOUT'a yazdırma vb. Olabilir.
    Lütfen hangi çıktı seçimini yaptığınızı belirtin.Not: Yukarıdaki gibi zaman çerçevelerinin toplamlarını çıkarmanıza izin verilmez, bu sadece açıklama olarak belirtilir. Zaman çerçevelerini, önce ve sonra biraz dahil olmak üzere çıktılamalısınız.
  • Grevler etrafına sarılmak yok 12:00etmek 00:30. Öyleyse n=14, zaman çerçevelerinden ikisi 11:29-00:31ve 11:59-01:01.
  • Girdi, 1 <= n <= 9090 değerinin olası tüm ihtarların toplamı olduğu aralıkta olacaktır .
  • Döndürdüğünüz zaman dilimleri herhangi bir sırada olabilir.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, gerekirse bir açıklama ekleyin.

Test senaryoları:

(tümü zaman aralıklarından önce ve sonra 1 dakika ve baştaki sıfırları kullanarak)

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
En esnek olanı seçerdim. Sonuç sayıları iki zil sesi arasında olduğu sürece, ondalık saat sayılarını içerir.
Adám

@ Adám Sanırım haklısın. Cevabımı buna göre düzenledim. Öyle, en az 1 dakika ve en 29 dakika olmalıdır .4/ .6/ .9/ .1izin verilir (sizin gibi 6 dakika ifade ettik ediliyor: :24/ :36/ :54/ :06).
Kevin Cruijssen

1
Belki zaman çiftlerinin herhangi bir sırayla iade edilebileceğinden bahsetmek ister misiniz?
Adám

Tamam n 0..90 olduğunu, n grevleri hesaplamak için zaman periyodu ne olduğunu net bulamıyorum: 12 saat mi? 24 saat mi? 48 saat mi? 0.24: 0..60 biçiminde izin verilen dönüş süresinden daha fazla?
RosLuP

@RosLuP Zaman dilimi normal bir analog saattir, yani 00:01 ile 12:00 arasındadır. Yani 0..24: 0..60 yerine, 0..12: 0..60 olmalıdır. Bu nasıl bir karışıklığı giderir.
Kevin Cruijssen

Yanıtlar:


3

APL (Dyalog Klasik) , 34 bayt SBCS

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

Çevrimiçi deneyin!

Bu çözüm kullanır ⎕io←1(1 tabanlı indeksleme).

Sağdan sola doğru:

⍳12 dır-dir 1 2 3...12

uzun ince bir 12x1 matrise dönüştürür

1, sola 1 saniyelik bir sütun ekler

⍪⍨ aynı matrisi dikey olarak birleştirir, bu yüzden şimdi 24x2'lik bir matris

, matrisi satır-büyük sırayla düzleştirir, 48 boyutunda bir vektör haline gelir: 1 1 1 2 1 3...1 12 1 1 1 2...1 12

+\ kısmi toplamlar: 1 2 3 5 6 9...

∘.-⍨ her bir eleman çifti arasındaki farklar, 48x48 matris

devrik

⎕=değerlendirilen girdinin ( ) gerçekleştiği her yerde 1 sn içeren 48x48 boole matrisi

1'lerin olduğu yerlerin koordinat çiftleri

.5× onları yarıya indir

.4 .1∘+¨ her bir çiftte 0.4 ve ikinci koordinatta 0.1 ekleyin

12| modulo 12

benzersiz


.1Çıktıda temsil edilen zaman aralığı nedir ? Ayrıca, güzel cevap.
Outgolfer Erik

2
Oh, ve bunun 34 bayt olmasını mümkün kılan şey, belki de ona bağlamak veya <sup>SBCS</sup>Adám'ın cevabı gibi yazmak isteyebilirsiniz.
Outgolfer Erik

@EriktheOutgolfer sorunu 01:: 29 /: 31 /: 59 yerine .1 / .4 / .6 / .9'a açıkça izin verir. Bu cevap için özel kodlamaya ihtiyacım yok, kendi tek bayt kodlamasına sahip Dyalog Classic'te.
ngn

Dyalog Classic'te değil. Ve evet, bunun açıkça izin verildiğini biliyorum 0.1, çıktıda kaç dakika olduğunu bilmek istedim ;)
Outgolfer Erik

@EriktheOutgolfer "SBCS" ekledi, teşekkürler; .1 × 60 dakika 6 dakika
ngn

5

JavaScript (ES6), 104 bayt

Zaman aralıklarını H.MM,H.MMformatta yazdırır .

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)

Çevrimiçi deneyin!

Aşağıdaki özyinelemeli sürümle aynı algoritmayı kullanır.


Özyinelemesiz sürüm, 117 bayt

Biçimde boşlukla ayrılmış bir zaman aralığı dizesi çıktılar 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

Test senaryoları

Yorumlananlar

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 bayt SBCS

Tam program gövdesi. İçin sor n. İki elemanlı listelerin listesini ondalık saatleri kullanarak yazdırır.

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

Çevrimiçi deneyin!

⍳24ɩ 1 ... 24 ndices

48⍴ siklik r uzunluğu 48, yani 1 ... 12,1 ... 12 eshape

.5× bununla yarıyı çarp

 enclose (bu dizinin tamamını her sol argüman için sağ argüman olarak kullanmak için)

(),/¨ Aşağıdakilerin her biri için bu uzunluktaki tüm alt listeleri döndürün:

⍳48Sonuçlar 1… 48

l← mağazada l( l engths için)

Şimdi her olası uzunluk için olası tüm çalışma listesi listelerine sahibiz.

,/ alt listelerin listesini bitiştir (lit. bitiştirme-azaltma)

 ifşa et (çünkü azalma rütbeyi 1'den 0'a düşürdüğü için)

( Her birine aşağıdaki işlevi uygulayın:

⊢/ son (yanan sağ azaltma) elemanı (bitiş zamanı)

⊃, ilk öğenin başına ekle (başlangıç ​​zamanı)

¯.1 .1+ bunlara negatif ve pozitif onda bir tane ekleyin

()/ Başlangıç-bitiş çiftlerini şu yöntemlerle filtreleyin:

⍳12bulgular 1… 12

1,¨ bir başa eklemek 1her

ϵ nlist (düzleştir)

48⍴ döngüsel r , yani 1,1,1,2 uzunluğu 48 eshape ... 1,11,1,12

 enclose (bu dizinin tamamını her sol argüman için sağ argüman olarak kullanmak için)

l+/¨l(1… 48)  her biri için bu uzunluktaki tüm alt listelerin toplamlarını döndürün

ϵ nlist (düzleştir)

⎕= sayısal girişi bununla karşılaştır

 sadece benzersiz öğeleri döndür (başlangıç-bitiş çiftleri)


0.1 0.5olabilir.1 .5
user41805

@Cowsquack Evet, ben de fark ettim. Yine de teşekkürler.
Adám

3

Python 3 , 118 116 bayt

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]

Çevrimiçi deneyin!

Bir zaman çerçevesi olarak temsil edilir (t1, t2), t1ve t2saat temsil olmak ondalık sayı. Ofset .1veya 6 dakikadır.


1

Toplu, 196 bayt

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

Açıklama: tbaşlayan, yarım saat içinde zamanı 0için 00:30. T zamanında vuruş sayısı daha sonra 1, 1, 1, 2, 1, 3vb Çıkarma 1sekansını vermektedir 0, 0, 0, 1, 0, 2sıfır ile içiçe tamsayı vb. Bu, daha sonra dizinin termwise çarpılması ile elde edilebilir 0, 0, 1, 1, 2, 2sekans vb 0, 1, 0, 1, 0, 1vs. Bu sekansların her ikisi kolaylıkla modulo ve (tam sayı) bölme kullanılarak hesaplanır.

Daha sonra 23 olası başlangıç ​​süresinin tamamında döngüye girmeye devam eder, ardından 24 çarpıcı sürenin tümünü alır ve girişin üzerindeki grev sayısını çıkarır ve sonucun sıfır olduğu zamanları yazdırır.

Kod döngüden sonra girer, ancak giriş 90'dan fazla olamaz, çünkü herhangi bir zarar verilmez.


1

APL NARS, 559 bayt

∇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) veya l (n), n saat vuruşuna sahip 0-24 saat içinde tüm temsili aralıkları döndürür. h (n) saat biçiminin 0..11.0..59; bunun yerine l (n) saat biçimine sahiptir. 0..23.0..59 testi

  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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.