Декодировать 7-сегментный дисплей


17

Вы , наверное , все знаете 7-сегментный дисплей , который может отображать среди прочего все цифры от 09 :

7-сегментный дисплей (wikipedia.org)

Вызов

Мы рассматриваем только сегменты AG , ваша задача - декодировать одну цифру, учитывая, какие сегменты включены.

Это может быть закодировано как 8-битное целое число, вот таблица каждой цифры с их двоичным представлением и соответствующими значениями с прямым и прямым порядком байтов:

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

Правила и ввод / вывод

  • Вход будет одним из
    • одно целое число (как в таблице выше одного из двух заданных порядков)
    • список / массив / .. битов
    • строка, состоящая из символов ABCDEFG(вы можете предположить, что она отсортирована, как пример ABCкодирует ), их регистр - ваш выбор (не смешанный регистр)7
  • Вывод будет цифрой, которую он кодирует
  • Вы можете предположить, что недопустимые входные данные (неверный означает, что нет соответствующей цифры)

тесты

Поскольку этот вызов позволяет несколько представлений, пожалуйста, обратитесь к таблице.



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

@JonathanAllan: Я уточню, только те, которые уже показаны.
ბიმო

Оооо дерьмо, вам не нужно обрабатывать все типы ввода? Единственный? Упс ...
Волшебная урна осьминога

@MagicOctopusUrn: Да, действительно :)
მოიმო

Ответы:




7

Wolfram Language (Mathematica) , 41 байт

