Горить, 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 нижній сегмент?) Будь ласка, намалюйте всі цифри та вкажіть номери сегментів, що входять до кожного.
Рівень Рівер Сент

Також які формати дозволені для введення? Чи будуть вказані номери сегментів у порядку? Що робити, якщо рішення немає?
Рівень річки Св.

"Деякі комбінації мають кілька не повторюваних рішень". Також будь-яка перестановка рішення - це інше рішення, правда? (як 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

1
Масив чисел ( “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-бітове ціле число, де LSB - верхній сегмент. Повертає 10-бітове ціле число, де LSB є цифрою 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

Демо


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

Математика, 40 байт

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

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

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

У прикладі, якому він відповідає

  |_
  |_

і вихід відповідають {7,8} .

Пояснення:

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


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

Чи не можете ви скористатися тим, що дозволені повторювані рішення при використанні цього алгоритму замінити XOR-зменшення на щось коротше (наприклад, згладити)? Або я щось пропускаю?

Код, як у мене він, генерує список 7-бітових цілих чисел, приблизно рівних 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, то XOR зменшує їх @ ais523. Вирівнювання буде працювати над списком використаних цифр, який містить більше символів.
fireflame241
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.