Tìm thời gian yêu thích của tôi


15

Tôi thực sự thích thời gian theo mô hình nhất định. Cụ thể, tôi thích những thời điểm mà tất cả các chữ số đều giống nhau hoặc tất cả các chữ số đều tăng một cách hợp lý bởi một từ trái sang phải. Hơn nữa, tôi ghét một cách trực quan khi mọi người đặt thư vào thời của tôi, vì vậy tất cả những điều vô nghĩa AM / PM đó đã chết đối với tôi. Vì vậy, thời gian yêu thích của tôi là:

0000 0123 1111 1234 2222 2345

Để tôi yên tâm, tôi cần bạn viết cho tôi một chương trình duy nhất, với thời gian hiện tại là đầu vào, cả hai: (A) nếu bây giờ không phải là một trong những thời điểm yêu thích của tôi, hãy cho tôi biết cả hai (i) bao nhiêu phút kể từ lần yêu thích cuối cùng của tôi cũng như (ii) bao nhiêu phút kể từ bây giờ thời gian yêu thích tiếp theo của tôi sẽ xảy ra; và (B) nếu bây giờ một trong những thời điểm yêu thích của tôi, hãy cung cấp một 'giá trị tín hiệu' duy nhất.

Đầu vào

Chương trình của bạn nên chấp nhận (bằng bất kỳ phương thức nào: đối số hàm, stdinđối số dòng lệnh, v.v.) thời gian hiện tại, theo bất kỳ định dạng nào sau đây:

  • Một thời gian bốn chữ số như một chuỗi

  • Một số nguyên có thể được đệm bằng 0 ở bên trái để tạo thời gian gồm bốn chữ số dưới dạng chuỗi

  • Một chuỗi gồm bốn (hoặc ít hơn) số nguyên, được sắp xếp sao cho số nguyên đầu tiên trong chuỗi là chữ số ngoài cùng (có ý nghĩa) trong đầu vào thời gian (ví dụ: 0951có thể được biểu diễn hợp lệ là [0, 9, 5, 1]hoặc [9, 5, 1])

    • Biểu diễn 0000dưới dạng một chuỗi có độ dài bằng không được chấp nhận

Trong trường hợp đầu vào chuỗi, nó chỉ nên chứa các chữ số, không có dấu hai chấm hoặc dấu chấm câu khác. Đầu vào có thể được coi là luôn có hiệu lực trong 24 giờ : HHMM , ở đâu 0 <= HH <= 230 <= MM <= 59. Bỏ qua khả năng của một bước nhảy vọt thứ hai.

Đầu ra

Chương trình của bạn phải cung cấp (trả về hàm stdout, v.v ... đều ổn) (A) hoặc (B) , phù hợp với việc giá trị đầu vào có phải là thời gian đích hay không.

Cho một):

Cung cấp hai giá trị số ở bất kỳ định dạng hợp lý nào, chẳng hạn như:

  • Đầu ra chuỗi đơn với một dấu phân cách phù hợp

  • Đầu ra số nguyên / chuỗi tuần tự, ví dụ, bashin hai dòng thành stdout:

    49
    34
    
  • Các giá trị trả về có độ dài hai thứ tự, chẳng hạn như danh sách Python, mảng C, v.v.: [49, 34]

Các giá trị có thể đến theo thứ tự. Ví dụ: cả hai điều sau đây sẽ là đầu ra hợp lệ cho đầu vào là 1200:

49 34
34 49

Tuy nhiên, thứ tự và dấu phân cách phải giống nhau cho tất cả các giá trị đầu vào!

Dành cho (B):

Sản xuất bất kỳ kết quả khác không thể đạt được. Giống nhau kết quả phải được tạo ra cho tất cả sáu lần mục tiêu. Vòng lặp vô hạn được loại trừ.

Đầu vào / Đầu ra mẫu

YAY!!! được sử dụng ở đây như một ví dụ minh họa và không được kê đơn.

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

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng. Sơ hở tiêu chuẩn là không được phép.


Có thể trả lại không có gì cho một thời gian yêu thích?
James Holdiness

1
@JamesHoldiness Fictional-me bị rối loạn nếu tôi không nhận được bất cứ thứ gì từ ứng dụng (điều gì sẽ xảy ra nếu trình thông dịch bị trục trặc?!?!), Vì vậy phải có một số giá trị hoặc đầu ra được tạo ra.
hBy2Py

Câu trả lời:


2

Thạch , 34 33 32 31 28 byte

3 byte nhờ ông Xcoder .ị³thủ thuật.

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

Hãy thử trực tuyến!

Một số phần chính xác như trong câu trả lời của Jonathan Allan , nhưng tôi đang đăng nó vì tôi nghĩ nó đủ khác biệt và được viết độc lập dựa trên câu trả lời Pyth của tôi (và ngắn hơn: D). Nên cũng có chỗ để cải thiện.

Đầu vào là một số nguyên, đầu ra là một mảng của lần trước và lần tiếp theo hoặc mảng trống cho thời gian đặc biệt.

