Créer un mur binaire

33

Étant donné un tableau d’entiers positifs en base 10, où n > 0, sortent leur représentation d’un mur binaire.

Comment cela marche-t-il?

  1. Convertissez chaque nombre en sa représentation binaire.
  2. Complétez la représentation avec les zéros au début du plus long, c'est 1, 2-à- dire -> 1, 10-> 01, 10.
  3. Créer un mur où les 1s sont des briques et 0s sont des briques manquantes.

Un mur est un bloc de caractères où tout caractère imprimable représente une brique et un espace ( 32) représente une brique manquante. Vous pouvez choisir n’importe quel personnage pour la brique, elle n’a pas besoin d’être distincte sur le mur tant qu’il ne s’agit pas d’un espace. Le caractère de brique manquant doit être un espace. Pour l'exemple ci-dessous, j'ai utilisé *pour les briques.

Exemple

Contribution:

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

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

Règles

  • Les entrées doivent être prises en base 10, si votre langue accepte d'autres bases, vous ne pouvez pas les utiliser.
  • Les nouvelles lignes de début et de fin sont autorisées.
  • Les entrées peuvent être considérées comme une liste d’entiers, d’arguments séparés ou n’importe quel format raisonnable.
  • La sortie peut être dans n'importe quel format raisonnable: chaîne séparée par une nouvelle ligne, tableau de lignes, tableau 2d, etc.
  • Les failles standard sont interdites.

Cas de test

Notez que dans le premier cas de test, toutes les couches ont une brique vide à la fin.

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

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

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

C'est le code de golf si le code le plus court gagne!

TheLethalCoder
la source
La sortie peut-elle être un tableau de lignes ou un tableau 2D de caractères?
ovs le
@ovs Désolé je pensais l'avoir spécifié, oui vous pouvez sortir un tableau ou un tableau 2d etc. N'importe quel format raisonnable.
TheLethalCoder
Dans le cas d'un tableau 2D, pouvons-nous utiliser des nombres pour les briques au lieu de caractères? par exemple[[1, " ", 1, " "], ...]
Arnauld
@Arnauld Ouais, cela semble bien.
TheLethalCoder
1
@Giuseppe Nouvelles lignes uniquement, sinon cela sera confondu pour les briques vides.
TheLethalCoder

Réponses:

13

MATL , 5 octets

B42*c

Essayez-le en ligne!

Explication

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
Luis Mendo
la source
Vous pouvez choisir n’importe quel personnage pour la brique, elle n’a pas besoin d’être distincte sur le mur tant qu’il ne s’agit pas d’un espace. oui ça veut dire que vous n'avez probablement pas besoin de 42*quoi que ce soit ...
Erik the Outgolfer
@EriktheOutgolfer Je pourrais choisir n'importe quel autre numéro, mais j'ai besoin de ces trois octets, je pense.
Luis Mendo
Que se passe-t-il s'il y a un octet intégré pour 100ou un autre numéro?
Erik the Outgolfer
11

J , 8 octets

