Освещение, 7-сегментная версия

14

Учитывая 7-сегментный дисплей с некоторыми сегментами, которые включены, а некоторые отключены, найдите последовательность цифр (0-9), чтобы после переключения соответствующих сегментов для каждой цифры все сегменты были выключены.

пример

  _
  _    [3] =>     |   [1] =>    [OFF]
  _               |

Числа и соответствующие им сегменты:

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

правила

Codegolf ⊨ выигрывает самая короткая запись.

вход

Непустой список включенных сегментов, заданный как

  1. Последовательность чисел. Сегменты нумеруются сверху вниз, слева направо; начиная с 0 или 1. Номера не обязательно должны быть в порядке.

  2. Одна 7-битная цифра. MSB / LSB не указан (таким образом, вы можете выбрать).

Допускаются нечисловые символы между цифрами (но не обязательно).

Например. для номера 7: 136или 1010010или0100101

Выход

Последовательность чисел, которые будут «применены» к дисплею. Не ограничивается никаким образом, например, порядком цифр. Например. для начального состояния , соответствующего количеству 1, действительные выходы бы 1, 111,010 и т.д.

Альтернативным выходом является 10-битная цифра (опять же, MSB / LSB - ваш выбор). Например. в 1качестве ввода, вывод будет 1000000000или 0000000001.

Некоторые комбинации имеют несколько неповторяющихся решений, например. сегменты, соответствующие заглавной букве, Hможно отключить 013, но также 489и0258 .

Если решения не существует (что я считаю невозможным), вывод будет пустым.

Кирилл
источник
2
Это требует больше уточнения. Какие сегменты включены в каждую цифру (например, включает ли 9 нижний сегмент?) Пожалуйста, нарисуйте все цифры и укажите номера сегментов, включенных в каждую.
Уровень River St
Кроме того, какие форматы разрешены для ввода? Будут ли номера сегментов приведены по порядку? Что мы делаем, если нет решения?
Уровень River St
«У некоторых комбинаций есть несколько неповторяющихся решений» Кроме того, любая перестановка решения - это другое решение, верно? (как 301для H).
Арно
1
Доказательство того, что решение всегда существует: достаточно найти решения для каждого отдельного сегмента. Решения для горизонтальных сегментов, от верхней части к нижней части , являются 17, 08, и 1479. Решения для верхних вертикальных сегментов, слева направо, есть 39и 59. Решения для нижних вертикальных сегментов, слева направо, есть 56и 2389.
Грег Мартин
1
@GregMartin 2не всегда необходим, потому что вы можете заменить его либо либо 0468, либо , 1358или 1369, в зависимости от того, хотите ли вы 0, 8или 9в своем ответе, но отменить это 7вообще невозможно , и я думаю, что у вас должен быть хотя бы один из 1и 3.
Нил

Ответы:

4

Желе , 26 25 байт

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ

Попробуйте онлайн!

Принимает ввод как 7-битное целое число. Возвращает двоичную форму 10-разрядного целого числа.

Это просто грубая сила всех возможностей. Удалите, чтобы получить все возможные выходы или замените его наX чтобы получить случайные возможные выходные данные.

Волшебная программа визуализации!

