Напишите программу, которая принимает непустую строку из цифр от 0 до 9 и печатает, как они будут отображаться на семисегментном дисплее, используя косую черту ( /
, \
).
Вот точные цифры:
/\
\ \
\/
\
\
/\
/
\/
/\
/\
/
\
\/\
/
\/\
/
/
\/\
\/
/\
\
/\
\/\
\/
/\
\/\
/
Когда одна цифра появляется за другой, они соединяются по диагонали вверх и вправо с диагональным интервалом между ними. Так, например, 203
стало бы так:
/\
/\
/\ /
\ \
/\ \/
/
\/
Обратите внимание, что 1
персонаж занимает столько же места, сколько остальные. Две строки 1
находятся на правой стороне дисплея, а не слева.
Так 159114
стало бы так:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Может быть любое количество и комбинация начальных / конечных новых строк или пробелов в выходных данных, если цифры находятся в правильном положении по отношению друг к другу.
Так что 159114
, это также будет действительным:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Возьмите ввод из stdin или командной строки, или напишите функцию, которая принимает строку. Выведите результат в stdout или вы можете вернуть его в виде строки, если напишите функцию.
Любая непустая строка из цифр от 0 до 9 должна работать, в том числе отдельных цифр строк (например 8
) и строки с ведущими нулями (например, 007
нули этого должны быть напечатаны).
Самый короткий код в байтах побеждает.
Ответы:
CJam,
777170696362 байтаВсе символы пригодны для печати, поэтому копирование и вставка должны работать нормально.
Попробуйте онлайн в интерпретаторе CJam .
идея
Мы начинаем с изучения количества цифр n на входе и помещаем квадрат пробелов, достаточно большой, чтобы покрыть вывод. В реализации этот квадрат будет закодирован как двумерный массив односимвольных строк.
Квадрат длины 2n + 1 будет правильным (т. Е. Не будет окружающего пробела) для простой реализации, но мы будем использовать один длиной 5n для сохранения пары байтов. К счастью, окружающие пробелы разрешены.
Если мы поменяем линии на семь слэш представления 8 , мы получим следующее:
Представление всех цифр может быть закодировано как 8-битное целое число, где i- й бит равен 0, если i- й символ должен быть заменен пробелом. Для цифр от 0 до 9 получаются целые числа
которые соответствуют следующим символам ISO-8559-1:
Для каждой цифры на входе, после выбора соответствующего 8-разрядного целого числа, мы повторяем i- й символ представления 8 ровно a i раз, где a i - i- й бит целого числа. Это выдвигает массив строк из одного или нулевого символа. Разделив этот массив на куски длиной 3, мы получим массив, в котором каждый элемент соответствует строке представления.
Теперь мы вычисляем векторизованный максимум строк, представляющих квадрат, и строк, представляющих цифру. Строки
, поэтому они заменят пробелы в квадрате. Однако пустая строка меньше, чем строка
, поэтому пустые строки в цифровом представлении сохранят пробелы в квадрате.
/
и\
больше, чем строкаТеперь мы повернем строки и столбцы на две единицы, чтобы разместить следующее представление цифр в правильной части квадрата и повторим процесс для оставшихся цифр на входе.
Наконец, мы переворачиваем каждую строку и вставляем перевод строки между отдельными строками.
Код
Последние повороты испортили бы результат, если бы длина стороны квадрата была меньше, чем 2n + 3 . Поскольку 5n ≥ 2n + 3 для всех натуральных чисел n , квадрат достаточно велик, чтобы предотвратить это.
источник
Python 3,
189183174 байтаСжатие выглядит хорошо для меня, но у меня возникают проблемы с хорошим способом расставить семь переменных ...
К счастью, спецификация довольно смягчена на правилах пробелов, потому что есть много начальных / конечных пробелов.
Expanded:
объяснение
Позиции сегмента, представленные переменными:
Каждый сегмент кодируется одним 2-байтовым символом Unicode. Например,
ϻ
кодируетg
сегмент так:Действительно,
2
это единственная цифра, которая не использует нижний правый сегмент семисегментного дисплея.источник
C
1098345323319 байтПерваяВтораяТретья попытка. Наконец-то решил угробить экранный буфер, чтобы сохранить несколько байтов. Эта программа принимает параметр цифр и печатает цифры в 7-сегментном формате.Первый раз участник. Просто для удовольствия. Быть нежным.
Расширенный, без предупреждения:
источник
JavaScript,
192178167162 байтаИспользование:
f("1337");
вернетсяОн использует функции ES6 и может иметь некоторое поведение, зависящее от реализации, из-за пропуска точек с запятой и скобок и тому подобного, но он работает в Firefox.
Expanded:
Объяснение:
l
является массивом, содержащим 10 однобайтовых символов, которые соответствуют форме каждой цифры. Например, цифра 0 представлена символомî
:Входные символы используются в качестве ключей для массива, содержащего их фигуры, представляющие аналоги, которые читаются по битам
источник
==0
и==1
действительно необходимо раньше?
. Разве int не считается логическим в js? @Regret"w\x05k/\x1D>~\x07\x7F?"
с каждым побитовым символом становится обратным"\xee\xa0\xd6\xf4\xb8|~\xe0\xfe\xfc"
, каждый из них для печати. Это дает еще 8 байтов. Хотя, не достаточно ...f=(x)=>{}
- они не нужны только с одним аргументом.Perl - 103 байта
Вышеприведенное содержит 6 непечатаемых символов (источник можно скачать на Ideone ) и эквивалентно следующему:
Каждый
^F
может быть заменен буквенным символом 6 (ACK) и\177
заменен символом 127 (DEL).Шебанг считается как 1, второй символ новой строки не нужен. Ввод взят из стандартного ввода.
Образец использования
объяснение
Выход генерируется по одному байту за раз. Каждый символ транслитерируется, и это затем интерпретируется как использование битового массива
vec
. Биты хранятся следующим образом:Выход чередуется от 3 до 5 слэшей, так что биты
56
перетекают в01
следующую цифру. Бит7
не используется.источник
C #,
360 355331 байтПривет, первая попытка кода-гольфа. Надеюсь, что это не так уж плохо для C # -вступления.
Использование:
p("159114");
вернетсяExpanded:
источник
string s(string n)
вn=>
с помощью лямбда. Ах, ну, вы можете просто оставить это так, если хотите. :) Однако я создал порт для Java, зачисляя вас. ;)питон 2,
317298278273,15Я считал 4 пробела табуляцией при подсчете.
Несжатый и читаемый:
источник
l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
наl[y+dy][x+dx]=[' ',c][r[map(int,s)[x/2]][i]=='1']
сохранение 5 байтов, изменениеreturn '\n'.join(''.join(x) for x in l)
наprint'\n'.join(''.join(x)for x in l)
сохранение 3 байта, плюс еще несколько изменений. Вот ссылка на Gist, где я сократил число байтов до 440 с 508.KDB (Q),
172136 байтобъяснение
1) Создайте
d
карту со всеми фигурами цифр.2) Заполните матрицу дополнительными нулями и сложите их вместе. то есть "01"
3) Используйте индекс для сопоставления
" /\"
и печати-1
.Контрольная работа
Я уверен, что это может быть короче!
Спасибо @hjk
источник
1 2 0 2 1 2 0 2 1
на(9#1 2 0 2)
(-6).enlist
на1#
работы, так что это еще -5.enlist
хотя, потому чтоcount[a 0]#0
не атом :(Пип, 122 + 1 = 123 байта
Использует
-n
флаг. Принимает ввод через аргумент командной строки.Символы в строке UTF-8 имеют следующие кодовые точки:
11152, 19190, 12535, 12547, 17651, 11575, 11557, 12629, 11071, 11089
.Слегка разгульный
Основная стратегия состоит в том, чтобы найти составные символы каждого числа, а затем искажать их соответствующим образом. Например, для
8
, мы хотим это (пробелы представлены точками):который превратится в это:
Приятной особенностью этой стратегии является то, что несколько предварительно искаженных чисел можно просто объединить рядом.
Теперь мы можем кодировать
/.\\/.\\/.
в базе 3 как1200120012
. Затем мы можем преобразовать это в десятичное число и рассматривать его как кодовую точку UTF-8.Выражение
J"\/ "@^(A_TB3M"⮐䫶ヷ䓳ⴷⴥㅕ⬿⭑")@_.2<>2Ma
получает предварительно искаженные данные следующим процессом:Как только мы соединили эти строки бок о бок, используя их
$.
, мы создадим сетку из пробелов (2 * n + 2 квадрат), пройдемся по предварительно перекошенной сетке и заменим соответствующие пробелы в перекошенной сетке на соответствующие персонажи. Чтобы увидеть, как это происходит, можно изменить код для печати каждого этапа и сделать паузу для ввода пользователя:Сетка фактически построена с ног на голову, потому что это, казалось, облегчало математику.
Я уверен, что есть лучшие алгоритмы для использования. Но я хотел придумать свою идею, а не копировать чужую.
Больше на Пипе
источник
Brainfuck - 719 байтов
Только для исторического контекста, кредиты Даниэлю Б. Кристофани. Я не совсем уверен, когда это было создано, но оно доступно из Интернет-архива уже 9 мая 2003 года.
Вывод для
9
отличается от описания проблемы.источник
Perl, 270 байт
Я действительно не должен был тратить свое время на это.
источник
[$1]while/(.)/g
на,[$_]for/./g
чтобы сохранить 4 байта. заменитьfor($i=0;$i<=$l;$i++)
на,for$i(0..$l)
чтобы сохранить 9 байтов.JavaScript ( ES6 ), 191
206Запустите сниппет в Firefox для проверки.
источник
Java 8, 341 байт
Порт ответа @Shion на C # .NET , так что постарайтесь также поддержать его!
Попробуйте онлайн.
Объяснение:
источник