Дзеркальний цифровий годинник


19

Багато цифрових годин відображають час за допомогою спрощених цифр, що складаються лише з семи різних ламп, які включаються або вимикаються:

Якщо вони відображаються горизонтально, цифри 018не змінюються, оскільки вони симетричні. Також цифри 2і 5замінюються, 2стаючи 5і навпаки. Усі інші цифри стають недійсними при дзеркальному відображенні.

Таким чином, враховуючи цілодобовий цифровий годинник, існує багато зчитування годин, так що дзеркальне зображення цифрового дисплея є також дійсним зчитуванням годинника. Ваше завдання - вивести всі такі показання годинника разом з дзеркальними показаннями.

Наприклад, 22:21стає 15:55і 00:15стає 21:00. З іншого боку, 12:34або 16:27вони більше не дійсні при дзеркальному відображенні (цифри 34679стають недійсними), і не є, 22:22або 18:21, оскільки в день є лише 24 години і 60 хвилин за годину, жоден здоровий годинник не відображатиметься 55:55або 12:81.

Завдання

Напишіть програму або функцію, яка не вводить і виводить всі дійсні пари у порядку зростання, як показано нижче:

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

Допускається наступний або провідний новий рядок. Маючи кілька пробілів безпосередньо перед подачею рядків, також дозволено. Часи повинні бути у форматі hh:mm, при необхідності підписані нулями.

Це , тому найкоротша відповідь у байтах виграє. Як завжди, стандартні лазівки заборонені.


У Clean, a String- це масив Char. Прийнятно , якщо моя відповідь дає список з Char? Типи виглядають однаково, коли голий друк.
Οurous

@Ourous Так, я думаю, це добре. Консенсус по мете здається, що рядок являє собою послідовність символів, і це те, що список символів.
Steadybox

У цьому семисегментному дисплеї цифра 1не є точно ідентичною її дзеркальному зображенню, оскільки ви можете визначити, чи використовуються найправіші або найбільш ліві сегменти для формування вертикальної "лінії", що становить цифру. Я розумію, що ми тут їх вважаємо однаковими.
Jeppe Stig Nielsen

@JeppeStigNielsen давайте зробимо вигляд, що OP використовував зображення з 14-дюймовими дисплеями замість 7seg, так що 1можна було б по центру.
Спарр

3
@Steadybox Вау, я мала цю точну ідею недавно. Планую використовувати його на людях під час співбесіди з програмуванням. До речі, у мене є мікрохвильова піч, яка не має розумного годинника і дозволяє вказати такі речі, як 83:75 :-)
JohnEye

Відповіді:


2

05AB1E , 34 байти

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

Спробуйте в Інтернеті!

Пояснення

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


5

APL (Dyalog Unicode) , 84 байти SBCS

Повне виведення програми на STDOUT. Потрібен ⎕IO( I ndex O rigin), 0який за замовчуванням для багатьох систем.

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

Спробуйте в Інтернеті!

⍳1440 що багато ɩ ntegers

0 60⊤ перетворити на змішану основу ∞, 60

100+ додати 100 (це колодки потрібні 0)

⍕¨ формат (раціоналізувати) кожен

1↓¨ видалити перший символ з кожного (це видаляє провідні 1)

{}⌿ Застосувати наступну анонімну функцію у стовпці ( найкраща година, хвилина)

0:: якщо трапиться якась помилка, нічого не повертайте

 спробуйте:

  '015xx2xx8x:'[] Індексуйте цей рядок за допомогою:

   ∊⍺':'⍵ε nlisted (сплющені) список годин, двокрапка, хвилини

   i← зберігається в i(для i nput)

   ⎕D⍳ɩдокументи кожного символу у списку D- іг

   Звернути це

  t← зберігати як t(для т імені )

  ()⊆ Група працює там, де:

   ':'≠t товста кишка відрізняється від t

⍎¨ виконати (оцінити) кожного

23 59≥ Булеві для кожного, незалежно від того, чи є вони меншими 23 або 59 відповідно

∧/ обидва правдиві?

: якщо так, то:

  ⍕i'-'t відформатований (розділений пробілом) список введення, тире, часу

  1↓ упустити перший (пробіл)

  ⎕← вихід до STDOUT


4

Сітківка , 57 байт


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

Спробуйте в Інтернеті! Пояснення:


 - 

Вставте роздільник.

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

Створіть усі можливі набори з чотирьох дзеркальних цифр.

A`\b2?5

Видаліть нелегальні години.

\b\d.
$&:

Вставте колонки.

O`

Сортувати за порядком.


4

Python 2 , 279 277 255 байт

for h in range(1440):
 q=[[[0,(a+"52")[(a=="2")+(a=="5")*2]][a in"01825"]for a in c]for c in[("%02d"%e)[::-1]for e in[h%60,h/60]]]
 if all(q[0]+q[1]):
	z=[int(''.join(j))for j in q]
	if(z[1]<60)*(z[0]<24):print"%02d:%02d - %02d:%02d"%(h/60,h%60,z[0],z[1])

