タイムアナグラム


29

もともと@Tlinkによって投稿(および削除)されました。これは、このStackOverflowの質問に触発された可能性が高いです。
それは削除されたのは残念だったので、それは一般に良い挑戦のように思えたので、私は適切なフォーマットとルールでそれを再投稿すると思いました。(@Tlinkに連絡して投稿の許可を取得しようとしましたが、(s)彼はこれ以上応答しないため、今すぐ自分で投稿することにしました。)

入力: 6桁。

出力: 24時間形式の最初または最後の有効な時間(00:00:0023:59:59)。(最初または最後の有効な時間を出力するかどうかを自分で選択できます。)

例:

入力がの1,8,3,2,6,4場合、次の時間が作成できます。

12:36:48    12:38:46    12:46:38    12:48:36
13:26:48    13:28:46    13:46:28    13:48:26
14:26:38    14:28:36    14:36:28    14:38:26
16:23:48    16:24:38    16:28:34    16:28:43
16:32:48    16:34:28    16:38:24    16:38:42
16:42:38    16:43:28    16:48:23    16:48:32
18:23:46    18:24:36    18:26:34    18:26:43
18:32:46    18:34:26    18:36:24    18:36:42
18:42:36    18:43:26    18:46:23    18:46:32
21:36:48    21:38:46    21:46:38    21:48:36
23:16:48    23:48:16

したがって、最初または最後のそれぞれ12:36:48または23:48:16この場合に出力します。

チャレンジルール:

  • 回答の最初または最後の有効な時間を出力したかどうかを示します。
  • I / Oは柔軟です。入力には、6つの整数を使用できます。6桁の数字を含む文字列。整数リスト/配列。単一の(おそらく8進数)番号。など。出力は、正しい順序の数字のリスト/配列にすることができます。形式の文字列HH:mm:ss/ HHmmss/ HH mm ss。改行区切り文字で印刷されたすべての数字。など。
  • 任意の順序で数字を取得することが許可されているため、すでに最低から最高、またはその逆にソートできます。
  • 指定された数字(つまり2,5,5,5,5,5)で有効な時間を作成できない場合は、任意の方法で明確にします。null/を返すことができfalseます "Not possible"; エラーでクラッシュします。など(のような無効な時間55:55:52、またはのような別の有効な時間を出力することはできません00:00:00。)有効な時間を作成できない入力をどのように処理するかを指定してください。
  • 有効なすべての時間を出力することはできません。最古/最新のみが出力/返される必要があります。
  • 24時間(つまり24:00:00)、または60分/秒(つまり00:60:60)は無効です。範囲は[00-23]、時間と[00-59]分と秒です。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

Input:          Earliest output:     Latest output:

1,2,3,4,6,8     12:36:48             23:48:16
2,5,5,5,5,5     None possible        None possible
0,0,0,1,1,1     00:01:11             11:10:00
1,1,2,2,3,3     11:22:33             23:32:11
9,9,9,9,9,9     None possible        None possible
2,3,5,5,9,9     23:59:59             23:59:59
1,2,3,4,5,6     12:34:56             23:56:41
0,0,0,0,0,0     00:00:00             00:00:00
1,5,5,8,8,8     18:58:58             18:58:58
1,5,5,5,8,8     15:58:58             18:58:55
1,1,1,8,8,8     18:18:18             18:18:18

1
23:48:16この例の有効な出力ではありませんか?
TFeld

最も早い時間または最も遅い時間のどちらか一方または両方を出力する必要がありますか?
tsh

@tsh 1つだけ。どちらがあなた次第です。これまでの2つのPythonの回答は、最も早いものを出力しました。
ケビンCruijssen

「有効時間」はうるう秒を考慮しませんか?たとえば、06:08:60その分にうるう秒があった場合、有効でしょうか?
エリックアウトゴルファー

@EriktheOutgolferいいえ、60分と秒は無効です。範囲は[00-23][00-59][00-59]。これをチャレンジで明らかにします。
ケビンCruijssen

回答:


9

C(gcc)186 174バイト

D[7]={0,1,10,100,1e3,1e4,1e5};G(O,L,F,T,I,M,E){if(!F)O=L<24e4&L%10000<6e3&L%100<60?L:1e9;else{for(T=1e9,I=0;I++<F;M=G(O/10,L*10+E,F-1),T=T>M?M:T,O=(O/10)+E*D[F])E=O%10;O=T;}}

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

Kevin Cruijssenのおかげで-12バイト

