골프 비트 직조


14

참고 :이 과제의 전반부는 Martin Ender의 이전 과제 인 Visualize Bit Weaving 에서 비롯되었습니다 .

난해한 프로그래밍 언어 인 은 "위빙 (weaving)"이라고하는 바이트 값에 대한 흥미로운 연산을 가지고 있습니다.

그것은 본질적으로 바이트의 8 비트의 순열입니다 (패턴이 대칭이기 때문에 어떤 끝에서 계산을 시작하는지는 중요하지 않습니다).

  • 비트 0이 비트 2로 이동
  • 비트 1이 비트 0으로 이동
  • 비트 2가 비트 4로 이동
  • 비트 3이 비트 1로 이동
  • 비트 4가 비트 6으로 이동
  • 비트 5가 비트 3으로 이동
  • 비트 6이 비트 7로 이동
  • 비트 7이 비트 5로 이동

편의상 순열에 대한 세 가지 다른 표현이 있습니다. 사이클로서 :

(02467531)

매핑으로 :

57361402 -> 76543210 -> 64725031

그리고 매핑 쌍의 목록으로 :

[[0,2], [1,0], [2,4], [3,1], [4,6], [5,3], [6,7], [7,5]]

8직조 바이트는 기본적으로 재설정됩니다.

예를 들어, 번호 직물 10011101이다 ( 15710 진수)를 생성한다 01110110(인 118베이스 (10)에).

입력

단지가있다 256유효한 입력 사이의 정수, 즉 모든, 0그리고 255포함은. 어떤베이스에서도 가져갈 수 있지만 일관성이 있어야하며 선택한베이스가 10이 아닌 경우 지정해야합니다.

입력을 제로 패딩 할 수 없습니다 .

산출

모든베이스에서 비트 위빙의 결과를 출력해야하며,베이스 10이 아닌 경우 일관되고 지정되어야합니다.

출력을 제로 패딩 할 수 있습니다 .


관련 : 비트 제직 시각화


5
재미있는 사실 : 이것이 원래 게시하려는 도전입니다. 그런 다음 순열을 시각화하기 위해 ASCII 아트를 작성한 다음 Sp3000은 렌더링이 더 어려워 질 것이라고 제안했습니다. ;)
Martin Ender 2016 년

2
출력베이스가 입력베이스와 다를 수 있습니까? "일관된"이라고 말하면 "동일한 기반에서 가능한 모든 입력"
Luis Mendo

순환 표현은 매핑 표현보다 유용하다고 생각합니다.
mbomb007

ASCII 아트가 확실히 더 재미 있다고 말해야합니다.
Insane

2
이것은 실제로 더 많은 테스트 사례를 사용할 수 있습니다.
James

답변:


32

파이썬 2.7, 44- > 36 바이트

lambda x:x/4&42|x*2&128|x*4&84|x/2&1

10
위대한 첫 번째 답변, PPCG에 오신 것을 환영합니다! :)
Martin Ender 2016 년

10
당신이 사용하는 경우 |대신 +하고 마스크 다음 이동 괄호를 제거하여 8 바이트를 면도 할 수 있습니다.
PellMell

당신이 새롭기 때문에, 나는 당신이 당신의 골프를 향상시키기 위해 @PellMell의 제안을 취한 다음 <strike></strike>진행률을 나타 내기 위해 이전 바이트 점수 주위 를 사용할 수 있음을 지적합니다 :-)
Insane


16

이블, 3 자

rew

온라인으로 사용해보십시오!

입력은 기본 256입니다 (예 : ASCII). 예를 들어 숫자 63을 입력하려면 ASCII 63을 입력하십시오. ? .

설명:

r          #Read a character
 e         #Weave it
  w        #Display it

때문에 부정 행위 같은 느낌이 든다.


1
ASCII는 256이 아니라 128입니다. 서수 128-255에 어떤 인코딩이 사용됩니까? 편집 : 시스템 인코딩을 사용하는 것처럼 보입니다.
Mego

11

