Розшифруйте 7-сегментний дисплей


17

Ви, напевно, всі знаєте 7-сегментний дисплей, який може, серед іншого, відображати всі цифри від 09 :

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

Виклик

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

Це може бути закодовано як 8-бітове ціле число, ось таблиця кожної цифри з їх двійковим поданням та відповідними значеннями маленького та великого ендіанів:

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

Правила та введення / виведення

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

Тести

Оскільки цей виклик дозволяє отримати декілька представлень, зверніться до таблиці.



Чи можемо ми прийняти ціле число (або масив) у будь-якому визначеному порядку біт або лише у двох показаних?
Джонатан Аллан

@JonathanAllan: Я уточню, лише ті, що вже показані.
ბიმო

О, лайно, вам не доведеться обробляти всі типи введення? Тільки один? Уопс ...
Чарівна урвиця

@MagicOctopusUrn: Так, справді :)
квітня 1818

Відповіді:




7

Мова Вольфрама (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]]&. Це не коротше, але це уникає попередження синтаксису!


Мова Вольфрама (Mathematica) , 27 25 байт

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

(Тут є якийсь персонаж, який не зовсім з'являється, вибачте. Клацніть на посилання нижче, і ви побачите його.)

Спробуйте в Інтернеті!

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


Не могли б ви пояснити цю відповідь трохи для того, хто не знає Mathematica?
jrook

Я думав, що це буде читати для когось, але добре, я відредагую в поясненні.
Міша Лавров

Поздоровлення; 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.

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

Спробуйте в Інтернеті!

Алгоритм

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

                                         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 байт

Приймає величину big-endian як вхідну.

"~¶ÌÚúþÞ"bUd

Спробуй це


Пояснення

Рядок містить символи в кожній з точок коду значень big-endian; 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 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. Спасибі!
Kevin Cruijssen

Я спробував деякі химерні речі теж не міг потрапити до 15 років. Найстрашніша спроба: ¦C•26¤æÈÛµÀš•2ô₂+sk(19).
Чарівна восьминога урна

1
@Grimy Дякую! Тепер, коли я бачу, це очевидно, оскільки стиснене ціле число має розмір 11, а
обертається

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