おそらく最適ではありませんが、動作します。奇妙なことに、7つの引数を持つ何らかの理由で、TIOのgcc実装では、実際にそれらを提供するか、セグメンテーション違反が必要です。ただし、私のマシンでは不要です。

形式:G(X、0,6)-> Yここで、Xは数字を使用する6桁の数字、Yは6桁の数字で、時間として(適切に挿入することにより)最小となる6桁の数字です。


2
私はあなたがゴルフができると思う{0,1,10,100,1000,10000,100000}{0,1,10,100,1e3,1e4,1e5}。また、あなたはゴルフができfor(I=0;I<F;++I){E=O%10;M=G(O/10,L*10+E,F-1);T=T>M?M:T;O=(O/10)+E*D[F];}にはfor(I=0;I++<F;M=G(O/10,L*10+E,F-1),T=T>M?M:T,O=(O/10)+E*D[F])E=O%10;、と周りのブラケットを取り外しifオンラインで174バイト試してください。また、私は好きG(O,L,F,T,I,M,E)です。:)
ケビンクルーイッセン

おかしい、私のマシンでは使用...1e3,1e4,1e5}しませんでした。提案をありがとう。
ラムダベータ

あなたはこの男の答えのどこにでもいる、@ ceilingcat、素敵なゴルフ。
ザカリー

私は洞察に感謝します。人々が実際に答えを読んで、それらを改善する方法を見つけるのを見るのは常に素晴らしいことです。:)あなたも今、彼らのいたるところにいます。
ラムダベータ


6

Haskell114 96 86バイト

import Data.List
f l=minimum[x|x@[a,b,c,d,e,f]<-permutations l,a:[b]<"24",c<'6',e<'6']

厳密性の低い出力になりました。入力を数字の文字列として受け取り、リストの比較で置換と制限を比較します。分と秒では、最初の桁のみがチェックされます。順列が有効な時間でない場合、クラッシュして火傷します。

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


5

パイソン2131の 115 112 109 105 88バイト

lambda s:min(d for d in permutations(s)if(2,4)>d[:2]>d[4]<6>d[2])
from itertools import*

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

I / Oは整数のリストです

時間が不可能な場合はエラーをスローします


代替案:

Python 2、88バイト

lambda s:max(d*((2,4)>d[:2]>d[4]<6>d[2])for d in permutations(s))
from itertools import*

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

最新の時刻を返します

無効な時間に対して空のタプルを返します


保存しました

  • -21バイト、ovsのおかげ


5

JavaScript(ES6)、93 89 88バイト

最低から最高にソートされた6桁の配列が必要です。最初の有効な時間の6桁の文字列を返すか、false解決策が存在しない場合。

f=(a,t='')=>t<24e4&/..([0-5].){2}/.test(t)?t:a.some((v,i)=>s=f(a.filter(_=>i--),t+v))&&s

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

コメント済み

算術式と正規表現の両方を使用してハイブリッドテストに合格するものが見つかるまで、入力のすべての順列を再帰的に試行します。

f = (                       // f = recursive function taking
  a, t = ''                 // a[] = input array and t = current time
) =>                        //
  t < 24e4 &                // if t is less than 240000
  /..([0-5].){2}/.test(t) ? // and it matches "hhMmSs" with M and S in [0-5]:
    t                       //   return t
  :                         // else:
    a.some((v, i) =>        //   for each digit v at position i in a[]:
      s = f(                //     save in s the result of a recursive call with:
        a.filter(_ => i--), //       a copy of a[] with the current digit removed
        t + v               //       the current digit appended to t
      )                     //     end of recursive call
    ) && s                  //   end of some(); if truthy, return s

5

Japt、17バイト

入力を数字列として受け取り、最初の有効な時間を出力します。有効な時間がない場合、無限ループします。

á
@øXr':}a@ÐX ¤¯8

それを試してみてください

警告:非常に遅い-2 *1000番目の後に追加して、X速度をいくらか上げます。また、無効な入力は無限ループを作成し、ブラウザをクラッシュさせる可能性があることを忘れないでください。


説明

                   :Implicit input of string U
á                  :Get all permutations of U
\n                 :Reassign that array to U
      }a           :Loop until true and then return the argument that was passed
        @          :By default that argument is an integer X which increments on each loop so first we'll pass X through a function
         ÐX        :  new Date(X)
            ¤      :  Get the time
             ¯8    :  Slice to the 8th character to get rid of the timezone info
@                  :The function that tests for truthiness
  Xr':             :  Remove all colons in X
 ø                 :  Does U contain the resulting string?

