Страницы

Поиск по вопросам

воскресенье, 24 ноября 2019 г.

Код-гольф: Увеличиваем цифры


Задача: Написать код минимально возможной длины, выводящий полученную на вход, строк
из цифр большим, символьным шрифтом. Шрифт должен быть в точности такой, как указан тут, в вопросе.

Пример:

На вход получена строка "0123456789", на стандартный вывод программа должна вывести:

  ###      #     #####   #####  #       #######  #####  #######  #####   #####
 #   #    ##    #     # #     # #    #  #       #     # #    #  #     # #     #
#     #  # #          #       # #    #  #       #           #   #     # #     #
#     #    #     #####   #####  #    #  ######  ######     #     #####   ######
#     #    #    #             # #######       # #     #   #     #     #       #
 #   #     #    #       #     #      #  #     # #     #   #     #     # #     #
  ###    #####  #######  #####       #   #####   #####    #      #####   #####


Правила и ограничения:


Программа может, но не обязана быть оформленной в виде функции. Если    она функци
- синтаксис объявления этой функции (int main() {} для C)    не учитывается в размере, важен размер самого рабочего кода.
Входная строка может поступать в программу любым, удобным вам, способом: в виде переменной
указанной в тестовом примере непосредственно перед кодом, в виде параметра функции или со стандартного ввода.
Входная строка может содержать только цифры
Результат должен быть выведен на стандартный вывод в текстовом виде. Если стандартны
вывод направлен на терминал, экран считать достаточной ширины для вывода всего контрольног
примера c запасом. Переход на новую строку обозначайте (явно или не явно) любым символом/комбинацией символов, использующейся для перевода строки на вашей платформе (Например, \n или \r\n).
Шрифт результата должен в точности соответствовать указанному выше. Между цифрам
на выводе должен быть минимум один пробел (цифры не должны сливаться). Шрифт считается моноширинным, т.е. вокруг единицы может быть больше пустого пространства т.к. ее изображение ýже остальных цифр.
В программе запрещено использовать любые встроенные в язык и библиотеки к нему функции сжатия и кодирования данных (Такие как: zip/unzip, base64)
Программа должна содержать шрифт (или код его формирующий) непосредственно в свое
теле. Получать шрифт из внешних источников (ввод, диск, сеть, память видеоадаптера, bios) запрещено.
Размер программы учитывается в байтах. Побеждает программа имеющая минимальный размер




Конкурс окончен

Первое место занимает @RusArt с ответом на 05AB1E, длиной всего 91 "байт".

Втрое место занимает @Anton Petrusevich с ответом на perl, длиной 150 байт.

И третье место достается @retorta с ответом на python, длиной 161 байт.

В ответах рассмотрены самые разные способы сжатия шрифта. При подготовке к конкурс
я рассматривал большинство из них. Самым простым для реализации и в то же время достаточн
эффективным оказалось сжатие до 70 байт в 7 битной, горизонтальной, кодировке (оригинально
моя кодировка представлена в ответе на postgresql. Даже удалось попасть в диапазон допустимы
символов, поменяв 6-7 биты и вычтя 2. Правда не все участники заморачивались и тратил
драгоценные байты на кодирование в диапазон печатных символов с 0x20 до 0x7E. Применяли кодирование как есть, часто с 8 битом или залезая вообще в диапазон управляющих. В принципе такое кодирование имеет право на жизнь, программы на той платформе, где писались работают. Хотя мне и не очень нравится когда программу нельзя напечатать на принтере, ввести по новой с листа и что бы при этом она продолжила работать (Вы не сможете опубликовать свой код в книге ;) ).

Победителем была использована совершенно другая кодировка шрифта. Словарь из 16 возможны
7и символьных элементов шрифта (в битовом кодировании) и кодовая таблица с номерам
частей для каждого символа, которая благодаря нестандартной кодовой странице языка 05AB1
заняла 35 "байт" (технически в этом языке используются 256 графем, которые принято считат
"байтами" потому что их именно 256 и если бы реально существовала такая кодовая таблица, то их все действительно можно было бы закодировать одним байтом). К сожалению подобное кодирование в других языках невозможно в принципе, в связи с тем, что из 256 значений байта в кодировке ASCII 31 используется для управляющих кодов, а 128 старших значений плохо переносятся между платформами.

Подобный подход со словарем в принципе был использован еще в нескольких ответах
но там не применялось бинарное кодирование в результате чего шрифт занимает горазд
больше места. В процессе подготовки конкурса я рассматривал даже несколько варианто
кодирования со словарем. Например, две комбинации ##### и #     #, встречающиеся очен
часто, предполагалось кодировать двумя битами со значениями 10 и 11, а остальные варианты 5и битным значением, первый бит которого 0, что бы отличить от первых двух и остальные 4 бита номер варианта. На практике же это давало совсем небольшой выигрыш в кодировании шрифта и при этом код декодирования оказывался слишком сложным и в код-гольфе неприменимым и опять же в обычном ascii коде уложить это очень сложно.

