Favori Zamanlarımı Bulma


15

Belirli kalıpları takip eden zamanları gerçekten çok seviyorum. Özellikle, tüm rakamların aynı olduğu veya tüm rakamların soldan sağa doğru aritmetik olarak arttığı zamanları severim. Dahası, insanlar zamanlarıma mektup yazdıklarında içtenlikle nefret ediyorum, bu yüzden tüm AM / PM saçmalıkları benim için öldü. Böylece, en sevdiğim zamanlar:

0000 0123 1111 1234 2222 2345

Zaman huzuru için, ben şimdiki zaman girdi olarak hem verilen bu bana tek program yazmaya ihtiyacım: (A) Eğer öyleyse değil artık benim favori zamanlardan biri, ikisi, (i) o kaç dakika var bana söyler son favori zamanımdan beri ve (ii) bir sonraki favori zamanımın kaç dakika olacağı; ve (B) o takdirde olduğunu şimdi benim favori zamanlardan biri, tek bir 'sinyal değerini' besler.

Giriş

Programınız stdin, şu biçimden birini ( işlev bağımsız değişkeni , komut satırı bağımsız değişkeni vb.) Şu biçimlerden birini aşağıdaki biçimlerden birinde kabul etmelidir :

  • Dize olarak dört haneli zaman

  • Dize olarak dört basamaklı bir zaman yapmak için solda sıfır dolgulu bir tam sayı

  • Dört (veya daha az) tamsayıdan oluşan bir dizi, dizideki ilk tamsayı zaman girişindeki en soldaki (anlamlı) basamak 0951olacak şekilde sıralanır (örneğin, geçerli olarak [0, 9, 5, 1]veya olarak gösterilebilir [9, 5, 1])

    • Temsil 0000sıfır uzunlukta bir dizisi olarak kabul edilebilir olduğu gibi

Bir dize girişi durumunda, yalnızca rakam içermeli, iki nokta üst üste veya başka noktalama işaretleri içermemelidir. Girişlerin her zaman 24 saatlik geçerli olduğu varsayılabilir:, HHMM nerede 0 <= HH <= 23ve 0 <= MM <= 59. Artık saniye olasılığını göz ardı edin.

Çıktı

Programınız , giriş değerinin hedef zaman olup olmadığına uygun olarak (A) veya (B) değerini sağlamalıdır (işlev iadeleri, stdoutvb.) .

(A) için:

Aşağıdaki gibi herhangi bir anlamlı biçimde iki sayısal değer girin:

  • Uygun bir sınırlayıcıya sahip tek telli çıkış

  • Sıralı tamsayı / dize çıktıları, ör. bashİki satırı aşağıdakilere yazdırma stdout:

    49
    34
    
  • Python listesi, C dizisi, vb.Gibi uzunluk-iki sıralı dönüş değeri: [49, 34]

Değerler her iki sırada da olabilir. Örneğin, aşağıdakilerin her ikisi de aşağıdakilerin girişi için geçerli çıktılar olacaktır 1200:

49 34
34 49

Ancak, sıra ve ayırıcı tüm giriş değerleri için aynı olmalıdır!

(B) için:

Başka türlü elde edilemeyen sonuçlar elde edin. Ancak aynı sonuç hedef sürelerin altısı için de üretilmelidir. Sonsuz döngüler hariç tutulur.

Örnek Girişler / Çıkışlar

YAY!!! Burada örnek niteliğinde bir örnek olarak kullanılmıştır ve kuralcı değildir.

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

Bu , bayt en kısa kod kazanır. Standart boşluklara izin verilmez.


En sevdiğiniz zamana hiçbir şey döndürmemek uygun mudur?
James Holderness

1
Bir uygulama (ne tercüman glitched olur?!?!) Tüm arka şey alamadım eğer @JamesHolderness Kurmaca-me, bu yüzden olmalı sabırsızlanmaya alır bazı oluşturulan değer veya çıkış.
hBy2Py

Yanıtlar:


2

Jöle , 34 33 32 31 28 bayt

Bay Xcoder .ịve ³püf noktaları sayesinde 3 bayt .

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

Çevrimiçi deneyin!

Bazı bölümler tam olarak Jonathan Allan'ın cevabında olduğu gibi, ama ondan yeterince farklı olduğunu ve Pyth cevabım (ve daha kısa: D) temelinde bağımsız olarak yazıldığını söylüyorum . Ayrıca iyileştirilmesi için yer olmalıdır.

