お気に入りの時間を見つける


15

特定のパターンに従う時間が本当に好きです。特に、すべての数字が同じであるか、すべての数字が左から右に1ずつ算術的に増加する時間が好きです。さらに、私が人々が私の時代に手紙を書くとき、私は内心的に嫌うので、そのAM / PMナンセンスのすべては私にとって死んでいます。したがって、私の好きな時間は次のとおりです。

0000 0123 1111 1234 2222 2345

私の心の平和のために、入力として現在の時間を与えられた単一のプログラムを書く必要があります:(A)今が私のお気に入りの時間の1つではない場合、私に両方を教えます(i)何分(ii)今から何分後に私の次のお気に入りの時間が発生するのと同様に、私の最後のお気に入りの時間からです。および(B)それがあればある今、私のお気に入りの回の1、単一の「信号値」を提供しています。

入力

プログラムはstdin、次のいずれかの形式で、現在の時刻を(関数引数、コマンドライン引数などの方法で)受け入れる必要があります。

  • 文字列としての4桁の時刻

  • 文字列として4桁の時刻を作成するために左側にゼロを追加できる整数

  • シーケンスの最初の整数が時間入力の左端(有効)桁になるように順序付けられた4つ(またはそれ以下)の整数のシーケンス(たとえば、または0951として有効に表現できます)[0, 9, 5, 1][9, 5, 1]

    • 0000長さゼロのシーケンスとして表現することは受け入れられます

文字列入力の場合、数字のみを含む必要があり、コロンやその他の句読点は使用できません。 入力は常に有効な24時間と見なすことができます: HHMM、ここで0 <= HH <= 23および0 <= MM <= 59。うるう秒の可能性を無視します。

出力

プログラムは、入力値がターゲット時間であるかどうかに応じて、(A)または(B)のstdoutいずれかを提供する必要があります(関数の戻り値などはすべて問題ありません)。

のために):

次のような適切な形式の2つの数値を指定します。

  • 適切な区切り文字を使用した単一文字列出力

  • 連続した整数/文字列出力。たとえば、次のbash2行を出力しますstdout

    49
    34
    
  • Pythonリスト、C配列など、長さ2の順序付けられた戻り値: [49, 34]

値はどちらの順序でもかまいません。たとえば、次の両方は、入力に対する有効な出力になります1200

49 34
34 49

ただし、順序と区切り文字はすべての入力値で同じでなければなりません!

(B)の場合:

他の方法では達成できない結果を生成します。同じ結果がしかし、目標時間の6つのすべてのために製造しなければなりません。無限ループは除外されます。

サンプル入力/出力

YAY!!! ここでは実証的な例として使用されており、規範的ではありません。

Input      Output
------    --------
 0000      YAY!!!
 0020      20 63
 0105      65 18
 0122      82 1
 0123      YAY!!!
 0124      1 587
 0852      449 139
 1111      YAY!!!
 1113      2 81
 1200      49 34
 1234      YAY!!!
 1357      83 505
 1759      325 263
 1800      326 262
 1801      327 261
 2222      YAY!!!
 2244      22 61
 2345      YAY!!!
 2351      6 9

これはなので、バイト単位の最短コードが優先されます。標準の抜け穴は許可されていません。


お気に入りの時間に何も返さなくても大丈夫ですか?
ジェームズホルダーネス

1
私は、アプリケーションからすべてのバックで何かを得るしない場合@JamesHolderness架空-meが(インタプリタがglitched場合は何?!?!)イライラを取得し、これがなければならないいくつか生成された値または出力。
-hBy2Py

回答:


2

ゼリー34 33 32 31 28バイト

Xcoder氏.ị³トリックのおかげで3バイト。

d³ḅ60;15j83,588ṁ5¤_\ṠÞAµ.ịxẠ

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

いくつかの部分はジョナサン・アランの答えとまったく同じですが、Pythの答えに基づいて独立して書かれている(そして短い:D)と思うので、私はそれを投稿しています。改善の余地もあるはずです。

入力は整数、出力は前後の時間の配列、または特別な時間の空の配列です。

説明

