Utwórz ścianę binarną


33

Biorąc pod uwagę tablicę dodatnich liczb całkowitych w podstawie 10, gdzie n > 0wypisuje ich reprezentację ściany binarnej.

Jak to działa?

  1. Konwertuj każdą liczbę na reprezentację binarną.
  2. Wypełnij reprezentację zerami wiodącymi do długości najdłuższego, tj. 1, 2-> 1, 10-> 01, 10.
  3. Utwórz ścianę, w której 1s są cegłami, a 0s brakującymi cegłami.

Ściana to blok znaków, w którym dowolny znak do wydrukowania reprezentuje cegłę, a spacja ( 32) oznacza brakującą cegłę. Możesz wybrać dowolną postać dla klocka, nie musi ona być wyraźna na całej ścianie, o ile nie jest to biała postać. Brakująca postać z cegły musi być spacją. W poniższym przykładzie użyłem *cegieł.

Przykład

Wkład:

[ 15, 7, 13, 11 ]
  1. [ 1111, 111, 1101, 1011 ]
  2. [ 1111, 0111, 1101, 1011 ]
  3. Wydajność:

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

Zasady

  • Dane należy wprowadzić w bazie 10, jeśli twój język akceptuje inne bazy, nie możesz ich używać.
  • Wiodące i końcowe nowe linie są dozwolone.
  • Dane wejściowe można traktować jako listę liczb całkowitych, oddzielnych argumentów lub dowolnego rozsądnego formatu.
  • Dane wyjściowe mogą być w dowolnym rozsądnym formacie: nowy ciąg oddzielony od linii, tablica linii, tablica 2d itp.
  • Standardowe luki są niedozwolone.

Przypadki testowe

Zauważ, że w pierwszym przypadku testowym wszystkie warstwy mają pustą cegłę na końcu.

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

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

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

To jest golf golfowy, więc wygrywa najkrótszy kod!


Czy wyjściem może być tablica wierszy lub tablica 2d znaków?
ovs

@ovs Niestety, myślałem, że to określiłem, tak, możesz wyprowadzić tablicę lub tablicę 2d itp. Dowolny rozsądny format.
TheLethalCoder

Czy w przypadku tablicy 2D możemy używać liczb dla cegieł zamiast znaków? np.[[1, " ", 1, " "], ...]
Arnauld

@Arnauld Tak, to wydaje się w porządku.
TheLethalCoder

1
@Giuseppe Tylko nowe linie, w przeciwnym razie będą mylone z pustymi cegłami.
TheLethalCoder

Odpowiedzi:


13

MATL , 5 bajtów

B42*c

Wypróbuj online!

Wyjaśnienie

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

Możesz wybrać dowolną postać dla klocka, nie musi ona być wyraźna na całej ścianie, o ile nie jest to biała postać. tak, to znaczy, że prawdopodobnie nie potrzebujesz 42*lub coś ...
Erik Outgolfer

@EriktheOutgolfer Mógłbym wybrać inną liczbę, ale myślę, że potrzebuję tych trzech bajtów.
Luis Mendo

Co jeśli wbudowany jest 1-bajtowy kod 100lub jakaś inna liczba?
Erik the Outgolfer



8

Oktawa, 22 bajty

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

Wypróbuj online

Wyjaśnienie:

Zaoszczędziłem trochę bajtów dzięki Luisowi Mendo! Nie zauważyłem też, że mogę nie tylko wybrać, którą postacią zbudować ścianę *.

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

Lub z de2bi:

Wyjaśnienie:

@(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),''])

Następujące działa na TIO, dla 7 bajtów więcej:

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

Wypróbuj tutaj


5

Python 3 , 88 84 71 74 72 bajty

Lambda, która zwraca listę ciągów znaków reprezentujących każdą linię.

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

Wypróbuj online! (link do wersji oddzielonej nowym wierszem)

Wyjaśnienie

  • lambda n:- Tworzy (anonimową) lambda z parametrem n. Zwraca niejawnie.

  • [...] - Tworzy zrozumienie listy.

  • bin(x)[2:] - Pobiera binarne reprezentacje liczb.

  • .replace(*'0 ') - Zastępuje wszystkie wystąpienia 0 spacją.

  • .rjust(len(bin(max(n)))-2) - Wypełnia reprezentacje binarne do długości najdłuższej.

  • for x in n- Iteruje przez nzmienną x.


Dziennik zmian

  • - 1 - 3 bajty dzięki @Rod, -(...)+2= 2-(...), użycierjust()

  • Dodano wersję z bin(), która była nieprawidłowa, ponieważ nie działała dla 1i 2.

  • Naprawiono błąd powyżej przy użyciu format() .

  • Zmieniono typ powrotu na listę ciągów, ponieważ było to dozwolone przez PO.

  • Naprawiono kolejny błąd wykorzystujący rjust()i przełączający się z powrotem bin(), zauważony i naprawiony przez @Rod.


5

JavaScript (ES6), 81 79 bajtów