9[,6,0,8,2,3,1,7,5,4][[#~Mod~41~Mod~11]]&

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

Использует в качестве входных данных столбец с прямым порядком байтов целых чисел. Игнорировать предупреждение о синтаксисе.

Для ввода X мы сначала берем X mod 41, а затем получаем результат mod 11. Результаты отличаются от mod 11, поэтому мы можем извлечь их из таблицы. Например, 126 mod 41, mod 11 - 3, поэтому, если мы сделаем позицию 3 равной 0, мы получим правильный ответ для ввода 126.

Стол есть 9[,6,0,8,2,3,1,7,5,4]. Часть 0 это голова, которая есть 9. Часть 1 отсутствует, так что, это Null, чтобы сохранить байт: нам никогда не нужно принимать участие 1. Тогда часть 2 - это 6, часть 3 - 0и так далее, как обычно.


Ответ Джонатана Аллана дает нам 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&. Это не короче, но это избегает синтаксического предупреждения!


Wolfram Language (Mathematica) , 27 25 байт

Mod[Hash[")dD}"#]+2,11]&

(Здесь есть какой-то персонаж, который не совсем появляется, извините. Нажмите на ссылку ниже, и вы увидите это.)

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

Это все о грубом принуждении некоторой строки войти внутрь, Hashчтобы хэши имели правильные значения mod 11. Более грубое форсирование, вероятно, может привести нас к еще более короткому решению.


Не могли бы вы немного объяснить этот ответ для тех, кто не знает Mathematica?
шут

Я думал, что это будет читабельным для любого, но хорошо, я отредактирую в объяснении.
Миша Лавров

Congrats; 41-байтовое решение сломало мой компрессор Mathematica.
lirtosiast



4

Java (JDK) , 32 байта

n->"99608231754".charAt(n%41%11)

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

кредиты



Спасибо, @JonathanAllan! Очень признателен!
Оливье Грегуар


3

Пробел , 152 байта

Обязательные «S, T и L на самом деле не существуют, это просто видимые представления команд».

S S S T	S S L
S S S T	S T	L
S S S T	T	T	L
S S S T	L
S S S T	T	L
S S S T	S L
S S S T	S S S L
S S S L
S S S T	T	S L
S S S L
S S S T	S S T	L
S S S L
S L
S T	L
T	T	T	T	T	S S S T	S T	S S T	L
T	S T	T	S S S T	S T	T	L
T	S T	T	L
S S L
S L
S L
T	S S L
S T	L
S T	L
S S S T	L
T	S S T	L
S L
L
L
S S S L
S L
L
T	L
S T	

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

Заканчивается ошибкой.

Эквивалентный синтаксис, похожий на ассемблер:

	push 4
	push 5
	push 7
	push 1
	push 3
	push 2
	push 8
	push 0
	push 6
	push 0
	push 9
	push 0
	dup
	readi
	retrieve
	push 41
	mod
	push 11
	mod
slideLoop:
	dup
	jz .slideLoop
	slide 1
	push 1
	sub
	jmp slideLoop
.slideLoop:
	drop
	printi

Вы можете удалить три завершающих символа новой строки, чтобы сохранить 3 байта. В STDERR выдает ошибку, но программа все еще работает, и это разрешено мета-правилами .
Кевин Круйссен,

3

Brainfuck , 474 176 154 151 149 137 байт

Принимает входную строку восемь 0 и 1включая первый 0десятичную точку.

(как во втором столбце таблицы в посте)

Выходные цифры от 0 до 9.

,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]

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

Алгоритм

Наблюдая за состоянием определенного сегмента, мы можем разбить набор возможных цифр на меньшие подмножества. Ниже приведено статическое двоичное дерево поиска, используемое в моем коде. Левое поддерево соответствует состоянию ON сегмента, правое соответствует состоянию OFF сегмента.

                                         0,1,2,3,4,5,6,7,8,9
                                                  |    
                                         /-------[A]-------------------------\
                                 0,2,3,5,6,7,8,9                             1,4
                                        |                                     |
                         /-------------[B]----------------\             /----[G]----\
                   0,2,3,7,8,9                            5,6          4             1   
                        |                                  |
              /--------[E]--------\                  /----[E]----\    
            0,2,8                3,7,9              6             5
              |                    |
        /----[F]----\        /----[F]----\
      0,8            2      9            3,7   
       |                                  |
 /----[G]----\                      /----[G]----\
8             0                    3             7

Некоторые наблюдения полезны для игры в гольф

  1. Биты C и D являются избыточными и могут игнорироваться.
  2. Ведущий ноль (бит для десятичной точки) может быть (ab) использован как значение 48, что важно как для анализа входных данных, так и для подготовки выходных данных.
  3. Когда лист достигнут и цифра напечатана, нам просто нужно пропустить все дальнейшие условия. Это можно сделать, переместив указатель данных достаточно далеко в область нулей, чтобы он не мог вернуться.
  4. Для совместимости лучше использовать нули справа, потому что некоторые реализации BF не поддерживают отрицательные указатели данных.
  5. Следовательно, лучше хранить выходное значение в самой правой ячейке, чтобы мы могли легко добраться до области нулей справа.
  6. Следовательно, лучше проверять биты слева направо: A, B, E, F, G, чтобы мы могли легче добраться до выходной ячейки.
  7. Разные цифры могут совместно использовать выходной код. Например, 5 и 6 находятся в одном поддереве. Мы можем сделать +++++для обоих значений, а затем +только для шести.
  8. Мы можем уменьшить количество +команд, если заранее добавим 2 к выходному значению. В этом случае нам нужно только уменьшить его 0и 1получить преимущество для других цифр.

2

Сетчатка , 96 байт

^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8

Попробуйте онлайн! Возможно, это не лучший способ, но это интересный способ программирования в Retina. Объяснение:

^(A)?(B)?C?(D|())(E|())(F)?(G)?

Пытается запечатлеть интересные случаи. Положительные снимки просто фиксируют письмо, если оно присутствует. Следовательно, длина захвата равна 1, если он присутствует, и 0, если он отсутствует. Частными случаями являются снимки 4 и 6, которые существуют, только если D или E отсутствуют соответственно. Они могут быть выражены только в десятичной системе счисления , как $#4и , $#6но это все , что нам нужно здесь. Захваты затем строятся в строку, длина которой является желаемым числом. Например, если мы напишем, 6*$1то эта строка имеет длину 6, если A присутствует, и 0, если она отсутствует. Чтобы выбрать между различными выражениями, мы используем $.(для положительных значений) или $#(для отрицательных значений) значения, равные 0 или 1, и это можно затем умножить на строку.

$.5*$.8*$(6*$7$2$2)

Fповторяется 6 раз и Bдважды (путем конкатенации, так как это гольфер). Тем не менее, результат игнорируется, если оба Eи Gприсутствуют. Это обрабатывает случаи 2, 6и 8.

$#6*$.3*$($.2*$(___$7)5*$7)

Fповторяется 5 раз, и, если Bприсутствует, добавляется шестой раз плюс дополнительные 3 (представленные константной строкой длины 3). Тем не менее, результат игнорируется, если Dон присутствует и Eотсутствует. Это обрабатывает случаи 3, 5и 9.

$#4*$(6*$1_3*$8

Aповторяется 6 раз, Gповторяется 3 раза и 1добавляется дополнительный (представленный постоянным символом между ними, потому что он гольфист). Однако результат игнорируется, если Dотсутствует. Это обрабатывает случаи 1, 4и 7.

$.(

Вышеуказанные строки затем объединяются и длина берется. если ничего из вышеперечисленного не применимо, строка не генерируется, и поэтому ее длина равна 0.

Результирующие строки (до определения длины) выглядят следующим образом:

1   _
2   BB
3   ___
4   _GGG
5   FFFFF
6   FFFFFF
7   AAAAAA_
8   FFFFFFBB
9   ___FFFFFF

2

MATL , 14 байтов

'/lx2Z^o~z'Q&m

Ввод - это число, представляющее сегменты в формате с прямым порядком байтов.

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

объяснение

'/lx2Z^o~z'  % Push this string
Q            % Add 1 to the codepoint of each char. This gives the array
             % [48 109 ... 123], corresponding to numbers 1 2 ... 9. Note that
             % 0 is missing
&m           % Implicit input. Call ismember function with second output. This
             % gives the 1-based index in the array for the input, or 0 if the
             % input is not present in the array.
             % Implicit display



1

Japt, 15 байт

Принимает значение с прямым порядком байтов в качестве входных данных.

"~¶ÌÚúþÞ"bUd

Попытайся


объяснение

Строка содержит символы в каждой из кодовых точек значений с прямым порядком байтов; Udполучает символ в коде ввода и bнаходит его индекс в строке.




1

TI-BASIC (серия TI-83 + / 84 +), 15 байтов

int(10fPart(194909642ln(Ans

Использует младший порядок ввода. Хеши довольно распространены в TI-BASIC, поэтому я написал хеш-функцию brute-forcer для подобных случаев.

Нам немного повезло, так как множитель имеет длину 9 цифр, а не ожидаемые 10.

      fPart(194909642ln(Ans   hash function mapping onto [0,1)
int(10                        take first digit after decimal point

1

05AB1E , 17 16 15 12 байт

•NŽyf¯•I41%è

-1 байт благодаря @ErikTheOutgolfer .
-1 байт, создав порт ответа @MishaLavrov 's Mathematica .
-3 байта благодаря @Grimy .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

NŽyf¯•       # Push compressed integer 99608231754
       I41%   # Push the input modulo-41
           è  # Index this into the integer (with automatic wraparound)
              # (and output the result implicitly)

Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа? ), Чтобы понять, почему •NŽyf¯•это так 99608231754.



@EriktheOutgolfer А, конечно .. По совпадению это так 128в. Забыл, что есть встроенный для 128того, чтобы быть пополам 256. Благодарность!
Кевин Круйссен

Я попробовал некоторые причудливые вещи тоже не смог получить до 15. Странная попытка: ¦C•26¤æÈÛµÀš•2ô₂+sk(19).
Волшебная Урна Осьминога

1
@ Грими Спасибо! Теперь, когда я вижу это, это очевидно, поскольку сжатое целое число имеет размер 11, и начинается
обратный перенос

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.