Murs binaires affaiblis


21

Inspiré par Créer un mur binaire

Étant donné une liste d'entiers positifs, nous pouvons les écrire les uns au-dessus des autres de cette manière, par [2, 6, 9, 4]exemple:

0010
0110
1001
0100

On peut imaginer cela comme un mur:

..#.
.##.
#..#
.#..

Cependant, c'est un mur très faible et il s'est effondré! Chaque 1( #) tombe jusqu'à ce qu'il touche le «sol» ou un autre 1( #). Les 0s ( .s) sont présents dans les taches laissées par les 1s déplacés .

Cela devient le suivant:

....
....
.##.
####

Ce qui se traduit par:

0000
0000
0110
1111

Ce qui, en tant que liste de nombres, est [0, 0, 6, 15].

Un autre cas de test

[10, 17, 19, 23]

Cela devient:

01010
10001
10011
10111

qui devient:

00000
10011
10011
11111

traduire en:

[0, 19, 19, 31]

Défi

Étant donné une liste d'entiers positifs, appliquez cette transformation à la liste. Entrée / sortie sous forme de listes d'entiers positifs dans n'importe quel format raisonnable. Des échappatoires standard s'appliquent.

Il s'agit d'un , donc la réponse la plus courte en octets gagne!



1
Plus de tests? Vous savez, des cas de test non carrés seraient bons.
Leaky Nun

@LeakyNun Bien sûr. Je ferai ça.
HyperNeutrino

C'est juste un problème de tri pour les tableaux de bits.
Marcus Müller

@ MarcusMüller Vous avez raison - je me suis rendu compte qu'après la réponse MATL: P
HyperNeutrino

Réponses:


29

MATL , 4 octets

BSXB

Essayez-le sur MATL Online

Explication

    % Implicitly grab input as an array 
    %   STACK: [10, 17, 19, 23]
B   % Convert each element to binary where each decimal number results in a row
    %   STACK: [0 1 0 1 0;
    %           1 0 0 0 1;
    %           1 0 0 1 1;
    %           1 0 1 1 1]
S   % Sort each column, placing all of the 1's at the bottom of each column
    %   STACK: [0 0 0 0 0;
    %           1 0 0 1 1;
    %           1 0 0 1 1;
    %           1 1 1 1 1] 
XB  % Convert each row from its binary representation to its decimal number
    %   STACK: [0, 19, 19, 31]
    % Implicitly display the result

o_O Comment ça marche: o
HyperNeutrino

1
MATL vient-il de sortir Jelly de 4 octets ? o_O
totalement humain

5 octets maintenant :-p
Leaky Nun

Je n'ai jamais pensé qu'il y aurait un intégré pour déplacer ceux vers le bas xD +1
HyperNeutrino

1
@totallyhuman bien, attendez l'arrivée de Dennis
JungHwan Min


5

JavaScript (ES6), 50 octets

f=a=>a.map(_=>a.map((e,i)=>a[a[i]|=a[--i],i]&=e))&&a

Explication: Supposons que deux rangées de mur ressemblent à ceci:

0011
0101

Le résultat doit être le suivant:

0001
0111

En d'autres termes, la première ligne devient le ET des deux lignes et la deuxième ligne devient le OU des deux lignes. Cela doit juste être répété suffisamment de fois pour que tous les bits tombent au fond.



2

Japt , 16 octets

m¤z3 ®¬n qÃz mn2

Essayez-le en ligne! en utilisant l' -Qindicateur pour formater le résultat du tableau.

Explication

m¤z3 ®¬n qÃz mn2    Implicit: U = input array.
                        [10, 17, 19, 23]
m¤z3                Map U to binary strings and rotate the array left 90°
                         1010       0111
                        10001   ->  1011
                        10011       0001
                        10111       1000
                                     111
®¬n qà              Sort each binary string, putting 0s and spaces at the start
                        0111
                        0111
                        0001
                        0001
                         111
z mn2               Rotate right 90° and convert each back to a number
                         0000       0
                        10011   ->  19
                        10011       19
                        11111       31
                    Implicit output of resulting array

Je pense que vous pouvez enregistrer un octet avecmì2 z3 mn z mì2
ETHproductions

@ETHproductions Il semble que la rotation du tableau 2D, au lieu de faire tourner le tableau de chaînes, remplisse chaque tableau intérieur avec nullau lieu d'espaces. Cela ne semble donc pas fonctionner. Et nullest trié à droite des 1s, contrairement aux espaces, qui sont triés à gauche.
Justin Mariner

2

Mathematica, 64 octets

#~FromDigits~2&/@(Sort/@(PadLeft[#~IntegerDigits~2&/@#]))&

 est \[Transpose]

Cela convertit l'entrée (une liste de nombres) en une liste de listes de chiffres, la remplit pour qu'elle soit une matrice carrée, la transpose, trie les lignes de sorte que le 1 "tombe" vers le bas, transpose en arrière, puis reconvertit en nombres .



2

Octave, 29 25 octets

4 octets enregistrés grâce à @Stewie

@(x)bi2de(sort(de2bi(x)))

de2bi/bi2deenregistre 4 octets en octave. Fonctionne sur octave-online.net.
Stewie Griffin

@StewieGriffin Merci!
Suever

1

J , 13 octets

/:~"1&.|:&.#:

Essayez-le en ligne!

Explication

/:~"1&.|:&.#:  Input: array M
           #:  Convert each in M to binary with left-padding
       |:&     Transpose
/:~"1&         Sort each row
     &.|:      Inverse of transpose (which is just transpose)
         &.#:  Inverse of converting to binary

Il y a à nouveau ce remplissage binaire gauche, +1. Et aussi, pouvez-vous expliquer pourquoi vous auriez besoin d'utiliser l'inverse de transposer, car il s'agit simplement de transposer?
Zacharý

@ Zacharý Les inverses sont utilisées pour annuler les opérations utilisées avant de trier chaque ligne. Il est vrai que l'inverse de la transposition est juste une transposition, mais une autre façon de voir cela est que <convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M, où les deux premières fonctions ne sont que les inverses des deux dernières.
miles


1

Dyalog APL, 24 21 19 octets

2⊥↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⎕

Essayez-le en ligne! (modifié pour que TryAPL l'accepte comme valide)

Comment?

  • entrée évaluée (les tableaux sont séparés par des espaces)
  • 2⊥⍣¯1⊢ convertit chacun des arguments en binaire (transposé de ce qui est dans la question)
  • transforme un tableau 2D en un vecteur de vecteurs
  • {⍵[⍋⍵]}¨ trie chacun des éléments du vecteur
  • transforme à nouveau le vecteur de vecteurs en tableau 2D
  • 2⊥ convertir du binaire (car il le transpose en quelque sorte, nous arrivons au résultat correct)

1

Dyalog APL (23 caractères)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. Convertissez les arguments d'entrée en une matrice binaire
  2. Fractionner la matrice en colonnes
  3. Trier les colonnes par ordre croissant
  4. Convertissez les lignes triées en décimales

Exemple

  {2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}10 17 19 23
      0 19 19 31

Merci à Zacharý de m'avoir corrigé sur celui-ci.


Vous pouvez remplacer (⊥⍣¯1)⍵par ⊥⍣¯1⊢⍵. De plus, je ne pense pas que vous ayez besoin de la spécification de l'axe sur le split ( ↓[1]=> ).
Zacharý

Oh, et vous êtes censé le reconvertir en liste!
Zacharý

Ceci n'est pas valide.
Zacharý

Merci, Zacharý, je travaillais sur ce tard hier soir et je pense que j'ai mal lu le problème. J'ai modifié ma solution maintenant.
James Heslip

1
Eh bien, bon travail! ( ⊥⍣¯1doit vraiment être intégré). Et merci d'avoir bien saisi mon nom d'utilisateur.
Zacharý


0

Python 2, 142 octets

... et toujours au golf ... j'espère –– Toute aide appréciée!

def c(l):b=[bin(n)[2:]for n in l];print[int(n,2)for n in map(''.join,zip(*map(sorted,zip(*['0'*(len(max(b,key=len))-len(x))+x for x in b]))))]

Une grande partie de cela est pour remplir les nombres avec des zéros.

Plus lisible:

def collapse(nums):
    bins = [bin(n)[2:] for n in nums]
    bins = [('0'*(len(max(bins, key = len)) - len(x))) + x for x in bins]
    print [int(n, 2) for n in map(''.join, zip(*map(sorted, zip(*bins))))]

Cela crée un tableau des représentations de chaînes binaires, le remplit, le fait pivoter de 90 ° dans le sens des aiguilles d'une montre, trie chaque ligne, le fait pivoter de 90 ° en arrière, puis crée des entiers à partir de chaque ligne.


142 octets , vous avez des parenthèses redondantes.
M. Xcoder

@ Mr.Xcoder, oh oui c'était idiot
Daniel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.