5

網膜77 74 69 65 62バイト

$
:
6+Lv$`(.)(.*):
$%`$2:$1$%'
O`
0L`([01].|2[0-3])([0-5].){2}

オンラインでお試しください!最も早い時刻を出力します。時刻が見つからない場合は空の文字列を出力します。編集:@TwiNightのおかげで5 8バイトを保存しました。説明:

$
:
6+Lv$`(.)(.*):
$%`$2:$1$%'

すべての順列を生成します。:順列として文字列が生成され、最初に終了するものの、この方法は機能します。

O`

時間を順番に並べ替えます。

0L`([01].|2[0-3])([0-5].){2}

最初の有効な時間を出力します。


改行で区切られた数字を出力できるため、5バイト
-TwiNight

6文字と一致する必要があり、最初の文字は0、1、または2でなければならないため、grepステージで:を削除することもできます
TwiNight

@TwiNightああ、Grepがそれより短い場合は、とにかく4バイトを節約できます。
ニール

そうそう、ちょうどできるL0
-TwiNight

@TwiNight 0G実際に。
ニール

4

157124バイト

説明をもっと注意深く読むように私に思い出させてくれたKevin Cruijssenに感謝します!

func[s][a: 0:0:0 loop 86400[b: to-string a a: a + 1 if b/1 =#"0"[insert b"0"]if s = sort replace/all copy b":"""[return b]]]

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

ソートされた文字列を入力として受け取ります。none時間を作ることができない場合に戻ります。

説明:

f: func[s][                                    ; the argument is a sorted string of digits
    a: 0:0:0                                   ; time object, set to 00:00:00 h 
    loop 86400 [                               ; loop through all seconds in 24 h
        b: to-string a                         ; convert the time to string 
        a: a + 1                               ; add 1 second to the current time   
        if b/1 = #"0" [                        ; prepend "0" if necessary
            insert b "0"                       ; (Red omits the leading 0)
        ]
        if s = sort replace/all copy b ":" ""[ ; compare the input with the sorted time
            return b                           ; return it if they are equal 
        ]
    ]
]

3
であるsort必要は開始時に?チャレンジでは、次のように述べています。任意の順序で数字を取得できるため、すでに最低から最高、またはその逆に並べ替えることができます。
ケビンクルーイッセン

@Kevin Cruijssen-いいえ、この場合は必要ありません。ソートされた入力で動作するようにソリューションを更新します。ありがとうございました!
ガレンイワノフ

3

Python 2、78バイト

lambda s:min(x for x in range(62**3)if x%100<60>x/100%100<s==sorted('%06d'%x))

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

Arnauldはバイトを保存しました。ありがとう!

['1','2','3','4','6','8']ソートされた順序のようなリストを期待します:

任意の順序で数字を取得することが許可されているため、すでに最低から最高、またはその逆にソートできます。

12364812:36:48のような整数を出力します。それが受け入れられることを願っています。


2
62**3代わりに使用できます240000か?
アーナウルド


3

Japt39 23バイト

これを行うより短い方法があることはかなり確かですが、JaptでDateオブジェクトを使用してみたかったのです。

á ®¬ò q':Ãf@T<ÐXiSiKÅ
Ì

á                     // Get all permutations of the input array.
  ®¬ò q':à            // [1,2,3,4,5,6] -> "12:34:56"
          f@          // Filter the results, keeping those that
            T<        // are valid dates
              ÐXiSiKÅ // when made into a date object.
Ì                     // Return the last remaining item, if any.

入力を数値のソートされた配列として受け取り、最新の有効時間を返すか、存在しない場合は空の出力を返します。シャギーのおかげで
10 ポンドのバイトを失いました。

ここで試してみてください



@Shaggyありがとう、本当にすてきです。今まで、Japtが日付のメソッドドキュメントに別のセクションを持っていることを知りませんでした。
NIT

3

ルビー68 67 62 56 55バイト

->*b{b.permutation.find{|a,b,c,d,e|c<6&&e<6&&a*9+b<22}}

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

入力:ソートされた数字の配列(整数として)。

出力:数字の配列、またはnil解が見つからない場合


スペースを落とすことができるeval "と思います。
ケビンCruijssen

はい、動作します、ありがとう。
GB

a*9+b<221バイトでできると思います。
JayCe

2

ゼリー、17 バイト

私はこれが最短のアプローチではないことをほぼ確信しています...これを後でもう一度見ていきます:)

Œ!s2Ḍ<ẠʋÐṀ“ð<<‘ṢḢ

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


