Выведите число в PrettyFont


13

Я разработал новый шрифт, который я называю PrettyFont. Я потратил много времени на его совершенствование, но так как я работающий человек, у меня нет времени, чтобы закончить это. Поэтому он содержит только 4 символа прямо сейчас. Однажды, когда я стану богатым, это станет моей пожизненной целью закончить это, но сейчас ...

Это PrettyFont: (0, 1, 2, 3)

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

Каждый символ имеет ширину 4 пикселя и высоту 5 пикселей. Сейчас! Я хочу, чтобы вы написали мне программу, которая выводит число в PrettyFont, чтобы я мог начать отправлять дизайны на печать.

Правила:

В качестве входных данных используется номер строки в базе 4 (только символы 0-3), например, «01321». Программа должна иметь возможность обрабатывать не менее 10 символов в строке. Бонусные баллы начисляются программе, которая получает целое число 10, а не строку. РЕДАКТИРОВАТЬ пояснение: целочисленный бонус означает, что можно ввести любой номер базы 10, например, 54321, и программа преобразует его в базу 4 и выведет его (в данном случае 31100301).

Выводом будет число, напечатанное с помощью PrettyFont. Пример ввода и вывода:

> "321"
####
   #
 ###
   #
####

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

 ## 
  # 
  # 
  # 
 ###

Огромный бонус к программе, которая может выводить ее в виде одной строки следующим образом:

> "321"
#### ####  ## 
   # #  #   # 
 ###   #    # 
   #  #     # 
#### ####  ### 

Символ «#» не является обязательным и может быть заменен любым символом.

При вертикальном выводе требуется пустая строка между каждым символом PrettyFont. Если кто-то делает горизонтальный вывод, между каждым символом PrettyFont требуется один пробел '' или символ табуляции.

Это код гольф, самый короткий код выигрывает! (Мне нужно это коротко, потому что мой офисный компьютер имеет ограниченное хранилище.)


1
Это не совсем дубликат, но единственная принципиальная разница между этим и codegolf.stackexchange.com/questions/3628/… это таблица поиска.
Питер Тейлор

PrettierFont -banner -c '#' 0123
Дрейк Кларрис

1
с 4 пикселями в ширину у вас будут проблемы с 'M'
Кэмерон МакФарланд

Сколько символов бонус за взятие 10 базовых номеров в качестве входных данных?
defhlt

Я не совсем уверен. Мне нужно увидеть еще несколько решений, чтобы понять, как трудно это сделать. Я сам не очень хорошо разбираюсь в код-гольфе, так что ... Предложения приветствуются!
Accatyc

Ответы:


11

к ( 118 117 72 71 69 66 символов)

Я пока не приложил много усилий для игры в гольф, но он достигает желаемого горизонтального выхода не слишком много символов:

-1'" "/:'+(5 4#/:4 20#"# "@,/0b\:'0x066609ddd806db00e8e0)"I"$'0:0;

Принимает ввод из стандартного ввода, печатает вывод в стандартный вывод.

редактирование: реализуя форму сжатия в выходном «растровом изображении», я сократил его до 72. Растровое изображение теперь создается путем преобразования 64-разрядных целых чисел в двоичные и отображения 0 и 1 в «#» или «». Я мог бы сделать это из hex как некоторые другие решения, но я думаю, что это закончится дольше . Оказывается, гекс лучше.

Пример вывода на 012301:

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

// редактировать: -6 символов


Впечатляет. Самый короткий код еще! Это может поместиться на моем диске Молодец.
Accatyc

Вплоть до 71. Учитывая, что объединенный kdb + / q / k exe весит всего 392 КБ, это может быть идеально для вашего диска с ограниченным хранилищем;)
Skeevey

10

Python3 (124)

s=input();[print(*["".join(" #"[0xf171ff429f72226f999f>>(20*int(x)+4*y+i)&1]for i in(3,2,1,0))for x in s])for y in range(5)]