Zaoszczędzono 2 bajty, używając liczb zamiast znaków dla cegieł, zgodnie z sugestią Ricka Hitchcocka

Zwraca tablicę 2D z 1 dla cegieł.

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)

Przypadki testowe




4

Rubin, 63 59 bajtów

-4 bajty z pomocą Alexis Andersen

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

Wypróbuj online!


1
nie potrzebujesz 0 w formacie ciągu. można golić bajt zastępując n.max.to_s(2).sizeze ('%b'%n.max).sizea nie faktycznie trzeba wymienić 1z*
Alexis Andersen

@AlexisAndersen dzięki :)
daniero

4

R , 87 88 bajtów

Bloki ścienne reprezentowane przez 8 , ponieważ, wiele ósemek.

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

Wypróbuj online!

Wejściowa lista liczb całkowitych jest konwertowana na tablicę bitów, które są obcinane końcowymi 0 bitami i odwracane.

Zredukowana tablica jest następnie wyprowadzana za pomocą write i szerokości kolumny, która została określona, ​​gdy tablica została przycięta.

ifelse() jest jedyną opcją IF, która działa niestety na wektory.


@ Vlo wskazał, że możesz użyć 1zamiast ""pliku wyjściowego w write.
Giuseppe,

@Giuseppe dziękuje za wskazówkę
MickyT


3

APL (Dyalog) , 30 22 20 14 bajtów

Zaoszczędź 6 bajtów dzięki @ Adám

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

Wypróbuj online!

(zakłada ⎕IO←0 ponieważ jest to ustawienie domyślne na wielu komputerach)

Pobiera dane wejściowe jako tablicę i zwraca macierz za pomocą *s i s.

Wyjaśnienie

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

Zaoszczędź 6 bajtów z' *'[⍉2⊥⍣¯1⊢⎕]
Adám

@ Adám Dzięki za wskazówki, nie wiedziałem, że mogę je usunąć ¨.
Kritixi Lithos

3

T-SQL, 290 bajtów

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

Używa 1kawałka cegły, przy założeniu, że dane wejściowe pochodzą z tabeli@

Bez golfa, z pewnym wyjaśnieniem

-- 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 bajtów

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

Cegły to 1s

Mathematica, 48 bajtów

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

Cegły są #


Potrzebujesz tylko jednego ukośnika w //.. ( /.Środki „zastąpić jeden raz”, //.oznacza „dalej robić wymiany dopóki sprawa przestanie się zmieniać”).
Nie jest to drzewo

ok-naprawiono-dzięki
J42161217,

Nie potrzebujesz spacji po przecinku w funkcji IntegerDigits.
Mark S.,

tak, wiem, dzieje się tak, gdy kopiujesz / wklejasz z notebooka.
naprawiono

2

C # (.NET Core) , 112 + 18 = 130 86 + 41 = 127 bajtów

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

Wypróbuj online!

Liczba bajtów obejmuje 41 bajtów z using System.Linq;using C=System.Convert;. Używa 1jako znaku dla ściany. Niemniej jednak jest to zbyt długo, nawet dla C # ...


Umieść, namespace System.Linq{}aby zapisać niektóre bajty. Czy a.Max()na pewno jest to prawda (jestem pewien, że nie jestem najmądrzejszy z binarnym: P)? Zapisałby class Convert{}jakieś bajty?
TheLethalCoder

1
Jeśli umieszczam program w określonej przestrzeni nazw, czy nie powinienem przesyłać całego programu zamiast tylko lambda? Nie jestem pewien co do zasad ...
Charlie,

Zazwyczaj po prostu umieszczam w przestrzeni nazw z lambda. Nie sądzę, żeby kiedykolwiek było na to pytanie i jest na stronie porad C #.
TheLethalCoder

Nie sądzę, że jest to poprawne, ponieważ nie można go skompilować bez użycia importu statycznego.
MetaColon

2
@MetaColon to jest powód, dla którego dodałem bajty using System.Linq;using C=System.Convert;do liczby bajtów, ponieważ te dwie usingdyrektywy są potrzebne do skompilowania kodu.
Charlie,

2

Siatkówka , 63 bajty

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

Wypróbuj online! Wyjaśnienie:

.+
$*#<

Konwertuj na unary i sufiks a <.

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

Konwertuj na binarny.

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

Gdy wszystkie litery <s dotrą w lewo, usuń je wszystkie.

