Моим первым в мире программированием головоломок и Code Golf является дисплей с семью слэшами . Вот мой первый вызов, также основанный на 7-сегментном дисплее.
Помимо цифр, я часто думаю о том, какие буквы я могу отображать, используя простой 7-сегментный дисплей. Оказывается, много букв могут быть отображены. Фактически, все буквы, кроме букв K, M, V, W, X, могут отображаться с использованием одного 7-сегментного дисплея. Это потому, что вы можете отображать либо строчные, либо прописные буквы. например
«abcdef» может отображаться как
_ _ _ _
!_!!_ ! _!!_ !_
! !!_!!_ !_!!_ !
Обратите внимание, что каждый символ представляет собой матрицу 3x3, состоящую из !
и _
.
Конечно, 7-сегментный дисплей может использоваться для отображения цифр и символов:
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
Некоторые буквы могут иметь как верхний, так и нижний регистр:
_ _
! _ !_!!_ ! ! ! _ ! !
!_ !_ ! !! ! ! !!_!!_!!_!!_!
Вот полный набор символов:
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_! _!!_
Обратите внимание, что есть пробел ( ), тире (
-
) и знак вопроса ( ?
). В письме I
, O
и Z
такие же , как числа 1
, 0
и 2
соответственно.
В этом задании вы напишите программу или функцию для отображения строки, используя 7-сегментный формат отображения выше.
правила
Вы можете написать программу или функцию
Это код-гольф, выигрывает самый короткий код в байтах
Ваша программа или функция должны получать ввод из STDIN или в качестве параметра. И выводит строку в STDOUT или в виде строки в 3 строки без пробела, но завершается символом новой строки. Обрабатывать верхний / нижний регистр
CHIOU
правильно.При желании вы можете распечатать конечные пробелы
Вы должны следовать формату выше. Использование подчеркивания
_
и восклицательного знака!
для формирования вашего 7-сегментного дисплея.Вы должны поддерживать пробелы (
), тире (
-
) и вопросительный знак (?
)Если строка содержит неподдерживаемый символ (k, m, v, w, x), отображается один символ ошибки (линия 3 горизонта, см. Пример). Помимо 5 неподдерживаемых символов, вы можете предположить, что ввод состоит только из поддерживаемого набора символов.
Я решил не использовать букву в нижнем регистре L (
l
) из-за путаницы, но если вы склонны, вы можете отобразить ее как1
справа или слева.
Примеры
$./a.out Start
_ _
!_ !_ !_! _ !_
_!!_ ! !! !_
$./a.out "7-seg dIsplay"
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
$./a.out "0123456789 chiou-?"
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
_ _ _ _ _ _ _ _
!_!!_ _ _!!_ !_ ! !_ !! _ _ !_!!_! _ !_ !_ _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "Bad Form"
_
_
_
$./a.out "Hello"
_
!_!!_ ! ! _
! !!_ !_ !_ !_!
$./a.out "World"
_
_
_
k, m, v, w, x
их, не отображались.\r
) с переводом строки (LF,\n
). * nix использует LF, а Windows использует CRLF. Только некоторые устаревшие системы используют CR самостоятельно. Более подробная информация здесь: en.wikipedia.org/wiki/NewlineОтветы:
CJam,
123114112110 байтВыше используется символ каретки, так как код содержит непечатаемые символы. Одним из них является null byte (
^@
), что означает, что этот код может быть выполнен только из командной строки.Мы можем исправить это только за счет двух дополнительных байтов (всего 112 ).
На этот раз все символы для печати. Попробуйте онлайн в интерпретаторе CJam .
Пример запуска
Идея (версия для печати)
Каждый символ может быть показан на 9-сегментном дисплее
заменив некоторые из его символов символов пробелами.
Мы можем превратить определенный символ в целое число, заменив каждый показанный сегмент в естественном порядке чтения на 1 , каждый не показанный сегмент на 0 и учитывая полученные двоичные цифры.
Первый и третий сегменты никогда не показываются, поэтому это даст целые числа в диапазонах [0,64) и [128,192) .
Мы можем закодировать каждое из этих целых чисел одним байтом, но половина из них приведет к непечатным символам. Таким образом, мы добавляем 64 к каждому целому числу перед приведением к символу, что гарантирует, что кодовые точки находятся в диапазонах [64,128) и [192,256) .
Единственным непечатаемым символом в этих двух диапазонах является DEL (кодовая точка 127), что соответствует следующей неподдерживаемой конфигурации дисплея:
Мы можем изменить приведенную выше кодировку, добавив 448 == 512 - 64 к каждой кодовой точке, преобразовав в базу 2 и удалив первую двоичную цифру.
Все, что осталось, чтобы найти эффективный способ связывания этих закодированных сегментов с соответствующими им символами ASCII.
Если мы сопоставим символы символов
" -chiou"
с символами";=KMVWX"
и преобразуем весь ввод в верхний регистр, мы можем просто сохранить кодировку для всех символов между0
(кодовая точка 48) иZ
(кодовая точка 90), давая диапазон 43.Индексирование массива является модульным в CJam, поэтому если
A
это строка длиной 43A86=
,A43=
иA0=
все они дают одинаковые результаты. Символ с кодовой точкой 86 таковV
, что мы просто сохраняем закодированные сегменты V - Z и 0 - U по порядку.В реальном коде мы выбираем знак at как символ «плохой формы», заменяем весь ввод на строку,
"@"
если он содержит запрещенную букву, и выполняем шаги, описанные выше.Код (версия для печати)
источник
Perl,
475469424390280272 байтамногострочный с комментариями:
Битовые шаблоны, кодирующие сегменты, хранятся в строке (за исключением 3 непечатаемых символов с использованием
\x
и использованием\0
для пробела) и отображаются на входные символы с помощью оператора транслитерации Perl.Для 5 из 7 сегментов, побитовых и используется вместе с троичным оператором для вывода пробела или символа сегмента. Для двух нижних левых сегментов (кодированных 2 и 4 в наборе битов) используется поиск подстроки в 8-символьную строку для сохранения 2 байтов.
Спасибо Dom Hastings за советы по игре в гольф на Perl.
Старая версия (с использованием регулярных выражений для кодирования шаблонов), 390 байт:
многострочный с комментариями:
Строка считывается и проверяется на наличие недопустимых символов, используя регулярное выражение, и завершается, если они найдены. Затем допустимые символы нижнего регистра заменяются на недопустимые символы, а вся строка преобразуется в нижний регистр.
Строки генерируются по одной, с 1 сегментом на букву в первой строке и 3 на двух других. Для каждой строки строка обрабатывается по одному символу за раз, и этот символ сопоставляется с регулярным выражением для каждого сегмента, чтобы проверить, если a! или _ должен отображаться. Использование регулярных выражений означает, что для символов, где сегмент не задан, требуется 0 бит на сегмент для каждого символа, чтобы кодировать, следует ли его устанавливать, а для тех, где он установлен, в среднем требуется чуть менее 8 бит, поскольку диапазоны символов регулярного выражения могут быть используемый. Таким образом, получается около 3 или 4 бит на сегмент на символ в наборе, или около 21-24 бит на символ.
Он не обрабатывает перенос строк.
источник
' '
может быть заменен на$"
и' '
может быть,$"x3
который урезает несколько, ваши\n
могут быть буквальными символами новой строки, чтобы избавиться от еще нескольких. Ваш ранний выход тоже может быть закорочен, используя die, так что этоif(/[kmvwx]/i){print" -\n"x3;exit}
становитсяdie" - "x3if(/[kmvwx]/i)
. Также вы можете перестроить цикл, чтобы избежать скобок, и вам не нужно$z
экономить еще несколько!$_=lc<>
не работает, потому что тогда код не может различитьОбыкновенный Лисп,
488416пример
С
"abcdefg'hijklnopqrstuz"
отпечатками:замечания
Символы и их представления закодированы в этом числе в базе 36:
Двоичное представление этой цифры разделено на группы по 17 бит.
Например, последняя группа из 17 битов
110000111101010
, которая здесь разбита на две части:110000
, код символа0
111101010
кодировка чертежа, лучше всего представленная следующим образом:Биты в первом и последнем «столбце» предназначены для
!
символов, а в среднем столбце - для_
символа. При необходимости хранятся версии символов в верхнем и нижнем регистре.Функция выполняет итерацию по входной строке три раза, по одному для каждой строки вывода, ищет соответствующий символ в таблице (или по умолчанию 146, то есть три бара) и печатает представление в текущей строке.
источник
'
персонажа, что приятно; однако он будет отображаться за пределами того, на что способен 7-сегментный дисплей. Если вы переместитесь!
вниз на 1 строку, это будет идеально.'
символ и отредактирую вопрос,K
потому что на самом деле я поставил неK
в том месте во входной строке ("... jlKn ...") ;-) Вы можете увидеть тройные бары (ошибка) просто после Л. Спасибо, что заметили.JavaScript (ES6),
380352324 байта( Примечание. В коде используется символ каретки, поскольку он содержит некоторые непечатаемые символы. Чтобы получить оригинальный код, щелкните здесь и выберите необработанные данные. И нет,
h
это не программа CJam.;)Называется как
d("7-seg display")
или похожий. Работает в Firefox 40, но может не работать в других браузерах. По какой-то причине фрагмент HTML / JS не сохраняет непечатаемые, но вы можете скопировать и вставить необработанные данные отсюда .Ungolfed:
( Примечание:
g
иh
были дополнены пробелами , чтобы соответствовать8
,-
,ÿ
иspace
с их соответствующими значениями Unicode) .Объяснение:
Я сразу заметил, что 7 сегментов, преобразованные в
0
/1
бит, будут хорошо сочетаться с первыми 128 символами Юникода. Проблема с этой идеей состоит в том, что 1/4 из этих символов являются непечатными управляющими символами. Используя их в моем коде, выглядело бы невероятно грязно (или невероятно умно; я не решил, какой именно). Чтобы решить эту проблему, сохранив при этом простоту остального кода, мне пришла в голову эта идея:За исключением
-
, пространства и ошибок , ни один из персонажей не отсутствовали оба нижних вертикальных сегментов. Поэтому, чтобы убедиться, что все эти символы остались между0020
и007f
, я просто отобразил 64 и 32 бита в эти сегменты, вот так:Номера других 5 сегментов не слишком важны; они могут быть расположены любым другим способом и все еще иметь все те же символы "в границах".
В качестве примера, вот кодированная версия A :
Затем я вставил закодированную версию каждого 7-сегментного символа в
h
. Однако, в8
результате007f
( управляющий код удаления ; постоянная независимо от того, как сегменты расположены), пробел не привело0000
(в нулевом коде, также константа),-
в результате0002
, и ошибка привела0007
. Я копировать-вставить необработанные байты в правильное положение8
,-
и ошибка ; пространство было легко достигнуто с\0
.После всего этого кодирования все, что мне нужно было сделать, это использовать его для декодирования строки и вывода в 7-сегментном читаемом формате. Я использовал для цикла и трех переменных (
x
,y
, иz
, каждая из которых соответствует выходной линии) , чтобы пройти через каждый символ в строке , и добавить его 7-сегм эквивалент к выходу. Я выбралÿ
для ошибки характера , потому что AFAIK, это не на любой клавиатуре, и это последний символ вu+0000-u+00ff
диапазоне. Возможно, я мог бы быть остроумным и избраннымΞ
(греческая буква XI) вместо ....;)Edit 1: Сохраненный кучу пространства путем создания мини-функции , чтобы определить , является ли
!
,_
илитребуется.
Изменить 2: сэкономил много места, используя уловки, которые я выучил с тех пор, как в последний раз посетил этот пост
Как обычно, предложения очень ценятся!
источник