Giải trình

Sử dụng ví dụ đầu vào 1200.

  • chuyển đổi thời gian thành cơ sở 100, thành giờ và phút : [12,0].
  • ḅ60cải đạo từ cơ sở 60 để có được tổng phút: 720.
  • ;15ghép nó với 15 : [720, 15].
  • 83,588 tạo mảng [83, 588] .
  • ṁ5làm cho nó dài 5 : [83, 588, 83, 588, 83].
  • ¤kết hợp hai hành động trên. Chỉ là một kỹ thuật.
  • jnối cặp với mảng : [720, 83, 588, 83, 588, 83, 15].
  • _\trừ từng giá trị mảng từ đầu tiên và nhận kết quả trung gian : [720, 637, 49, -34, -622, -705, -720].
  • ṠÞ ổn định sắp xếp những thứ này bằng dấu hiệu : [-34, -622, -705, -720, 720, 637, 49].
  • Amất các giá trị tuyệt đối: [34, 622, 705, 720, 720, 637, 49].
  • µbắt đầu một chuỗi đơn nguyên mới. Một lần nữa, một kỹ thuật.
  • .ịmất các mục cuối cùng và đầu tiên : [49, 34].
  • ×Ạlặp lại rằng một lần nếu không có số 0 hoặc 0 lần khác : [49, 34].

@JamesHoldiness Đã sửa lỗi không thay đổi kích thước (được đổi ,thành ;từ khi nó được chọn làm danh sách theo nghĩa đen).
PurkkaKoodari

Thật thú vị, tôi đã cố gắng chuyển câu trả lời Pyth của bạn sang Jelly và tôi đã nhận được 28 byte . Tôi không nghĩ nó đủ khác biệt để trở thành một câu trả lời riêng biệt, vì vậy hãy sử dụng nó (và bộ thử nghiệm dễ thương: P). (lưu ý rằng sử dụng ³thay vì 100được phép ) YAY!!!Giá trị này [0, 0]luôn luôn giống nhau.
Ông Xcoder

Rất vui, cảm ơn! Tôi nghĩ rằng cải tiến chính là thủ thuật lập chỉ mục một nửa, tôi chưa bao giờ nghĩ về điều đó.
PurkkaKoodari

Bạn có kế hoạch để cập nhật với các đề xuất của tôi? (Chỉ là một lời nhắc nhở, tôi có cảm giác rằng bạn đã quên chỉnh sửa?)
Ông Xcoder

@ Mr.Xcoder Vâng, quên chỉnh sửa. Tôi sẽ sử dụng xẠlàm bộ lọc số 0 vì tôi thích []hơn [0, 0]vì nó khác biệt rõ ràng hơn.
PurkkaKoodari

2

JavaScript (ES6), 87 83 byte

Đã lưu 4 byte nhờ @ l4m2

Đưa đầu vào dưới dạng một chuỗi. Trả về một 0hoặc một mảng 2 phần tử.

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]

Các trường hợp thử nghiệm

Làm sao?

Chúng tôi không quan tâm đến kết quả của .every()vòng lặp. Với điều kiện đầu vào là hợp lệ, nó sẽ luôn bị làm sai lệch. Điều chúng tôi thực sự quan tâm là khi chúng tôi thoát khỏi vòng lặp này.

Chúng tôi thoát ngay khi tìm thấy thời gian yêu thích i(tính bằng phút) lớn hơn hoặc bằng thời gian tham chiếu k(thời gian đầu vào được tchuyển đổi theo phút). Chúng tôi sau đó trả lại 0nếu i == khoặc 2 sự chậm trễ khác.


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

2

Befunge-93, 88 85 86 80 74 byte

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

Hãy thử trực tuyến!

Xuất ra số phút kể từ lần yêu thích cuối cùng, tiếp theo là số phút cho đến lần yêu thích tiếp theo (cách nhau bởi hai chuỗi ký tự: dấu cách, dấu gạch nối). Nếu nó đã là một thời gian yêu thích, thì một số không được trả về.


1

C, 121 byte

*p,l[]={0,83,671,754,1342,1425,1440};f(t){t=t%100+t/100*60;for(p=l;t>*p;++p);*p-t?printf("%d %d",t-p[-1],*p-t):puts("");}

Xuất ra một dòng mới nếu thời gian là một thời gian yêu thích.

Hãy thử trực tuyến!


1

Sạch , 126 byte

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)

Xác định chức năng ?, lấy Intvà trả lại (Int, Int).
Khi đối số là thời gian yêu thích, nó sẽ gặp sự cố với chương trình gọi hd of [].

Hãy thử trực tuyến!


1

Pyth, 48 45 42 byte

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Mã lấy trong một chuỗi thời gian và xuất ra lần trước và lần tiếp theo dưới dạng một mảng, hoặc 0 nếu thời gian là đặc biệt.

Thật thú vị, một cách tiếp cận bắt buộc cũng là 42 byte:

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