m`^<
 <

Wstaw spację przed dowolnymi <, które już osiągnęły lewą stronę.

(.)<
<$1

Przesuń wszystkie <lewe o jeden krok. Wypłukać i powtórzyć.


2

PowerShell , 100 bajtów

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

Wypróbuj online!

Ugh, convertbinarne w PowerShell jest bardzo bolesne. Plus .lengthy wywołania ze spacjami, plus długiej rozmowy, aby były wszystkie takie same , wszystko sprowadza się do długiego złożenia.-replace0.padLeft().length

Mile widziane sugestie gry w golfa poniżej 100.


2

PHP, 84 bajty

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

Na szczęście operacja bitowa rzutuje logwynik na int. float tu by nie działał.

Wypróbuj online .


2

Clojure, 185 bajtów

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

Wersja bez golfa:

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

Anonimowa funkcja, która przyjmuje argument jako listę. Zwraca linie jako listę.

Czytając inne odpowiedzi, założę się, że może być mniejszy. clojure.string/replacenapisanie nieprzyzwoitej liczby znaków


2

Japt , 33 30 bajtów

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

Wypróbuj online!

Zaoszczędź 3 bajty dzięki @Justin Mariner

Wyjaśnienie

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

Możesz upuścić 3 ostatnie znaki, aby po prostu zwrócić tablicę ciągów i użyć -Rflagi (nie dodawanej do liczby bajtów), aby zobaczyć wynik połączony z nową linią: tutaj .
Justin Mariner,

2

Python 3 , 92 90 bajtów

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

Wypróbuj online!

Zwraca listę wierszy. Układanie ich w stosy pokazuje, że rzeczywiście wyrównują się prawidłowo.

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

Podział

Zasadniczo konwertuje tablicę na binarną, a następnie zastępuje wszystkie zera spacjami. Nliczba spacji jest dodawana z przodu każdej linii, gdzieN = [length of longest line] - [length of line] .

-1 bytes Dzięki panu Xoder

Wypróbuj online!


Nie możesz mieć początkowych ani końcowych spacji na wyjściu.
TheLethalCoder

@TheLethalCoder Och, musiałem źle odczytać zasady! Dzięki za złapanie tego.
Graviton,

90 bajtów , zastępuje '0',' 'się *'0 '.
Pan Xcoder,

@ Mr.Xcoder Ach ciekawe, nigdy bym o tym nie pomyślał. Dzięki!
Graviton,

2

Japt , 11 bajtów

m¤z3 z ·r0S

Wypróbuj online!

Wyjaśnienie

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

Niezły exploit z z3 z. Nie jestem pewien, dlaczego y ytam nie działa, przyjrzę się temu później ...
ETHprodukcje

2

Java 7, 130 108 88 bajtów

Zaoszczędzono 22 dzięki @TheLethalCoder Zaoszczędzono 20 dzięki @Xanderhall

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

Nie golfowany:

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

1
Opublikuj przyrost io, b[i]aby zapisać bajt. Możesz zachować wynik za pomocą 1's, więc nie potrzebujesz .replace('1','*'). Zamiast tego użyj Java 8 i skompiluj do lambda, aby zaoszczędzić bajty. Jeśli nie chcesz tego robić, int[]bzapisuje bajt.
TheLethalCoder

Dziękuję Ci! Czy mógłbyś wyjaśnić, co to jest „Post inkrement i w b [i], aby zapisać bajt”. znaczy?
Java Gonzar,

i++ocenia, ia następnie zwiększa go (podczas gdy ++irobi to odwrotnie), aby można było i++wyjść z forpętli i użyć b[i++]zamiast tego. Aha, a skoro już to robimy, masz tylko jedną linię w swojej pętli, więc szelki nie są potrzebne.
TheLethalCoder

Prawdziwe! Niesamowite, dziękuję
Java Gonzar,

2
Możesz zapisać kilka bajtów, przełączając pętlę na pętlę foreach. for(int x:i)Można również użyć Long.toBinaryStringzamiast wersji Integer, aby zapisać 3 bajty.
Xanderhall

1

Python 2, 217 bajtów

Po 2 godzinach kodowania zdecydowałem, że numpy to zły pomysł

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

Wykorzystanie w Ubuntu

Zainstaluj numpy

python2 -m pip install numpy

Utwórz plik o nazwie iz wejściem w formacie14 4 6 2

Biegać

python2 prog.py

1

8 , 232 254 250 bajtów

Kod

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

Wersja bez golfa z komentarzami

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

Te słowa należy wywoływać kolejno (patrz przykład)

Zastosowanie i przykłady

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

Lub bardziej wyraźnie

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


1

Excel VBA, 170 161 bajtów

Grał w golfa

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe formatu 1 2 3 .. nz zakresu [A1]i wysyła odpowiednią ścianę binarną do okna natychmiastowego VBE poprzez zakres[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

Sformatowany:

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

Bez golfa

Pełna Subprocedura, która pobiera dane wejściowe formatu Array(1, 2, 3...)i wysyła odpowiednią ścianę binarną do okna natychmiastowego VBE poprzez zakres[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

Węgiel drzewny , 20 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Działa poprzez ręczne przekształcanie każdego numeru wejściowego na binarny, ale drukowanie go w kolejności od prawej do lewej. Traktuję dane wejściowe jako ciąg zakończony znakiem nowej linii, ponieważ Charcoal nie ma dobrego sposobu wprowadzania list, w przeciwnym razie napisałbym coś takiego, który niestety obecnie zajmuje 21 bajtów:

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

Try it online! Link is to verbose version of code. This version vectorises over the input array, although its output is hardcoded to -s which saves a byte.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.