Создать бинарную стену


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 ]

* **
* * 
*  *
*   

Это код гольф, поэтому выигрывает самый короткий код!


Может ли вывод быть массивом строк или двумерным массивом символов?
овс

@ovs Извините, я сказал, что да, вы можете вывести массив или 2d массив и т. д. Любой разумный формат.
TheLethalCoder

В случае двумерного массива, можем ли мы использовать числа для кубиков вместо символов? например[[1, " ", 1, " "], ...]
Arnauld

@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*или что-то ...
Эрик Outgolfer

@EriktheOutgolfer Я мог бы выбрать любой другой номер, но мне нужны эти три байта, я думаю.
Луис Мендо

Что если есть встроенный 1-байтовый 100или какой-то другой номер?
Эрик Outgolfer



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

  • Изменен тип возвращаемого значения в список строк, потому что это было разрешено OP.

  • Исправлена ​​еще одна ошибка с использованием rjust()и переключением обратно bin(), определена и исправлена ​​@Rod.


5

JavaScript (ES6), 81 79 байт

Сохранено 2 байта с использованием цифр вместо символов для кирпичей, как это предложил Рик Хичкок

Возвращает 2D массив с 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 спасибо :)
Даниеро

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 (Dyalog) , 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

@ Adám Спасибо за советы, я не знал, что смогу удалить ¨.
Критиси Литос

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для кирпича кусок, предполагает, что вход приходит из таблицы@

Ungolfed, с некоторым объяснением

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

Mathematica, 40 байт

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

Кирпичи 1с

Mathematica, 48 байтов

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

Кирпичи #


Вам нужно только один слеш в //.. ( /.означает «заменить один раз», //.означает «продолжайте делать замену, пока вещь не перестанет меняться».)
Не дерево

ok-fixed-спасибо
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

Попробуйте онлайн! Объяснение:

.+
$*#<

Преобразовать в одинарный и суффикс a <.

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

Преобразовать в двоичный файл

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

Как только все <s достигли влево, удалите их все.

m`^<
 <

Вставьте пробел перед любым <s, которые уже достигли слева.

(.)<
<$1

Переместить все <влево на один шаг. Промыть и повторить.


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

PHP, 84 байта

while(++$i<$argc)echo strtr(sprintf("\n%".-~log(max($argv),2).b,$argv[$i]),10,"* ");

К счастью, битовая операция logприводит результат к int. поплавок не будет работать здесь.

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


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 '*'

Вы можете отбросить последние 3 символа, чтобы просто вернуть массив строк, и использовать -Rфлаг (не добавленный к счетчику байтов), чтобы увидеть выход с присоединением новой строки: здесь .
Джастин Маринер

2

Python 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 '.
Мистер Кскодер

@ Mr.Xcoder Ах, интересно, никогда бы не подумал об этом. Благодарность!
Гравитон

2

Japt , 11 байт

m¤z3 z ·r0S

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

объяснение

m¤z3 z ·r0S  Implicit input of array
m¤           Map the array to binary strings
  z3 z       Rotate right 270° and then right 90°. This adds left padding to each string
       ·r0S  Join with newlines and replace 0s with spaces

Хороший подвиг с z3 z. Не уверен, почему y yтам не работает, я посмотрю это позже ...
ETHproductions

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

Ungolfed:

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

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

Спасибо! Не могли бы вы объяснить, что такое «Отправить инкремент i на b [i], чтобы сохранить байт». средства?
Ява Гонсар

i++оценивает, а iзатем увеличивает его (тогда как ++iделает наоборот), так что вы можете переместить i++выход из forцикла и использовать b[i++]вместо этого. Да, и пока мы на нем, у вас есть только одна линия внутри петли, поэтому скобки не нужны.
TheLethalCoder

Правда! Удивительно, спасибо
Ява Гонсар

2
Вы можете сохранить несколько байтов, переключив ваш цикл на цикл foreach. for(int x:i)Кроме того, вы можете использовать Long.toBinaryStringвместо целочисленной версии, чтобы сохранить 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

Установить NumPy

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

Golfed

Функция анонимного непосредственного окна 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

Ungolfed

Полная Subпроцедура, которая принимает ввод формата Array(1, 2, 3...)и выводит соответствующую двоичную стенку в окно VBE Immediate через диапазон[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ι«←§ *ι≧÷²ι

Попробуйте онлайн! Ссылка на подробную версию кода. Работает путем ручного преобразования каждого входного числа в двоичное, но распечатывает его в порядке справа налево. Я воспринимаю ввод как строку, оканчивающуюся новой строкой, так как Charcoal не имеет хорошего способа ввода списков, иначе я бы написал что-то вроде этого, которое, к сожалению, в настоящее время занимает 21 байт:

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

Попробуйте онлайн! Ссылка на подробную версию кода. Эта версия векторизируется над входным массивом, хотя его выходные данные жестко закодированы в -s, что сохраняет байт.

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