Пазл с цифровыми часами

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что для создания каждой цифры 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. Вы можете использовать число с десятичной точкой. Вы можете использовать строку. Вы можете использовать массив. Вы можете иметь параметр для каждой цифры.
geokavel
источник
Связанный: codegolf.stackexchange.com/q/54008/42545
ETHproductions

Ответы:

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.

Райнер П.
источник