CJam, 15 12 바이트

3 바이트를 절약 한 FryAmTheEggman에게 감사합니다.

l8Te[m!6532=

베이스 2에 입력.베이스 2에도 출력, 0으로 8 비트로 채워짐.

여기에서 테스트하십시오.

설명

l      e# Read the input.
8Te[   e# Left-pad it to 8 elements with zeros.
m!     e# Generate all permutations (with duplicates, i.e. treating equal elements
       e# in different positions distinctly).
6532=  e# Select the 6533rd, which happens to permute the elements like [1 3 0 5 2 7 4 6].

7

MATL , 14 바이트

&8B[2K1B3D5C])

입력은 10 진수입니다. 출력은 0으로 채워진 이진입니다.

온라인으로 사용해보십시오!

설명

&8B         % Take input number implicitly. Convert to binary array with 8 digits
[2K1B3D5C]  % Push array [2 4 1 6 3 8 5 7]
)           % Index first array with second array. Implicitly display

7

젤리, 11 바이트

+⁹BḊŒ!6533ị

Martin의 CJam 답변 번역. 여기에서 시도하십시오.

+⁹BḊ          Translate (x+256) to binary and chop off the MSB.
              This essentially zero-pads the list to 8 bits.
    Œ!        Generate all permutations of this list.
      6533ị   Index the 6533rd one.

1
나는 제로 패딩 트릭을 좋아한다. 우아한.
trichoplax 2016 년

7

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

f=n=>n*4&84|n*2&128|n/2&1|n/4&42

우선권의 좋은 남용!
Leaky Nun

1
분명히 우선 순위는 이런 식으로 작동하도록 설계되었습니다! 비트 시프트에서도 작동하지만 더 길어집니다.
Neil

6

J, 12 바이트