В ответах можно найти и совершенно иные способы кодирования, например, кодирование повторов # и пробелов просто количествами подряд, представленном в ответе @Qwertiy

К сожалению никто из участников не пробовал использовать вертикальное кодирование
т.е. где элементом выступает 7 бит кодируемого символа берущихся из него по вертикали
А при таком способе кодирования получается очень много повторов. Присмотритесь к цифра
5689 у них отличаются только 1 и последняя вертикаль, остальные одинаковы. При кодировании повторов в такой строке удается достичь практически такого же сжатия как и в случае с словарем и битовым кодированием. Но на практике гольфа опять же слабо применимое из за роста объема декодирующего кода. 



Альтернативный рейтинг

К сожалению не удалось сформулировать правила так, что бы они действительно отражал
то, чего я хотел от конкурса. Во многих ответах используются символы не работающие 
другой кодировке символов или функции близкие по смыслу к base64, т.е. представляющие закодированную строку как одно большое число, в результате чего в коде отсутствует собственноручное ее декодирование. В данном альтернативном рейтинге я отражаю результаты, как бы они выглядели, если бы правила были точно сформулированы.


Anton Petrusevich, ответ на perl, длиной 150 байт
Андрей, ответ на C#, длиной 176 байт
Visman, ответ на PHP, длиной 235 байт




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