あなたは正しい、これは最短のアプローチではありません。しかし、公的な屈辱は良くないので、改善点についてはまだコメントしません。:)
エリックアウトゴルファー

入力がソートされていると想定される可能性があるため、いくらか節約できます。ゴルフに2分間費やしただけでも、よく見えるのは屈辱的ではありません!
ジョナサンアラン

より正確には、15バイトで実行できます。1バイトを保存するには、些細なことをする必要があります。他を救うために、それはそれほど些細ではありません。気をつけて、私はその15バイトバージョンを投稿するつもりでしたが、それはあなたのアプローチを使用しています。ところで、あなたの健康は大丈夫ですか?
エリックアウトゴルファー

さあ、投稿してください。健康は良いです、私は仕事にいるので、ゴルフに時間を費やすことはできません!!
ジョナサンアラン

投稿しました。これで、なぜ私が「屈辱」に言及していたかがわかります。:P
エリック・ザ・アウトゴルファー

2

Wolfram言語(Mathematica)、63バイト

FirstCase[Permutations@#,{a:0|1|2,b_,c_,_,d_,_}/;a*b-4<6>d>=c]&

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

取りソートされた入力として、数字のリストを。Missing[NotFound]無効な入力に対して返します。

説明

Permutations@#

入力のすべての順列を見つけます。入力はソートされるため、有効な時間はすべて昇順であることが保証されます。

FirstCase[ ... ]

一致する最初のリストを検索...

{a:0|1|2,b_,c_,_,d_,_}

最初の要素は、標識されたa、0、1、又は2であり、及び第二、第三、及び第五の要素を標識bcおよびdそれぞれ...

... /;a*b-4<6>d>=c

...ようにa*b10未満であり、dそしてcと、6未満でありますd >= c

トリックは、すべての番号のことである0024、二桁の製品は9以下である、可能な無効な数字2529(我々は、0,1、又は2であることが最初の桁を強制するため)少なくとも10個の製品を持っています。


2

Pyth、37バイト

j\:hf&&<shT24<s@T1 60<seT60mcs`Md2S.p

テストスイート

説明:
j\:hf&&<shT24<s@T1 60<seT60mcs`Md2S.pQ # Code with implicit variables
   h                                   # The first element of
                                   .pQ # The list of all permutations of the input list
                                  S    # Sorted
                           mcs`Md2     # Mapped to three two digit long strings
    f                                  # Filtered on whether
       <shT24                          #  The first number is less than 24
      &      <s@T1 60                  #  AND the second number is less than 60
     &               <seT60            #  AND the third number is less than 60
j\:                                    # Joined by a colon


2

バッシュ+ GNUは、sedの8372、69のバイト

  • 6つの個別の引数として入力を受け入れます。
  • 最も早い時間(見つかった場合)を返します。
  • 有効な組み合わせが存在しない場合、何も返しません(空の出力)。

seq 0 86399|sed "s/^/date +%T -ud@/e;h;`printf s/%d//\; $@`/\w/d;x;q"

使い方

GNU-sed e(xecute)コマンド+ を使用して、0から86399の範囲のタイムスタンプに対して、可能なすべての時間文字列を事前生成しますdate

%seq 0 86399|sed "s/^/date +%T -ud@/e;h;"

00:00:00
00:00:01
...
23:59:59

sed入力数字ごとに、6つの順次置換コマンドを使用してスクリプトを生成します。

%echo sed `printf s/%d//\; $@`

sed s/1//;s/2//;s/3//;s/4//;s/6//;s/8//;

次に、置換を適用し、少なくとも1桁残っている入力行を削除し、最初に一致する行を印刷します(元の時間文字列はでホールドスペースから抽出されますx)。

%echo 23:45:12|sed 's/1//;s/2//;s/3//;s/4//;s/6//;s/8//;'
:5:2 //non-matching, delete

%echo 12:36:48|sed 's/1//;s/2//;s/3//;s/4//;s/6//;s/8//;'
:: //matching, print and stop

テスト

%./timecomb 1 2 3 4 6 8
12:36:48
%./timecomb 2 5 5 5 5 5
%./timecomb 0 0 0 1 1 1
00:01:11
%./timecomb 1 1 2 2 3 3
11:22:33
%./timecomb 9 9 9 9 9 9
%./timecomb 2 3 5 5 9 9
23:59:59
%./timecomb 1 2 3 4 5 6
12:34:56
%./timecomb 0 0 0 0 0 0
00:00:00
%./timecomb 1 5 5 8 8 8
18:58:58
%./timecomb 1 5 5 5 8 8
15:58:58
%./timecomb 1 1 1 8 8 8
18:18:18

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


2

Kotlin396 391 389バイト

これを小さくする方法はわかりません。私はそれが可能なことの2倍だと思っています。最も早い時間を生成します。7バイトのケビンに感謝します!

fun p(d:Array<Int>)={val s=Array(6,{0})
val f=Array(6,{1>0})
val t=Array(3,{0})
val o=Array(3,{60})
fun r(i:Int){if(i>5){var l=0>1
var e=!l
for(p in 0..2){t[p]=s[p*2]*10+s[p*2+1]
l=l||(e&&t[p]<o[p])
e=e&&t[p]==o[p]}
if(t[0]<24&&t[1]<60&&t[2]<60&&l)for(p in 0..2)o[p]=t[p]}
else
for(p in 0..5)if(f[p]){f[p]=0>1
s[i]=d[p]
r(i+1)
f[p]=1>0}}
r(0)
if(o[0]>23)0
else "${o[0]}:${o[1]}:${o[2]}"}()

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


2
私はKotlinを知りませんが、あなたは本当に両方var l=0>1を必要としvar e=1>0ますか?また、なぜあるl=le=e必要?ゴルフに仕事に思える二つのものがあるvar e=1>0var e=!lして前にスペースを削除します"None"。また、偽の出力は問題"None"ありません0
ケビンCruijssen

@Kevinは5バイトをありがとう。ショックを受けた私はそれらの1つを逃した。ループを中止していないので、とにかく2つの時間が同じであるかどうかがわからないので、新しいループの方が少ないと判断できます。たくさんの方法をコーディングしましたが、これが最短になりました。ただし、全体的なコードは私が好むよりもはるかに大きいです。
ジョンウェルズ

1
最新バージョンでゴルフにさらに2バイト:"0"ちょうどすることができます0
ケビンCruijssen

String型ではない@Kevinで、StringとIntの両方を許可するには:Anyを追加する必要があります。
ジョンウェルズ

1
うーん TIOでも0機能しますが、エラーなしで出力されます。そして、現在の関数は、私が知る限り、戻り値の型を指定していません。PS:コトリンはまったく知りません。引用符なしで試しただけで、結果は同じでした。;)たぶん、それが原因で他の何かが機能していません。
ケビンCruijssen

