Створіть бінарну стінку


33

Дано масив додатних цілих чисел у базі 10, де n > 0виводять їх подання бінарної стінки.

Як це працює?

  1. Перетворіть кожне число у його двійкове подання.
  2. Прокладіть подання з ведучими нулями до довжини найдовшої, тобто 1, 2-> 1, 10-> 01, 10.
  3. Створіть стіну, де 1s - цегла, а 0s відсутні цегли.

Стіна - це блок символів, де будь-який символ для друку являє собою цеглу, а пробіл ( 32) - це відсутня цегла. Ви можете вибрати будь-який символ для цегли, він не повинен бути виразним по всій стіні, якщо це не білий пробіл. Зниклий символ цегли повинен бути пробілом. Для наведеного нижче прикладу я використовував *цеглу.

Приклад

Вхід:

[ 15, 7, 13, 11 ]
  1. [ 1111, 111, 1101, 1011 ]
  2. [ 1111, 0111, 1101, 1011 ]
  3. Вихід:

    ****
     ***
    ** *
    * **
    

Правила

  • Вхід повинен бути зроблений у базі 10, якщо ваша мова приймає інші основи, ви можете не використовувати їх.
  • Дозволені провідні та слідові нові лінії.
  • Введення може сприйматися як список цілих чисел, окремих аргументів або будь-якого розумного формату.
  • Вихід може бути у будь-якому розумному форматі: новий рядок, розділений рядком, масив рядків, 2d масив тощо.
  • Стандартні лазівки заборонені.

Випробування

Зауважте, що в першому тестовому випадку всі шари мають порожню цеглу на кінці.

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

****
* **
****
****

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

Це код гольфу, тому найкоротший виграш коду!


Чи може висновок бути масивом ліній або 2d масивом символів?
ов

@ovs Вибачте, я подумав, що я вказав, так, ви можете вивести масив або 2d масив тощо. Будь-який розумний формат.
TheLethalCoder

У випадку двовимірного масиву чи можемо ми використовувати цифри для цеглин замість символів? наприклад[[1, " ", 1, " "], ...]
Арнольд

@Arnauld Так, це здається прекрасним.
TheLethalCoder

1
@Giuseppe Лише нові рядки, інакше вони будуть плутати порожні цегли.
TheLethalCoder

Відповіді:


13

MATL , 5 байт

B42*c

Спробуйте в Інтернеті!

Пояснення

B     % Implicitly input an array of numbers. Convert to binary. 
      % Gives a matrix with each row corresponding to a number
42    % Push 42 (ASCII code of '*')
*     % Multiply
c     % Convert to char. Char 0 is displayed as space. Implicitly display

Ви можете вибрати будь-який символ для цегли, він не повинен бути виразним по всій стіні, якщо це не білий пробіл. так, це означає, що вам, мабуть, не потрібно 42*чи щось ...
Erik the Outgolfer

@EriktheOutgolfer Я міг вибрати будь-яке інше число, але мені потрібні ті три байти, як я думаю.
Луїс Мендо

Що робити, якщо є вбудований 1-байт для 100чи якогось іншого числа?
Ерік Аутгольфер



8

Октава, 22 байти

@(x)[dec2bin(x)-16,'']

Спробуйте в Інтернеті

Пояснення:

Збережено кілька байт завдяки Луїсу Мендо! Крім того, я не помітив, що можу вибрати, з якого персонажа будувати стіну, не тільки *.

@(x)                    % Take the input as a column vector
    dec2bin(x)          % Convert each row of the input to a string with 1 and 0
                        % It gets automatically padded with zeros, to fit the longest number
    dec2bin(x)-16       % Subtract 16, to get from the ASCII-values of 1/0 (48/49)
                        % to 32/33 (space and !)
@(x)[dec2bin(x)-16,'']  % Concatenate with the empty string to convert it to a string.

Або з de2bi:

Пояснення:

@(x)                          % Take the input as a column vector
               de2bi(x)       % Convert each row of the input to a binary number.
                              % Gets automatically padded to fit the longest number
            42*de2bi(x)       % Multiply the matrix by 42, which is the ASCII-value for *
           [42*de2bi(x),'']   % Concatenate the matrix with the empty string to convert
                              % it to a string. 0 are automatically displayed as spaces
