비트 제직 시각화


32

난해한 프로그래밍 언어 인 은 "위빙 (weaving)"이라고하는 바이트 값에 대한 흥미로운 연산을 가지고 있습니다. 그것은 본질적으로 바이트의 8 비트의 순열입니다 (패턴이 대칭이기 때문에 어떤 끝에서 계산을 시작하는지는 중요하지 않습니다).

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

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

(02467531)

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

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

당신의 작업은 상자 그리기 문자를 사용하여,이 순열을 시각화하는 것입니다 , , , , , , (Unicode 코드 포인트 : U + 2500, U + 2502, U + 250C, U + 2510 + 2514 U, U + 2518, U를 + 253C). 이 시각화는 다음 제약 조건을 충족해야합니다.

첫 번째 줄과 마지막 줄은 정확히 다음과 같습니다.

0 1 2 3 4 5 6 7

그 사이에는 상자 그리기 문자에 맞게 최대 15 자까지 줄을 사용할 수 있습니다 (4 줄 이상 필요). 행은 첫 번째 행의 숫자 중 하나 아래에서 수직으로 시작하고 마지막 행의 해당 숫자 위의 수직으로 끝나야합니다. 8 개의 선은 반드시 연결되어 있어야하며 비아 만 통과 할 수 있습니다 (항상 2 개의 선이 닿지 않아야 함). 라인의 정확한 경로는 당신에게 달려 있습니다 (특히 골프 가능한 레이아웃을 찾는 것이이 도전의 핵심입니다). 유효한 출력은 다음과 같습니다.

0 1 2 3 4 5 6 7
│ │ └─┼┐│ │ └┐│
└─┼─┐ ││└─┼─┐││
┌─┘ │ ││  │ │││
│ ┌─┼─┘│  │ │││
│ │ │ ┌┼──┘ │││
│ │ │ │└┐ ┌─┼┼┘
│ │ │ │ │ │ │└┐
0 1 2 3 4 5 6 7

그러나 올바른 숫자를 올바르게 연결하는 다른 레이아웃도 좋습니다. 답변에 선택한 결과를 보여주십시오.

프로그램이나 기능을 작성할 수 있으며 입력을받지 않습니다. 다이어그램을 STDOUT (또는 가장 가까운 대안)으로 출력하거나 문자열 또는 문자열 목록 (각각 한 줄을 나타내는) 형식의 함수 리턴 값으로 출력하십시오.

표준 규칙이 적용되므로 가장 짧은 코드 (바이트)가 이깁니다.


1
유니 코드를 지원하지 않는 언어에 다른 기호를 사용할 수 있습니까?
flawr

3
이 문제는 본질적으로 복사 붙여 넣기 ... 제공되는 출력을하는 방법의 순열을 복용에 대한 귀결 01234567입력으로 다음 연결 01234567? 링크를 직접 알아 내야합니까? 특히 골프의 경우 훨씬 더 어려운 과제입니다.
shooqie 2016 년

5
@shooqie 이것은 샌드 박스에서 논의되었습니다. 그것은 실제로 매우 다른 도전이 될 것이며 나는 어느 시점에 게시하는 것을 고려하고 있습니다. 그러나 위의 예를 복사하여 붙여 넣는 것 보다이 과제에 더 많은 것이 있다고 생각합니다. 수 많은 다른 허용 가능한 출력이 있으며 위의 출력은 특히 압축하기 어렵고 다른 것 (기존 답변에서 사용되는 것과 같은)은 훨씬 더 압축 가능합니다. 문제는 압축 가능한 단일 문자열을 찾는 것입니다. 그것은 몇 바이트에서 자동으로 레이아웃을 찾는 것과는 매우 다릅니다.
Martin Ender 2016 년

2
누군가는 이것을 악에서 해결해야합니다.
RK.

3
@Holger 우리가 그렇게하지 않는 좋은 이유가 있습니다. 사람들은 문자열을 큰 유니 코드 문자로 묶어 인코딩 할 수 있으며, 이는 단일 바이트에 몇 바이트의 정보를 저장할 수 있습니다. 예.
Martin Ender 2016 년

답변:


13

실제로 69 바이트

"│ ┌┘│ │└┐ │└┐└┐""┌┘└┼┐└┼┐ └┼┐└┐""└┼┐│└┐┌┘└┐┌┘│""┌┼─┘"3*"│┌┘"+8r' j;)

온라인으로 사용해보십시오! (온라인 통역사에서 정렬이 약간 엉망입니다)