' *'{~#:

Essayez-le en ligne!

Explication

' *'{~#:  Input: array of integers
      #:  Convert each to binary with left-padding
' *'{~    Use the digits to index into the string ' *'
milles
la source
Oh, voilà #:pourquoi ça bat Jelly.
Erik the Outgolfer
8

Octave, 22 octets

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

Essayez-le en ligne

Explication:

Sauvé quelques octets grâce à Luis Mendo! De plus, je n'ai pas remarqué que je pouvais choisir le personnage avec lequel construire le mur, pas seulement *.

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

Ou avec de2bi:

Explication:

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

Ce qui suit fonctionne sur TIO, pour 7 octets de plus:

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

Essayez-le ici

Stewie Griffin
la source
5

Python 3 , 88 84 71 74 72 octets

Un lambda qui renvoie une liste de chaînes, représentant chaque ligne.

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

Essayez-le en ligne! (lien vers la version séparée par une nouvelle ligne)

Explication

  • lambda n:- Crée un lambda (anonyme), avec un paramètre n. Retourne implicitement.

  • [...] - Crée une compréhension de liste.

  • bin(x)[2:] - Obtient les représentations binaires des nombres.

  • .replace(*'0 ')- Remplace toutes les occurrences de 0par un espace.

  • .rjust(len(bin(max(n)))-2) - Pad les représentations binaires à la longueur de la plus longue.

  • for x in n- Itère à travers n, avec la variable x.


Changelog

  • - 1 - 3 octets grâce à @Rod, -(...)+2= 2-(...), utilisation derjust()

  • Ajout d'une version avec à la bin()place, qui était invalide car elle ne fonctionnait pas pour 1et 2.

  • Correction du bug ci-dessus en utilisant format().

  • Changement du type de retour en liste de chaînes, car il était autorisé par l'OP.

  • Correction d' un autre bogue à l' aide rjust()et la commutation de retour à bin(), repéré et fixé par @Rod.

M. Xcoder
la source
5

JavaScript (ES6), 81 à 79 octets

Sauvegardé 2 octets en utilisant des nombres au lieu de caractères pour les briques, comme suggéré par Rick Hitchcock

Retourne un tableau 2D avec 1 pour les briques.

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)

Cas de test

Arnauld
la source
4

05AB1E , 9 octets

bí.Bí»0ð‡

Essayez-le en ligne!

Erik le golfeur
la source
Battez-moi par 38 secondes. J'ai eu aussi b0ð:í.Bí»pour 9 octets.
Riley
4

Ruby, 63 59 octets

-4 octets avec l'aide d'Alexis Andersen

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

Essayez-le en ligne!

Daniero
la source
1
vous n'avez pas besoin du 0 dans le format de chaîne. vous pouvez raser un octet en le remplaçant n.max.to_s(2).sizepar ('%b'%n.max).sizeet vous n'avez pas réellement besoin de le remplacer 1par*
Alexis Andersen
@AlexisAndersen merci :)
daniero
4

R , 87 88 octets

Blocs de mur représentés par un 8, parce que, bien beaucoup de huit.

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

Essayez-le en ligne!

La liste d'entiers en entrée est convertie en un tableau de bits qui sont supprimés des bits de fin 0 et inversés.

Le tableau réduit est ensuite généré en utilisant writeune largeur de colonne qui a été déterminée lors de la suppression du tableau.

ifelse() est la seule option SI qui fonctionne malheureusement sur les vecteurs.

MickyT
la source
@Vlo a souligné que vous pouvez utiliser 1plutôt que ""pour le fichier de sortie dans write.
Giuseppe
@ Giuseppe merci pour le tuyau
MickyT
3

APL (Dyalog) , 30 22 20 14 octets

6 octets sauvés grâce à @ Adám

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

Essayez-le en ligne!

(suppose ⎕IO←0 qu'il s'agit par défaut sur de nombreuses machines)

Cela prend l’entrée sous forme de tableau et retourne une matrice avec * s et s.

Explication

2⊥⍣¯1⊢⎕       Convert input to binary (returns a transposed matrix of 1s and 0s)
              Transpose
' *'[ ... ]    Index into this string
Kritixi Lithos
la source
Économisez 6 octets avec' *'[⍉2⊥⍣¯1⊢⎕]
Adám
@ Adám Merci pour les conseils, je ne savais pas que je pouvais enlever le ¨.
Kritixi Lithos le
3

T-SQL, 290 octets

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

Les usages 1 de la brique, en supposant que les données proviennent du tableau@

Ungolfed, avec une explication

-- 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
Brian J
la source
3

Mathematica, 40 octets

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

Les briques sont des 1

Mathematica, 48 octets

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

Les briques sont #

J42161217
la source
Vous ne devriez avoir besoin que d’une barre oblique //.. ( /.signifie "remplacer une fois", //."continuer à remplacer jusqu'à ce que la chose cesse de changer".)
Pas un arbre
ok-fixed-thanks
J42161217
Vous n'avez pas besoin d'espace après la virgule dans la fonction IntegerDigits.
Mark S.
oui, je sais, cela se produit lorsque vous copiez / collez depuis notebook.fixed
J42161217
2

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

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

Essayez-le en ligne!

Le nombre d'octets comprend 41 octets de using System.Linq;using C=System.Convert;. Utilise 1comme personnage pour le mur. Néanmoins, c'est beaucoup trop long, même pour C # ...

Charlie
la source
Placez dans namespace System.Linq{}pour enregistrer quelques octets. Est- a.Max()ce que la vérité est garantie (je suis sûr que je ne suis tout simplement pas le plus intelligent avec binaire: P)? Est-ce que class Convert{}sauver des octets?
TheLethalCoder
1
Si je place le programme dans un espace de noms donné, ne devrais-je pas soumettre l'ensemble du programme au lieu d'un lambda? Je ne suis pas sûr des règles pour cela ...
Charlie
Je viens généralement de placer dans un espace de noms avec lambda. Je ne pense pas qu'il y ait jamais eu de question à ce sujet et que cela se trouve dans la page Conseils C #.
TheLethalCoder
Je ne pense pas que cela soit valide, car vous ne pouvez pas le compiler sans utiliser des importations statiques.
MetaColon
2
@MetaColon, c’est la raison pour laquelle j’ai ajouté les octets au nombre using System.Linq;using C=System.Convert;d’octets, car ces deux usingdirectives sont indispensables à la compilation du code.
Charlie
2

Retina , 63 octets

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

Essayez-le en ligne! Explication:

.+
$*#<

Convertir en unaire et suffixe a <.

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

Convertir en binaire.

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

Une fois que tous les <s ont atteint la gauche, supprimez-les tous.

m`^<
 <

Insérer un espace avant tout <s ayant déjà atteint la gauche.

(.)<
<$1

Déplacez tous les <s à gauche d'un pas. Rincer et répéter.

Neil
la source
2

PowerShell , 100 octets

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

Essayez-le en ligne!

Ugh, convertpasser au binaire dans PowerShell est tellement douloureux. Plus .lengthy appelle -replaceles 0espaces avec, plus une longue.padLeft() appel à les faire tout de même .length, tout ajoute à une longue présentation.

Les suggestions de golf pour obtenir au-dessous de 100 sont les bienvenues.

AdmBorkBork
la source
2

PHP, 84 octets

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

Heureusement, l'opération de bit envoie le logrésultat à int. float ne fonctionnerait pas ici.

Essayez-le en ligne .

Titus
la source
2

Clojure, 185 octets

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

Version non-golfée:

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

Fonction anonyme qui prend l'argument sous forme de liste. Renvoie les lignes sous forme de liste.

En lisant les autres réponses, je parie que cela pourrait être plus petit. clojure.string/replaceprend une quantité obscène de caractères pour écrire ..

Josué
la source
2

Japt , 33 30 octets

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

Essayez-le en ligne!

3 octets sauvés grâce à @Justin Mariner

Explication

¡                              // 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 '*'
Powelles
la source
Vous pouvez supprimer les 3 derniers caractères pour simplement renvoyer un tableau de chaînes et utiliser l' -Rindicateur (non ajouté au nombre d'octets) pour afficher la sortie jointe à la nouvelle ligne: ici .
Justin Mariner
2

Python 3 , 92 90 octets

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

Essayez-le en ligne!

Retourne une liste de lignes. Les empiler indique qu'ils s'alignent bien.

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

La panne

Convertit essentiellement le tableau en binaire, puis remplace tous les 0 par des espaces. Nnombre d'espaces sont ajoutés à l'avant de chaque ligne oùN = [length of longest line] - [length of line] .

-1 bytes Merci à M. Xoder

Essayez-le en ligne!

Graviton
la source
Vous ne pouvez pas avoir d'espaces de début ou de fin dans la sortie.
TheLethalCoder
@TheLethalCoder Oh, vous devez avoir mal interprété les règles! Merci d'avoir attrapé ça.
Graviton
90 octets , remplacer '0',' 'par *'0 '.
M. Xcoder
@ Mr.Xcoder Ah intéressant, n'aurait jamais pensé à cela. Merci!
Graviton
2

Japt , 11 octets

m¤z3 z ·r0S

Essayez-le en ligne!

Explication

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
Justin Mariner
la source
Bel exploit avec z3 z. Vous ne savez pas pourquoi y yça ne marche pas là-bas, j'examinerai plus tard ...
ETHproductions
2

Java 7, 130 108 88 octets

22 sauvés grâce à @TheLethalCoder 20 sauvés grâce à @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', ' '));       
}
Java Gonzar
la source
1
Post increment ià b[i]pour sauvegarder un octet. Vous pouvez conserver la sortie avec 1donc pas besoin de .replace('1','*'). Utilisez plutôt Java 8 et compilez-le en un lambda pour sauvegarder des octets. Si vous ne voulez pas faire cela int[]benregistre un octet.
TheLethalCoder
Merci! Pourriez-vous s'il vous plaît expliquer ce que "Post increment i at b [i] pour enregistrer un octet." veux dire?
Java Gonzar
i++évalue ipuis incrémente (alors que ++ifait le contraire) afin que vous puissiez déplacer le i++hors de la forboucle et utiliser à la b[i++]place. Oh, et tant que nous y sommes, vous n'avez qu'une seule ligne dans votre boucle, vous n'avez donc pas besoin d'accolades.
TheLethalCoder
Vrai! Incroyable, merci
Java Gonzar
2
Vous pouvez économiser quelques octets en basculant votre boucle sur une boucle foreach. for(int x:i)En outre, vous pouvez utiliser à la Long.toBinaryStringplace de la version Integer pour enregistrer 3 octets.
Xanderhall
1

Python 2, 217 octets

Après 2 heures de codage, j’ai décidé que ce n’était pas une bonne idée pour 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()

Utilisation dans Ubuntu

Installer numpy

python2 -m pip install numpy

Créer un fichier nommé iavec une entrée au format14 4 6 2

Courir

python2 prog.py
Вгений Новиков
la source
1

8ème , 232 254 250 octets

Code

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

Version non-golfée avec commentaires

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

Ces mots doivent être appelés en séquence (voir exemple)

Usage et exemples

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

Ou plus clairement

ok> [15,11,15,15] f f1 f2 f3
****
* **
****
****
Manoir du chaos
la source
1

Excel VBA, 170 161 octets

Golfé

Fonction de fenêtre immédiate VBE anonyme qui prend en entrée le format 1 2 3 .. nde la plage [A1]et transmet le mur binaire correspondant à la fenêtre VBE Immediate via la plage[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

Formaté:

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

SubRoutine complète qui prend en entrée le format Array(1, 2, 3...)et sort la paroi binaire correspondante dans la fenêtre VBE Immediate via la plage[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
Taylor Scott
la source
1

Charbon de bois , 20 octets

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Fonctionne en convertissant manuellement chaque numéro d'entrée en fichier binaire, mais en l'imprimant dans un ordre allant de droite à gauche. Je prends l’entrée comme une chaîne terminée par une nouvelle ligne, car Charcoal n’a pas un bon moyen de saisir des listes, sinon j’écrirais quelque chose comme ceci qui malheureusement prend actuellement 21 octets:

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Cette version est vectorisée sur le tableau en entrée, bien que sa sortie soit codée en dur en -s, ce qui enregistre un octet.

Neil
la source