@(x)fliplr([42*de2bi(x),''])

Наступні роботи над TIO, на 7 байт більше:

@(x)fliplr([42*(dec2bin(x)>48),''])

Спробуйте тут


5

Python 3 , 88 84 71 74 72 байт

Лямбда, яка повертає список рядків, що представляють кожен рядок.

lambda n:[bin(x)[2:].replace(*'0 ').rjust(len(bin(max(n)))-2)for x in n]

Спробуйте в Інтернеті! (посилання на версію, розділену новим рядком)

Пояснення

  • lambda n:- Створює (анонімне) лямбда з параметром n. Повертається неявно.

  • [...] - Створює розуміння списку.

  • bin(x)[2:] - Отримує двійкові представлення чисел.

  • .replace(*'0 ')- Замінює всі випадки 0з пробілом.

  • .rjust(len(bin(max(n)))-2) - Розставляє двійкові представлення по довжині найдовшої.

  • for x in n- взаємодіє через nзмінну x.


Журнал змін

  • - 1 - 3 байти завдяки @Rod, -(...)+2= 2-(...), використаннюrjust()

  • bin()Замість цього додана версія , яка була недійсною, оскільки вона не працювала для 1та 2.

  • Виправлено помилку вище, використовуючи format().

  • Змінено тип повернення до списку рядків, оскільки це дозволило ОП.

  • Виправлена ​​ще одна помилка за допомогою @Rod rjust()і повернення до неї bin(), її виявлення та виправлення.


5

JavaScript (ES6), 81 79 байт

Збережено 2 байти, використовуючи цифри замість символів для цеглин, як це запропонував Рік Хічкок

Повертає двовимірний масив із значеннями 1 для цегли.

f=(a,b=[],x=1)=>a.every(n=>n<x)?a.map(n=>b.map(i=>n&i?1:' ')):f(a,[x,...b],x*2)

Тестові справи




4

Рубі, 63 59 байт

-4 байти за допомогою Алексіса Андерсена

->*n{puts n.map{|i|("%#{('%b'%n.max).size}b"%i).tr'0',' '}}

Спробуйте в Інтернеті!


1
вам не потрібно 0 в рядковому форматі. Ви можете голитися байт, замінюючи n.max.to_s(2).sizeз , ('%b'%n.max).sizeі ви на самому справі не потрібно , щоб замінити 1з*
Алексіс Андерсен

@AlexisAndersen дякую :)
daniero

4

R , 87 88 байт

Стінові блоки представлені 8, тому що, дуже багато восьми.

write(ifelse((I=sapply(scan(),intToBits))[(M=max(which(I>0,T)[,1])):1,],8,' '),1,M,,'')

Спробуйте в Інтернеті!

Цілочисельний список введення перетворюється на масив бітів, які обрізані з 0 бітів і зворотні.

Потім зменшений масив виводиться за допомогою writeта шириною стовпця, яка визначалася під час обрізки масиву.

ifelse() є єдиним варіантом IF, який, на жаль, працює на векторах.


@Vlo вказав, що ви можете використовувати, 1а не ""для вихідного файлу в write.
Джузеппе

@Giuseppe дякую за підказку
MickyT


3

APL (Діалог) , 30 22 20 14 байт

Збережено 6 байт завдяки @ Adám

' *'[⍉2⊥⍣¯1⊢⎕]

Спробуйте в Інтернеті!

(передбачається ⎕IO←0, що це за замовчуванням для багатьох машин)

Це приймає введення як масив і повертає матрицю з *s і s.

Пояснення

2⊥⍣¯1⊢⎕       Convert input to binary (returns a transposed matrix of 1s and 0s)
              Transpose
' *'[ ... ]    Index into this string

Збережіть 6 байт за допомогою' *'[⍉2⊥⍣¯1⊢⎕]
Адама

@ Adám Спасибі за підказки, я не знав, що можу видалити ¨.
Kritixi Lithos

3

T-SQL, 290 байт

