내가 좋아하는 시간 찾기


15

특정 패턴을 따르는 시간이 정말 마음에 듭니다. 특히, 나는 모든 자릿수가 같거나 모든 자릿수가 왼쪽에서 오른쪽으로 산술적으로 증가하는 시간을 좋아합니다. 또한, 사람들이 내 시대에 편지를 쓰면 눈에 띄게 미워하므로 AM / PM의 말도 안되는 소리가 모두 나에게 죽습니다. 따라서 내가 가장 좋아하는 시간은 다음과 같습니다.

0000 0123 1111 1234 2222 2345

내 마음의 평화를 위해 현재 시간을 입력으로 제공하는 단일 프로그램을 작성해야합니다. (A) 지금 내가 좋아하는 시간 중 하나 가 아닌 경우 (i) 몇 분인지 알려주십시오. 나의 마지막 마음에 드는 시간 이후 였을뿐 아니라 (ii) 다음 몇 분간의 다음 마음에 드는 시간이 일어날 지; 및 (B) 가있는 경우 입니다 지금 내가 가장 좋아하는 시간 중 하나를, 하나의 '신호 값'을 공급한다.

입력

프로그램은 stdin다음과 같은 형식으로 현재 시간 을 어떤 방법 으로든 함수 인수 , 명령 행 인수 등으로 받아 들여야합니다 .

  • 문자열로 된 네 자리 시간

  • 4 자리 시간을 문자열로 만들기 위해 왼쪽에 0으로 채워질 수있는 정수

  • 시퀀스의 첫 번째 정수가 시간 입력에서 가장 왼쪽 (유의 한) 숫자가되도록 정렬 된 4 개 이하의 정수 시퀀스 (예 : 또는 0951로 유효하게 표시 될 수 있음 )[0, 9, 5, 1][9, 5, 1]

    • 대표 0000길이 제로 시퀀스로 허용

문자열 입력의 경우 숫자, 콜론 또는 다른 문장 부호 포함 해야 합니다 . 입력은 항상 24 시간 유효한 것으로 가정 할 수 있습니다 : HHMM , where 0 <= HH <= 230 <= MM <= 59. 윤초의 가능성을 무시하십시오.

산출

입력 값이 목표 시간인지 여부에 따라 프로그램이 (A) 또는 (B)stdout 중 하나 를 제공해야합니다 (함수 반환 등 ) .

(A)의 경우 :

다음과 같이 적절한 형식으로 두 개의 숫자 값을 제공하십시오.

  • 적합한 구분 기호가있는 단일 문자열 출력

  • 순차 정수 / 문자열 출력, 예를 들면, bash두 개의 라인을 인쇄 stdout:

    49
    34
    
  • Python 목록, C 배열 등과 같은 길이가 2 개인 반환 값 : [49, 34]

값은 어느 순서로나 올 수 있습니다. 예를 들어, 다음은 모두 입력에 대한 유효한 출력입니다 1200.

49 34
34 49

그러나 모든 입력 값의 순서와 구분 기호는 동일해야합니다!

(B)의 경우 :

다른 방법으로는 얻을 수없는 결과를 생성하십시오. 같은 결과는하지만, 목표 시간의 여섯 용으로 제작해야합니다. 무한 루프는 제외됩니다.

샘플 입력 / 출력

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

입니다 바이트의 승리에 너무 짧은 코드. 표준 허점 은 허용되지 않습니다.


좋아하는 시간 동안 아무것도 반환하지 않아도 되나요?
James Holderness

1
나는 응용 프로그램 (어떤 인터프리터가 glitched 경우?!?!)에서 모든 뒷면에 아무것도하지 않는 경우 @JamesHolderness 소설은 - 나, 그래서이 있어야한다 불안해을 얻는다 일부 생성 된 값 또는 출력.
hBy2Py

답변:


2

젤리 , 34 33 32 31 28 바이트

Xcoder 씨 .ị³트릭 덕분에 3 바이트 .

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

온라인으로 사용해보십시오!

일부는 Jonathan Allan의 답변 과 정확히 같지만 Pyth 답변 (및 더 짧은 : D)을 기반으로 독립적으로 작성된 것으로 생각되므로 게시하고 있습니다. 개선의 여지가 있어야합니다.

입력은 정수이고 출력은 이전 및 다음 시간의 배열이거나 특수한 시간의 빈 배열입니다.

설명

예제 입력 사용 1200.

  • 시간을 기본 100으로 시간과 분으로 변환합니다 [12,0].
  • ḅ60기본 60에서 변환하여 총 분을 얻습니다 720..
  • ;1515와 쌍을 이룹니다 [720, 15].
  • 83,588배열을 만듭니다 [83, 588].
  • ṁ5길이를 5 :로 만듭니다 [83, 588, 83, 588, 83].
  • ¤위의 두 동작을 결합합니다. 기술 일뿐입니다.
  • 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].
  • ×Ạ0이 없으면 한 번, 그렇지 않으면 0 번 반복합니다 [49, 34].

