Ослабленные двоичные стены

HyperNeutrino 08/20/2017. 14 answers, 1.278 views
code-golf number binary binary-matrix

Вдохновленный Создание бинарной стены

Учитывая список положительных целых чисел, мы можем записать их друг над другом так же, как [2, 6, 9, 4] в качестве примера:

0010
0110
1001
0100 

Мы можем представить это как стену:

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

Однако это очень слабая стена, и она рухнула! Каждый 1 ( # ) падает до тех пор, пока он не достигнет «земли» или еще 1 ( # ). 0 s ( . S) присутствуют в пятнах, оставленных перемещением 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] 

Вызов

Учитывая список положительных целых чисел, примените это преобразование к списку. Ввод / вывод в виде списков положительных целых чисел в любом разумном формате. Применяются стандартные лазейки.

Это , поэтому выигрывает самый короткий ответ в байтах!

5 Comments
1 Leaky Nun 07/29/2017
Больше проверок? Знаете, не квадратные тестеры были бы хорошими.
HyperNeutrino 07/29/2017
@LeakyNun Конечно. Я это сделаю.
Marcus Müller 07/30/2017
Это просто проблема сортировки для бит-массивов.
HyperNeutrino 07/30/2017
@ MarcusMüller Вы правы - я понял, что после ответа MATL: P

14 Answers


Suever 07/29/2017.

MATL , 4 байта

BSXB 

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

Explanation

% 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 
5 comments
HyperNeutrino 07/29/2017
O_O Как это работает: o
1 totallyhuman 07/29/2017
Разве MATL просто играл в гольф Jelly на 4 bytes ? о_О
Leaky Nun 07/29/2017
5 байтов: -p
HyperNeutrino 07/29/2017
Я никогда не думал, что будет встроенный, чтобы переместить их на нижнюю xD +1
1 JungHwan Min 07/29/2017
@totallyhuman хорошо, подождите, пока Деннис приходит

Anders Kaseorg 07/29/2017.

Python , 68 байт

 f=lambda a:a and[x|y&a[0]for x,y in zip([0]+f(a[1:]),f(a[1:])+[-1])] 

Попробуйте прямо сейчас!


Neil 07/29/2017.

JavaScript (ES6), 50 байт

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

Объяснение: Предположим, что два ряда стены были такими:

0011
0101 

Результат должен быть следующим:

0001
0111 

Другими словами, первая строка становится И из двух строк, а вторая строка становится OR из двух строк. Это нужно просто повторить достаточно, чтобы все биты упали на дно.


Leaky Nun 07/29/2017.

Justin Mariner 07/29/2017.

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 
2 comments
ETHproductions 07/30/2017
Я think вы можете сохранить байт с mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHproductions Кажется, что вращение 2D-массива вместо вращения массива строк заполняет каждый внутренний массив null а не пробелом. Так что это не работает. И null сортируется справа от 1 с, в отличие от пробелов, которые сортируются влево.

DanTheMan 07/30/2017.

Mathematica, 64 байт

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

 является \[Transpose]

Это преобразует вход (список чисел) в список списков цифр, подставляет его как квадратную матрицу, переносит его, сортирует строки, чтобы «упасть» на дно, перенесет назад, затем преобразует обратно в числа ,


xnor 07/30/2017.

Python 3.5 , 60 байт

 def f(a,*t):
 if t:b,*r=f(*t);t=f(a|b,*r);a&=b
 return(a,*t) 

Попробуйте прямо сейчас!

Принимает входные данные как f(2, 6, 9, 4) . Предполагается, что ввод не пуст. Использует много распаковки кортежей .


Suever 07/30/2017.

Octave, 29 25 байт

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de сохраняет 4 байта в октаве. Работает на octave-online.net.
Suever 07/30/2017
@StewieGriffin Спасибо!

miles 07/29/2017.

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 
2 comments
Zacharý 07/30/2017
В этом двоичном левом дополнении есть +1. А также, можете ли вы объяснить, почему вам нужно использовать инверсию транспонирования, поскольку она просто транспонируется?
miles 08/01/2017
@ Zacharý Инверсы используются для отмены операций, используемых перед сортировкой каждой строки. Это правда, что инверсия транспонирования просто транспонирована, но другой способ увидеть это как M , где первые две функции - это просто Обратные из последних двух.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 байт

bí0ζR€{øC 

Попробуйте прямо сейчас!

Разработайте другой алгоритм от Magic's.

3 comments
Magic Octopus Urn 07/31/2017
ζ , damnit. Удалите мой, возьмите мой +1.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Почему вы удалили свой? Не нужно.
Magic Octopus Urn 07/31/2017
Это не очень сильно отличается (с точки зрения алгоритма), и это на 25% лучше.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 байт

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

Попробуйте прямо сейчас! (Изменено так, что TryAPL принимает его как действительное)

Как?

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

James Heslip 07/30/2017.

Dyalog APL (23 символа)

NO 
  1. Преобразование входных аргументов в двоичную матрицу
  2. Разделить матрицу на столбцы
  3. Сортировка столбцов в порядке возрастания
  4. Преобразовать отсортированные строки обратно в десятичные

пример

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

Спасибо Захари за то, что вы исправили меня на этом.

5 comments
Zacharý 07/30/2017
Вы можете заменить (⊥⍣¯1)⍵ на ⊥⍣¯1⊢⍵ . Кроме того, я не думаю, что вам нужна спецификация оси на split ( ↓[1] => ).
Zacharý 07/30/2017
О, и вы должны преобразовать его обратно в список!
Zacharý 07/30/2017
Это неверно.
James Heslip 07/30/2017
Спасибо, Захари, я работал над этим поздно вечером, и я думаю, что неправильно понял проблему. Теперь я изменил свое решение.
1 Zacharý 07/30/2017
Ну, хорошая работа! ( ⊥⍣¯1 действительно должен быть встроенным). И благодарю вас за то, что вы действительно получили мое имя пользователя.

ThePirateBay 07/29/2017.

JavaScript, 127 125 байт

a=>a[m='map'](_=>b[m]((n,i)=>n&&(b[i]--,d|=1<a[m](e=>d+=!!(2**c&e),d=0)&&d)).reverse() 

Попробовать онлайн

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1< может стать 2**c&e

Dopapp 07/30/2017.

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º, а затем создает целые числа из каждой строки.

2 comments
Mr. Xcoder 07/30/2017
142 байта , у вас есть избыточная скобка.
Dopapp 07/30/2017
@ Mr.Xcoder, о да, это было глупо

Related questions

Hot questions

Language

Popular Tags