16-битная двоичная сетка


29

Для любого 16-разрядного целого числа без знака преобразуйте его десятичное число (т. Е. Число-10) в сетку ASCII 4x4 его битов, где старший бит (MSB) находится в верхнем левом, младший бит (LSB) в внизу справа, прочитайте поперек и затем вниз (как текст на английском языке).

Примеры

Вход: 4242

+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Вход: 33825

+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Особые требования

  1. Входные данные должны быть в десятичном формате (основание-10), однако вы можете преобразовать в двоичный файл любым удобным для вас способом (включая использование встроенных языковых модулей, если они доступны).

  2. Формат выходной таблицы должен точно соответствовать . Это означает , что вы должны использовать символы ASCII конкретных ( -, +и |) для линий сетки таблицы , как показано на рисунке, интерьер каждой ячейки 3 символов, а истинные биты представлены в #то время как ложь представляется пробелом ( ).

  3. Начальные или конечные пробелы запрещены. Окончательный перевод строки требуется .

  4. Битовый порядок должен соответствовать примерам, как описано.

довольствие

  1. Ввод должен быть числом 10 в командной строке, стандартном вводе или вводе пользователем, но не должен быть жестко запрограммирован в исходном коде.

Пусть победит самый ясный и короткий код! :-)



2
Первое предложение звучит сбивающим с толку меня, где говорится «преобразовать его десятичную форму » Основываясь на остальной части поста и примере, похоже, что ввод дается в десятичной форме, но вы должны преобразовать двоичную форму значения в сетку.
Рето Коради

1
@RetoKoradi, вы по существу правы, но вопрос требует от вас преобразования десятичного числа в двоичную сетку . Нет явного требования работать с двоичным числом, только вероятные детали реализации.
type_outcast

Считает ли запись функции с номером base-10 в качестве аргумента функции входной пользовательский?
Алекс А.

2
Поскольку вы говорите, что данное число является «16- разрядным целым числом без знака », оно по определению в двоичной форме. Когда я впервые прочитал это, на самом деле это звучало так, как если бы ввод был дан в двоичной форме. Все становится ясно к концу. Но, по крайней мере для меня, первый абзац действительно не отражает проблему вообще.
Рето Коради

Ответы:


21

J, 26 байт

