Menemukan Waktu Favorit Saya

15

Saya sangat suka saat-saat yang mengikuti pola tertentu. Khususnya, saya suka saat-saat di mana semua digitnya sama, atau semua angka bertambah secara hitung satu dari kiri ke kanan. Lebih jauh lagi, saya sangat benci ketika orang-orang menaruh surat di zaman saya, jadi semua omong kosong AM / PM itu mati bagi saya. Jadi, waktu favorit saya adalah:

0000 0123 1111 1234 2222 2345

Untuk ketenangan pikiran saya, saya ingin Anda menulis saya satu program yang, mengingat waktu saat ini sebagai masukan, keduanya: (A) jika sekarang bukan salah satu waktu favorit saya, ceritakan pada saya (i) berapa menit sudah sejak waktu favorit terakhir saya serta (ii) berapa menit dari sekarang waktu favorit saya berikutnya akan terjadi; dan (B) jika adalah sekarang salah satu kali favorit saya, memasok 'nilai sinyal' tunggal.

Memasukkan

Program Anda harus menerima (dengan metode apa pun: argumen fungsi,, stdinargumen baris perintah, dll.) Waktu saat ini, dalam salah satu format berikut:

  • Waktu empat digit sebagai string

  • Bilangan bulat yang dapat diisi nol di sebelah kiri untuk membuat waktu empat digit sebagai string

  • Urutan empat (atau lebih sedikit) bilangan bulat, diurutkan sedemikian rupa sehingga bilangan bulat pertama dalam urutan adalah digit paling kiri (signifikan) dalam input waktu (misalnya, 0951dapat secara sah direpresentasikan sebagai [0, 9, 5, 1]atau [9, 5, 1])

    • Mewakili 0000sebagai urutan panjang nol dapat diterima

Dalam hal input string, input hanya berisi digit, tanpa titik dua, atau tanda baca lainnya. Input dapat diasumsikan selalu valid 24 jam:, di HHMM mana 0 <= HH <= 23dan0 <= MM <= 59 . Abaikan kemungkinan lompatan kedua.

Keluaran

Program Anda harus menyediakan (pengembalian fungsi stdout, dll. Semuanya baik-baik saja) baik (A) atau (B) , yang sesuai dengan apakah nilai input adalah waktu target atau tidak.

Untuk sebuah):

Berikan dua nilai numerik dalam format apa pun yang masuk akal, seperti:

  • Output string tunggal dengan pembatas yang sesuai

  • Output integer / string berurutan, misalnya, bashmencetak dua baris ke stdout:

    49
    34
    
  • Panjang-dua nilai pengembalian yang diurutkan, seperti daftar Python, array C, dll .: [49, 34]

Nilai bisa datang dalam urutan apa pun. Misalnya, kedua hal berikut ini akan menjadi output yang valid untuk input 1200:

49 34
34 49

Namun, urutan dan pemisah harus sama untuk semua nilai input!

Untuk (B):

Menghasilkan hasil yang tidak dapat dicapai. Namun, hasil yang sama harus dihasilkan untuk keenam target waktu. Loop tak terbatas dikecualikan.

Input / Output Sampel

YAY!!! digunakan di sini sebagai contoh demonstratif dan tidak bersifat preskriptif.

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

Ini adalah , jadi kode terpendek dalam byte menang. Celah standar tidak diijinkan.

hBy2Py
sumber
Apakah boleh mengembalikan apa pun untuk waktu favorit?
James Holderness
1
@JamesHolderness Fictional-me menjadi gelisah jika saya tidak mendapatkan apa pun dari aplikasi (bagaimana jika penerjemahnya glitched?!?!), Jadi harus ada nilai atau output yang dihasilkan.
hBy2Py

Jawaban:

2

Jelly , 34 33 32 31 28 byte

3 byte terima kasih kepada Tn. Xcoder .ịdan ³triknya.

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

Cobalah online!

Beberapa bagian persis seperti dalam jawaban Jonathan Allan , tapi saya mempostingnya karena saya pikir itu cukup berbeda dari itu dan ditulis secara independen berdasarkan jawaban Pyth saya (dan lebih pendek: D). Seharusnya juga ada ruang untuk perbaikan.

Input adalah bilangan bulat, output adalah array dari waktu sebelumnya dan berikutnya atau array kosong untuk waktu khusus.

Penjelasan