실제로이 거대한 여기에 이용 - 그들은 단지 바이트 각이야 있도록 문자를 그리기 상자의 모든, CP437에 있습니다. 필요한 각 문자는 이론적으로 4 비트로 인코딩 될 수 있지만 (고유 문자는 9 개뿐이므로) 문자열을 압축하여 절약 된 31 바이트는 실제로는 매우 열악한 문자열 처리 기능으로 인해 손실됩니다. 또한 8x4 구성의 점수는 동일합니다. 8x4가 (수직으로) 가능한 가장 짧은 구성 인 것으로 보이므로 이것이 최적입니다.

3 바이트의 Martin에게 감사합니다!

4 바이트 더 TimmyD에 감사합니다!

설명:

"│ ┌┘│ │└┐ │└┐└┐""┌┘└┼┐└┼┐ └┼┐└┐""└┼┐│└┐┌┘└┐┌┘│""┌┼─┘"3*"│┌┘"+8r' j;)
"│ ┌┘│ │└┐ │└┐└┐""┌┘└┼┐└┼┐ └┼┐└┐""└┼┐│└┐┌┘└┐┌┘│""┌┼─┘"3*"│┌┘"+         push the individual lines, using string multiplication to shorten repeated sections
                                                              8r' j   push the string "0 1 2 3 4 5 6 7" (range(8), join on spaces)
                                                                   ;)  make a copy and move it to the bottom of the stack

1
기술적으로 다른 많은 답변은 언어가 지원하는 단일 바이트 인코딩 (있는 경우)을 사용하고 귀하와 동일한 바이트를 출력하고 "출력은 CP437로 인코딩되었습니다"라고 말함으로써 단일 바이트 인코딩을 사용할 수 있습니다. 그러나 아무도 그 사실을 알지 못하는 것 같습니다. ¯ \ _ (ツ) _ / ¯
Martin Ender

21

PowerShell을 V2 +, 172 153 148 145 142 131 123 바이트 (81 개 문자)

($a=""+0..7)
$b='┌┘'
"│$b$('┌┼─┘'*3)
└┼┐$('│└─┐'*3)
$b$('└┼─┐'*3)│
│ $($b*6)│"
$a

인라인 코드 블록을 사용하여 여러 변수가 필요하지 않도록 직조를 한층 더 발전 시켰습니다. 이것은 아마도 최적의 몇 바이트 안에있을 것입니다.

공백과 함께 결합 된 $a범위와 동일하게 설정 하여 시작 0..7합니다. $ofs배열 의 기본 (출력 필드 구분 기호)이 공백이므로 배열이 문자열로 표시되면 ""+(이와 같은 연산자를 사용하면 PowerShell은 오른쪽 개체를 왼쪽 개체로 암시 적으로 캐스팅하려고 시도합니다.) 결과는 공백으로 구분 된 범위입니다.

그것은 parens로 캡슐화되어 결과를 파이프 라인에 추가합니다. 그런 다음 하나의 도우미 변수를 설정 한 다음 $b적절한 변수가있는 4 줄의 출력 (문자 그대로 줄 바꿈으로 분할)을 반복하고 반복 섹션에 인라인 코드 블록을 사용한 다음 $a다시 입력합니다. 4 개의 라인 $a은 파이프 라인에 배치되며 출력은 암시 적입니다.

PS C:\Tools\Scripts\golfing> .\visualize-bit-weaving.ps1
0 1 2 3 4 5 6 7
│┌┘┌┼─┘┌┼─┘┌┼─┘
└┼┐│└─┐│└─┐│└─┐
┌┘└┼─┐└┼─┐└┼─┐│
│ ┌┘┌┘┌┘┌┘┌┘┌┘│
0 1 2 3 4 5 6 7

1
맨 아래에서 앞뒤로 이동하는 것이 좋습니다. :)
Martin Ender 2016 년

11

자바 스크립트 ES6, 168 167 바이트

편집 : 웁스, 기능의 일부로 업데이트 된 바이트 수를 나타내는 |U + 2502 대신 파이프 문자를 사용하고있는 것으로 나타났습니다 .

_=>((n=`0 1 2 3 4 5 6 7 `)+[...`6452301`].map(i=>`${(d=n=>`│ `.repeat(n))(i)}└┐│ ${r=d(6)}┌┼┘ ${r}│└┐ ${d(6-i)}`).join``+n).match(/.{16}/g).join`
`

문자열을 반환합니다.

산출:

0 1 2 3 4 5 6 7 
│ │ │ │ │ │ └┐│ 
│ │ │ │ │ │ ┌┼┘ 
│ │ │ │ │ │ │└┐ 
│ │ │ │ └┐│ │ │ 
│ │ │ │ ┌┼┘ │ │ 
│ │ │ │ │└┐ │ │ 
│ │ │ │ │ └┐│ │ 
│ │ │ │ │ ┌┼┘ │ 
│ │ │ │ │ │└┐ │ 
│ │ └┐│ │ │ │ │ 
│ │ ┌┼┘ │ │ │ │ 
│ │ │└┐ │ │ │ │ 
│ │ │ └┐│ │ │ │ 
│ │ │ ┌┼┘ │ │ │ 
│ │ │ │└┐ │ │ │ 
└┐│ │ │ │ │ │ │ 
┌┼┘ │ │ │ │ │ │ 
│└┐ │ │ │ │ │ │ 
│ └┐│ │ │ │ │ │ 
│ ┌┼┘ │ │ │ │ │ 
│ │└┐ │ │ │ │ │ 
0 1 2 3 4 5 6 7 

추가 : @TimmyD의 방법을 사용하면 다른 167 바이트 솔루션이 있습니다.

(n=`0 1 2 3 4 5 6 7
`,a=`│┌┘ `,b=`└┼─┐`,d=`┌┼─┘`,f=` │└┐`)=>[n,a,a,a,a,`
`,b,b,b,`└┼┐
┌┘`,d,d,d,`│
│`,f,f,f,` │
`,n].join``

8

자바 스크립트 (ES6) 137 134 바이트

f=
_=>`0
2525252
1 1 1 1
24242423525252 3 1 1 1 3 242424
0`.replace(/\d/g,d=>`0 1 2 3 4 5 6 7,└┼┐,┌┘,│
│,│ , │`.split`,`[d])  
;
o.textContent=f();
<pre id=o></pre>

종소리로 나는 이것을 즉시 Plain Hunt Major 의 첫 두 행으로 인식했습니다 (링크 된 이미지는 0-7 대신 1-8을 사용합니다).


4

Pyth - 119 104 100 81 바이트

매우 간단합니다. (실제로는 바이트입니다).

js[KjdU8cX."sz¨ú¨ãÆhÆ?\ÕüÓ¼xFNøa"_G"│┌┘└┼─┐ "15K

여기에서 온라인으로 사용해보십시오 .

또한 @TimmyD의 출력을 훔쳤습니다.

0 1 2 3 4 5 6 7
│┌┘ │┌┘ │┌┘ │ │
└┼─┐└┼─┐└┼─┐└┐│
┌┘┌┼─┘ └┐│┌┼─┼┘
│ │└┐ ┌─┼┘│└┐└┐
0 1 2 3 4 5 6 7

3

MS-DOS 배치, 136 바이트

@echo 0 1 2 3 4 5 6 7
@echo ³ÚÙ ³ÚÙ ³ÚÙ ³ÚÙ
@echo ÀÅÄ¿ÀÅÄ¿ÀÅÄ¿ÀÅ¿
@echo ÚÙÚÅÄÙÚÅÄÙÚÅÄÙ³
@echo ³ ³À¿ ³À¿ ³À¿ ³
@echo 0 1 2 3 4 5 6 7

@TimmyD의 출력을 사용합니다. 이것은 Windows Batch에서도 작동하지만 내 코드 페이지에는 CP437이 아닌 CP850이 있습니다.


CP437 또는 CP850 사용 여부에 관계없이 Windows에서도 작동합니다.
Holger

@Holger Huh, 어쨌든 시도해 보았을 것입니다.
Neil

3

MATLAB / 옥타브 112 109 바이트

a='0 1 2 3 4 5 6 7';d=['└┐│ ';'┌┼┘ ';'│└┐ '];e=repmat('│ ',3,1);[a;d d d d;e d d d e;a]

산출:

0 1 2 3 4 5 6 7
└┐│ └┐│ └┐│ └┐│
┌┼┘ ┌┼┘ ┌┼┘ ┌┼┘
│└┐ │└┐ │└┐ │└┐
│ └┐│ └┐│ └┐│ │
│ ┌┼┘ ┌┼┘ ┌┼┘ │
│ │└┐ │└┐ │└┐ │
0 1 2 3 4 5 6 7

내 코드의으로 출력한다 기반으로 @Dendrobium@Neil .



주의 사항 : 링크 된 주석이 삭제되었습니다. 출력이 @TimmyD의 출력보다 더 골프화 가능하다는 것은 OP였습니다.
Outgolfer Erik

3

/// , 112 바이트 (100 자)

/8/0 1 2 3 4 5 6 7//9/│//A/└┐//B/┌┼┘/8/C/9 A9 A9 A9//D/9A 9A 9A 9/
AC
B B B B
DA
C 9
9 B B B 9
9 D
8

-3 바이트를위한 @MartinEnder에게 감사합니다!
-9 바이트에 대한 @MartinEnder에게 감사합니다!
15 자 규칙을 지정해 주셔서 감사합니다. @MartinEnder (OP)

용도 TimmyD의 @ 마르코의 출력 @

012 34 5 6 7
└┐│ └┐│ └┐│ └┐│
┌┼┘ ┌┼┘ ┌┼┘ ┌┼┘
│└┐ │└┐ │└┐ │└┐
│ └┐│ └┐│ └┐│ │
│ ┌┼┘ ┌┼┘ ┌┼┘ │
│ │└┐ │└┐ │└┐ │
012 34 5 6 7


0

Python3, 209 바이트

lambda s="0 1 2 3 4 5 6 7\n":s+"│┌┘ │┌┘ │┌┘ │ │\n└┼─┐└┼─┐└┼─┐└┐│\n┌┘┌┼─┘ └┐│┌┼─┼┘\n│ │└┐ ┌─┼┘│└┐└┐\n"+s

문자열을 반환합니다.

2 바이트를 절약 한 @Mego에게 감사드립니다!

캐릭터 바디의 크레딧은 @TimmyD로 가십시오!


2
a,부품이 필요하지 않으므로 매개 변수를 사용하여 부품을 호출 할 필요가 없습니다.
Mego

0

Sprects , 99 바이트 (87 자)

$8
AC
BE
DA
C 9
9E 9
9 D
8$E B B B$D9A 9A 9A 9$C9 A9 A9 A9$B┌┼┘$A└┐$9│$80 1 2 3 4 5 6 7

@Marco의 출력을 사용합니다 (16 번째 문자마다 줄 바꿈으로 바꿉니다 (regex : (.{15}).->).\1\n )으로 ).