Girdi bir tamsayıdır, çıktı bir önceki ve bir sonraki zamanlar dizisi veya özel zamanlar için boş dizidir.

açıklama

Örnek giriş kullanma 1200.

  • saat ve dakika halinde, tabanın 100 zaman dönüştürür: [12,0].
  • ḅ60tabanından 60 mühtedi toplam dakika almak için: 720.
  • ;1515 ile çiftleri o: [720, 15].
  • 83,588 dizi oluşturur [83, 588] .
  • ṁ5 uzunluğu 5 yapar: [83, 588, 83, 588, 83] .
  • ¤yukarıdaki iki eylemi birleştirir. Sadece bir teknik.
  • j çifti diziyle birleştirir: [720, 83, 588, 83, 588, 83, 15] .
  • _\birinciden her bir dizi değerini çıkarır ve ara sonuçlar alır: [720, 637, 49, -34, -622, -705, -720].
  • ṠÞ kararlı bir şekilde sinyalnum bu sıralar: [-34, -622, -705, -720, 720, 637, 49].
  • AMutlak değerleri alır: [34, 622, 705, 720, 720, 637, 49].
  • µyeni bir monadik zincir başlatıyor. Yine, bir tekniklik.
  • .ịilk ve son öğeleri alır: [49, 34].
  • ×Ạtekrarlar aksi hiçbir sıfır veya sıfır kere varsa keresinde: [49, 34].

@JamesHolderness (değişti hiçbir boyutu değişikliği için düzeltildi ,için ;bir liste sabitin olarak yakalandı ediliyordu beri).
PurkkaKoodari

Funnily, Pyth cevabını Jelly'e taşımaya çalıştım ve 28 bayt aldım . Ayrı bir cevap olacak kadar farklı olduğunu düşünmüyorum, bu yüzden kullanmaktan çekinmeyin (ve sevimli test paketi: P). ( ³bunun yerine 100kullanımına izin verildiğini unutmayın ) YAY!!!Değer [0, 0]her zaman aynıdır.
Bay Xcoder

Güzel, teşekkürler! Sanırım ana gelişme yarı endeksleme hilesi, bunu hiç düşünmedim.
PurkkaKoodari

Önerilerimle güncellemeyi planlıyor musunuz? (Sadece bir hatırlatma, düzenlemeyi unuttuğun hissine
kapıldım

@ Mr.Xcoder Evet, düzenlemeyi unuttum. Ben kullanacağız xẠben tür tercih beri sıfır filtre olarak []üzerinde [0, 0]daha net bir şekilde farklı olduğu için.
PurkkaKoodari

2

JavaScript (ES6), 87 83 bayt

@ L4m2 sayesinde 4 bayt kaydedildi

Girişi dize olarak alır. Ya 0da 2 elemanlı bir dizi döndürür .

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]

Test senaryoları

Nasıl?

.every()Döngünün sonucunu umursamıyoruz . Girişin geçerli olması şartıyla , her zaman yanlış olacaktır . Ne biz gerçekten ilgilendiğiniz olduğunu ne zaman bu döngü çıkın.

iReferans süresinden k( tdakika olarak dönüştürülen giriş zamanı ) büyük veya ona eşit olan bir favori zaman (dakika cinsinden ifade edilir) bulduğumuzda çıkarız . Daha sonra dönmek 0durumunda i == kveya 2 gecikmeler aksi.


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

2

Befunge-93, 88 85 86 80 74 bayt

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

Çevrimiçi deneyin!

Son favori zamandan bu yana geçen dakika sayısını ve ardından bir sonraki favori zamana kadar olan dakika sayısını (iki karakter dizisiyle ayrılmış: boşluk, tire) çıkarır. Zaten bir favori zaman ise, tek bir sıfır döndürülür.


1

C, 121 bayt

*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("");}

Zaman sık kullanılan bir zamansa yeni satır çıktısı verir.

Çevrimiçi deneyin!


1

Temiz , 126 bayt

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)

Fonksiyonunu tanımlar ?alarak Intve dönen (Int, Int).
Argüman favori bir zaman olduğunda, çağıran programıhd of [] .

Çevrimiçi deneyin!


1

Pyth, 48 45 42 bayt

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

Çevrimiçi deneyin. Test odası.

Kod bir zaman dizesini alır ve önceki ve sonraki zamanları dizi olarak veya zaman özelse çıktılar 0.

İlginç bir şekilde, zorunlu bir yaklaşım da 42 bayttır:

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