入力例を使用します1200

  • 時間をベース100に変換して、時間と分に変換します[12,0]
  • ḅ60合計60分を取得するためにベース60から変換します720
  • ;1515:とペアにします[720, 15]
  • 83,588配列を作成し[83, 588]ます。
  • ṁ5長さ5:にし[83, 588, 83, 588, 83]ます。
  • ¤上記の2つのアクションを組み合わせます。ただの技術。
  • jペアを配列に結合します[720, 83, 588, 83, 588, 83, 15]
  • _\最初から各配列値を減算し、中間結果を取得します[720, 637, 49, -34, -622, -705, -720]
  • ṠÞ これらをsignumで安定的にソートします:[-34, -622, -705, -720, 720, 637, 49]
  • A絶対値を取ります:[34, 622, 705, 720, 720, 637, 49]
  • µ新しいモナド連鎖を開始します。繰り返しますが、技術的です。
  • .ị最後と最初の項目を取ります:[49, 34]
  • ×Ạゼロがない場合は1回、そうでない場合は0回繰り返します[49, 34]

@JamesHolderness(変更なしサイズ変更のために固定,する;ことは、リストリテラルとしてピックアップされていたので)。
-PurkkaKoodari

おもしろいことに、私はあなたのPythの答えをJellyに移植しようとしましたが、28バイトを得ました。私はそれが別の答えになるほど十分に異なるとは思わないので、それを自由に使用してください(そしてかわいいテストスイート:P)。(³ではなくの使用100許可されていることに注意してください)YAY!!!値は[0, 0]、常に同じです。
氏Xcoder

よかった、ありがとう!主な改善点はハーフインデックスのトリックだと思いますが、私はそのことについて考えたことはありませんでした。
-PurkkaKoodari

私の提案で更新する予定ですか?(念のため、編集するのを忘れた気がしますか?)
Mr Xcoder

@ Mr.Xcoderええ、編集するのを忘れていました。私が使用しますxẠ、私は一種の好むので、ゼロフィルタとして[]オーバー[0, 0]それがより明確に異なるだから。
-PurkkaKoodari

2

JavaScript(ES6)、87 83バイト

@ l4m2のおかげで4バイト節約

入力を文字列として受け取ります。0または2要素配列を返します。

t=>[i=0,83,588,83,588,83,15].every(d=>(k=t-(t/25>>2)*40)>(j=i,i+=d))|i-k&&[k-j,i-k]

テストケース

どうやって?

.every()ループの結果は気にしません。入力が有効であれば、常に虚偽になります。本当に興味があるのはこのループを終了するときです。

i基準時間k(入力時間tを分単位に変換)以上のお気に入りの時間(分単位)が見つかるとすぐに終了します。それ以外の0場合、i == kまたは2つの遅延が返されます。


2
t%100+(t/25>>2)*60=>t-(t/100|0)*40
l4m2

2

Befunge-93、88の 85 86 80 74バイト

&:"d"/58**-:"S"-:"b"6*-:"S"v
@._v#!:<\-*53:-"S":-*6"b":-<
:$#<$$\^@.._\#`0

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

最後のお気に入りの時刻からの分数を出力し、次に次のお気に入りの時刻までの分数を出力します(スペースとハイフンの2文字のシーケンスで区切られます)。すでにお気に入りの時間である場合、単一のゼロが返されます。



1

クリーン、126バイト

import StdEnv
f=[1440,1425,1342,754,671,83,0]
?t#t=t rem 100+t/100*60
=(\(a,b)=(t-hd b,last a-t))(span(\a=t<a||isMember t f)f)

関数を定義し?、取得Intして返し(Int, Int)ます。
引数がお気に入りの時間である場合、呼び出しプログラムをでクラッシュさせhd of []ます。

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


1

Pyth、48 45 42バイト

&*FJ.u-NY+P*3,83 588 15isMcz2 60,eK._DJ_hK

オンラインでお試しください。 テストスイート。

コードは時間文字列を取り込んで、前の時間と次の時間を配列として、または0時間が特別な場合に出力します。

興味深いことに、命令型アプローチも42バイトです。

V+_isMcz2 60+P*3,83 588 15KZIg0=-ZNIZK)_ZB

