Aynalı Dijital Saat


19

Birçok dijital saat, zamanı yalnızca açık veya kapalı olan yedi farklı ışıktan oluşan basitleştirilmiş basamaklar kullanarak görüntüler:

Yatay olarak yansıtıldığında, basamaklar 018simetrik oldukları için değişmez. Ayrıca, rakamlar 2ve 5takas, 2olma 5ve tersi olsun. Yansıtıldığında diğer tüm rakamlar geçersiz olur.

Bu nedenle, 24 saatlik bir dijital saat verildiğinde, dijital ekranın yansıtılmış görüntüsünün de geçerli bir saat okuması olacağı şekilde birçok saat okuması vardır. Göreviniz, yansıtılmış okumalarla birlikte tüm bu saat okumalarını çıkarmaktır.

Örneğin, 22:21olur 15:55ve 00:15olur 21:00. Öte yandan, 12:34ya 16:27da yansıtıldığında artık geçerli değildir (rakamlar 34679geçersiz hale gelir) ve ikisi de değildir 22:22ya da 18:21, çünkü bir günde sadece 24 saat ve bir saatte 60 dakika olduğu için, aklı başında hiçbir saat görüntülenmez 55:55ya da 12:81.

Görev

Hiçbir girdi almayan ve geçerli tüm çiftleri aşağıda gösterildiği gibi artan sırada veren bir program veya işlev yazın:

00:00 - 00:00
00:01 - 10:00
00:05 - 20:00
00:10 - 01:00
00:11 - 11:00
00:15 - 21:00
00:20 - 05:00
00:21 - 15:00
00:50 - 02:00
00:51 - 12:00
00:55 - 22:00
01:00 - 00:10
01:01 - 10:10
01:05 - 20:10
01:10 - 01:10
01:11 - 11:10
01:15 - 21:10
01:20 - 05:10
01:21 - 15:10
01:50 - 02:10
01:51 - 12:10
01:55 - 22:10
02:00 - 00:50
02:01 - 10:50
02:05 - 20:50
02:10 - 01:50
02:11 - 11:50
02:15 - 21:50
02:20 - 05:50
02:21 - 15:50
02:50 - 02:50
02:51 - 12:50
02:55 - 22:50
05:00 - 00:20
05:01 - 10:20
05:05 - 20:20
05:10 - 01:20
05:11 - 11:20
05:15 - 21:20
05:20 - 05:20
05:21 - 15:20
05:50 - 02:20
05:51 - 12:20
05:55 - 22:20
10:00 - 00:01
10:01 - 10:01
10:05 - 20:01
10:10 - 01:01
10:11 - 11:01
10:15 - 21:01
10:20 - 05:01
10:21 - 15:01
10:50 - 02:01
10:51 - 12:01
10:55 - 22:01
11:00 - 00:11
11:01 - 10:11
11:05 - 20:11
11:10 - 01:11
11:11 - 11:11
11:15 - 21:11
11:20 - 05:11
11:21 - 15:11
11:50 - 02:11
11:51 - 12:11
11:55 - 22:11
12:00 - 00:51
12:01 - 10:51
12:05 - 20:51
12:10 - 01:51
12:11 - 11:51
12:15 - 21:51
12:20 - 05:51
12:21 - 15:51
12:50 - 02:51
12:51 - 12:51
12:55 - 22:51
15:00 - 00:21
15:01 - 10:21
15:05 - 20:21
15:10 - 01:21
15:11 - 11:21
15:15 - 21:21
15:20 - 05:21
15:21 - 15:21
15:50 - 02:21
15:51 - 12:21
15:55 - 22:21
20:00 - 00:05
20:01 - 10:05
20:05 - 20:05
20:10 - 01:05
20:11 - 11:05
20:15 - 21:05
20:20 - 05:05
20:21 - 15:05
20:50 - 02:05
20:51 - 12:05
20:55 - 22:05
21:00 - 00:15
21:01 - 10:15
21:05 - 20:15
21:10 - 01:15
21:11 - 11:15
21:15 - 21:15
21:20 - 05:15
21:21 - 15:15
21:50 - 02:15
21:51 - 12:15
21:55 - 22:15
22:00 - 00:55
22:01 - 10:55
22:05 - 20:55
22:10 - 01:55
22:11 - 11:55
22:15 - 21:55
22:20 - 05:55
22:21 - 15:55
22:50 - 02:55
22:51 - 12:55
22:55 - 22:55