Menggunakan input contoh 1200.

  • mengonversi waktu ke basis 100, menjadi jam dan menit: [12,0] .
  • ḅ60 mengkonversi dari basis 60 untuk mendapatkan total menit: 720 .
  • ;15 pasangkan dengan 15: [720, 15] .
  • 83,588 menciptakan array [83, 588] .
  • ṁ5membuat panjang 5: [83, 588, 83, 588, 83].
  • ¤menggabungkan dua tindakan di atas. Hanya masalah teknis.
  • jbergabung pasangan dengan array: [720, 83, 588, 83, 588, 83, 15].
  • _\mengurangi setiap nilai array dari pertama dan mendapat hasil antara: [720, 637, 49, -34, -622, -705, -720].
  • ṠÞ stabil macam ini dengan signum: [-34, -622, -705, -720, 720, 637, 49].
  • A mengambil nilai absolut: [34, 622, 705, 720, 720, 637, 49] .
  • µmemulai rantai monadik baru. Sekali lagi, masalah teknis.
  • .ị mengambil item terakhir dan pertama: [49, 34] .
  • ×Ạmengulangi bahwa sekali jika tidak ada nol, atau nol kali sebaliknya: [49, 34].
PurkkaKoodari
sumber
@JamesHolderness Tetap tanpa perubahan ukuran (diubah ,menjadi ;karena diambil sebagai daftar literal).
PurkkaKoodari
Lucunya, saya mencoba untuk port jawaban Pyth Anda ke Jelly dan saya mendapat 28 byte . Saya tidak berpikir itu cukup berbeda untuk menjadi jawaban yang terpisah, jadi silakan menggunakannya (dan test suite yang imut: P). (catatan bahwa menggunakan ³bukan 100yang diperbolehkan ) The YAY!!!nilainya [0, 0], selalu sama.
Tn. Xcoder
Terima kasih banyak! Saya pikir peningkatan utama adalah trik pengindeksan setengah, saya tidak pernah memikirkan yang itu.
PurkkaKoodari
Apakah Anda berencana untuk memperbarui dengan saran saya? (Hanya pengingat, saya merasa Anda lupa mengedit?)
Tn. Xcoder
@ Mr.Xcoder Ya, lupa mengedit. Saya akan menggunakan xẠsebagai filter nol karena saya []lebih suka [0, 0]karena lebih jelas berbeda.
PurkkaKoodari
2

JavaScript (ES6), 87 83 byte

Disimpan 4 byte berkat @ l4m2

Mengambil input sebagai string. Mengembalikan 0array 2 atau elemen.

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]

Uji kasus

Bagaimana?

Kami tidak peduli dengan hasil .every()loop. Asalkan input tersebut valid, itu akan selalu palsu. Yang benar-benar kami minati adalah kapan kami keluar dari loop ini.

Kami keluar segera setelah kami menemukan waktu favorit i(dinyatakan dalam menit) yang lebih besar dari atau sama dengan waktu referensi k(waktu input tdikonversi dalam menit). Kami kemudian kembali 0jika i == katau 2 penundaan sebaliknya.

Arnauld
sumber
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

Cobalah online!

Menghasilkan jumlah menit sejak waktu favorit terakhir, diikuti oleh jumlah menit hingga waktu favorit berikutnya (dipisahkan oleh dua urutan karakter: spasi, tanda hubung). Jika ini sudah menjadi waktu favorit, maka satu nol dikembalikan.

James Holderness
sumber
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("");}

Output baris baru jika waktu adalah waktu favorit.

Cobalah online!

Steadybox
sumber
1

Bersih , 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)

Menentukan fungsi ?, mengambil Intdan mengembalikan (Int, Int).
Ketika argumennya adalah waktu favorit, ia membuat crash program panggilan hd of [].

Cobalah online!

Suram
sumber
1

Pyth, 48 45 42 byte

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

Cobalah online. Suite uji.

Kode mengambil string waktu dan menampilkan waktu sebelumnya dan berikutnya sebagai array, atau 0 jika waktu khusus.

Menariknya, pendekatan imperatif juga 42 byte:

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