Спробуйте в Інтернеті!

Кредити

  • 279 байт скорочено до 256 на дилнан .

  • 256 байт FlipTrack зменшено до 255 .



3

Чисто , 269 ... 172 170 байт

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]

Спробуйте в Інтернеті!

Безголівки:

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 байт

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

Спробуйте в Інтернеті!

Створює всі можливі комбінації, 0125а потім маніпулює ними у часи. Вони в правильному порядку, оскільки вони породжені в лексикографічному порядку. Нарешті, це фільтрує зайві недійсні часи, видаляючи рядки, які відповідають регулярному вираженню 5.:або 25:. На жаль, не здається, що стиснення добре працює на будь-якій з рядків, якими користується ця програма, якщо я не зробив помилку чи недогляд.



2

Japt v2 (+ -R), 51 байт

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

Перевірте це в Інтернеті!

Пояснення

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

Вугілля деревне , 59 байт

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

Спробуйте в Інтернеті!Посилання на багатослівну версію коду. Пояснення:

F012F0125F0125F015

Створіть чотири вкладені петлі для непереданих цифр.

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

Переконайтеся, що ні години, ні хвилини не досягли 25 (Дзеркальне відображення 25 хвилин призведе до 25 годин, тож це не потрібно.)

ικ:λμ - 

Роздрукуйте невідомий час.

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

Роздрукуйте дзеркальний час, перетворивши перевернуті цифри (або 3двокрапки) з рядка в цілі числа та переглянувши їх у таблиці перекладу.

Крім того, також для 59 байт:

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

F¹¹F¹⁶

Створіть петлі для годин і хвилин.

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

Виключіть 25і будь-які хвилини, що закінчуються 2.

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

Перетворіть години та хвилини на базу 4.

Fθ§0125:λ

Роздрукуйте цифри, знайдені в таблиці перекладу.

 - 

Роздрукуйте роздільник.

F⮌θ§0152:λ⸿

Друкуйте зворотні цифри, знайдені в дзеркальній таблиці перекладу.


1

Желе , 72 66 62 55 байт

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

Спробуйте в Інтернеті!

Ніладична програма. Я отримав подвійний продукт '0125'ідеї з відповіді 05AB1E від Emigna, але все інше я зробив, не порадившись з цим, оскільки мови розходяться після цього. Можливо, є можливості для гольфу, можливо, багато.

Пояснення

Програма працює наступним чином:

  • Візьміть всі продукти довжини чотири списки символів '0125'з “0152:”©ṢṖp`⁺. ©копіює рядок '0152:'до реєстру для подальшого використання. ṢṖsort сортує потім останній елемент рядка → '0125'. дублює посилання на продукт.

  • ḣ176видаляє будь-який час з форматом 25xxабо 5xxx(не дійсно годин).

  • j€“:”приєднується до кожної пари цифр з а ':'. наприклад ['05'],['21']]'05:12'.

  • Ç€застосовує перше посилання на кожен із цих часів. Він знаходить індекс кожного символу в рядку, '0125:'після чого для кожного з цих індексів отримує символ у рядку '0152:'і повертає його назад. Це дзеркальна робота (реверсування та заміна 2s і 5s).

  • µ;" поєднує початковий час з дзеркальним часом → '05:2115:20'

  • ⁾25ẇ$ÐṂфільтрує часи з підрядкою '25'. Це вловлює будь-який час пари з дзеркальною половиною 25:xxабо 5x:xx. Примітка . Я не знаю, для чого $це потрібно. Можливо, хтось міг би розіграти його правильним синтаксисом, але я не впевнений.

  • Кожен раз розділіть їх на дві половинки ( œs€2), потім з'єднайте їх з рядком ' - '( j€“ - ”). '05:2115:20''05:21 - 15:20'.

  • Нарешті, Yз'єднує всі рядки з новим рядком і все неявно друкується.

Старі версії

62 байти

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

Спробуйте в Інтернеті!

66 байт

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

Спробуйте в Інтернеті!

72 байти

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

Спробуйте в Інтернеті!




1

Котлін , 205 207 байт

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

Прикрасили

    (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
        }

Тест

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

ТІО

TryItOnline

Правки

  • +2 Steadybox - фіксований формат IO

Там повинен бути пробіл по обидва боки -. Додавання лише два байти: Спробуйте це в Інтернеті!
Steadybox

Виправлено, мені цікаво, чи є спосіб повернутися до 205 байт, зменшивши решту коду
jrtapsell

0

C, 225 байт

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

Оскільки відповіді на С немає, я розміщую свою. Інший підхід може бути коротшим.

Спробуйте в Інтернеті!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.