Цифровий годинник відповідає головоломці


10

Існує безліч головоломок із відповідниками, які передбачають додавання, видалення чи переміщення певної кількості відповідностей для створення нових чисел чи фігур. Це так, як з цифровим годинником.

З огляду на дійсний час на 12-годинному цифровому годиннику, виведіть цифру, яка потребує переміщення найменших ліній, щоб зробити так, щоб кожна видима цифра на годиннику стала цією цифрою. Якщо мінімум більше однієї цифри, виведіть їх усі. Якщо неможливо зробити кожну цифру однаковою, виведіть -1або помилкове значення, відмінне від 0 (ви отримаєте багато таких).

Цифри годин виглядають приблизно так:

  |
  |
 _
 _|
|_
 _
 _|
 _|

|_|
  |
 _
|_
 _|
 _
|_
|_|
 _
  |
  |    
 _ 
|_|
|_|
 _
|_|
 _|
 _
| |
|_|

Випробування:

Вхід: 123

Дисплей годинника:

       _   _
  | :  _|  _|
  | : |_   _|

Вихід: 4

Пояснення: На дисплеї 1:23потрібно намалювати загалом 12 рядків. Тому, щоб кожна цифра була однаковою, кожна цифра повинна мати 4 рядки. Єдина цифра, яка має 4 рядки, - це 4. Тому відповідь має бути 4.

Вхід: 1212

Дисплей годинника:

     _        _
  |  _| :  |  _|
  | |_  :  | |_

Вихід: -1

Пояснення: для відображення 12:12потрібно 14 рядків. 14, розділене на 4, не є цілим числом, тому неможливо, щоб кожна цифра була однаковою.

Вхід: 654

Дисплей годинника:

 _     _  
|_  : |_  |_|
|_| :  _|   |

Вихід: 5

Пояснення: Загальна кількість рядків 15. 15, розділене на 3, це 5, тому кожна цифра повинна мати 5 рядків. Єдині цифри, які містять 5 рядків 2, 3- і 5. Відповідь 5тому, що для створення кожної цифри потрібно лише 2 ходи. Просто перемістіть рядок у лівій нижній частині 6 до нижньої частини 4, тоді у вас є:

 _     _  
|_  : |_  |_|
 _| :  _|  _|

Тоді, як бачите, все, що вам потрібно зробити, - це перемістити рядок у верхньому правому куті цифри, який спочатку був 4 до верху, і ви отримаєте 5:55. Щоб зробити кожну цифру a 2або 3потрібно більше 2 ходів.

Вхід: 609

Дисплей годинника:

 _     _   _
|_  : | | |_|
|_| : |_|  _|

Вихід: 609( 6,0,9або [6,0,9]також нормально).

Пояснення: 6, 0і 9єдині цифри , які мають 6 рядків. Як такі, вони також є єдиним можливим рішенням. Не важко зрозуміти, що знадобиться два рухи, щоб зробити будь-який з них єдиною цифрою. Тому ви виводите всі три цифри.

Примітки:

  • Хоча час введення повинен бути дійсним, час виведення не відповідає (наприклад, 999як вихід є нормальним.)
  • Я дуже гнучка в роботі. Ви можете вимагати провідної 0. Можна використовувати число з десятковою комою. Можна використовувати рядок. Ви можете використовувати масив. Ви можете мати параметр для кожної цифри.

Відповіді:


1

Юлія, 160 157 154

x->(c=count_ones;l=[119;36;93;109;46;107;123;37;127;111];m=l[x+1];n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);find(n.==minimum(n).!=1/0)-1)

Це функція лямбда. Призначте його змінній, щоб викликати її. Приймає вектор цілих чисел у діапазоні 0-9будь-якої довжини та повертає (можливо, порожній) вектор результатів.

Тестові справи

julia> clock = x->(c=co...        # assign function to variable
(anonymous function)

julia> clock([1 2 3])
1-element Array{Int64,1}:
 4

julia> clock([1 2 1 2])
0-element Array{Int64,1}

julia> clock([6 5 4])
1-element Array{Int64,1}:
 5

clock([6 0 9])
3-element Array{Int64,1}:
 0
 6
 9

Пояснення

Перерахуйте сім сегментів і представляйте їх як бітовий вектор.

+---+                     +-0-+
|   |      Enumerate      1   2
+---+   >  the seven  >   +-3-+
|   |      segments       4   5
+---+                     +-6-+

Приклад: 1 (включені сегменти 2 + 5) стає 36(біти 2 + 5 встановлено).
Ось подання для цифр 0-9.

l=[119;36;93;109;46;107;123;37;127;111];
m=l[x+1];

Ми можемо використовувати цифру в якості індексу, щоб отримати її бітове зображення. +1через індексацію на основі 1 у Джулії.

Функція c=count_ones;підраховує кількість 1-бітів у цілому цілому. Псевдонім ми присвоюємо тому, що він нам потрібен частіше.

Повна програма, трохи невольфська:

x->(
  c=count_ones;
  l=[119;36;93;109;46;107;123;37;127;111];
  m=l[x+1];
  n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);
  find(n.==minimum(n).!=1/0)-1
)

Тепер останні два рядки докладно:

mean(map(c,m)) обчислює середню кількість рядків на вхідну цифру.

n=map(a->...,l) петлі над векторним поданням всіх цифр.

Якщо кількість рядків нашої поточної цифри aнеоднакове середньому рядку вводу, поверніться inf.

c(a)==mean(map(c,m))?...:1/0

Якщо ні, поверніть суму відстаней Хеммінга між нашими поточними та всіма вхідними цифрами.

sum(map(b->c(a$b),m))

Тепер у нас є вектор nдовжини, що 10представляє числа, 0-9який дає нам загальну кількість доповнень / вилучень, які ми маємо виконати, щоб infперетворити всі вхідні цифри на це число, або , якщо таке перетворення неможливо без зміни кількості рядків.

find(n.==minimum(n).!=1/0)-1

Нарешті, виведіть локації (на основі 0) усіх мінімумів, які не є inf.

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