Penjelasan

  • cz2membagi input ( z) menjadi dua karakter.
  • sM mengevaluasinya sebagai bilangan bulat.
  • i... 60mem-parsing array dua item yang dihasilkan sebagai basis 60.
  • ,83 588mewakili array [83, 588].
  • *3rangkap tiga untuk [83, 588, 83, 588, 83, 588].
  • Pmenghapus yang terakhir 588.
  • +... 15menambah 15akhir.
  • .u-NYmulai dari angka yang diuraikan, kurangi setiap angka dalam array darinya dan kembalikan nilai-nilai perantara. Inilah perbedaan dari setiap waktu khusus.
  • Jmenugaskan perbedaan ini untuk J.
  • *Fmenghitung produk dari perbedaan. Ini akan menjadi 0 jika waktunya khusus.
  • & hentikan evaluasi di sini dan kembalikan 0 jika waktunya khusus.
  • ._DJ stable-macam perbedaan dengan tanda.
  • Kmenghemat bahwa array di K.
  • e mengambil item terakhir dalam array.
  • _hK mengambil item pertama dalam array dan meniadakannya.
  • , mengembalikan keduanya sebagai sebuah array.
PurkkaKoodari
sumber
Dan itu cara licik yang bagus untuk menyerap tanda negatif.
hBy2Py
Simpan satu byte dengan beralih dari cz2 60ke c2z60(mereka setara dengan daftar 4-elemen)
Tn. Xcoder
1

Jelly ,  33 32  34 byte

 +3  +2 byte untuk diperbaiki sehingga semua output waktu yang disukai sama.

Pasti jalan yang lebih pendek!

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

Tautan monadik yang mengambil daftar empat digit dan mengembalikan daftar yang berisi dua bilangan bulat
- jika ini adalah waktu yang disukai, hasil kedua entri akan menjadi nol.

Cobalah online! atau lihat test-suite .

Bagaimana?

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
Jonathan Allan
sumber
Saya tidak berpikir format input (digit array) diperbolehkan dalam pertanyaan, juga tidak mengubah output untuk waktu khusus.
PurkkaKoodari
Diperbaiki, tetapi saya tidak tahu apakah itu maksud sebenarnya untuk melakukan transformasi semacam itu ...
Jonathan Allan
Benar, tapi saya pikir jawabannya masih harus sesuai dengan aturan tertulis tantangan saat ini bahkan jika maksud asli OP berbeda.
PurkkaKoodari
@ Pietu1998 Awalnya saya bahkan tidak pernah menganggap daftar digit sebagai bentuk input yang berguna. Per diskusi dalam komentar utama, saya telah secara resmi merevisi tantangan untuk memungkinkan input urutan-digit.
hBy2Py
1

Sekam , 36 byte

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

Cobalah online!

Terima kasih kepada Zgarb karena menjelaskan kepadaku cara kerja terner dalam obrolan. Mencoba bermain golf ↑0, tetapi saya tidak membuatnya bekerja jika tidak karena beberapa alasan (?). Ini adalah jawaban Husk non-sepele pertama saya, dan mengesampingkan yang disebutkan di atas, saya cukup puas dengan itu. Nilai yang digunakan bukannya YAY!!!adalah [](tapi saya harap itu akan berubah untuk tujuan bermain golf).

Penjelasan

? ↑ 2 ↑ 0Πṙ_1 † aÖ ± ↔Ġ - :: 15t * 3e588 83B60 † d½ | Input sebagai daftar digit dari CLA, output ke STDOUT.

                                   ½ | Membagi daftar menjadi dua bagian.
                                 † d | Ubah setiap bagian menjadi bilangan bulat basis-10.
                              B60 | Konversi dari basis 60.
                : | Tambahkan hal-hal di atas ke ↓ ([15, 83, 588, 83, 588, 83]).
                       e588 83 | Buat dua daftar elemen [588, 83].
                     * 3 | Ulangi tiga kali.
                    t | Hapus elemen pertama.
                 : 15 | Sebutkan 15.
              Ġ- | Terapkan pengurangan kumulatif dari kanan.
             ↔ | Membalikkan.
           Ö ± | Sortir yang stabil berdasarkan tanda (-1, 0 atau 1).
         † a | Memetakan nilai absolut.
      ṙ_1 | Putar yang benar.
? Π | Jika produk tersebut benar, maka:
 ↑ 2 | Ambil dua elemen pertama.
   ↑ 0 | Kembalikan daftar kosong jika tidak.
Tuan Xcoder
sumber
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)}}

Yg diperindahkan

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

Uji

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

jrtapsell
sumber