16-бітна двійкова сітка


29

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

Приклади

Вхід: 4242

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

Вхід: 33825

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

Конкретні вимоги

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

  2. Формат вихідної таблиці повинен точно відповідати . Це означає, що ви повинні використовувати конкретні символи ASCII ( -, +та |) для ліній сітки таблиці, як показано, інтер'єр кожної комірки - 3 символи, а справжні біти представлені символом, #а false - представленим пробілом ( ).

  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 дозволяють запитувати та встановлювати символи для малювання значень у коробці відповідно.)


Ви (чи хтось інший) знаєте, чи існує консенсус у команді малювання коробки для забивання гольфу? Я особисто думаю, що припущення з кодом гольфу полягає в тому, що рішення працюють на більшості систем, на яких працює мова рішення, правда? Як виглядає таке рішення, яке виводить правильні поля на всі (або майже всі) J-установки? Мені дуже подобається ваше рішення, до речі! Мій мозок все ще працює на своєму шляху, що саме мені подобається в коді гольфу.
type_outcast

5
@type_outcast Нам не потрібна портативність для проблем із кодом для гольфу. Поки вона працює з деякою реалізацією на одній платформі, вона дійсна.
Денніс

Дякуємо за відповідь @Dennis. Я щасливий, що моя презумпція була помилковою, тому що мені (досі) дуже подобається рішення Мавриса! :-)
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? ;-)
Digital Trauma

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))

Безголовки:

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

Пітон 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
перейти

Без проблем! Я фактично працював над дуже подібним рішенням.
Morgan Thrapp

@downvoter Хочете пояснити?
Zach Gates

Оскільки ви не використовуєте 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
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

Як варіант:

Чистий 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 BTW прекрасно опублікував своє рішення як відповідь :)
Digital Trauma

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

6

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

Моє перше рішення про кодегольф колись, тому не звинувачуйте мене.

#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?"|":"+");}}

Безумовно

#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;звичайну допомогу.
Зереги

Гей Зереги. Ви можете видалити простір між включати та бібліотекою .. та видалити тип повернення для основної функції.
wendelbsilva

C++не підтримує автоматичний вклад.
Зереги

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

Python 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 байт завдяки акуратному @ xnor 4**8+ трюку . Основний друк робиться циклом 9 разів, вибираючи відповідний рядок для непарного / парного.


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

@xnor О, це акуратно :)
Sp3000

4

Пітон 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" )

Потім візьміть просту 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 байт

гольф:

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);}

неозорений:

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 / аргв


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 байт

Гольф:

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).
манатура

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.