Как это устроено

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ  - main link, takes one integer
2ṗ⁵’                       - generate all length-10 binary arrays
    µ                µÐf   - now we find those arrays which correspond to digit-
                              sequences which work to switch off all segments:
                              Filter (keep) those arrays which:
     ×                      - multiplied by 
      “wØ][:koR¶{‘          - [119, 18, 93, 91, 58, 107, 111, 82, 127, 123] 
                               (encoding for turned-on segments given number)
                  ^/        - reduced by XOR
                    =      - are equal to (implicit) the program's input
                        Ḣ  - output the first of these valid arrays
fireflame241
источник
1
Массив numbers ( “wØ][:koR¶z‘) может содержать ошибку. В вашем номере 9отсутствует нижний сегмент (сравните 9в своей визуализации тот, что в описании задачи). В остальном очень приятно, особенно визуализация!
Kyrill
1
@kyrill Исправлено! Просто требуется небольшое изменение в списке литералов.
fireflame241
2

JavaScript (ES6), 60 байт

n=>[65,35,55,42,48,54,110].reduce((r,v,i)=>r^=n>>i&1&&v+v,0)

Это работает, потому что:

  • Переключение 1 и 7 включает только верхний сегмент
  • Переключение 1, 2 и 6 включает только верхний левый сегмент
  • Переключение 1, 2, 3, 5 и 6 включает только верхний правый сегмент
  • Переключение 2, 4 и 6 переключает только центральный сегмент
  • Переключение 5 и 6 включает только нижний левый сегмент
  • Переключение 2, 3, 5 и 6 включает только нижний правый сегмент
  • Переключение 2, 3, 4, 6 и 7 включает только нижний сегмент
Нил
источник
1
Не уверен, следует ли это признать победителем, потому что, очевидно, ты черпал вдохновение у Арно. Но затем он также черпал вдохновение из вашего комментария. В любом случае, хороший ответ, вы оба!
Kyrill
@kyrill Мой обновленный ответ был также предложением Нила. Нет сомнений, что его ответ до сих пор выигрывает.
Арно
2

JavaScript (ES6), 117 107 101 86 84 байта

Сохранено 15 байт благодаря Нейлу

Принимает входные данные как 7-разрядное целое число, где младший бит является верхним сегментом. Возвращает 10-разрядное целое число, где младший бит является цифрой 0.

f=(n,k)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,-~k):k

демонстрация

Arnauld
источник
1
Короче рекурсия f=(n,k=1023)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?k--&&f(n,k):k. Или , если вы предполагаете , ответ существует, то f=(n,k=0)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,k+1):k.
Нил
1
@Neil Спасибо! Да, ответ всегда существует.
Арно
1
Поскольку всегда можно создать ответ, используя цифры 1-7, вы можете сохранить еще 8 байтов, удалив 83и, используя ,91,75и k+2.
Нил
2

Mathematica, 40 байт

BitXor@@{260,802,10,514,3,266,293}[[#]]&

(Это может быть лучше, если тщательно выбирать выход для каждого сегмента и переключаться между LSB и MSB.)

Возьмите ввод как список позиций например {2,4,5,7}и выведите 10-битное число ( 384=0110000000 в двоичном виде) в порядке старших (0, ..., 9).

В примере это соответствует

  |_
  |_

и вывод соответствует {7,8} .

Объяснение:

Магические числа (жестко закодированный список) - это выходные данные, которые возвращаются для каждого сегмента. (закодировано в двоичном виде) И, если число появляется в списке дважды, эффект тот же, что и его не появляется, поэтому используется побитовый XOR. Нам просто нужно XOR вывод возможного значения включенных сегментов.

user202729
источник
2

Желе , 12 байт

ị“A#7*06n‘^/

Попробуйте онлайн!

Это не грубая сила, и это значительно короче, чем мое другое решение. Принимает входные данные в виде списка включенных сегментов и выводит, поскольку LSB является верхним сегментом.

Выводится как список движений цифр.

Как это устроено

Это будет быстро

ị“A#7*06n‘^/ - main link, takes input as a list of turned-on segments (eg. [1,3,6])
 “A#7*06n‘   - list literal [65,35,55,42,48,54,110] where each element is a 7-bit
                 integer, where each integer corresponds to how to turn off
                 a segment (eg. turn off the first segment with 7 and 1 =>2^7+2^1=>64)
ị            - get the elements in the list corresponding to the input indices
          ^/ - XOR reduce these elements to get a single 7-bit integer
fireflame241
источник
Разве вы не можете воспользоваться тем фактом, что при использовании этого алгоритма допускаются повторяющиеся решения для замены XOR-сокращения чем-то более коротким (например, сглаживанием)? Или я что-то упустил?
Код, который у меня есть, теперь генерирует список 7-битных целых чисел, примерно равных 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, а затем XOR-уменьшает их @ ais523. Уплощение будет работать со списком используемых цифр, который занимает больше символов.
fireflame241