declare @ int;select @=max(log(a,2))+1from @i;with t as(select convert(varchar(max),a%2)b,a/2c,@-1m,ROW_NUMBER()over(order by(select 1))r from @i union all select convert(varchar(max),concat(c%2,b))b,c/2c,m-1,r from t where m>0)select replace(b,0,' ')from t where m=0group by r,b order by r

Використання 1для шматка цегли, припускаючи, що вхід надходить з таблиці@

Безумовно, з деякими поясненнями

-- assume input is presented in an input table
declare @input table (a int)
insert into @input values (15), (7), (13), (11)

---- start here

-- figure out how many characters are needed, by taking log2
declare @max int
select @max = max(log(a, 2)) + 1
from @input

-- recursive cte
-- will join against itself, recursively finding each digit in the binary string
;with cte as
(
    select 
        convert(varchar(max), a % 2) as b, -- is the least significant bit 1 or 0
        a / 2 as c, -- remove least significant bit, for the next run
        @max - 1 as max, -- keep track of iterations left
        ROW_NUMBER() over (order by (select 1)) as rn -- keep the order of the input
    from @input

    union all -- recursive loop
              -- below columns follow the same pattern

    select convert(varchar(max), 
        concat(cte.c % 2, cte.b)) as b, -- prepend the current binary string with the newest least significant bit
        cte.c / 2 as c, 
        cte.max - 1, 
        cte.rn
    from cte
    where cte.max > 0
)
select replace(b, 0, ' ') -- swap 0s for space
from cte
where max = 0 -- only take the last iteration
group by rn, b -- grab each unique input, 
               -- need to group by row number so it can be ordered by
               -- need to group by binary string, so it can be selected
order by rn -- sort by the order the input arrived in

3

Математика, 40 байт