Sondaki veya baştaki yeni bir satıra izin verilir. Hat beslemesinden hemen önce birkaç boşluk bırakılmasına da izin verilir. Zamanlar formatta olmalı hh:mm, gerektiğinde sıfırlarla doldurulmalıdır.

Bu , bu yüzden bayttaki en kısa cevap kazanır. Her zamanki gibi standart boşluklara izin verilmez.


Clean'te a Stringbir dizisidir Char. Benim cevap verirse kabul edilebilir mi listesini ait Char? Türler çıplak yazdırıldığında aynı görünür.
17'de

@Ourous Evet, bence iyi. Meta üzerinde konsensüs bir dize bir karakter dizisidir olduğunu gibi görünüyor, ve en o karakterlerin bir listesini ne.
Steadybox

Bu yedi bölümlü ekranda rakam 1, ayna görüntüsüyle tam olarak aynı değildir , çünkü rakamı oluşturan dikey "çizgiyi" oluşturmak için en sağdaki segmentlerin veya en soldaki segmentlerin kullanılıp kullanılmadığını anlayabilirsiniz. Burada aynı olduğunu düşündüğümüzü anlıyorum.
Jeppe Stig Nielsen

@JeppeStigNielsen, OP'nin 7seg yerine 14seg ekranlı bir görüntü kullandığını varsayalım, böylece 1ortalanabilir.
Sparr

3
@Steadybox Vay be, son zamanlarda tam olarak bu fikrim vardı. Program röportajları sırasında insanlarda kullanmayı planlıyorum. BTW Aklı başında bir saati olmayan ve 83:75 :-) gibi şeyleri belirtmenize izin veren bir mikrodalga fırınım var
JohnEye

Yanıtlar:


2

05AB1E , 34 bayt

0125DâDâεÂ5n‡í)}ʒ€н25‹P}':ý… - ý»

Çevrimiçi deneyin!

açıklama

0125                                # push "0125"
    Dâ                              # cartesian product with itself
      Dâ                            # cartesian product with itself
        ε       }                   # apply to each
         Â                          # bifurcate
          5n                       # push 25 bifurcated
             ‡                      # transliterate
              í                     # reverse each
               )                    # wrap in a list
                 ʒ      }           # filter each on
                  €н                # head of each
                    25‹             # less than 25
                       P            # product
                         ':ý        # merge on ":"
                            … - ý   # merge on " - "
                                 »  # join on newlines

6

Python 2 , 187 180 178 177 bayt

R=range(11)
for t in['0000111122201250125012'[j::11]+':'+'0001112255501501501015'[i::11]for i in R for j in R]:print t+' - '+''.join(map(dict(zip('0125:','0152:')).get,t))[::-1]

Çevrimiçi deneyin!

+1 Kevin Cruijssen için teşekkürler.


5

APL (Dyalog Unicode) , 84 bayt SBCS

STDOUT'a tam program çıktısı. Birçok sistemde varsayılan ⎕IO( I ndex O rigin) olmasını gerektirir 0.

{0::⋄∧/23 59≥⍎¨(':'t)⊆t←⌽'015xx2xx8x:'[⎕Di←∊⍺':'⍵]:⎕←1↓⍕i'-'t}⌿1↓¨⍕¨100+0 60⊤⍳1440

Çevrimiçi deneyin!

⍳1440 Birçok olduğunu ɩ ntegers

0 60⊤ karışık bazlı ∞'a dönüştür, 60