説明

  • cz2入力(z)を2文字の断片に分割します。
  • sM それらを整数として評価します。
  • i60結果の2項目配列をベース60として解析します。
  • ,83 588は配列を表し[83, 588]ます。
  • *3それを3つに複製し[83, 588, 83, 588, 83, 588]ます。
  • P最後を削除し588ます。
  • +… 最後に15追加15します。
  • .u-NY解析された数値から始まり、配列の各数値をそこから減算し、中間値を返します。これらは、それぞれの特別な時間との違いです。
  • Jこれらの違いをに割り当てJます。
  • *F差の積を計算します。時間が特別な場合、これは0になります。
  • & ここで評価を停止し、時間が特別な場合は0を返します。
  • ._DJ 符号によって差異を安定ソートします。
  • Kその配列をに保存しKます。
  • e 配列の最後の項目を取得します。
  • _hK 配列の最初の項目を取り、それを否定します。
  • , 2つを配列として返します。

そして、それはマイナス記号を吸収する素晴らしい、卑劣な方法です。
hBy2Py

からcz2 60に切り替えてバイトを保存しますc2z60(4要素リストと同等です)
Mr. Xcoder

1

ゼリー 33 32  34 バイト

 +3  +2バイトを修正して、すべてのいいね!時間出力が等しくなるようにします。

もっと短い方法にせよ!

s2Ḍḅ60
83,588ṁ5“¡Ð‘j+\ṡ2>E¥ÞÇḢạÇa\

4桁のリストを取得し、2つの整数を含むリストを返すモナドリンク
-気に入った時間であれば、結果は両方のエントリがゼロになります。

オンラインでお試しください!またはテストスイートを参照してください。

どうやって?

s2Ḍḅ60 - helper link, getMinuteOfDay: list of digits, D   e.g. [1,2,3,3]
 2     - literal two                                           2
s      - split into chunks of length                           [[1,2],[3,3]]
  Ḍ    - un-decimal (convert from base 10) (vectorises)        [12,33]
    60 - literal sixty                                         60
   ḅ   - un-base (convert from base)                           753

83,588ṁ5“¡Ð‘j+\ṡ2>E¥ÞÇḢạÇa\ - Link: list of digits        e.g. [1,2,3,3]
83,588                      - literal list of integers         [83,588]
       5                    - literal five                     5
      ṁ                     - mould like (implicit range of) [83,588,83,588,83]
        “¡Ð‘                - code-page index list             [0,15]
            j               - join                           [0,83,588,83,588,83,15]
              \             - cumulative reduce with:
             +              -   addition                     [0,83,671,754,1342,1425,1440]
                2           - literal two                      2
               ṡ            - overlapping slices of length     [[0,83],[83,671],[671,754],[754,1342],[1342,1425],[1425,1440]]
                     Ç      - last link (1) as a monad f(D)    753
                    Þ       - sort by:
                   ¥        -   last two links as a dyad:
                 >          -     greater than? (vectorises)    [0, 0] [ 0,  0] [  0,  1] [  1,   1] [   1,   1] [   1,   1]
                  E         -     equal?                          1       1         0         1           1           1
                            -                             -->  [[671,754],[0,83],[83,671],[754,1342],[1342,1425],[1425,1440]]
                      Ḣ     - head                             [671,754]
                        Ç   - last link (1) as a monad f(D)    753
                       ạ    - absolute difference (vectorises) [ 82,  1]
                          \ - cumulative reduce with:
                         a  -   AND                            [ 82,  1]
                            -   -- such that if "liked" then the [0,x] result becomes [0,0] so they are all equal

私は、入力形式(数字配列)が質問で許可されているとは思わず、特別な時間の出力の変更も許可されていません。
-PurkkaKoodari

固定が、それは必要な変換に真の意図だった場合、私は知らない...
ジョナサン・アラン

確かに、OPの本来の意図が異なっていたとしても、答えはチャレンジの現在の書面による規則と一致する必要があると思います。
-PurkkaKoodari

@ Pietu1998もともと、数字のリストを有用な入力フォームとは考えていませんでした。主なコメントの議論ごとに、数字列の入力を許可するためにチャレンジを正式に改訂しました。
hBy2Py

1

、36バイト

?↑2↑0Πṙ_1†aÖ±↔Ġ-::15t*3e588 83B60†d½

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

三者がチャットでどのように機能するかを説明してくれたZgarbに感謝します。ゴルフをしようとし↑0ていますが、何らかの理由で動作しませんでした(?)。これは私の最初の重要な回答であり、前述のことはさておき、私はかなり満足しています。代わりに使用される値YAY!!![](ただし、ゴルフの目的で変更されることを願っています)。