012 34 5 6 7
└┐│ └┐│ └┐│ └┐│
┌┼┘ ┌┼┘ ┌┼┘ ┌┼┘
│└┐ │└┐ │└┐ │└┐
│ └┐│ └┐│ └┐│ │
│ ┌┼┘ ┌┼┘ ┌┼┘ │
│ │└┐ │└┐ │└┐ │
012 34 5 6 7


0

Bash + GNU sed, 140 바이트

sed 'h
s/$/nxxxacnb b b bnyyycanc xxxcnc b b b cnc yyyc/
:
s/x/ac /
s/y/ca /
s/a/└┐/
s/b/┌┼┘/
t
y/cn/│\n/
G'<<<'0 1 2 3 4 5 6 7'

산출:

0 1 2 3 4 5 6 7
└┐│ └┐│ └┐│ └┐│
┌┼┘ ┌┼┘ ┌┼┘ ┌┼┘
│└┐ │└┐ │└┐ │└┐
│ └┐│ └┐│ └┐│ │
│ ┌┼┘ ┌┼┘ ┌┼┘ │
│ │└┐ │└┐ │└┐ │
0 1 2 3 4 5 6 7

사용 TimmyD의 @ 출력 : 142 바이트

sed 'h
s/$/npbcccnsurdddnbeeepnp bbbbbbp/
:
s/b/qt/
s/c/quot/
s/d/psor/
s/e/suor/
t
y/nopqrstu/\n─│┌┐└┘┼/
G'<<<'0 1 2 3 4 5 6 7'

산출:

0 1 2 3 4 5 6 7
│┌┘┌┼─┘┌┼─┘┌┼─┘
└┼┐│└─┐│└─┐│└─┐
┌┘└┼─┐└┼─┐└┼─┐│
│ ┌┘┌┘┌┘┌┘┌┘┌┘│
0 1 2 3 4 5 6 7

0

Tcl , 205 바이트

puts "[set B "0 1 2 3 4 5 6 7"]
│┌┘ │┌┘ │┌┘ └┐│
└┼┐ └┼─┐└┼──┐││
┌┘└─┐│ └┐│┌─┼┼┘
│ ┌─┼┘┌─┼┘│ │└┐
$B"

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

출력

012 34 5 6 7
│┌┘ │┌┘ │┌┘ └┐│
└┼┐ └┼─┐└┼──┐││
┌┘└─┐│ └┐│┌─┼┼┘
│ ┌─┼┘┌─┼┘│ │└┐
012 34 5 6 7

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.