@JamesHolderness (변경 없음 크기 변화에 대한 수정 ,;이리스트 리터로 촬상되는 이후).
PurkkaKoodari

재미있게도, 나는 Pyth 답변을 Jelly로 이식하려고 시도했으며 28 바이트를 얻었습니다 . 나는 그것이 별도의 답변이 될만큼 충분히 다르다고 생각하지 않으므로 자유롭게 사용하십시오 (그리고 귀여운 테스트 스위트 : P). ( ³대신에 사용 하는 100것이 허용됨 ) YAY!!!값은 [0, 0]항상 동일합니다.
Mr. Xcoder

감사합니다! 주요 개선 사항은 반 인덱싱 트릭이라고 생각합니다.
PurkkaKoodari

내 제안으로 업데이트 할 계획입니까? (단지 알림, 편집을 잊어 버린 느낌이 있습니까?)
Mr. Xcoder

@ Mr.Xcoder 그래, 편집하는 것을 잊었다. 내가 사용합니다 xẠ내가 가지 선호하기 때문에 제로 필터로 []이상 [0, 0]더 명확하게 다르다 때문이다.
PurkkaKoodari

2

자바 스크립트 (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분 단위로 변환 된 입력 시간 )보다 크거나 같은 선호 시간 (분으로 표시)을 찾으면 종료 합니다. 그런 다음 0if 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

온라인으로 사용해보십시오!

마지막 즐겨 찾기 시간 이후의 분 수와 다음 즐겨 찾기 시간까지의 시간 (분, 공백, 하이픈으로 구분)을 출력합니다. 이미 좋아하는 시간이면 단일 0이 반환됩니다.



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)을 두 문자 조각으로 나눕니다 .
  • sM 정수로 평가합니다.
  • i60결과로 생성 된 두 항목 배열을 기본 60으로 구문 분석합니다.
  • ,83 588배열을 나타냅니다 [83, 588].
  • *3그것을 세 번 [83, 588, 83, 588, 83, 588].
  • P마지막을 제거합니다 588.
  • +… 끝에 15추가 15합니다.
  • .u-NY구문 분석 된 숫자에서 시작하여 배열의 각 숫자를 빼고 중간 값을 반환합니다. 이것은 각각의 특별한 시간과의 차이점입니다.
  • J이러한 차이점을에 할당합니다 J.
  • *F차이의 곱을 계산합니다. 시간이 특별하면 0이됩니다.
  • & 여기서 평가를 중지하고 시간이 특별하면 0을 반환합니다.
  • ._DJ 안정적으로 차이를 부호별로 정렬합니다.
  • K해당 배열을에 저장합니다 K.
  • e 배열의 마지막 항목을 가져옵니다.
  • _hK 배열의 첫 번째 항목을 가져 와서 무시합니다.
  • , 둘을 배열로 반환합니다.

그리고 그것은 음의 부호를 흡수하는 훌륭하고 비열한 방법입니다.
hBy2Py

cz2 60c2z60
Xcoder

1

젤리 ,  33 32  34 바이트

 +3  +2 바이트로 수정하여 좋아하는 모든 시간 출력이 동일합니다.

더 짧은 길이어야 해요!

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

네 자리의 목록을 가져와 두 개의 정수를 포함하는 목록을 반환하는 모나드 링크
-좋아하는 시간이면 결과는 두 항목이 모두 0입니다.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

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

고쳐졌지만, 그러한 변화가 필요한 진정한 의도인지는 모르겠습니다 ...
Jonathan Allan

그러나 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에 출력합니다.

                                   ½ | 목록을 두 부분으로 나눕니다.
                                 † d | 각 반을 10 진수로 바꿉니다.
                              B60 | 베이스 60에서 변환합니다.
                : | 위의 내용을 ↓에 추가하십시오 ([15, 83, 588, 83, 588, 83]).
                       588 회 | 두 요소 목록을 작성하십시오 [588, 83].
                     * 3 | 세 번 반복하십시오.
                    t | 첫 번째 요소를 제거하십시오.
                 : 15 | 15를 앞에 붙입니다.
              Ġ- | 오른쪽에서 누적 빼기를 적용합니다.
             ↔ | 역.
           Ö ± | 부호 (-1, 0 또는 1)로 안정적인 정렬.
         † a | 절대 값을 매핑하십시오.
      ṙ_1 | 오른쪽으로 돌리십시오.
? Π | 제품이 진실한 경우 :
 ↑ 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.