açıklama

  • cz2input ( z) öğesini iki karakterli parçalara böler .
  • sM onları tamsayı olarak değerlendirir.
  • i60Sonuçtaki iki öğe dizisini temel 60 olarak ayrıştırır.
  • ,83 588diziyi temsil eder [83, 588].
  • *3bunu üç katına çıkarır [83, 588, 83, 588, 83, 588].
  • Psonuncuyu kaldırır 588.
  • +… Sonuna 15ekler 15.
  • .u-NYayrıştırılan sayıdan başlar, dizideki her sayıyı ondan çıkarır ve ara değerleri döndürür. Bunlar her özel zamanın farklarıdır.
  • J bu farklılıkları J .
  • *Ffarklılıkların çarpımını hesaplar. Zaman özelse bu 0 olacaktır.
  • & değerlendirmeyi burada durdurur ve zaman özelse 0 döndürür.
  • ._DJ farklılıkları işarete göre sıralar.
  • Kdiziyi kaydeder K.
  • e dizideki son öğeyi alır.
  • _hK dizideki ilk öğeyi alır ve reddeder.
  • , ikisini dizi olarak döndürür.

Ve bu negatif işareti sindirmenin iyi ve sinsi bir yoludur.
hBy2Py

Bir bayt cz2 60değerini olarak değiştirerek c2z60(4 elemanlı listeler için eşdeğerdir)
Bay Xcoder

1

Jöle ,  33 32  34 bayt

 +3  +2 bayt düzeltilecek, böylece tüm sevilen zaman çıktıları eşit olacak.

daha kısa bir yol olmalı!

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

Dört hanenin bir listesini alan ve iki tamsayı içeren bir liste döndüren monadik bir bağlantı
- eğer hoşunuza giden bir zamansa, sonuç her iki giriş de sıfır olacaktır.

Çevrimiçi deneyin! veya test takımına bakın .

Nasıl?

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

Giriş formatının (rakam dizisi) soruya izin verilmediğini ve özel zamanlar için değişen çıktı olduğunu düşünmüyorum.
PurkkaKoodari

Düzeltildi, ancak bu tür dönüşümleri zorunlu
Jonathan Allan

Doğru, ama bence OP'nin asıl amacı farklı olsa bile cevaplar hala mevcut meydan okuma kurallarına uymalıdır.
PurkkaKoodari

@ Pietu1998 Başlangıçta hiç bir basamak listesi yararlı bir giriş formu olarak düşünmemiştim. Ana yorumlardaki tartışma başına, basamak dizisi girişine izin vermek için meydan okumayı resmen değiştirdim.
hBy2Py

1

Kabuk , 36 bayt

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

Çevrimiçi deneyin!

Üçlülerin sohbette nasıl çalıştığını açıkladığı için Zgarb'a teşekkürler . Golf yapmaya çalışıyorum ↑0, ama başka türlü (?) Çalışmak için alamadım. Bu benim ilk önemsiz Husk cevabım ve yukarıda belirtilenleri bir kenara bırakarak, bundan oldukça memnunum. Yerine kullanılan değer YAY!!!olduğunu [](ama o golf amaçlı değiştirmesini umut ediyoruz).

açıklama

? ↑ 2 ↑ 0Πṙ_1 † aÖ ± ↔Ġ - :: 15t * 3e588 83B60 † d½ | CLA'dan rakam listesi olarak giriş yapın, STDOUT'a çıkış yapın.

                                   ½ | Listeyi iki yarıya bölün.
                                 † d | Her yarıyı bir baz-10 tamsayısına çevirin.
                              B60 | Taban 60'dan dönüştürün.
                : | Yukarıdakileri ↓'ye ekleyin ([15, 83, 588, 83, 588, 83]).
                       e588 83 | İki eleman listesi oluşturun [588, 83].
                     * 3 | Üç kez tekrarlayın.
                    t | İlk elemanı sökün.
                 : 15 | Başına 15.
              Ġ- | Kümülatif çıkarma işlemini sağdan uygulayın.
             ↔ | Ters.
           Ö ± | İşarete göre kararlı sıralama (-1, 0 veya 1).
         † a | Mutlak değeri eşleyin.
      ṙ_1 | Bir sağa döndürün.
? Π | Ürün doğruysa, o zaman:
 ↑ 2 | İlk iki unsuru ele alalım.
   ↑ 0 | Aksi takdirde boş bir liste döndürün.

1

Kotlin , 293 bayt

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

Beautified

{
    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çek

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.