Grid@PadLeft@IntegerDigits[#,2]/. 0->""&

Цеглини - 1с

Математика, 48 байт

Grid@PadLeft@IntegerDigits[#,2]/.{0->"",1->"#"}& 

Цеглини #


Вам знадобиться лише одна коса коса риса //.. ( /.означає "замінити один раз", //.означає "продовжуйте робити заміну, поки річ не перестане змінюватися".)
Не дерево

ок-виправлено-дякую
J42161217

Вам не потрібно місця після коми після функції IntegerDigits.
Марк С.

так, я знаю, це відбувається, коли ви копіюєте / вставляєте з notebook.fixed
J42161217

2

C # (.NET Core) , 112 + 18 = 130 86 + 41 = 127 байт

a=>a.Select(n=>C.ToString(n,2).Replace("0"," ").PadLeft(C.ToString(a.Max(),2).Length))

Спробуйте в Інтернеті!

Кількість байтів включає 41 байт від using System.Linq;using C=System.Convert;. Використовується 1як символ для стіни. Тим не менш, це занадто довго навіть для C # ...


Помістіть місце, namespace System.Linq{}щоб зберегти кілька байт. Чи a.Max()гарантовано це правда (я впевнений, що це я просто не найрозумніший з бінарним: P)? Врятували б class Convert{}будь-які байти?
TheLethalCoder

1
Якщо я розміщую програму в заданому просторі імен, чи не повинен я подавати всю програму замість просто лямбда? Я не впевнений у правилах цього ...
Чарлі

Я зазвичай просто розміщуюсь у просторі імен з лямбда. Я не думаю, що про це ніколи не виникало питань, і це на сторінці підказок C #.
TheLethalCoder

Я не думаю, що це дійсно, тому що ви не можете його скласти без використання статичного імпорту.
MetaColon

2
@MetaColon саме тому я додав байти using System.Linq;using C=System.Convert;до підрахунку байтів, оскільки ці дві usingдирективи потрібні для компіляції коду.
Чарлі

2

Сітківка , 63 байти

.+
$*#<
+`(#+)\1
$1 
 #
#
{T`<`_`^(<.+(¶|$))+$
m`^<
 <
(.)<
<$1

Спробуйте в Інтернеті! Пояснення:

.+
$*#<

Перетворити в одинарний і суфікс а <.

+`(#+)\1
$1 
 #
#

Перетворити на бінарне.

{T`<`_`^(<.+(¶|$))+$

Як тільки всі <s дістаються зліва, видаліть їх усіх.

m`^<
 <

Вставте пробіл перед <s, який уже досяг ліворуч.

(.)<
<$1

Перемістіть усі <s вліво на один крок. Промийте і повторіть.


2

PowerShell , 100 байт

$args|%{if(($c=($a=[convert]::ToString($_,2)).length)-gt$l){$l=$c}$a-replace0,' '}|%{$_.padleft($l)}

Спробуйте в Інтернеті!

Тьфу, convertбіна в PowerShell настільки болісна. Плюс .lengthу виклики на з пробілами, плюс довгий виклику , щоб зробити їх все-таки , все складає в протягом довгого уявлення.-replace0.padLeft().length

Пропозиції з гольфу, щоб потрапити нижче 100, вітаються.



2

Clojure, 185 байт

(fn[i](let[b(map #(Long/toBinaryString %)i)](map #(clojure.string/replace(clojure.string/replace(format(str"%0"(reduce(fn[l i](max l(count i)))0 b)"d")(read-string %))"1""#")"0"" ")b)))

Безгольова версія:

(fn [i]
    (let [b (map #(Long/toBinaryString %) i)]
        (map
            #(clojure.string/replace
                (clojure.string/replace
                    (format
                        (str "%0"
                            (reduce
                                (fn [l i] (max l(count i))) 0 b)
                            "d")
                        (read-string %))
                        "1"
                        "#")
                "0"
                " ")
        b)))

Анонімна функція, яка приймає аргумент як список. Повертає рядки як список.

Читаючи інші відповіді, я думаю, що це може бути менше. clojure.string/replaceзаймає нецензурну кількість символів для написання ..


2

Japt , 33 30 байт

¡'0p(¡X¤lÃn o)-X¤l)+X¤)£" *"gX

Спробуйте в Інтернеті!

Збережено 3 байти завдяки @Justin Mariner

Пояснення

¡                              // map input integers
    (¡X¤lÃn o)                 // longest binary string length
              -X¤l)            // minus current binary string length
 '0p                           // repeat zero
                   +X¤)        // concat with current binary string
                       £       // map chars of binary string
                        " *"gX // swap 0 and 1 with ' ' and '*'

Ви можете скинути останні три символи, щоб просто повернути масив рядків, а також використати -Rпрапор (не доданий до кількості байтів), щоб побачити вихідний об'єднання нового рядка: тут .
Джастін Марінер

2

Пітон 3 , 92 90 байт

lambda a:[' '*(len(bin(max(a)))-len(i)-2)+i for i in[bin(i)[2:].replace(*'0 ')for i in a]]

Спробуйте в Інтернеті!

Повертає список рядків. Складання їх показує, що вони дійсно вирівнюються належним чином.

['111 ', ' 1  ', ' 11 ', '  1 ']
>>>
 111 
  1  
  11 
   1 

Розбивка

По суті перетворює масив у бінарний, а потім замінює всі 0 на пробіли. Nкількість пробілів додається до передньої частини кожного рядка, де N = [length of longest line] - [length of line].

-1 bytes Завдяки містеру Кседеру

Спробуйте в Інтернеті!


У виході не може бути проміжних чи кінцевих пробілів.
TheLethalCoder

@TheLethalCoder О, мабуть, неправильно прочитали правила! Дякуємо, що це зробили.
Гравітон

90 байт , замініть '0',' 'на *'0 '.
Містер Xcoder

@ Mr.Xcoder Ах цікаво, ніколи б про це не подумав. Спасибі!
Гравітон


2

Java 7, 130 108 88 байт

Збережено 22 завдяки @TheLethalCoder Збережено 20 завдяки @Xanderhall

void a(int[]b){for(int i:b)System.out.println(Long.toBinaryString(i).replace('0',' '));}

Безголівки:

void a(int[]b){
    for(int i:b)
        System.out.println(Long.toBinaryString(i).replace('0', ' '));       
}

1
Збільшення розміру iна, b[i]щоб зберегти байт. Ви можете тримати вихід з 1's, тому немає потреби в .replace('1','*'). Використовуйте Java 8 замість цього і компілюйте в лямбда, щоб зберегти байти. Якщо ви цього не хочете, це int[]bекономить байт.
TheLethalCoder

Дякую! Чи можете ви поясніть, що таке "Посилення в i [b], щоб зберегти байт." засоби?
Java Gonzar

i++Оцінює, iпотім збільшує його (тоді як ++iробить навпаки), щоб ви могли перемістити i++вихід із forциклу та використовувати b[i++]натомість. О, і поки ми в цьому, у вас є лише одна лінія у вашій петлі, тому дужки не потрібні.
TheLethalCoder

Правда! Дивовижно, дякую
Java Gonzar

2
Ви можете зберегти кілька байт, переключивши цикл на цикл foreach. for(int x:i)Крім того, ви можете використовувати Long.toBinaryStringзамість версії Integer, щоб зберегти 3 байти.
Ксандерхолл

1

Python 2, 217 байт

Після 2 годин кодування я вирішив, що numpy - це погана ідея для цього

import numpy as n
i=n.loadtxt("i")
o=[n.copy(i)]
o[0].fill(10)
while n.count_nonzero(i)>0:
 o.append(i%2+32)
 i=n.vectorize(lambda x:x//2)(i)
print n.fliplr(n.array(o).T).astype('uint8').view('c').tostring().decode()

Використання в Ubuntu

Встановити нуме

python2 -m pip install numpy

Створіть файл, названий iіз введенням у форматі14 4 6 2

Біжи

python2 prog.py

1

8-е , 232 254 250 байт

Код

0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop

Безгольова версія з коментарями

\ convert to binary and save longest string length
: f 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop ;

\ pad binary number with zero
: f1 a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop ;

\ replace every 0 with space
: f2 a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ;

\ replace every 1 with * and print each line of bricks
: f3 ( nip /1/ "*" s:replace! . cr ) a:each drop ;

Ці слова потрібно викликати послідовно (див. Приклад)

Використання та приклади

ok> [15,7,13,11] 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop
****
 ***
** *
* **

Або більш чітко

ok> [15,11,15,15] f f1 f2 f3
****
* **
****
****


1

Excel VBA, 170 161 байт

Гольф

Анонімна функція негайного вікна VBE, яка приймає введення формату 1 2 3 .. nз діапазону [A1]і виводить відповідну бінарну стінку до негайного вікна VBE через діапазон[B1,C1,2:2]

n=Split([A1]):[A2].Resize(1,UBound(n)+1)=n:[C1]="=Int(1+Log(B1,2))":For Each i In n:[B1]=i:?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," "):Next

Відформатовано:

n=Split([A1])
[A2].Resize(1,UBound(n)+1)=n
[C1]="=Int(1+Log(B1,2))"
For Each i In n
[B1]=i
?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," ")
Next

Безумовно

Повна Subрутина, яка приймає введення формату Array(1, 2, 3...)і виводить відповідну бінарну стінку до негайного вікна VBE через діапазон[A1,B1,2:2]

Sub a(ByRef n As Variant)
    Let Range("A1").Resize(1,UBound(n)+1) = n
    Let Range("C1").Value = "=Int(1+Log(A1,2))"
    Dim i As Integer
    For Each i In n
        Let Range("A1").Value = i
        Debug.Print Replace(
                            Replace(
                                    [Right( Rept( 0, C1) & Dec2Bin( B1), C1)],
                                    1,
                                    "*"
                            ),
                            0,
                            " "
                    )
    Next
End Sub

1

Вугілля деревне , 20 байт

WS«⸿≔IιιWι«←§ *ι≧÷²ι

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Працює, вручну перетворюючи кожен вхідний номер у бінарний, але друкуючи його в правому вліво. Я приймаю введення як строку, що закінчується новим рядком, оскільки вугілля не має хорошого способу введення списків, інакше я б написав щось подібне, яке, на жаль, наразі займає 21 байт:

WS⊞υIιW⌈υ«Eυ﹪κ²↓⸿≧÷²υ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Ця версія векторизується над вхідним масивом, хоча його вихід жорстко кодується до -s, що зберігає байт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.