Извините, вертикаль мне не интересна.

???/golf.py
1230012301203012030102301230
 ##  #### #### #### ####  ##  #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### ####
  #  #  #    # #  # #  #   #  #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  #    # #  #
  #    #   ### #  # #  #   #    #   ### #  #   #    #  #  #  ### #  #   #    #  #  #  ### #  #   #  #  #   #   ### #  #   #    #   ### #  #
  #   #      # #  # #  #   #   #      # #  #   #   #   #  #    # #  #   #   #   #  #    # #  #   #  #  #  #      # #  #   #   #      # #  #
 ### #### #### #### ####  ### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### ####

Отличный! Не ожидал так мало символов для горизонтального. Хорошая работа.
Accatyc

1
Спасибо. Я думаю, моя идея (шестнадцатеричное число и сдвиги) должна быть еще короче в реализации Ruby.
Ev_genus

10

J, 84 82 81 80 75 69 знаков

' #'{~(,4,.(4*".,' ',.1!:1[1)+/i.4){"1#:63231 37521 37415 37441 63487

Берет ввод с клавиатуры:

   ' #'{~(,4,.(4*".,' ',.1!:1[1)+/i.4){"1#:63231 37521 37415 37441 63487 63487
0123210
 ####  ##  #### #### ####  ##  ####
 #  #   #  #  #    # #  #   #  #  #
 #  #   #    #   ###   #    #  #  #
 #  #   #   #      #  #     #  #  #
 ####  ### #### #### ####  ### ####

Волшебные числа FTW (или за второе место в этом случае) :-)


Очень мило ... очень мило ... Я впечатлен! Сегодня много хороших ответов. Может быть, мои дизайнерские принты получатся хорошими.
Accatyc

Вы можете закодировать все цифры в одно двоичное число и изменить форму результата, чтобы получить соответствующие матрицы чисел.
FUZxxl

@FUZxxl Я пытался найти число для полных 80 битов, но #:, похоже, не сработало для такого размера числа. #:1166416635908028473935870и #:1166416635908028473931775оба дают один и тот же ответ для меня.
Гарет

8

С - 164 151 символов по горизонтали

На IDEone: http://ideone.com/gljc3

Код (164 байта):

i,j;main(){char n[99];gets(n);for(;j<5;++j){for(i=0;n[i];++i)printf("%.4s ","#####  # ##   #  ### #     #"+4*("01110233340135006460"[(n[i]-48)*5+j]-48));puts("");}}

введите описание изображения здесь

РЕДАКТИРОВАТЬ - 151 байт

Я добавил предложения из комментариев, а затем некоторые. Это не совсем безопасно (массив 0 длины, который я gets()в ...), хотя.

char i,j=5,n[];main(){for(gets(n);j--;)for(i=puts("");n[i];printf("%.4s ","#####  # ##   #  ### #     #"+4*(0x1A600BA136E0248>>15*n[i++]-720+3*j&7)));}

Обратите внимание, i=puts("")это неопределенное поведение, так как я отношусь voidкак int! Он последовательно возвращается 0к моей версии MinGW, но возвращается 1к использованию компилятора IDEOne.

Принимает десятичное число, выводит основание 4 (167 байт)

char i,j=5,n[];main(p){for(itoa(atoi(gets(n)),n,4);j--;)for(i=puts("");n[i];printf("%.4s ","#####  # ##   #  ### #     #"+4*(0x1A600BA136E0248>>15*n[i++]-720+3*j&7)));}

Ох, короткий в C! Это, безусловно, будет работать в течение минуты на моем старом процессоре. Хороший.
Accatyc

Не могли бы вы сохранить 3 символа, удалив "! = 0"?
a3nm

Да спасибо Я не уловил это.
Каслай

Положите getsв for(сохранить 1). Перейти putsк внешнему forприращению и сохранить фигурные скобки. Сохранить парантез: (n[i]-48)*5+j-> n[i]*5-240+j, тот же трюк с +4*(...
Угорен

Хорошо, до 153 байтов. Не так уж плохо для догадки.
Каслай

7

Рубин, 0123 символа + бонус ([0123] против '#')

f=15
0.upto(4){|n|$*[0].chars{|x|$><<"%4s "%eval(:f6ff929192279241f7ff[x.to_i+4*n]).to_i.to_s(2).tr(?0,' ').tr(?1,x)}
puts}

Пример:

% ruby ./font.rb 01231231
0000  11  2222 3333  11  2222 3333  11  
0  0   1  2  2    3   1  2  2    3   1  
0  0   1    2   333   1    2   333   1  
0  0   1   2      3   1   2      3   1  
0000  111 2222 3333  111 2222 3333  111
% ruby ./font.rb 01231231102020103201301203212302230
0000  11  2222 3333  11  2222 3333  11   11  0000 2222 0000 2222 0000  11  0000 3333 2222 0000  11  3333 0000  11  2222 0000 3333 2222  11  2222 3333 0000 2222 2222 3333 0000 
0  0   1  2  2    3   1  2  2    3   1    1  0  0 2  2 0  0 2  2 0  0   1  0  0    3 2  2 0  0   1     3 0  0   1  2  2 0  0    3 2  2   1  2  2    3 0  0 2  2 2  2    3 0  0 
0  0   1    2   333   1    2   333   1    1  0  0   2  0  0   2  0  0   1  0  0  333   2  0  0   1   333 0  0   1    2  0  0  333   2    1    2   333 0  0   2    2   333 0  0 
0  0   1   2      3   1   2      3   1    1  0  0  2   0  0  2   0  0   1  0  0    3  2   0  0   1     3 0  0   1   2   0  0    3  2     1   2      3 0  0  2    2      3 0  0 
0000  111 2222 3333  111 2222 3333  111  111 0000 2222 0000 2222 0000  111 0000 3333 2222 0000  111 3333 0000  111 2222 0000 3333 2222  111 2222 3333 0000 2222 2222 3333 0000 

РЕДАКТИРОВАТЬ: Рубин, 87 символов

0.upto(4){|n|$*[0].bytes{|x|$><<"%04b0"%:f6ff929192279241f7ff[x-48+4*n].to_i(16)}
puts}

введите описание изображения здесь


Творческий! Очень хорошо. Это будет выглядеть потрясающе в моих проектах. Имейте upvote.
Accatyc

Tricky! Потребуется некоторое время, чтобы понять это.
manatwork

5

Рубин

Вертикальный: 116 знаков

f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"}
$<.chars{|c|i=c.to_i*5;$><<f[i,5]*$/+$/*2}

Образец прогона:

bash-4.2$ echo -n 321 | ruby -e 'f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"};$<.chars{|c|i=c.to_i*5;$><<f[i,5]*$/+$/*2}'
####
   #
 ###
   #
####

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

 ## 
  # 
  # 
  # 
 ###

Горизонтально: 150 148 символов

f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"}
o=(0..4).map{""}
$<.chars{|c|5.times{|j|o[j]<<f[c.to_i*5+j]+" "}}
$><<o*$/

Образец прогона:

bash-4.2$ echo -n 321 | ruby -e 'f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr "01"," #"};o=(0..4).map{""};$<.chars{|c|5.times{|j|o[j]<<f[c.to_i*5+j]+" "}};$><<o*$/'
#### ####  ##  
   # #  #   #  
 ###   #    #  
   #  #     #  
#### ####  ### 

Я собирался закодировать это так. Не думай, что я смогу победить это мой язык!
Гриффин

4

Mathematica 174 145 139 118 119 123 символов

Теперь работает с вводом в базу 10 (Целочисленный бонус). Более ранние версии можно найти в редакциях.


Использование ArrayPlot :

С помощью ArrayPlotмы можем напрямую преобразовать 1 и 0 в черно-белые квадраты, сохраняя при этом несколько символов. Например, с n = 58021, что составляет 32022211 в базе 4:

i = IntegerDigits; i[n, 4] /. Thread@Rule[0~Range~3, ArrayPlot /@ ((PadLeft[#, 4] & /@ i[#, 2]) & /@ (i@{89998, 62227, 89248, 81718} /. {8 -> 15}))]

целочисленный бонус


объяснение

Ввод - это программный параметр n.

Ноль может быть представлен {{1,1,1,1},{1,0,0,1},{1,0,0,1},{1,0,0,1},{1,1,1,1} или шестнадцатеричным аналогом f999f.

Выражение, f999f62227f924ff171fсодержит информацию для отображения всех чисел {0,1,2,3}. (Примечание: оно начинается с того f999f, что, как мы отмечали, скрыто равно нулю.) Поскольку Mathematica не распознает это как число, я использовал 89998622278924881718(в четырех целочисленных строках) вместо этого, разбил число на целые цифры, а затем использовал 15 в каждом месте 8 появилось. (Это позволило мне использовать цифры вместо строк везде.)


1
Ваш вывод не совпадает с вводом.
Мистер Листер

Разве вы не можете просто перенести это для вертикального бонуса?
Гриффин

Как я понимаю правила, бонус за горизонтальную конфигурацию.
DavidC

Мистер Листер Хорошо подловил. Я скопировал и вставил картинку с нулем вместо 1.
DavidC

Мой плохой, неправильно прочитанный.
Гриффин

3

Mathematica , 112 107 103

Мой взгляд на метод Дэвида.

i=IntegerDigits;Grid/@i@n/.Thread[0~Range~3->("#"i[i@#/.8->15,2,4]&/@{89998,62227,89248,81718}/.0->"")]

Математическая графика

105 с БОНУСОМ:

(для n = 54321)

i=IntegerDigits;Grid/@n~i~4/.Thread[0~Range~3->("#"i[i@#/.8->15,2,4]&/@{89998,62227,89248,81718}/.0->"")]

Математическая графика


Очень мило на самом деле. Так мало персонажей с бонусом. Хорошая работа!
Accatyc

3

APL ( 58 57)

{' #'[1+5 4⍴1022367 401959 1020495 988959[1+⍎⍵]⊤⍨20⍴2]}¨⍞

Выход:

0123
 #### ## #### #### 
 # # # # # # 
 # # # # ### 
 # # # # # 
 #### ### #### #### 

2

Python 2.7

Вертикальный 160

for i in input():print['****\n*  *\n*  *\n*  *\n****',' ** \n  * \n  * \n  * \n***','****\n*  *\n  * \n *  \n****','****\n   *\n ***\n   *\n****'][int(i)]+'\n'

Горизонтальный 234 216

x=[['****\n*  *\n*  *\n*  *\n****',' ** \n  * \n  * \n  * \n ***','****\n*  *\n  * \n *  \n****','****\n   *\n ***\n   *\n****'][int(i)]for i in input()]
for i in range(5):print' '.join([y.split('\n')[i]for y in x])

Оба принимают ввод как строку в кавычках на стандартном вводе

пример:
$. / pretty
"0123"


Как вы управляете этим? Я получаю ошибки. Python 2: «TypeError: объект« int »не повторяется», Python 3: «TypeError: объект builtin_function_or_method 'не может быть подписан».
manatwork

@manatwork Это в Python 2.7, я отредактировал ответ, чтобы прояснить это.
Мэтт

@manatwork Кроме того, похоже, что вы, возможно, вводили цифры без кавычек, то есть: 0123. Вы должны попробовать ввести "0123" в stdin.
Мэтт

Работай сейчас. Извините, этот трюк с цитатами не был очевиден для меня.
manatwork

@manatwork в версиях Python до 3 Функция input () оценивает ввод, как если бы это было выражение Python. Если кавычек нет, программа пытается перебрать целое число, выдавая полученную ошибку.
Мэтт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.