Ослаблені бінарні стіни


21

Натхненний створенням бінарної стіни

Враховуючи список натуральних чисел, ми можемо виписати їх над собою, [2, 6, 9, 4]як приклад:

0010
0110
1001
0100

Ми можемо уявити це як стіну:

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

Однак це дуже слабка стіна, і вона обвалилася! Кожен 1( #) падає вниз, поки не потрапить на "землю" чи іншу 1( #). В 0и ( .и) присутні в місцях , залишених переміщуються 1с.

Це стає наступним:

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

Що перекладається на:

0000
0000
0110
1111

Який, як перелік чисел, є [0, 0, 6, 15].

Ще один тестовий випадок

[10, 17, 19, 23]

Це стає:

01010
10001
10011
10111

що стає:

00000
10011
10011
11111

переклад назад до:

[0, 19, 19, 31]

Виклик

Давши список натуральних чисел, застосуйте це перетворення до списку. Введення / виведення як списки натуральних чисел у будь-якому розумному форматі. Застосовуються стандартні лазівки.

Це , тому найкоротша відповідь у байтах виграє!



1
Більше тестів? Ви знаєте, не квадратні тестові вітрини будуть добре.
Leaky Nun

@LeakyNun Звичайно. Я це зроблю.
HyperNeutrino

Це лише проблема сортування для бітових масивів.
Маркус Мюллер

@ MarcusMüller Ти маєш рацію - я зрозумів, що після відповіді MATL: P
HyperNeutrino

Відповіді:


29

MATL , 4 байти

BSXB

Спробуйте в MATL Online

Пояснення

    % 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 Як це працює: o
HyperNeutrino

1
Невже MATL вийшов з гольфу на 4 байти ? o_O
totalhuman

5 байт зараз :-p
Leaky Nun

Я ніколи не думав, що буде вбудований
модуль,

1
@totallyhuman добре, зачекайте, поки прийде Денніс
JungHwan Min


5

JavaScript (ES6), 50 байт

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

Пояснення: Припустимо, два ряди стіни були такими:

0011
0101

Результат повинен бути таким:

0001
0111

Іншими словами, перший рядок стає І з двох рядів, а другий - АБО з двох рядів. Це просто потрібно повторити достатньо разів, щоб усі шматочки впали на дно.



2

Japt , 16 байт

m¤z3 ®¬n qÃz mn2

Спробуйте в Інтернеті! використовуючи -Qпрапор для форматування результату масиву.

Пояснення

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

Я думаю, ви можете зберегти байт за допомогоюmì2 z3 mn z mì2
ETHproductions

@ETHproductions Здається, що обертаючи 2D масив, замість обертання масиву рядків, прокладки кожного внутрішнього масиву nullзамість пробілів. Так що, схоже, це не працює. І nullсортується праворуч від 1s, на відміну від пробілів, відсортованих зліва.
Джастін Марінер

2

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

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

 є \[Transpose]

Це перетворює вхідні дані (список номерів) у список списків цифр, прокладки - квадратну матрицю, переміщують її, сортують рядки так, щоб «падіння» 1 було знизу, переміщується назад, а потім перетворюється назад у числа .



2

Октава, 29 25 байт

4 байти збережено завдяки @Stewie

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

de2bi/bi2deзберігає 4 байти в октаві. Працює на octave-online.net.
Стюі Гріффін

@StewieGriffin Дякую!
Suever

1

J , 13 байт

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

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

Пояснення

/:~"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

Там знову те двійкове ліве підкладка, +1. А також, чи можете ви пояснити, чому вам потрібно було б скористатись зворотною формою транспозиції, оскільки це просто транспонування?
Zacharý

@ Zacharý Звороти використовуються для скасування операцій, які використовуються перед сортуванням кожного рядка. Правда, що зворотне переміщення - це просто перенесення, але інший спосіб бачити це як <convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M, де перші дві функції - це лише звороти двох останніх.
миль

1

05AB1E , 9 байт

bí0ζR€{øC

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

Якийсь алгоритм, який відрізняється від Magic's.


ζ, блін. Видалено моє, прийміть мій +1.
Magic Octopus Urn

@MagicOctopusUrn Чому ви видалили своє? Не має потреби.
Ерік Аутгольфер

Це не дуже сильно відрізняється (з точки зору алгоритму), і це було на 25% краще.
Чарівна восьминога урна

1

Діялог APL, 24 21 19 байт

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

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

Як?

  • оцінений вхід (масиви розділені пробілом)
  • 2⊥⍣¯1⊢ перетворює кожен аргумент у двійковий (перекладається те, що йдеться у питанні)
  • перетворює 2D масив у вектор векторів
  • {⍵[⍋⍵]}¨ сортує кожен з елементів вектора
  • знову перетворює вектор векторів у 2D масив
  • 2⊥ конвертувати з бінарного (оскільки він свого роду переміщує його, ми доходимо до правильного результату)

1

Діалог APL (23 символи)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. Перетворити вхідні аргументи у двійкову матрицю
  2. Розбийте матрицю на стовпці
  3. Сортуйте стовпці у порядку зростання
  4. Перетворити відсортовані рядки назад у десяткові

Приклад

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

Дякую Захарі за те, що мене виправили на цьому.


Ви можете замінити (⊥⍣¯1)⍵на ⊥⍣¯1⊢⍵. Крім того, я не думаю, що вам потрібна специфікація осі на split ( ↓[1]=> ).
Zacharý

О, і ви повинні перетворити його назад у список!
Zacharý

Це недійсне.
Zacharý

Дякую, Захарі, я працював над цим пізно вчора ввечері, і, думаю, я неправильно прочитав проблему. Я змінив своє рішення зараз.
Джеймс Хесліп

1
Ну, гарна робота! ( ⊥⍣¯1дійсно потрібно бути вбудованим). І дякую за те, що ви справді отримали моє ім’я користувача правильно.
Zacharý


0

Python 2, 142 байти

... і все-таки гольф ... сподіваємось - будь-яка допомога вдячна!

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

Великий шматок цього полягає в прокладці чисел нулями.

Більш зрозумілі:

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

Це створює масив зображень двійкових рядків, прошиває їх, обертає його на 90 ° за годинниковою стрілкою, сортує кожне рядок, повертає його назад на 90 °, а потім створює цілі числа з кожного рядка.


142 байти , у вас є кілька зайвих дужок.
Містер Xcoder

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