6532 A._8&{.

비트 위빙 연산에 해당하는 A.순열 인덱스가 6532있는 순열 내장 을 사용합니다 .

용법

입력은 이진수의 목록입니다. 출력은 8 개의 이진수로 채워진 목록입니다.

   f =: 6532 A._8&{.
   f 1 0 0 1 1 1 0 1
0 1 1 1 0 1 1 0
   f 1 1 1 0 1 1 0
1 1 0 1 1 0 0 1

설명

6532 A._8&{.  Input: s
       _8&{.  Takes the list 8 values from the list, filling with zeros at the front
              if the length(s) is less than 8
6532          The permutation index for bit-weaving
     A.       permute the list of digits by that index and return

6

망막 , 39 바이트

+`^(?!.{8})
0
(.)(.)
$2$1
\B(.)(.)
$2$1

베이스 2의 입력 및 출력, 출력은 왼쪽으로 채워집니다.

온라인으로 사용해보십시오!

설명

+`^(?!.{8})
0

이것은 입력을 0으로 왼쪽 채 웁니다. 는 +문자열 변경이 멈출 때까지 단계가 반복되는 것을 나타낸다. 문자열이 8 자 미만인 경우 문자열의 시작과 일치하고 0해당 위치에 a 를 삽입합니다 .

이제 실제 순열에 대해. 간단한 해결책은 다음과 같습니다.

(.)(.)(.)(.)(.)(.)(.)(.)
$2$4$1$6$3$8$5$7

그러나 그것은 고통스럽고 길다. Retina에서 구현하기가 훨씬 쉬운 순열의 다른 공식을 발견했습니다 ( X인접한 비트의 스왑을 나타냄).

1 2 3 4 5 6 7 8
 X   X   X   X
2 1 4 3 6 5 8 7
   X   X   X
2 4 1 6 3 8 5 7

이제는 구현하기가 훨씬 쉽습니다.

(.)(.)
$2$1

이것은 단순히 두 문자를 일치시키고 교체합니다. 일치하는 항목이 겹치지 않으므로 4 쌍을 모두 바꿉니다.

\B(.)(.)
$2$1

이제 같은 일을 다시하고 싶지만 첫 번째 문자는 건너 뛰고 싶습니다. 가장 쉬운 방법 은으로 단어 경계에서 경기 시작 되지 않도록 하는 것입니다 \B.


6

x86 기계 코드, 20 바이트

16 진수로 :

89C22455C1E002D0E0D1E880E2AAC0EA0211D0C3

AL 레지스터를 통한 입력 및 결과 반환 절차입니다

분해

89 c2                   mov    edx,eax
24 55                   and    al,0x55  ;Clear odd bits
c1 e0 02                shl    eax,0x2  ;Shift left, bit 6 goes to AH...
d0 e0                   shl    al,1     ;...and doesn't affected by this shift
d1 e8                   shr    eax,1    ;Shift bits to their's target positions
80 e2 aa                and    dl,0xaa  ;Clear even bits
c0 ea 02                shr    dl,0x2   ;Shift right, bit 1 goes to CF
11 d0                   adc    eax,edx  ;EAX=EAX+EDX+CF
c3                      ret

5

C (안전하지 않은 매크로), 39 바이트

#define w(v)v*4&84|v*2&128|v/2&1|v/4&42

C (기능), 41 바이트

w(v){return v*4&84|v*2&128|v/2&1|v/4&42;}

C (전체 프로그램), 59 바이트

main(v){scanf("%d",&v);return v*4&84|v*2&128|v/2&1|v/4&42;}

(종료 코드를 통해 반환되므로으로 호출하십시오. echo "157" | ./weave;echo $?)

C (표준 호환 전체 프로그램), 86 바이트

#include<stdio.h>
int main(){int v;scanf("%d",&v);return v*4&84|v*2&128|v/2&1|v/4&42;}

C (컴파일러 경고가없는 표준 호환 전체 프로그램), 95 바이트

#include<stdio.h>
int main(){int v;scanf("%d",&v);return (v*4&84)|(v*2&128)|(v/2&1)|(v/4&42);}

C (인수 또는 stdin에서 읽을 수 있고 오류 / 범위 검사를 포함하는 컴파일러 경고가없는 표준 호환 전체 프로그램), 262 바이트

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int v,char**p){v=v<2?isatty(0)&&puts("Value?"),scanf("%d",&v)?v:-1:strtol(p[1],p,10);exit(*p==p[1]||v&255^v?fprintf(stderr,"Invalid value\n"):!printf("%d\n",(v*4&84)|(v*2&128)|(v/2&1)|(v/4&42)));}

고장

기존의 많은 답변과 거의 동일합니다. <<2( *4), <<1( *2), >>1( /2) 및 >>2( /4) 를 사용하여 모든 비트를 제자리로 비트 시프트 한 다음| 모두 함께 사용하십시오.

나머지는 다른 종류의 보일러 플레이트입니다.


4

Mathematica, 34 바이트

PadLeft[#,8][[{2,4,1,6,3,8,5,7}]]&

익명의 기능. 이진수의 목록을 가져와 8 개의 이진수로 채워진 목록을 출력합니다.


3

PowerShell v2 +, 34 바이트

("{0:D8}"-f$args)[1,3,0,5,2,7,4,6]

@ LegionMammal978 's answer 의 번역 . 전체 프로그램. 명령 행 인수를 통해 입력을 2 진 숫자로 가져오고 0으로 채워진 2 진 배열로 출력합니다.

"{0:D8}"-f부분은 표준 숫자 형식 문자열 을 사용 0하여 입력 앞에 추가 합니다 $args. 때문에 -f운영자가 지원하는 입력으로 배열을 가지고, 우리는 명시 적으로 첫 번째 요소를 사용하는 말한 {0:, 우리는 일반적인 작업을 수행 할 필요가 없습니다 $args[0]. 우리는 그 문자열을 parens로 캡슐화 한 다음 색인화합니다.[1,3,0,5,2,7,4,6] 직조 만듭니다. 결과 배열은 파이프 라인에 남아 있고 출력은 암시 적입니다.

( .ToString()배열 의 기본값 에는 구분 기호가 `n있으므로 출력이 여기에서 줄 바꿈으로 구분됩니다)

PS C:\Tools\Scripts\golfing> .\golf-bit-weaving.ps1 10011101
0
1
1
1
0
1
1
0

PS C:\Tools\Scripts\golfing> .\golf-bit-weaving.ps1 1111
0
0
0
1
0
1
1
1

3

MATLAB, 49 48 44 바이트

s=sprintf('%08s',input(''));s('24163857'-48)

입력을 이진 값의 문자열로 가져옵니다. 출력이 채워졌습니다. @Luis Mendo 덕분에 4 바이트가 절약되었습니다.

설명:

input('')             -- takes input
s=sprintf('%08s',...) -- pads with zeros to obtain 8 digits
s('24163857'-48)      -- takes positions [2 4 1 6 3 8 5 7] from s (48 is code for '0')

3

V , 17 바이트

8é0$7hd|òxplò2|@q

온라인으로 사용해보십시오!

이진으로 입력 및 출력을 가져옵니다. 바이트 수의 대부분은 0으로 채워집니다. 입력 패딩이 허용 된 경우 다음을 수행 할 수 있습니다.

òxplò2|@q

문자 교체 방법에 대한 Martin의 솔루션 덕분에 다음과 같습니다.

1 2 3 4 5 6 7 8
 X   X   X   X
2 1 4 3 6 5 8 7
   X   X   X
2 4 1 6 3 8 5 7

설명:

8é0                 "Insert 8 '0' characters
   $                "Move to the end of the current line
    7h              "Move 7 characters back
      d|            "Delete until the first character
        ò   ò       "Recursively:
         xp         "Swap 2 characters
           l        "And move to the right
             2|     "Move to the second column
               @q   "And repeat our last recursive command.


2

Pyth, 19 자

s[@z1.it%2tzP%2z@z6

입력과 출력은 기본 2입니다.

Pyth 전문가와는 거리가 멀지 만 아직 아무도 대답하지 않았기 때문에 나는 그것을 쐈다.

설명:

s[                # combine the 3 parts to a collection and then join them
  @z1             # bit 1 goes to bit 0
  .i              # interleave the next two collections
    t%2tz         # bits 3,5,7; t is used before z to offset the index by 1
    P%2z          # bits 0,2,4
  @z6             # bit 6 goes to bit 7

이것은 0으로 채워진 입력을 가정하므로 유효하지 않습니다.
Leaky Nun



1

vi, 27 바이트

8I0<ESC>$7hc0lxp<ESC>l"qd0xp3@q03@q

어디 <ESC>이스케이프 문자를 나타냅니다. I / O가 이진이고 출력이 채워집니다. vim의 24 바이트 :

8I0<ESC>$7hd0xpqqlxpq2@q03@q

<ESC>그 주위에 백틱이 필요합니다. 편집을했지만 변경할 바이트를 4 개 더 알아낼 수 없습니다.
Joe

@SirBidenXVII 감사합니다.
Neil

0

실제로 27 바이트

'08*+7~@tñiWi┐W13052746k♂└Σ

온라인으로 사용해보십시오!

이 프로그램은 입력 및 출력을 이진 문자열로 출력합니다 (출력은 8 비트로 0으로 채워짐).

설명:

'08*+7~@tñiWi┐W13052746k♂└Σ
'08*+                        prepend 8 zeroes
     7~@t                    last 8 characters (a[:~7])
         ñi                  enumerate, flatten
           Wi┐W              for each (i, v) pair: push v to register i
               13052746k     push [1,3,0,5,2,7,4,6] (the permutation order, zero-indexed)
                        ♂└   for each value: push the value in that register
                          Σ  concatenate the strings

0

자바 스크립트, 98 바이트

입력은 2 자릿수로 문자열로 취해지고 출력은 2 자릿수를 문자열로 취합니다

n=>(n.length<8?n="0".repeat(8-n.length)+n:0,a="13052746",t=n,n.split``.map((e,i)=>t[a[i]]).join``)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.