('   ';' # '){~4 4$_16{.#:

Анонимный глагол. К счастью, J очень хорош в рисовании коробок. Давайте попробуем это:

   f =. ('   ';' # '){~4 4$_16{.#:
   f 4242
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Как упоминали некоторые комментаторы, способ рисования блоков J зависит от системы: на некоторых платформах этот код будет работать с настройками по умолчанию, а на других - с помощью символов рисования линий Unicode. (Команды 9!:6и9!:7 позволяют запрашивать и устанавливать символы для рисования в штучной упаковке значений, соответственно.)


Знаете ли вы (или кто-либо еще), есть ли консенсус по команде рисования ящиков для игры в гольф, тогда? Лично я считаю, что в случае с Code Golf предполагается, что решения работают на большинстве систем, на которых работает язык решения, верно? Как будет выглядеть решение, которое выдает правильные поля для всех (или почти всех) установок J? Кстати, мне очень нравится ваше решение! Мой мозг все еще работает, и это именно то, что мне нравится в Code Golf.
type_outcast

5
@type_outcast Мы не нуждаемся в переносимости для задач в гольф-коде. Пока он работает с некоторой реализацией на одной платформе, он действителен.
Деннис

Спасибо за ответ @ Денис. Я рад, что мое предположение было неверным, потому что мне (все еще) очень нравится решение Мауриса! :-)
type_outcast

14

JavaScript (ES6), 102

... или 96 returnвместо console.log.

Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6.

f=n=>{for(o=h=`
+---+---+---+---+
`,z=16;z--;n/=2)o=(z&3?'':h+'|')+` ${' #'[n&1]} |`+o;console.log(o)}

// TEST
console.log=x=>O.innerHTML=x+O.innerHTML

function test(n) { f(n); console.log(n); }
<input id=I value=4680><button onclick='test(+I.value)'>-></button>
<pre id=O></pre>


6
Является ли JavaScripy каким-то странным гибридом javascript / python? ;-)
Цифровая травма

6
@DigitalTrauma конечно. Но так как мир не готов ( tvtropes.org/pmwiki/pmwiki.php/Main/TheWorldIsNotReady ) к этой новой эволюции, я вернусь к JavaScript
edc65,

Круто, это работает на Edge!
Артуро Торрес Санчес

Должен ... не ... нажимать ... твтропы ...
РК.

14

Befunge -93, 196 218 байт

&00p12*v>>4>"---+",v v <
v*:*:*:<   | :-1,,,< #
>:*2/10p^  >"+",25*,10g|
     > #v^#         $< @
 25*,^  >4" |",,v ,*<>
v>"#",00g10g-00p 10g
 |`-1g01g00     <>48^
v>" ",10g
>2/10p>"| ",,1-:#^_$>^

Чтобы запустить программу ...

  1. Перейти к онлайн-переводчику .
  2. Вставьте этот код в большое текстовое поле.
  3. щелчок Show .
  4. Введите желаемое число в Input поле.
  5. Нажмите Run. (Или измените значение Slowна 5 миллисекунд, а затем нажмите Show.)
  6. Та-да!

Выход за 4242:

+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Выход за 33825:

+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

объяснение

О боже, во что я ввязался? Ну, вот и все! (Нерелевантный код заменяется на .s.)

Часть 1: Получить ввод (сохранить в 0,0) и вычислить 32768 (сохранить в 1,0).

&00p12*v>
v*:*:*:< 
>:*2/10p^

Часть 2: Распечатайте «+ --- + --- + --- + ---».

>4>"---+",v
  | :-1,,,<

Часть 3. Выведите «+» и символ новой строки и проверьте, равен ли (1,0) 0 (т. Е. Все готово). Если это так, прекратить. В противном случае продолжайте.

 ........... v <
   | ....... # 
   >"+",25*,10g|
v.#         $< @
>4" |",,v ...

Часть 4: Получить двоичные цифры ввода, обновляя (0,0) и (1,0) по мере продвижения. Напечатайте правильные вещи. Я пользуюсь поведением Бефунга.

 .....  >4" |",,v ,*<.
v>"#",00g10g-00p 10g
 |`-1g01g00     <>48^
v>" ",10g
>2/10p>"| ",,1-:#^_...

Часть 5: Распечатайте новую строку и вернитесь к части, которая печатает "+ --- + --- + --- + --- +". Используется обходной трюк.

     > #.^.         .. .
 25*,^  ......... ...>
................ ...
 .........      .....
........
.................._$>^

Та-да!


10

Юлия, 156 143 байта

n->(p=println;l="+"*"---+"^4;for i=1:4 p(l,"\n| ",join([j>"0"?"#":" "for j=reshape(split(lpad(bin(n),16,0),""),4,4)[:,i]]," | ")," |")end;p(l))

Ungolfed:

function f(n::Int)
    # Convert the input to binary, padded to 16 digits
    b = lpad(bin(n), 16, 0)

    # Split b into a 4x4 matrix
    m = reshape(split(b, ""), 4, 4)

    # Store the line separator for brevity
    l = "+" * "---+"^4

    # Print each column of the matrix as a row
    for i = 1:4
        println(l, "\n| ", join([j > "0" ? "#" : " " for j = m[:,i]], " | "), " |")
    end

    # Print the bottom of the table
    println(l)
end

Попробуйте онлайн


10

Python 2, 157 153 151 146 байт

J=''.join;R='+---'*4;i=format(input(),'016b')
print J(R+'+\n|'+J(' '+('#'if int(l)else' ')+' |'for l in i[n*4:-~n*4])+'\n'for n in range(4)),R+'+'

Спасибо Моргану Треппу за сохранение 4 байта и Джонатану Фречу за сохранение 5.

использование

$ python test.py
33825
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Вы можете сохранить два байта, если вы '+---'*4j=''.join
включите

Нет проблем! Я на самом деле работал над очень похожим решением.
Морган Трепп

@ downvoter Хотите объяснить?
Зак Гейтс

Поскольку вы не используете Python 3, вы можете заменить int(input())с input()и сохранить пять байтов.
Джонатан Фрех

9

Руби, 118 114

b="%016b"%gets
l=?++"---+"*4
1.upto(16){|i|puts l if i%4==1
print"| #{b[i-1]==?0?' ':?#} "
puts ?|if i%4<1}
puts l

спасибо за @ w0lf за сохранение некоторых символов.


1
Вы можете сохранить несколько байтов, если вы пишете буквенные символы с использованием ?нотации (например, ?|вместо '|'). Это работает для всего, кроме космоса.
Кристиан Лупаску

@ w0lf Я обнаружил, что это ?\sработает для космоса, но это не очень полезно здесь.
Mhmd

7

GNU sed + dc, 116

Оценка включает +1 для -rфлагов, чтобы sed:

s/.*/dc -e2o&p/e
:
s/^.{,15}$/0&/;t
s/./| & /g
s/.{16}/\n+---+---+---+---+\n&|/g
y/01/ #/
s/\n([-+]+)(.*)/\1\2\n\1/

Тестовый вывод:

$ { echo 4242 ; echo 33825 ; } | sed -rf 16bitgrid.sed
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

В качестве альтернативы:

Чистый сед, 146

Вы можете подумать, что обманывать использование sedрасширения GNU для оценки dcкоманды. В этом случае мы можем сделать это немного по-другому, в соответствии с этим мета-ответом . Конечно, в вопросе четко говорится, что входные данные должны быть в базе 10, но здесь я пытаюсь утверждать, что мы можем переопределить это для sedответов и использовать вместо них унарный (база 1).

:
s/11/</g
s/<([ #]*)$/< \1/
s/1/#/
y/</1/
t
:a
s/^.{,15}$/0&/;ta
s/./| & /g
s/.{16}/\n+---+---+---+---+\n&|/g
y/01/ #/
s/\n([-+]+)(.*)/\1\2\n\1/

Тестовый вывод

Использование printfдля генерации необходимой унарной строки:

$ printf "%33825s" | tr ' ' 1 | sed -rf 16bitgrid.sed 
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

Хороший. Это похоже на решение Perl, которое я придумал в качестве (частного) доказательства концепции при тонкой настройке вопроса.
type_outcast

@type_outcast Кстати, все в порядке, чтобы опубликовать собственное решение в качестве ответа :)
Digital Trauma

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

6

С ++ 11, 193 191 190 176 172 байта

Мое первое решение на Codegolf когда-либо, так что не вините меня.

#include<iostream>
int n,j,i=65536;int main(){std::cin>>n;for(;j<9;){for(int k:{0,0,0,0})if(j%2)printf("| %s",n&(i/=2)?"# ":"  ");else printf("+---");puts(j++%2?"|":"+");}}

Ungolfed

#include <iostream>
int n, i = 65536, j;

int main()
{
    std::cin >> n;

    for (; j < 9;)
    {
        for(int k:{0,0,0,0})
        {
            if (j % 2)
            {
                printf("| %s", n & (i /= 2) ? "# " : "  ");
            }
            else
            {
                printf("+---");
            }
        }
        puts(j++ % 2 ? "|" : "+");
    }
}

Предыдущая версия

#include <iostream>
using namespace std;

int n, i = 65536, j;
int main()
{
    cin >> n;

    for (; j < 9;)
    {
        for(int k:{0,0,0,0})
        {
            if (j % 2)
            {
                cout << "| " << (n & (i /= 2) ? "# " : "  ");
            }
            else
            {
                cout << "+---";
            }
        }
        cout << (j++ % 2 ? "|\n" : "+\n");
    }
}

Подсказка: 0x10000 - 65536, с префиксом «0x», шестнадцатеричный код всегда длиннее десятичного
edc65

Подсказка 2: вы должны избегать using namespace stdв производственном коде. И это тоже не полезно здесь.
edc65

@ edc65 dec-> hex хорошая идея, я всегда думал о том, что hex имеет более короткое представление, но забудьте о 0x. using namespace stdэкономит несколько байтов, потому что я не должен префикс coutи cinс std::. Даже используя просто не using std::cout;поможет.
Зерег

Привет Зерегес. Вы можете удалить пробел между include и библиотекой .. и удалить тип возврата для основной функции.
wendelbsilva

C++не поддерживает auto int.
Зерег

6

Pyth, 37 байт

Jj*3\-*5\+JVc4_m@" #".>Qd16jd.i*5\|NJ

Попробуйте онлайн: демонстрация или тестовый набор

Объяснение:

Jj*3\-*5\+J
  *3\-                       the string "---"
      *5\+                   the string "+++++"
 j                           join second by first string: 
                                "+---+---+---+---+"
J                            save in J
          J                  print J

Vc4_m@" #".>Qd16jd.i*5\|NJ
    m         16             map each d in [0, 1, ..., 15] to:
          .>Qd                 input number Q shifted to the right by d
     @" #"                     and take the ^th char in " #" (modulo 2)
   _                         reverse this list of chars
 c4                          split into 4 groups
V                            for each group N in ^:
                    *5\|       the string "|||||"
                  .i    N      interleave ^ with N
                jd             join chars with spaces and print
                         J     print J

5

CJam, 43 41 байт

'+5*'-3**N+ri2bG0e[4/{" #"f='|5*.\S*N2$}/

Определенно гольф, но это начало, я думаю. Создает верхнюю строку, затем для каждых 4 битов создает четную строку и копирует предыдущую нечетную строку.

Попробуйте онлайн .


4

Питон 2, 122 121 120 байт

n=bin(4**8+input())[3:]
i=0
exec"print'| %s |'%' | '.join(' #'[x>'0']for x in n[:4])*i or'+---'*4+'+';n=n[4*i:];i^=1;"*9

-1 байт благодаря изящному 4**8+трюку @ xnor . Основная печать выполняется зацикливанием 9 раз, выбирая соответствующую строку для нечетного / четного.


Я думаю, что это bin(4**8+input())[3:]экономит байтformat
xnor

@xnor О, это здорово :)
Sp3000 19.09.15

4

Python 2, 94

n=input()
s=();exec"s=(' #'[n%2],)+s;n/=2;"*16
a='+---'*4+'+\n'
print(a+'| %s '*4+'|\n')*4%s+a

Идея состоит в том, чтобы взять образец

+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+

за исключением случаев, когда %sвместо заготовок выполняется замена кортежей. Кортеж выглядит так

('#', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#')

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

%tuple(' #'[c>'0']for c in bin(input()+4**8)[3:])

Спасибо Sp3000 за 2 байта.


4

PowerShell, 203 188 182 байта

param($a)$l="+---+---+---+---+";$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');@(1..16|%{if($b[$_-1]-eq'1'){"| # "}else{"|   "};if($_%4-eq0){"|`n$l`n"}})-join''

Редактировать - сохранил 15 байт, изменив порядок |прорисовки, поэтому мы можем .TrimEnd("|")вывести на выход дамп и вместо этого преобразовать цикл for в блок подкода, который создает массив

Edit2 - сохранил еще 6 байтов, избавив от необходимости сохранять в $oпеременную и просто выводить с-join'' напрямую.

Ooooooooof.

Рисовать в PowerShell сложно . Работать с двоичными цифрами в PowerShell сложно .

Использует встроенные модули для [convert] входного целого числа в строковом представлении в двоичном формате, а затем снова возвращает значение в, [int64]чтобы мы могли повторно вызвать его .ToString(), чтобы добавить / дополнить соответствующее число нулей. (Обратите внимание, что создание массива строк и присоединение к ним @(,"0"*16)-join''на 1 символ короче, чем буквенная строка "0000000000000000")

Затем возьмите простой цикл for, 1..16|%{...}проверяющий каждую цифру, чтобы создать наш выходной массив, а затем, наконец -join'', снова вместе.


Предыдущая, 188

param($a)$l="+---+---+---+---+";$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');$o=@(1..16|%{if($b[$_-1]-eq'1'){"| # "}else{"|   "};if($_%4-eq0){"|`n$l`n"}});$o-join''

Предыдущий, 203

param($a)$l="+---+---+---+---+`n|";$o=$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');1..16|%{if($b[$_-1]-eq'1'){$o+=" # |"}else{$o+="   |"};if($_%4-eq0){$o+="`n$l"}};$o.TrimEnd('|')

1
Я надеюсь, что это было "весело тяжело". :-) +1 за ваше объяснение; это помогло моему ограниченному пониманию PowerShell.
type_outcast

3

Javascript (ES6), 216 207 байт

Определяет анонимную функцию.

i=>(","+("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4<1?"| "+a.slice(l,l+4).map(v=>v?"#":" ").join` | `+" |":"").filter(v=>!!v).join`,`+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)

Спасибо ETHproductions за советы!


Хорошо сделано! Поскольку вы используете ES6, вот несколько советов: 1. В любое время, когда вам нужно использовать строку в качестве единственного параметра функции, вы можете использовать строку шаблона, например так: .join` | `​2. Вы также можете использовать строки шаблона для интерполяции значений: i=>`,${"0".repeat....join`,`},`.replace...3 Вы можете найти больше советов ES6 в этой теме .
ETHproductions

Кажется, это перестало работать, но играя в гольф немного больше, я могу получить 197 с правильным результатом:i=>`,${("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4?"":"| "+a.slice(l,l+4).map(v=>' #'[v]).join` | `+" |").filter(v=>v).join`,`},`.replace(/,/g,`<line break>+---+---+---+---+<line break>`).slice(1)
ETHproductions

2
("0".repeat(16)+i.toString(2)).slice(-16) ->(65536|i).toString(2).slice(1)
edc65

Сохраняя вашу точную логику, это может быть гольф до 169, см. Jsfiddle.net/76fp7aw6
edc65


2

Pyth, 50 байтов

j.i*5]<3*5"+---"ms.i*5\|dc4mj@" #"qd\1*2\ .[Z16.BQ

Пояснения придется подождать, пока в другой раз я выложу это на свой телефон!


2

Руби, 102

n=gets.to_i
print j="+---"*4+"+
" 
19.downto(0){|i|print i%5>0?"| #{((n>>i*4/5)%2*3+32).chr} ":"|
"+j}

Алгоритм

Распечатать горизонтальный разделитель

Цикл 20 раз (19..0)

Если номер цикла не делится на 5, преобразовать его в число в диапазоне 16..0, умножив на 4/5. Выведите пробел (ascii 32) или #(ascii 32 + 3 = 35), перед которым стоит| которым стоит пробел.

Если номер цикла делится на 5, выведите завершающий |, символ новой строки и горизонтальный разделитель, идентичный первому.


2

Perl, 103 байта

$_=(($l='+---'x4 .'+
').'| x 'x4 .'|
')x4 .$l;@n=(sprintf'%016b',<>)=~/./g;s/x/$n[$x++]?'#':$"/eg;print

Много строки повторения , чтобы сделать сетку xс, преобразовать входные данные в двоичные , а затем s///в xсек до #или $"( ) в зависимости от флага в указанной позиции ( $x).


2

PHP, 159 байт

bingrid16.php:

<?$r=10;while(--$r){if($r%2){echo str_repeat('+---',4).'+';}else{$c=9;echo'|';while(--$c){echo' '.($c%2?'|':($argv[1]&pow(2,$r*2+$c/2-5)?'#':' '));}}echo"\n";}

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

php bingrid16.php 4242

Ничего особенного, только грубый форсированный рендеринг.

Я попробовал другой угол, используя массивы вместо петель, но он был длиннее - 224 байта:

<?=implode(array_map(function($r)use($argv){return($r%2?str_repeat('+---',4).'+':'|'.implode(array_map(function($c)use($r,$argv){return' '.($c%2?'|':($argv[1]&pow(2,$r*2+$c/2-5)?'#':' '));},range(8,1))))."\n";},range(9,1)));

2

Perl 5 , 85 84 байта

84 83 байта кода +-p флаг

-1 байт после того, как Дом напомнил мне использовать новую строку

say$\='+'."---+"x4,"
| ",map y/01/ #/r.' | ',/./g for(sprintf"%016b",$_)=~/..../g}{

Попробуйте онлайн!


Хороший, намного лучший подход, чем мой! Буквальный перевод строки также сэкономит вам лишний байт $/!
Дом Гастингс

1

c99 263 байта

golfed:

main(int argc,char **argv){short i=atoi(argv[argc-1]);char *t="| # ", *f="|   ",*a[16],**p=a,*b="+---+---+---+---+\r\n";while(p<a+16){if((i|0x8000)==i)(*(p++))=t;else(*(p++))=f;i<<=1;}for(p=a;p<a+16;p+=4)printf("%s%s%s%s%s|\n",b,*p,p[1],p[2],p[3]);printf("%s",b);}

ungolfed:

main(int argc, char **argv)
{
    short i=atoi(argv[argc -1]);
    char *t ="| # ", *f="|   ",*a[16],**p=a,*b="+---+---+---+---+\r\n";

    while (p<a+16)
    {
        if((i|32768)==i)
            (*(p++))=t;
        else
            (*(p++))=f;

        i<<=1;
    }

    for (p=a;p<a+16;p+=4)
        printf("%s%s%s%s%s|\n",b,*p,p[1],p[2],p[3]);
    printf("%s",b);
}

Мне просто нравилось представлять немного изменчивый вариант, и я чувствовал, что это первый раз, когда он уместен (даже если он стоит мне несколько байтов, но C не может выполнить этот вызов в байтах, даже если есть шанс, поэтому мне все равно) использовать argc / ARGV


1

Руби, 95

Кивок Mhmd для краткого преобразования строк, но я хотел попробовать использовать строковые методы вместо числовых.

->i{puts g='+---'*4+?+;("%016b"%i).scan(/.{4}/){puts$&.gsub(/./){"| #{$&<?1?' ':?#} "}+"|
"+g}}

1

Руби, 93

Немного более короткая версия, использующая только числовые операции.

->i{n=g='+---'*4+"+
";15.downto(0){|m|n+="| #{[' ',?#][1&i>>m]} "
n+="|
"+g if m%4<1}
puts n}

1

C # 227 байт

Golfed:

class B{public static string G(short v){string s="",b=System.Convert.ToString(v,2).PadLeft(16,'0');for(int i=9;i>0;){s+=i--%2!=0?"+---+---+---+---+\n":"| "+b[i*2+1]+" | "+b[i*2]+" | "+b[i*2-1]+" | "+b[i*2-2]+" |\n";}return s;}}

Абзац:

class B
{
    public static string G(short v)
    {
        string s="",b=System.Convert.ToString(v, 2).PadLeft(16,'0');
        for(int i=9;i>0;)
            s+=i--%2!=0?"+---+---+---+---+\n":"| "+b[i*2+1]+" | "+b[i*2]+" | "+b[i*2-1]+" | "+b[i*2-2]+" |\n";
        return s;
    }
}

В первый раз я пытаюсь что-то вроде этого, советы будут приветствоваться!


Во-первых, я считаю 286 байт, и вы можете удалить пробелы.
Голубой

Как именно вы это считаете? Я пошел в свойствах, чтобы увидеть размер файла там, но я не уверен, что это способ сделать это! Без отступа я опустился до 230 байтов!
антонимитмеры

Используйте что-то вроде mothereff.in/byte-counter или, если вы используете Linux, используйте wcкоманду
Blue

1

Питон 3, 145 144 байта

В линию:

a="|";b="+"+"---+"*4+"\n";r=0,1,2,3;(lambda x:print(b+b.join(a+a.join(" %s "%'# '[x&2**(i+j*4)<1]for i in r)+a+"\n"for j in r)+b))(int(input()))

С символами новой строки:

a="|"
b="+"+"---+"*4+"\n"
r=0,1,2,3
lambda x:print(b+b.join(a+a.join(" %s "%'# '[x&2**(i+j*4)<1]for i in r)+a+"\n"for j in r)+b)
x(int(input()))

Изменить: Танки @manatwork для сохранения 1 байта


1
На основе gnibbler «с наконечником , жесткое кодирование r=0,1,2,31 символ короче , чем генерации его r=range(4).
manatwork

0

Котлин , 192 байта

{val v=it.toString(2).padStart(16,'0')
fun p(){(0..3).map{print("+---")}
println("+")}
(0..3).map{p()
v.subSequence(it*4,(it+1)*4).map{print("| ${if(it>'0')'#' else ' '} ")}
println("|")}
p()}

украшенный

{
    val v = it.toString(2).padStart(16, '0')
    fun p() {
        (0..3).map { print("+---") }
        println("+")
    }
    (0..3).map {
        p()
        v.subSequence(it *4, (it +1) *4).map {print("| ${if (it > '0') '#' else ' '} ")}
        println("|")
    }
    p()
}

Тест

var b:(Int) -> Unit =
{val v=it.toString(2).padStart(16,'0')
fun p(){(0..3).map{print("+---")}
println("+")}
(0..3).map{p()
v.subSequence(it*4,(it+1)*4).map{print("| ${if(it>'0')'#' else ' '} ")}
println("|")}
p()}

fun main(args: Array<String>) {
    b(255)
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.