印象的な時計に合わせる


14

前書き:

自宅には、1時間ごとに指定された量を打つ時計がありますが、30分ごとに1回打つ時計もあります。したがって、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)オブジェクト、タイムスタンプ、文字列(先頭のゼロの有無にかかわらず)、.29/ .31/ .59/ .01(つまりの0.29-3.01代わりに00:29-03:01)などの10 進数として出力できます。明確な限り、タイムフレームの前後。
    また、金額は自分で選択できます。すべての私の例では、私は1分を使用しますが、あなたはまた、など、5分、15分を、選択することができますこれはまた、あなたが使用できることを意味します.4/ .6/ .9/ .1(つまり、0.4-3.1代わりの00:24-03:06)たとえば。リストも柔軟です。リスト/コレクション、配列、区切り文字で区切られた文字列、STDOUTへの行ごとの印刷などを指定できます。どの出力を選択したかを明記して
    ください。注:上記のような時間枠の合計を出力することは許可されていません。これは説明としてのみ言及されています。時間枠を出力する必要があります(わずかにその前後を含む)。
  • ストライキはから12:00に折り返し00:30ます。もしそうであればn=14、時間フレームの2がある11:29-00:3111: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
私は最も柔軟なものを求めています。結果の数値が2つの呼び出し時間の間にある限り、これには10進数の時間の数値が含まれます。
アダム

@Adámあなたが正しいと思います。それに応じて回答を編集しました。少なくとも1分、最大で29分が必要なので、.4/ .6/ .9/ .1が許可されます(あなたが述べたように6分::24/ :36/ :54/ :06)。
ケビンCruijssen

1
タイムペアが任意の順序で返される可能性があることに言及している場合
アダム

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にする必要があります。混乱を解消する方法。
ケビンCruijssen

回答:


3

APL(Dyalog Classic)、34バイトSBCS

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

オンラインでお試しください!

このソリューションは⎕io←1(1ベースのインデックス付け)を使用します。

右から左へ:

⍳121 2 3...12

背の高い薄い12x1マトリックスに変換します

1, 左に1の列を追加します

⍪⍨ 同じ行列を垂直に連結するため、24x2行列になりました

, 行優先順で行列を平坦化し、サイズ48のベクトルになります。 1 1 1 2 1 3...1 12 1 1 1 2...1 12

+\ 部分和: 1 2 3 5 6 9...

∘.-⍨ 要素の各ペアの違い、48x48マトリックス

転置

⎕=評価された入力()が発生する場合は常に1の48x48ブール行列

1の位置の座標のペア

.5× それらを半分に

.4 .1∘+¨ 各ペアの最初の座標に0.4、2番目の座標に0.1を追加します

12| モジュロ12

ユニークな


.1出力で表される時間間隔は何ですか?また、いい答えです。
エリックアウトゴルファー

2
ああ、これがこれを34バイトにすることを可能にするものです。多分それにリンクするか<sup>SBCS</sup>、Adámの答えのように書きたいでしょう。
エリックアウトゴルファー

@EriktheOutgolferの問題では、:01 /:29 /:31 /:59の代わりに.1 / .4 / .6 / .9が明示的に許可されます。この回答には特別なエンコーディングは必要ありません。DyalogClassicには独自のシングルバイトエンコーディングがあります。
-ngn

Dyalog Classicにはありません。そして、はい、それが明示的に許可されていることは知って0.1います。出力
に何分ある

@EriktheOutgolfer "SBCS"が追加されました、ありがとう。.1×60分は6分
18年

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。10進数の時間を使用して2要素リストのリストを印刷します。

∪(⎕=∊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)

これで、それぞれの可能なランレングスの時間の実行のすべての可能なリストができました。

,/ サブリストのリストを連結(点灯、連結縮小)

 開示する(削減によりランクが1から0に減少したため)

( 次の機能をそれぞれに適用します。

⊢/ 最後の(点灯右縮小)要素(終了時間)

⊃, 最初の要素を追加します(開始時間)

¯.1 .1+ それらにマイナスとプラスの10分の1を追加します

()/ これらの開始と終了のペアを以下でフィルタリングします。

⍳12ɩndices 1…12

1,¨1それぞれの 前に

ϵ nlist(平坦化)

48⍴ 周期的にrは、1,1,1,2すなわち長さ48にeshapeを... 1,11,1,12

 囲みます(この配列全体を各左引数の右引数として使用します)

l+/¨l(1…48)の それぞれについて、その長さのすべてのサブリストの合計を返します

ϵ nlist(平坦化)

⎕= 数値入力を比較する

 一意の要素のみを返します(開始と終了のペア)


0.1 0.5なることができます.1 .5
KritixiのLithos

@Cowsquackうん、私も気づいた。でもありがとう。
アダム

3

Pythonの3118の 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時間を表す小数です。オフセットは.16分です。


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はから始まる30分単位の時間0です00:30。時刻tにおける衝突の数がある111213等減算は1配列与える000102ゼロでインターリーブ整数である等。これは、次いで、配列のtermwise乗算することにより得られる001122配列を有する等010101などが挙げられる。これらの配列の両方が容易にモジュロ及び(整数)除算を用いて計算されます。

その後、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.