Giải trình

  • cz2chia đầu vào ( z) thành các mảnh có hai ký tự.
  • sM đánh giá chúng là số nguyên.
  • iCác 60phân tích cú pháp phân tích mảng hai mục kết quả là cơ sở 60.
  • ,83 588đại diện cho mảng [83, 588].
  • *3triplicates đó [83, 588, 83, 588, 83, 588].
  • Ploại bỏ cuối cùng 588.
  • +... 15cho biết thêm 15đến cùng.
  • .u-NYbắt đầu từ số được phân tích cú pháp, trừ từng số trong mảng từ nó và trả về các giá trị trung gian. Đây là những khác biệt từ mỗi thời điểm đặc biệt.
  • Jgán những khác biệt này cho J.
  • *Ftính toán các sản phẩm của sự khác biệt. Đây sẽ là 0 nếu thời gian là đặc biệt.
  • & dừng đánh giá ở đây và trả về 0 nếu thời gian là đặc biệt.
  • ._DJ ổn định - sắp xếp sự khác biệt bằng dấu hiệu.
  • Klưu mảng đó vào K.
  • e lấy mục cuối cùng trong mảng.
  • _hK lấy mục đầu tiên trong mảng và phủ nhận nó.
  • , trả về hai dưới dạng một mảng.

Và đó là một cách tốt, lén lút để hấp thụ các dấu hiệu tiêu cực.
hBy2Py

Lưu một byte bằng cách chuyển từ cz2 60sang c2z60(chúng tương đương với danh sách 4 phần tử)
Ông Xcoder

1

Thạch ,  33 32  34 byte

 +3  +2 byte để sửa chữa để tất cả các đầu ra thời gian thích đều bằng nhau.

phải là một cách ngắn hơn!

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

Một liên kết đơn âm lấy một danh sách gồm bốn chữ số và trả về một danh sách chứa hai số nguyên
- nếu đó là thời gian thích thì kết quả cả hai mục sẽ là số không.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao?

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

Tôi không nghĩ định dạng đầu vào (mảng chữ số) được cho phép trong câu hỏi, cũng không phải là đầu ra thay đổi trong thời gian đặc biệt.
PurkkaKoodari

Đã sửa, nhưng tôi không biết liệu đó có phải là ý định thực sự cần phải chuyển đổi như vậy không ...
Jonathan Allan

Đúng, nhưng tôi nghĩ câu trả lời vẫn phải phù hợp với các quy tắc bằng văn bản hiện tại của thử thách ngay cả khi mục đích ban đầu của OP là khác nhau.
PurkkaKoodari

@ Pietu1998 Ban đầu tôi thậm chí không bao giờ coi danh sách các chữ số là một hình thức nhập liệu hữu ích. Mỗi cuộc thảo luận trong các ý kiến ​​chính, tôi đã chính thức sửa đổi thử thách để cho phép nhập chuỗi số.
hBy2Py

1

Husk , 36 byte

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

Hãy thử trực tuyến!

Cảm ơn Zgarb đã giải thích cho tôi cách chim nhạn làm việc trong trò chuyện. Cố gắng chơi gôn ↑0, nhưng tôi đã không làm cho nó hoạt động nếu không vì lý do nào đó (?). Đây là câu trả lời Husk không tầm thường đầu tiên của tôi, và để những điều đã nói ở trên sang một bên, tôi khá hài lòng với nó. Giá trị được sử dụng thay vì YAY!!![] (nhưng tôi hy vọng điều đó sẽ thay đổi cho mục đích chơi gôn).

Giải trình

? 2 ↑ 0Πṙ_1 aÖ ± ↔Ġ - :: 15t * 3e588 83B60 d½ | Nhập dưới dạng danh sách chữ số từ CLA, xuất ra STDOUT.

                                   ½ | Chia danh sách thành hai nửa.
                                 | D | Biến mỗi nửa thành một số nguyên cơ bản 10.
                              B60 | Chuyển đổi từ cơ sở 60.
                : | Nối phần trên vào ([15, 83, 588, 83, 588, 83]).
                       e588 83 | Tạo danh sách hai yếu tố [588, 83].
                     * 3 | Lặp lại ba lần.
                    t | Loại bỏ yếu tố đầu tiên.
                 : 15 | Chuẩn bị 15.
              Ġ- | Áp dụng phép trừ tích lũy từ bên phải.
             ↔ | Đảo ngược.
           Ö ± | Sắp xếp ổn định theo dấu (-1, 0 hoặc 1).
         † a | Bản đồ giá trị tuyệt đối.
      ṙ_1 | Xoay một bên phải.
? Π | Nếu sản phẩm là sự thật, thì:
 ↑ 2 | Lấy hai yếu tố đầu tiên.
   ↑ 0 | Trả về một danh sách trống nếu không.

1

Kotlin , 293 byte

{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)}}

Làm đẹp

{
    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)}
}

Kiểm tra

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

Dùng thử

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.