説明

?↑2↑0Πṙ_1†aÖ±↔Ġ-:: 15t * 3e588 83B60†d½| CLAから数字リストとして入力し、STDOUTに出力します。

                                   ½| リストを2つに分割します。
                                 †d | 各半分を10進整数に変換します。
                              B60 | ベース60から変換します。
                :| 上記を↓に追加します([15、83、588、83、588、83])。
                       e588 83 | 2つの要素のリスト[588、83]を作成します。
                     * 3 | 3回繰り返します。
                    t | 最初の要素を削除します。
                 :15 | 15.の前に付けます
              Ġ-| 右から累積減算を適用します。
             ↔| 逆。
           Ö±| 記号による安定したソート(-1、0、または1)。
         †a | 絶対値をマップします。
      ṙ_1| 1つ右に回転します。
?Π| 製品が真実である場合:
 ↑2 | 最初の2つの要素を取得します。
   ↑0 | それ以外の場合は、空のリストを返します。

1

コトリン、293バイト

{fun i(l:List<Int>)=l.all{it==l[0]}|| l.mapIndexed{a,b->b-a}.all{it==l[0]}
val a=(0..1439+0).map{val h=it/60
val m=it%60
listOf(h/10,h%10,m/10,m%10)}+listOf(listOf(0,0,0,0))
val s=a.indexOf(it)
if(i(it))0 to 0 else
s-a.subList(0,s).indexOfLast{i(it)}to a.subList(s,a.size).indexOfFirst{i(it)}}

美化

{
    fun i(l:List<Int>)=l.all { it ==l[0] } || l.mapIndexed { a, b -> b - a }.all { it ==l[0] }
    val a = (0..1439 + 0).map {
        val h = it/60
        val m = it%60
        listOf(h/10,h%10,m/10,m%10)
    } + listOf(listOf(0,0,0,0))
    val s = a.indexOf(it)
    if (i(it)) 0 to 0 else
        s - a.subList(0, s).indexOfLast {i(it)} to a.subList(s, a.size).indexOfFirst {i(it)}
}

テスト

var t:(i:List<Int>)-> Pair<Int, Int> =
{fun i(l:List<Int>)=l.all{it==l[0]}|| l.mapIndexed{a,b->b-a}.all{it==l[0]}
val a=(0..1439+0).map{val h=it/60
val m=it%60
listOf(h/10,h%10,m/10,m%10)}+listOf(listOf(0,0,0,0))
val s=a.indexOf(it)
if(i(it))0 to 0 else
s-a.subList(0,s).indexOfLast{i(it)}to a.subList(s,a.size).indexOfFirst{i(it)}}

data class Test(val input: List<Int>, val output: Pair<Int, Int>)

val TEST = listOf(
    Test(listOf(0,0,0,0), 0 to 0),
    Test(listOf(0,0,2,0), 20 to 63),
    Test(listOf(0,1,0,5), 65 to 18),
    Test(listOf(0,1,2,2), 82 to 1),
    Test(listOf(0,1,2,3), 0 to 0),
    Test(listOf(0,1,2,4), 1 to 587),
    Test(listOf(0,8,5,2), 449 to 139),
    Test(listOf(1,1,1,1), 0 to 0),
    Test(listOf(1,1,1,3), 2 to 81),
    Test(listOf(1,2,0,0), 49 to 34),
    Test(listOf(1,2,3,4), 0 to 0),
    Test(listOf(1,3,5,7), 83 to 505),
    Test(listOf(1,7,5,9), 325 to 263),
    Test(listOf(1,8,0,0), 326 to 262),
    Test(listOf(1,8,0,1), 327 to 261),
    Test(listOf(2,2,2,2), 0 to 0),
    Test(listOf(2,2,4,4), 22 to 61),
    Test(listOf(2,3,4,5), 0 to 0),
    Test(listOf(2,3,5,1), 6 to 9)
)

fun main(args: Array<String>) {
    for (t in TEST) {
        val v = t(t.input)
        if (v != t.output) {
            throw AssertionError("$t $v")
        }
    }
}

TIO

TryItOnline

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.