100+ 100 ekleyin (bu gerekli 0'ları doldurur)

⍕¨ her birini biçimlendir (dizgi oluştur)

1↓¨ her birinden ilk karakteri bırak

{}⌿ Aşağıdaki anonim işlevi sütun olarak uygulayın ( en iyi saat, dakika)

0:: herhangi bir hata olursa hiçbir şey döndürmeyin

 Deneyin:

  '015xx2xx8x:'[] Bu dizeyi dizine ekleyin:

   ∊⍺':'⍵ε nlisted saat, kolon, dakikada listesini (düzleştirilmiş)

   i← depolanan iiçin ( i , girişi)

   ⎕D⍳ɩ listesindeki her karakterin ndices D igits

   tersine çevir

  t← olarak depola t( t ime için)

  ()⊆ Grup şu durumlarda çalışır:

   ':'≠t kolon farklıdır t

⍎¨ her birini yürütmek (değerlendirmek)

23 59≥ Her biri için sırasıyla 23 ve 59'a eşit veya daha küçük olup olmadıkları

∧/ ikisi de doğru mu?

: öyleyse, o zaman:

  ⍕i'-'t biçimlendirilmiş (boşlukla ayrılmış) giriş, tire, zaman listesi

  1↓ ilkini bırak (boşluk)

  ⎕← STDOUT çıktısı


4

Retina , 57 bayt


 - 
+m`^.{3,9}$
0$&0¶1$&1¶2$&5¶5$&2
A`\b2?5
\b\d.
$&:
O`

Çevrimiçi deneyin! Açıklama:


 - 

Ayırıcıyı yerleştirin.

+m`^.{3,9}$
0$&0¶1$&1¶2$&5¶5$&2

Yansıtılmış dört basamaklı tüm olası kümeleri oluşturun.

A`\b2?5

Yasadışı çalışma süresi olanları silin.

\b\d.
$&:

Sütunları yerleştirin.

O`

Sırala.



3

Temiz , 269 ... 172 170 bayt

import StdEnv
?n=toChar n+'0'
$c|c<2=c=7-c
n=[0,1,2,5]
t=flatlines[u++[' - ':v]\\[u,v]<-[[map?[a,b,10,x,y],map?[$y,$x,10,$b,$a]]\\a<-n,b<-n,x<-n,y<-n]|['23:59']>=max u v]

Çevrimiçi deneyin!

Ungolfed:

import StdEnv
numeral n = toChar (n+48)
mirror 2 = 5
mirror 5 = 2
mirror c = c
digits = [0, 1, 2, 5]
times
    = flatlines [ // flatten with interspersed newlines
        original ++ [' - ' : reflection] // insert separator
        \\ // generate all pairs of times and their mirrored copies
        [original, reflection] <- [
            [map numeral [a, b, 10, x, y], map (numeral o mirror) [y, x, 10, b, a]]
            \\ // generate every combination of display digits
            a <- digits,
            b <- digits,
            x <- digits,
            y <- digits
            ]
        | ['23:59'] >= max original reflection // make sure both times actually exist
        ]

2

Pyth , 48 bayt

Lj\:c2bjf!:T"5.:|25:"0mj" - ",ydyX_d`25)^"0125"4

Çevrimiçi deneyin!

Tüm olası kombinasyonları oluşturur 0125ve sonra bunları zamana göre manipüle eder. Bunlar doğru sırayladır, çünkü sözlükbilimsel sırayla oluşturulurlar. Son olarak, normal ifadeyle eşleşen satırları kaldırarak fazladan geçersiz süreleri filtreler 5.:veya 25:. Ne yazık ki, bir hata veya gözetim yapmadıkça sıkıştırma, bu programın kullandığı dizelerin herhangi birinde güzel çalışıyor gibi görünmüyor.


2

Perl 5 , 147 bayt

map{$h=0 x($_<10).$_;map{$_="0$_"if$_<10;say"$h:$_ - $q:$i"if($i=reverse$h=~y/25/52/r)<60&&"$h$_"!~/[34679]/&&($q=reverse y/25/52/r)<24}0..59}0..23

Çevrimiçi deneyin!


2

Japt v2 (+ -R), 51 bayt

G²Çs4 ùT4 i':2î+" - "+Zw r\d_^Z>1})r3,5Ãkf/5.|25):

Çevrimiçi test edin!

açıklama

G²Ç   s4 ùT4 i':2à ®   +" - "+Zw r\d_  ^Z>1})r3,5à kf/5.|25):
G²oZ{Zs4 ùT4 i':2} mZ{Z+" - "+Zw r\dZ{Z^Z>1})r3,5} kf/5.|25):/   Ungolfed

G²              Calculate 16**2, or 256.
  oZ{       }   Create the range [0...256) and map each integer Z to:
Zs4               Convert Z to a base-4 string.  [0, 1, 2, 3, 10, ..., 3331, 3332, 3333]
    ùT4           Pad-left with 0's to length 4. [0000, 0001, 0002, ..., 3331, 3332, 3333]
        i':2      Insert a colon at index 2.     [00:00, 00:01, 00:02, ..., 33:31, 33:32, 33:33]

mZ{      }      Map each string Z in the resulting array to:
Zw r\dZ{     }    Reverse Z, and replace each digit Z' with
        Z^Z>1       Z' xor'd with (Z>1). This turns 2 to 3 and vice versa.
                  We now have [00:00, 10:00, 30:00, 20:00, 01:00, ..., 12:22, 32:22, 22:22]
Z+" - "+          Append this to Z with " - " in between. This gives
                    [00:00 - 00:00, 00:01 - 10:00, 00:02 - 30:00, ..., 33:32 - 32:22, 33:33 - 22:22]
r3,5              Replace all 3s in the result with 5s.
                    [00:00 - 00:00, 00:01 - 10:00, 00:02 - 50:00, ..., 55:52 - 52:22, 55:55 - 22:22]

k               Remove all results that
 f/5.|25):/       match the regex /(5.|25):/g. This removes times with impossible hours.

                Implicit: output result of last expression, joined with newlines (-R)

1

JavaScript (ES6), 142 bayt

f=(n=0)=>n<176?(s=(g=n=>d[n>>2]+d[n&3])(n%4*4|n/4&3,d='0152')+':'+g(n>>6|(n/4&12)),s<'25'?g(n>>4,d='0125')+`:${g(n&15)} - ${s}
`:'')+f(n+1):''

Çevrimiçi deneyin!


1

Kömür , 59 bayt

F012F0125F0125F015¿›‹⁺ικ25⁼⁺λμ25«ικ:λμ - F⟦μλ3κι⟧§015::2Iν⸿

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

F012F0125F0125F015

Yansıtılmamış basamaklar için dört iç içe döngü oluşturun.

¿›‹⁺ικ25⁼⁺λμ25«

Ne saatlerin ne de dakikaların 25 olmadığını kontrol edin. (25 dakikayı yansıtmak 25 saat ile sonuçlanacaktır, dolayısıyla bu işlem yapılmaz.)

ικ:λμ - 

Aynalanmamış zamanı yazdırın.

F⟦μλ3κι⟧§015::2Iν⸿

Ters çevrilmiş rakamları (veya 3iki nokta üst üste için) dizeden tamsayıya dönüştürerek ve bir çeviri tablosuna bakarak yansıtılan zamanı yazdırın .

Alternatif olarak, 59 bayt için de:

F¹¹F¹⁶¿⁻¹¹κ¿⁻²﹪κ⁴«≔⟦÷ι⁴﹪ι⁴¦⁴÷κ⁴﹪κ⁴⟧θFθ§0125:λ - F⮌θ§0152:λ⸿

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

F¹¹F¹⁶

Saatler ve dakikalar için döngüler oluşturun.

¿⁻¹¹κ¿⁻²﹪κ⁴«

Hariç tutulan 25ve ayrıca biten dakikalar 2.

≔⟦÷ι⁴﹪ι⁴¦⁴÷κ⁴﹪κ⁴⟧θ

Saati ve dakikayı tabana dönüştürün 4.

Fθ§0125:λ

Aranan rakamları bir çeviri tablosunda yazdırın.

 - 

Ayırıcıyı yazdırın.

F⮌θ§0152:λ⸿

Yansıtılmış bir çeviri tablosunda görüntülenen ters rakamları yazdırın.


1

Jöle , 72 66 62 55 bayt

®ṢiЀUị®
“0152:”©ṢṖp`⁺ḣ176j€“:”µ;"Ç€⁾25ẇ$ÐṂœs€2j€“ - ”Y

Çevrimiçi deneyin!

Niladik program. Emigna'nın 05AB1E cevabından çifte '0125'fikir ürünü aldım, ancak geri kalanlar danışmadan yaptım, çünkü diller bundan sonra ayrılıyor. Muhtemelen golf için fırsatlar var, muhtemelen çok fazla.

açıklama

Program aşağıdaki gibi çalışır:

  • Karakterlerin listesinin uzunluğu dört tüm ürünleri işte '0125'ile “0152:”©ṢṖp`⁺. ©dizeyi '0152:'daha sonra kullanmak üzere kayıt defterine kopyalar . ṢṖsonra dizenin son öğesini açar → '0125'. ürün bağlantısını çoğaltır.

  • ḣ176biçimi ile herhangi kez kaldırır 25xxveya 5xxx(değil geçerli saat).

  • j€“:”her basamak çiftini a ile birleştirir ':'. örneğin ['05'],['21']]'05:12'.

  • Ç€ilk bağlantıyı bu zamanların her birine uygular. Dizedeki her karakterin dizinini bulur, '0125:'ardından bu indekslerin her biri için dizedeki karakteri alır '0152:'ve tersine çevirir. Bu ayna işlemidir ( 2s ve 5s'yi ters çevirme ve değiştirme ).

  • µ;" orijinal saati yansıtılan zamanla birleştirir → '05:2115:20'

  • ⁾25ẇ$ÐṂalt dize ile zamanları filtreler '25'. Bu, yansıtılmış yarısı 25:xxveya olan herhangi bir zaman çiftini yakalar 5x:xx. Not : Neden $gerekli olduğunu bilmiyorum . Belki birisi uygun sözdizimi ile golf olabilir ama emin değilim.

  • Bu sürelerin her birini iki yarıya ( œs€2) bölün ve ardından string ' - '( j€“ - ”) ile birleştirin . '05:2115:20''05:21 - 15:20'.

  • Son olarak, Ytüm dizeleri bir satırsonu ile birleştirir ve her şey dolaylı olarak yazdırılır.

Eski versiyonlar

62 bayt

i@€®ị“:0152”
“:0125”©Ḋp`⁺ḣ176j€“:”µ,"UÇ€$F€⁾25ẇ$ÐṂœs€2j€“ - ”Y

Çevrimiçi deneyin!

66 bayt

“0125”
i@€¢ị“0152”
UṚÇ€
Ñp`⁺ḣ176µ,"Ç€j€€“:”j€“ - ”¹⁾2 ẇ$ÐṂ⁾25ẇ$ÐṂY

Çevrimiçi deneyin!

72 bayt

⁾25
i@€¢µẋ@€¢ṙ"
Ṛµ;@""Ç€Ḣ€€
“0125”p`⁺j€“:”ḣ176µ,"Ç€j€“ - ”¹⁾2 ẇ$ÐṂÑẇ$ÐṂY

Çevrimiçi deneyin!


1

C (GCC) , 175 174 bayt

@Steadybox sayesinde bir kereye mahsus.

char*p,s[14],*e;f(t){for(t=0;sprintf(p=s,"%02d:%02d -",t/100,t%100),t<2400;)if(t++%10^2&&!strpbrk(s,"346789")&&t%100^26){for(e=s+12;p<e;p++)*e--=*p^7*(*p>49&*p<58);puts(s);}}

Çevrimiçi deneyin!


1

Befunge, 178 bayt

>0>:5g"7"`>v1\,+55<
v_^#`+87:+1_4>99p\ :99gg48 *-:55+/"0"+,55+%"0"+,":",\v
>$1+:55v v,," - "_^#-5g99,+"0"%+55,+"0"/+55:-*84gg99:<
v_@#!`+< >,\5^
 !"%*+,/4569RSTW
 *R4!+S5%/W9",T6

Çevrimiçi deneyin!


1

Kotlin , 205 207 bayt

(0..1439).map{"%02d : %02d".format(it/60,it%60)}.let{it.map{i->i to i.reversed().map{x->"25180:X52180:".let{it[it.indexOf(x)+7]}}.joinToString("")}.filter{(_,b)->it.contains(b)}.map{(a,b)->println("$a-$b")}}

Beautified

    (0..1439)
        .map { "%02d : %02d".format(it / 60, it % 60) }              // Make the times
        .let { it.map {i->
                i to i.reversed().map {x->                         // Pair it with the reversed times
                    "25180:X52180:".let{ it[it.indexOf(x)+7] }     // - X means bad times are removed
                }.joinToString("")                                 // - Make the string
            }.filter {(_,b)-> it.contains(b) }                     // Remove the unpaired times
                .map { (a, b) -> println("$a - $b") }              // Print out the pairs
        }

Ölçek

fun main(args: Array<String>) {
    f()
}

fun f() =
(0..1439).map{"%02d:%02d".format(it/60,it%60)}.let{it.map{i->i to i.reversed().map{x->"25180:X52180:".let{it[it.indexOf(x)+7]}}.joinToString("")}.filter{(_,b)->it.contains(b)}.map{(a,b)->println("$a-$b")}}

TIO

TryItOnline

Düzenlemeler


İki tarafında da bir boşluk olması gerekiyordu -. Eklemek için yalnızca iki bayt maliyeti: Çevrimiçi deneyin!
Sabit kutu

Düzeltildi, kodun geri kalanını azaltarak 205 bayta geri dönmenin bir yolu olup olmadığını merak ediyorum
jrtapsell

0

C, 225 bayt

h,m,l,r,d=10,L[]={0,1,5,9,9,2,9,9,8,9};M(h,m){l=L[h%d]*d+L[h/d];r=L[m%d]*d+L[m/d];return L[h%d]<9&L[h/d]<9&L[m%d]<9&L[m/d]<9;}f(){for(h=0;h<24;++h)for(m=0;m<60;++m)M(h,m)&l<60&r<24&&printf("%02d:%02d - %02d:%02d\n",h,m,r,l);}

C cevabı olmadığından kendi cevabımı gönderiyorum. Başka bir yaklaşım daha kısa olabilir.

Çevrimiçi deneyin!


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.