약한 이진 벽


21

영감을받은 것은 이진 벽 만들기

양의 정수 목록이 주어지면 [2, 6, 9, 4]예를 들어 다음 과 같이 서로 위에 쓸 수 있습니다 .

0010
0110
1001
0100

이것을 벽으로 상상할 수 있습니다.

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

그러나 이것은 매우 약한 벽이며 붕괴되었습니다! 각 1( #)은 "지상"또는 다른 1( #)에 도달 할 때까지 쓰러집니다 . 0S ( .S)가 이동 된만큼 왼쪽 지점에 존재하는 1S.

이것은 다음과 같습니다 :

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

다음으로 다시 변환됩니다.

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

트윗 담아 가기 내가 할게.
HyperNeutrino

그것은 비트 배열의 정렬 문제 일뿐입니다.
Marcus Müller

@ 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이 Jelly를 4 바이트만큼 아웃 골프 했습니까 ? o_O
완전히 인간적인

5 bytes now :-p
Leaky Nun

나는
그것들을

1
@totallyhuman 잘, 데니스가 올 때까지 기다립니다
정환 민


5

자바 스크립트 (ES6), 50 바이트

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

설명 : 벽의 두 행이 다음과 같다고 가정하십시오.

0011
0101

결과는 다음과 같아야합니다.

0001
0111

즉, 첫 번째 행은 두 행의 AND가되고 두 ​​번째 행은 두 행의 OR이됩니다. 이것은 모든 비트가 맨 아래로 떨어지도록 충분한 시간을 반복하면됩니다.



2

Japt , 16 바이트

m¤z3 ®¬n qÃz mn2

온라인으로 사용해보십시오! 은 USING -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의 오른쪽에 정렬 1왼쪽으로 분류되어 공간, 달리의.
Justin Mariner

2

Mathematica, 64 바이트

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

는 \[Transpose]

입력 (숫자 목록)을 자릿수 목록으로 변환하고, 정사각형 행렬로 채우고, 행을 정렬하고, 1을 "아래로"아래로 내림으로써 행을 정렬하고, 다시 조옮김 한 다음 다시 숫자로 변환합니다. .



2

옥타브, 29 25 바이트

@Stewie 덕분에 4 바이트 절약

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

de2bi/bi2de4 바이트를 옥타브로 저장합니다. octave-online.net에서 작동합니다.
Stewie Griffin

@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

Dyalog APL, 24 21 19 바이트

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

온라인으로 사용해보십시오! (TryAPL이 유효한 것으로 수락하도록 수정)

방법?

  • 평가 된 입력 (배열은 공백으로 구분됨)
  • 2⊥⍣¯1⊢ 각 인수를 이진으로 변환합니다 (문제에있는 것을 바꾼다)
  • 2D 배열을 벡터로 변환
  • {⍵[⍋⍵]}¨ 벡터의 각 요소를 정렬합니다
  • 벡터의 벡터를 다시 2D 배열로 변환
  • 2⊥ 이진에서 변환 (그것이 전치되기 때문에 올바른 결과에 도달합니다)

1

Dyalog APL (23 자)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. 입력 인수를 이진 행렬로 변환
  2. 행렬을 열로 분할
  3. 열을 오름차순으로 정렬
  4. 정렬 된 행을 다시 십진수로 변환

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

이것을 수정 해 준 Zacharý에게 감사드립니다.


당신은으로 대체 할 수 있습니다 (⊥⍣¯1)⍵⊥⍣¯1⊢⍵. 또한 split ( ↓[1]=> ) 에 축 지정이 필요하다고 생각하지 않습니다 .
Zacharý

아, 그리고 다시 목록으로 변환해야합니다!
Zacharý

유효하지 않습니다.
Zacharý

감사합니다, Zacharý, 나는 지난 밤 늦게이 일을하고 있었는데 문제를 잘못 읽은 것 같습니다. 지금 솔루션을 수정했습니다.
제임스 헤 슬립

1
잘 했어! ( ⊥⍣¯1실제로 내장되어야 함). 실제로 내 사용자 이름을 올바르게 설정해 주셔서 감사합니다.
Zacharý


0

파이썬 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]))))]

이것의 큰 덩어리는 숫자를 0으로 채우는 것입니다.

더 읽기 쉬운 :

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 바이트 , 여분의 괄호가 있습니다.
Mr. Xcoder

@ Mr.Xcoder, 오 그렇습니다 어리석은
Daniel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.