execute("ru.stackoverflow.com", "674415");
.cssload-container,.cssload-cube{width:97px;height:97px;transform-style:preserve-3d}.cssload-container,.cssload-cube,.cssload-half1,.cssload-half2{transform-style:preserve-3d}.cssload-container{position:relative;margin:23p
84px;perspective:292px}.cssload-cube{animation:cube 11.5s forwards infinite;transform-origin:cente
49px}.cssload-half1,.cssload-s1{top:0;transform-origin:50% 100%}.cssload-half1{height:39px;position:absolute;animation:half-fol
11.5s forwards infinite}.cssload-side{width:19px;height:19px;background:#ddd;position:absolute}.cssload-s1{left:39px;animation:s1an
11.5s forwards infinite}.cssload-s2,.cssload-s3,.cssload-s4{left:39px;transform-origin:50
0}.cssload-s2{top:19px;animation:s2ani 11.5s forwards infinite}.cssload-s3{top:39px;animation:s3an
11.5s forwards infinite}.cssload-s4{top:58px;animation:s4ani 11.5s forwards infinite}.cssload-s5{left:19px;top:19px;transform-origin:100
50%;animation:s5ani 11.5s forwards infinite}.cssload-s6{left:58px;top:39px;transform-origin:
50%;animation:s6ani 11.5s forwards infinite}@keyframes cube{0%,30%{transform:rotateX(0)}40%{transform:rotateX(45deg
rotateY(0) rotate(45deg)}60%{transform:rotateX(60deg) rotateY(0) rotate(45deg)}65%,70%{transform:rotateX(60deg
rotate(45deg) rotate(180deg)}75%,80%{transform:rotateX(60deg) rotate(45deg) rotate(1turn)}90%{transform:rotateX(0
rotate(0) rotate(0)}}@keyframes s1ani{0%{opacity:1;transform:translateY(0);background:#ddd}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(-90deg);background:#ddd}90%{transform:rotateX(-90deg)}}@keyframes s2ani{0%{opacity:0;transform:rotateX(-179deg)}10%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%,80%{background:#b4b4b4}65%{opacity:1;background:#b4b4b4}90%{opacity:1}to{opacity:0}}@keyframes s3ani{0%,10%{opacity:0;transform:rotateX(-179deg)}20%,90%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%{background:#969696}to{opacity:0}}@keyframes s4ani{0%,20%{opacity:0;transform:rotateX(-179deg)}10%,to{opacity:0}30%{opacity:1;transform:rotateX(0)}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(90deg);background:#b4b4b4}80%{background:#b4b4b4}90%{opacity:1;transform:rotateX(90deg)}}@keyframes s5ani{0%,10%{opacity:0;transform:rotateY(-179deg)}20%{opacity:1;background:#ddd;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(90deg)}55%{background:#ddd}60%{background:#c8c8c8}90%{transform:rotateY(90deg);opacity:1}to{opacity:0}}@keyframes s6ani{0%,20%{opacity:0;transform:rotateY(179deg)}30%{opacity:1;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(-90deg);background:#ddd}60%,80%{background:#c8c8c8}90%{opacity:1;transform:rotateY(-90deg)}to{opacity:0}}@keyframes half-fold{0%,50%{transform:rotateX(0)}60%,90%{transform:rotateX(-90deg)}}


Ответы

Ответ 1



05AB1E, -78 91 86 bytes 7F"‰ʒØTs“c7н7ƒÔΛ`"255öb7ô"KƶΘå驨ÈÐjη½ñ4BØ„ZƤ™Ωë₄´Ø#Ã.Dι¯ƒ“T"255öhIS7*N+èHè)»1'#‡0' ‡ Попробовать Словарь в 255-й системе счисления: ‰ʒØTs“c7н7ƒÔΛ` При преобразовании в двоичную и разделении на группы по 7 получаем это: ['1000001', '0011100', '0100010', '0001000', '0011000', '0101000', '0111110', '0000001', '1000000', '1111111', '1000010', '0000010', '1111110', '0000100', '0010000', '0111111'] Сам шрифт кодируется в 16-й системе счисления (в словаре 16 элементов) 1200021 3453336 6076889 6076709 8AAA9BB 988C706 608C006 9AD3EEE 6006006 600F706 В программе он также переведен в 255-ю систему счисления: KƶΘå驨ÈÐjη½ñ4BØ„ZƤ™Ωë₄´Ø#Ã.Dι¯ƒ“T Прогоняется цикл от 0 до 6, в каждой итерации ввод пользователя преобразуется в индекс шрифта, которые в свою очередь восстанавливаются по словарю. В конце программа все собирает и заменяет 0 на пробел и 1 на #. UPD Заменил использование • на явное преобразование системы счисления. ö = pop a,b push int(a, b) UPD Исправил цифру 3, заодно самоликвидировался костыль и код получился меньше Расшифровка 7 - кладем в стек число 7 F - берем из стека число a, в интервале от 0 до a выполняем следующие команды "‰ʒØTs“c7н7ƒÔΛ`" - кладем в стек строку 255 - кладем в стек число 255 ö - берем из стека a и b, выполняем преобразование системы счисления числа a с основания b к основанию 10, кладем результат в стек b - берем из стека число, преобразуем число в двоичную систему счисления, кладем результат в стек 7 - кладем в стек число 7 ô - берем из стека a и b, делим a на группы по b элементов, кладем в стек массив "KƶΘå驨ÈÐjη½ñ4BØ„ZƤ™Ωë₄´Ø#Ã.Dι¯ƒ“T" - кладем в стек строку 255 - кладем в стек число 255 ö - берем из стека a и b, выполняем преобразование системы счисления числа a с основания b к основанию 10, кладем результат в стек h - берем из стека число, переводим его в 16-ю систему счисления I - кладем в стек пользовательский ввод S - берем из стека строку и кладем массив ее символов 7 - кладем в стек число 7 * - берем из стека a и b, умножаем, кладем в стек результат. Тут массив умножается на число, то есть каждый элемент массива умножается на число N - кладем в стек текущий итератор из команды F (2-я по счету, N = [0..6]) + - берем из стека a и b, складываем, кладем в стек результат è - берем из стека a и b (a - шрифт, b - индекс), кладем в стек a[b] (код из словаря) H - переводим число из 16-й системы в 10-ю è - берем из стека a и b (a - словарь, b - индекс), кладем в стек a[b] (часть рисунка) ) - тут играет роль end F » - на этот момент в стеке есть строки с частями рисунка, команда соединяет их в одну и вставляет между ними перенос на новую строку 1 - кладем в стек число 1 '# - кладем в стек символ # ‡ - берем из стека a,b,c (a - рисунок, b - 1, c - #), в a заменяем b на с 0 - кладем в стек число 0 ' - кладем в стек пробел ‡ - берем из стека a,b,c (a - рисунок, b - 0, c - пробел), в a заменяем b на с в конце программа сама выводит на экран последний элемент стека (наш рисунок)

Ответ 2



Python3, 161 байт def f(s): for i in'0123456':print(*(format(b'>>@>>>"AAB@ABAAA(B@@AAA>>B~~>?A@AA"@AAAAA>>>>>>'[int(i+j)],'7b').translate({48:' ',49:'#'})for j in s)) SO режет некоторые символы, так что код скопированный отсюда не будет работать, но если скопировать отсюда, то всё работает. Проверка

Ответ 3



Perl, 230 165 155 153 150 символов и байт. Вся программа в ASCII, поэтому, число байт, занимамых программой, равно числу символов. Символы шрифта кодированы простой формулой, чтобы оставались печатными. $_="0987654321"; for$l(0..6){say map{sprintf("%08b",127&(80+ord substr'L8nnp/n/nnRHqqrpqrqqqX11rpp4qqq8nnr..8noq8p1/1q@q1R8pq2qq@qqLn/n2nn@nn',$l.$_))=~y/01/ #/r}/./g} Ideone: https://ideone.com/gbBuzn Комментарий: код эволюционировал, приведён последний вариант. С подсказками Mike Можно ужать ещё, наверное, пару символов, если формулу взять подсказанную, но тогда совсем моего авторства не останется :) Update: минус ещё два символа за счёт того, что ord берёт код первого символа строки. Спасибо Alexander Onokhov. Update: минус ещё три символа за счёт переупорядочивания данных шрифта и замены умножения на слияние строк. Идея "Someone Unknown".

Ответ 4



Javascript ES6, 376 286 символов Входные данные в переменной s. `235145251167151715251 1131323152524111615241115251 151111191624111615051215251 15131452511411616414526 15131316068625121415161 01131413161515111525121415251 0233517156125253155251`.replace(/./g,(m,i)=>' #'[i&1].repeat(m)).split` `.map(x=>s.replace(/./g,i=>x.substr(7*i,7)+" ")).join` ` Проверка: f = s => `235145251167151715251 1131323152524111615241115251 151111191624111615051215251 15131452511411616414526 15131316068625121415161 01131413161515111525121415251 0233517156125253155251`.replace(/./g,(m,i)=>' #'[i&1].repeat(m)).split` `.map(x=>s.replace(/./g,i=>x.substr(7*i,7)+" ")).join` ` document.querySelector("input").addEventListener("input", function (e) { document.querySelector("pre").textContent = f(e.target.value.replace(/\D/g, '')); }) body { display:inline-block; } input { position:sticky; left:8px; width:calc(100vw - 16px); box-sizing:border-box; }





Старая версия (376 символов)

Внимнание! Первая строка кода заканчивается пробелом!!!



f = s => ` 2#3 5# 4#5 2#5 # 6#7 #5 #7 #5 2#5 
 # 3# 3#2 3# 5#2 5#2 4# # 6# 5#2 4# # 5#2 5#
# 5# # # 9# 6#2 4# # 6#  9# 2# 5#2 5#
# 5# 3# 4#5 2#5 # 4# #6 #6 4# 4#5 2#6
# 5# 3# 3# 6 6#8 6#2 5# 2# 4# 5# 6#
 # 3# 4# 3# 6# 5# 5# # 5#2 5# 2# 4# 5#2 5#
 2#3 3#5 #7 #5 6# 2#5 2#5 3# 5#5 2#5 `.replace(/.\d/g,m=>m[0].repeat(m[1])).split`
`.map(x=>s.replace(/./g,i=>x.substr(7*i,7)+" ")).join`
`

document.querySelector("input").addEventListener("input", function (e) {
  document.querySelector("pre").textContent = f(e.target.value.replace(/\D/g, ''));
})
body { display:inline-block; }
input { position:sticky; left:8px; width:calc(100vw - 16px); box-sizing:border-box; }




Ответ 5



Javascript, 376 символов function printn(n) { var r=Array(7),s,i,d,k=0;while(n[k]){d='ab222ba7c777711231445123132148885dd546332112462215ef799912212211220321'.substr(n.split('')[k]*7 7).split('');for(i=0;i<7;i++){s=' ######, ##### ,# #, #,# ,#######,###### , # ,# # , # , ### , # # , ## , # ,# # , # '.split(',')[parseInt(d[i],16)];r[i]=r[i]?r[i]+' '+s:s}k++}return r.join('\n'); } // Test document.querySelector("input").addEventListener("input", function (e) { document.querySelector("pre").textContent = printn(e.target.value.replace(/\D/g, '')); }); document.querySelector("pre").textContent = printn('0123456789'); body { display:inline-block; } input { position:sticky; left:8px; width:calc(100vw - 16px); box-sizing:border-box; }



Ответ 6



PHP7.0, 211 189 182 символов @Mike уточнил в комментарии, что base64_decode() под запретом. Это тот же вариан на 252 символа, но строка со шрифтом представлена символами ASCII с кодами от 0 до 254, а функция base64_decode() удалена. Код не может быть нормально отображен в кодировке UTF-8

Ответ 7



PHP, 214 символов и байт function d($s){ $c='>>@>>>"AAB@ABAAA(B@@AAA>>B~~>?A@AA"@AAAAA>>>>>>'; for($l=0;$l<7;$l++){ for($d=0;$d

Ответ 8



Delphi, 407 символов Запишу пока что, потом подумаю еще. На C/C++, конечно, короче будет, хотя и над этим еще надо подумать, как ужать. program numbers; {$APPTYPE CONSOLE} uses SysUtils, strUtils; const a: array[0..6] of string = ( '1C083E3E407F3E7F3E3E', '22184141424040424141', '41280101424040044141', '41083E3E427E7E083E3F', '410840017F0141104101', '22084041024141104141', '1C3E7F3E023E3E103E3E'); const s = '1234567890'; var r,b: byte; c: char; x : word; begin for r:=0 to 6 do begin for c in s do begin x := strToInt('$'+copy(a[r],1+StrToInt(c)*2,2)); for b := 6 downto 0 do write(ifthen(x and (1 shl b)>=1, '#', ' ')); write(' '); end; writeln; end; end. зы: как длину то считаете

Ответ 9



Crystal 0.22, 250 байт def foo(s) 7.times{|i|s.each_byte{|b|8.times{|j|print (1&[0x1C22414141221C,0x3E0808080A0C08,0x7F01013E40413E,0x3E41403E40413E,0x20207F21212101,0x3E41403F01017F,0x3E41413F01413E,0x404040810217F,0x3E41413E41413E,0x3E41407E41413E][b-48]>>8*i+j)>0?"#": " "}};puts} end foo("0123456789"); https://play.crystal-lang.org/#/r/24o0 Основано на коде https://ru.stackoverflow.com/a/674586/253020

Ответ 10



C#, 313 305 304 302 299 281 279 278 277 276 275 261 259 258 252 250 байтов void f(string s){ for(int i=-1,j;++i<7;WriteLine())foreach(var c in s)for(Write(" "),j=0;j<7;)Write((new[]{-0x88F7EF9FCFA2,-0x1CB86CD9AB6,1056705L<<28,0,-0x790413A7D03D,0x102041,16449<<14,-0xE9EBC6CC0FBF,16385<<14,8193<<14}[c-48]+0xfa0c07d020be>>i*7+j++&1)>0?"#":" "); } ЗЫ. using static System.Console; - считаем как подключение стандартной библиотеки В немного более читабельном виде: using static System.Console; class Program { static void Main() { ShowNumber("0123"); ReadLine(); } static void ShowNumber(string s) { for (int i = -1, j; ++i < 7; WriteLine()) foreach (var c in s) for (Write(" "), j = 0; j < 7;) Write((new[] { -0x88F7EF9FCFA2, -0x1CB86CD9AB6, 1056705L<<28, 0, -0x790413A7D03D, 0x102041, 16449<<14, -0xE9EBC6CC0FBF, 16385<<14, 8193<<14 }[c - 48] + 0xfa0c07d020be >> i * 7 + j++ & 1) > 0 ? "#" : " "); } } Перенос объявления массива внутрь Write позволил выиграть 7 байт Перевод магических чисел в шестнадцатеричную систему позволил выиграть 8 байт Перевод '0' в 48 позволил выиграть еще один байт Чтение этого позволило избавиться от пары скобок и выиграть 2 байта Перенос вывода разделителей между цифрами в Write позволил уменьшить магические числа и выиграть 3 байта Убрал из подсчета заголовок функции Перенос WriteLine() внутрь заголовка for() позволил выкинуть пару скобок {} и выиграть 2 байта (подсмотрено в этом ответе) Замена операции сравнения == на < дает еще байт Вынос объявления переменных перед циклами позволил выиграть еще байт Перенос инкремента j++ в тело цикла позволил выиграть еще байт Перенос инкремента ++i в предусловие позволил выиграть еще байт Вынос постоянного слагаемого позволяет выиграть невероятные 14 байт (возможно выбор другого слагаемого может улучшить результат еще на 1-2 байта, но лень выбирать) Вынос вывода разделителя между цифрами в заголовок цикла позволил выиграть еще 2 байта Рекомендация @Qwertiy даёт еще один байт Формирование магических чисел с помощью сдвигов дает еще 6 байт Удалил лишнюю пару скобок (не понятно откуда она взялась) - 2 байта

Ответ 11



C++, 283 uint64_t a[]={0x1C22414141221C,0x3E0808080A0C08,0x7F01013E40413E,0x3E41403E40413E,0x20207F21212101,0x3E41403F01017F,0x3E41413F01413E,0x404040810217F,0x3E41413E41413E,0x3E41407E41413E};for(int i=0;i<7;++i,printf("\n"))for(int c:s)for(int I=0;I<8;++I)putchar(1&a[c-48]>>8*i+I?'#':' '); Читаемый код void foo(std::string s) { uint64_t a[]={0x1C22414141221C,0x3E0808080A0C08,0x7F01013E40413E,0x3E41403E40413E,0x20207F21212101,0x3E41403F01017F,0x3E41413F01413E,0x404040810217F,0x3E41413E41413E,0x3E41407E41413E}; for(int i=0;i<7;++i,printf("\n")) for(int c:s) for(int I=0;I<8;++I) putchar(1&a[c-48]>>8*i+I?'#':' '); } int main() { foo("0123456789"); return 0; } Проверка: https://ideone.com/gKYibz

Ответ 12



Java, 596 символов public class Main { public static void main(String[] args) { String s = "0123456789"; String i[] = s.split(""); int n[][] = { { 9, 8, 3, 3, 3, 8, 9 }, { 12, 10, 7, 12, 12, 12, 6 }, { 6, 3, 15, 6, 4, 4, 0 }, { 6, 3, 15, 6, 15, 3, 6 }, { 4, 2, 2, 2, 0, 14, 14 }, { 0, 4, 4, 1, 15, 3, 6 }, { 6, 3, 4, 1, 3, 3, 6 }, { 0, 2, 13, 12, 11, 11, 11 }, { 6, 3, 3, 6, 3, 3, 6 }, { 6, 3, 3, 5, 15, 3, 6 } }; String[] b = { "#######", "###### ", "# # ", "# #", "# ", " ######", " ##### ", " # # ", " # # ", " ### ", " ## ", " # ", " # ", " # ", " # ", " #" }; for (int m = 0; m < 7; m++) { for (int k = 0; k < i.length; k++) { System.out.print(b[n[Integer.parseInt(i[k])][m]] + " "); } System.out.print("\n"); } } } Краткий вариант: public class Main {public static void main(String[] args){String s="0123456789";Strin i[]=s.split("");int n[][]={{9,8,3,3,3,8,9},{12,10,7,12,12,12,6},{6,3,15,6,4,4,0},{6,3,15,6,15,3,6},{4,2,2,2,0,14,14},{0,4,4,1,15,3,6},{6,3,4,1,3,3,6},{0,2,13,12,11,11,11},{6,3,3,6,3,3,6},{6,3,3,5,15,3,6}};String[] b={"#######","###### ","# # ","# #","# "," ######"," ##### "," # # "," # # "," ### "," ## "," # "," # "," # "," # "," #"};for(int m=0; m<7;m++){for(int k=0;k

Ответ 13



PHP7.0, 235 символов Вариант со словарем как в этом ответе

Ответ 14



JavaScript, 726 cимволов, 757Кб) function p(s){ var d=[[7,' ###',' # #','# #',2,2,1,0],[5,' #',' ##','# #',' #',3,3,'f'],[7, #####','# #',' #',0,'#',4,'f'],[7,' #####','# #',' #',0,2,1,0],[7,'#',' #',1,1,'f',' #',5],[7,'f','#',1,'######',' #','# #',' ##### '],[7, #####','# #','#','######',1,1,0],[7,'f','# #',' #',' #',' #',4,4],[7, #####','# #',1,0,1,1,0],[7,' #####','# #',1,' ######',' #',1,0]];for(var h=0;h<7;h++){var ps='';for(var c of s){var cn=parseInt(c);var cd=d[cn];var cm=cd[h+1];var dl=cd[0];if(typeof cm=='number'){cm=d[cn][cm+1]}if(cm.indexOf('f')+1){cm='';for(var j=0;j

Ответ 15



Perl, -132 байта (вне конкурса, использует функцию кодирования) укороченный вариант решения от Anton Petrusevich $_="0987654321"; for$l(0..6){say map{(unpack'(B8)*','>>@>>>"AAB@ABAAA(B@@AAA>>B~~>?A@AA"@AAAAA>>>>>>')[$l.$_]=~y/01/ #/r}/./g} Использованы непечатные символы ASCII, поэтому копипаст отсюда работать не будет. На ideone можно увидеть рабочий пример. Пятая строка длиной 132 байта.

Ответ 16



Javascript ES6, 382 309 276 271 259 258 символов Входные данные в переменной s. eval("[[56b=16c=124cd=128g=254cgcc],[68 48e=130ef=132defee],[e80a=2afdd8ee],[ebccfh=252hbc126],[ebdagae32ea],[68bde4ee32ee],[56cgc4cc32cc]]"[R='replace'](/\d+|\w(?!=)/g,'$&,')).map(x=>s[R](/./g,m=>(256+x[m]).toString(2)[R](/./g,b=>" #"[b]).slice(1))).join` ` Проверка t = s => eval("[[56b=16c=124cd=128g=254cgcc],[68 48e=130ef=132defee],[e80a=2afdd8ee],[ebccfh=252hbc126],[ebdagae32ea],[68bde4ee32ee],[56cgc4cc32cc]]"[R='replace'](/\d+|\w(?!=)/g,'$&,')).map(x=>s[R](/./g,m=>(256+x[m]).toString(2)[R](/./g,b=>" #"[b]).slice(1))).join` ` document.querySelector("input").addEventListener("input", function (e) { document.querySelector("pre").textContent = t(e.target.value.replace(/\D/g, '')); }) body { display:inline-block; } input { position:sticky; left:8px; width:calc(100vw - 16px); box-sizing:border-box; }



Ответ 17



C#, 248 194 193 188 187 177 176 байтов Другой подход с упаковкой цифр не в long-константы, а в строку с символами, т. е., по сути, в число в 128-ричной системе: static void f(string s) { for(int i=-5,j;++i<3;WriteLine())foreach(var c in s)for(j=0;j<8;)Write(" #"[("~r``k!`!``Ln++Kk+K+++t**Kkkz+++r``Kaar` +rk*!*+f+*Lrk+J++f++~`!`J``f``"[i*10+c-8]-6^100)>>j++&1]); } Использует все наработки из моего предыдущего ответа + задействована хотелка из комментария. В более читабельной форме: using static System.Console; class Program { static void Main() { ShowNumber2("012345678"); ReadLine(); } static void ShowNumber2(string s) { for (int i = -5, j; ++i < 3; WriteLine()) foreach (var c in s) for (j = 0; j < 8;) Write(" #"[ ( "~r``k!`!``Ln++Kk+K+++t**Kkkz+++r``Kaar` +rk*!*+f+*Lrk+J++f++~`!`J``f``" [i * 10 + c - 8] - 6 ^ 100 ) >> j++ & 1 ]); } Проверка: http://ideone.com/xhiOgv Невероятно, но факт - один маленький XOR позволяет выкинуть из строки кучу управляющих последовательностей и выиграть ~50 байт! Рекомендация @Qwertiy даёт еще один байт Замена x^0b111...111 на ~x приносит 5 байтов и третье место в рейтинге Рекомендация @Mike дает еще один байт Благодаря помощи @Mike по подбору значения для XOR удалось выиграть еще 10 байт Еще одна хитрость приносит байт

Ответ 18



Ruby and Crystal -161b Вне конкурса вариант Антона (+Майка), просто чтобы показать синтаксис Ruby и Crystal, тут у них совпало. v="0987654321" 7.times{|l|puts v.chars.map{|c|("%08b"% (127&(80+"LRqqqRL8HX888nnq1npp/nq1n1qnprrr/22/pp.1qnnqp.qqn/r48@@@nqqnqqnnqqo1qn"[c.to_i*7+l].ord))).tr("01"," #")}.join} http://ideone.com/XvoUPZ

Ответ 19



PostrgeSQL (8.4+), 284 байта select string_agg(translate((ascii(substr(s,c::int+l::int*10+1,1))-2#96)::bit(8)::text,'01',' #'),' ') from (values('~j``"!`!``Dz##$"#$###Jcc$""f###j``$ j`a#j"c!c#r#cDj"#d##r##~`!`d``r``')) B(s), regexp_split_to_table('0123456','') l, regexp_split_to_table('9876543210','') c group by l order by l Число которое надо вывести задается в 4й строке. В примере на sqlfiddle.com пришлос заменить пробелы на подчеркивания, потому что там вывод на экран происходит в HTML (соседние пробелы подавляются), но разглядеть можно. На экране в pgAdmin (утилита из комплекта поставки postrgesql) выглядит замечательно.

Ответ 20



F#, 496 байт let p (s:string)= let f o v = String([|for i=(56-(o*8)) downto (56-(o*8)-7) do yield if (if i>32 then((v>>>30)&&&(1L<<<(i-31)))<>0L else(v&&&(1L <<< i-1))<>0L)then '#' else ' '|]) printfn "%s"(List.fold(fun a e-> a+(Array.fold(fun b v->b+(f e ([0x38448282824438L;0x1030501010107CL;0x7C82027C8080FEL;0x7C82027C02827CL;0x80848484FE0404L;0xFE8080FC02827CL;0x7C8280FC82827CL;0xFE840810202020L;0x7C82827C82827CL;0x7C82827E02827CL].[(int v - int '0')])))""(s.ToCharArray()))+"\n")"" [0..6]) Тест: https://ideone.com/i0hTW0

Ответ 21



PHP, 675 символов $a=[' ### # ##### ##### # ####### ##### ####### ##### #### ',' # # ## # # # # # # # # # # # # # # ','# # # # # # # # # # # # # # # ',' # # ##### ##### # # ###### ###### # ##### ###### ','# # # # # ####### # # # # # # # ',' # # # # # # # # # # # # # # # # ',' ### ##### ####### ##### # ##### ##### # ##### ##### '];for($l=0;$l<7;++$l){for($i=0;$i

Ответ 22



Второй вариант на PHP, с друго кодировкой алфавита PHP, 273 символа читабельный вариант: $s = "1234567890"; $n = [1,2,4,8,16,24,28,34,40,62,63,64,65,66,126,127]; $a = ['6399BF9F99','75CCDBBDCC','C800DBB2CC','C399DE9399','C3B0F0C4C0','73BC1CC4CC','69F9199499']; foreach($a as $l){ for($i=0;$i=0;$b--){ echo $n[hexdec($l[$s[$i]])]&1<<$b?'#':' '; } ?> =0;$b--)echo $n[hexdec($l[$s[$i]])]&1<<$b?'#':' ';?>

Ответ 23



PHP, 465 символов $a = "###"; $z = " "; $s = "0123456789"; $i = str_split($s); $n = [[9, 8, 3, 3, 3, 8, 9], [12, 10, 7, 12, 12, 12, 6], [6, 3, 15, 6, 4, 4, 0] [6, 3, 15, 6, 15, 3, 6], [4, 2, 2, 2, 0, 14, 14], [0, 4, 4, 1, 15, 3, 6], [6, 3, 4, 1, 3, 3, 6], [0, 2, 13, 12, 11, 11, 11], [6, 3, 3, 6, 3, 3, 6], [6, 3, 3, 5, 15, 3, 6]]; $b = ["#$a$a", "$a$a ", "# $z# ", "# $z#", "#$z$z", " $a$a", " ##$a ", " # #$z", " #$z# ", " $a ", " ##$z", " # $z", "$z#$z", " $z# ", " $z# ", "$z$z#"]; for ($m = 0; $m < 7; $m++) { for ($k = 0; $k < count($i); $k++) { echo $b[$n[$i[$k]][$m]] . " "; } echo "\n"; } Краткий вариант $a="###";$z=" ";$s="0123456789";$i=str_split($s);$n=[[9,8,3,3,3,8,9],[12,10,7,12,12,12,6],[6,3,15,6,4,4,0],[6,3,15,6,15,3,6],[4,2,2,2,0,14,14],[0,4,4,1,15,3,6],[6,3,4,1,3,3,6],[0,2,13,12,11,11,11],[6,3,3,6,3,3,6],[6,3,3,5,15,3,6]];$b=["#$a$a","$a$a ","# $z# ","# $z#","#$z$z"," $a$a"," ##$a "," # #$z"," #$z# "," $a "," ##$z", " # $z","$z#$z"," $z# "," $z# ","$z$z#"];for($m=0;$m<7;$m++){for($k=0;$k

Ответ 24



Аналог кода на Delphi из предыдущего ответа переписанный на php. PHP, 285 символов читабельный вариант: $s = "1234567890"; $a=['1C083E3E407F3E7F3E3E','22184141424040424141','41280101424040044141','41083E3E427E7E083E3F','410840017F0141104101','22084041024141104141','1C3E7F3E023E3E103E3E']; foreach($a as $l){ for($i=0; $i=0; $b--) echo hexdec(substr($l,$i*2,2))&1<<$b?'#':' '; ?> =0;$b--)echo hexdec(substr($l,$i*2,2))&1<<$b?'#':' ';?>

Ответ 25



Python 3, 244 байта (без учёта первых двух строк) s=input() from re import sub for r in range(7):print(*(eval(sub('(.)'*2,r'+" "*0x\1+"#"*\2',hex(int('3BKFT57KVYH9NKP5RWAHYETF85SH2KMQ1BKLL2CVX0HPWX1W2WBGPNN1SHAZPXK7JS0JP0V493SO5PSD1JDSIOB1VMCY67RQ2N7X94FSBVDX9MV0UCUVVSK5GR0DHCG',36)))[15:])[int(d)*7+r*70:][:7]for d in s))

Ответ 26



C#, 252 байта Весь код: http://ideone.com/SzOJCG Только функция: int i=0,j;for(;i<70;i+=10){foreach(var c in s)for(j=0;j<8;j++)Write(new BitArray(new[]{(int)"\x1\x4\x8\x10\x14\x18\x1 !8>?@AD|~\x7f\uc282"["JDKKARKRKKOFNNIANINNSEMMIAADNNSDKKILLCKQSDAMRMNBNMODANHNNBNNJPRKHKKBKK"[i+c-48]-65]})[j]?'#':' ');WriteLine();}

Ответ 27



Kotlin, 233 234 243 268, зато без непечатных символов :) (0..6).map{c->s.map{(BigInteger("cq7ntkqmgle8bf3logj0a8x7uwoe4u3x2dpfv5x5hvwz7z25fob8oanyd2cs7xt99qeaoj1bnj3jw1guzhbzknwgyi7cdz5",36).toString(2).replace('0','4').drop(c*70+it.toInt()*7-336).take(7)+"1").map{print(it-17)}};println()} Развернуто import java.math.BigInteger fun main(args: Array) { val s = "110123456789" (0..6).map{c-> s.map{(BigInteger("cq7ntkqmgle8bf3logj0a8x7uwoe4u3x2dpfv5x5hvwz7z25fob8oanyd2cs7xt99qeaoj1bnj3jw1guzhbzknwgyi7cdz5",36) .toString(2) .replace('0','4') .drop(c*70+it.toInt()*7-336) .take(7)+"1" ) .map{print(it-17)} } println() } } Попробовать можно тут, просто скопировать туда целиком развернутый код

Комментариев нет:

Отправить комментарий