2

MATL31 30バイト

Y@3Xy[X1]X*!Y*t[4XX]6*<!AY)1Y)

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

入力は6つの整数で、出力は配列の最小の時間、分、および秒です。そのような時間が不可能な入力のクラッシュ。

(@Luis Mendoのおかげで1バイト。)


私はあなたが交換することができると思う2&Aことで!Aバイナリ行列が行ベクトルになることはありませんので、
ルイス・Mendo



1

網膜58 47バイト

+,V^2`[0-5][6-9]{2}
G`([01].|2[0-3])([0-5].){2}

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

入力は、ソートされた順序で6桁です。出力は、最も早い有効時間を表す6桁、または有効な時間が存在しない場合は空の文字列です。

編集:私はばかだった、-9バイト

説明

アルゴリズム

簡潔にするために、低桁を0〜5、高桁を6〜9として定義しましょう。

まず、各位置の「低さ」または「高さ」が正しいように数字を再配置します。入力の上位桁数ごとの正しい配置:

# of highs  arrangment
0           LLLLLL
1           LLLLLH
2           LLLHLH
3           LHLHLH
4+          Not possible

並べ替えが失敗すると、入力の最終チェックに4桁以上の数字が含まれるため、そのケースを完全に無視できます。

次に、低値と高値を個別に並べ替えます。再配置と組み合わせると、分と秒の制約を満たす最小値が得られます。したがって、存在する場合、これは最も早い有効な時間を提供します。

最後に、有効な時間があるかどうかを確認します。そうでない場合は、文字列を破棄します。


プログラム

+,V^2`[0-5][6-9]{2}

LHHその中の最初の2桁に一致してスワップし(になりますHLH)、それがなくなるまで繰り返しLHHます。これにより、正しい配置が得られます。

実際、私は嘘をついた。1)スワップは隣接する数字間でのみ発生し、低位と高位の間でのみ行われるため、ソートは不要です。および2)入力がソートされます。そのため、最低値と最高値は個別にすでにソートされています。

G`([01].|2[0-3])[0-5].[0-5].

有効な時間である場合にのみ文字列を保持します

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