펜토미노 사각형 인쇄


16

입력을받지 않고 12 개의 별개의 펜토미노 로 구성된 직사각형의 텍스트를 지속적으로 인쇄하거나 반환하는 프로그램이나 함수를 작성하십시오 .

12 개의 펜토미노

사각형의 크기와 방향은 다를 수 있지만 12 개의 펜토미노는 모두 정확히 한 번만 사용해야하므로 면적은 60입니다. 각 펜토미노는 다른 인쇄 가능한 ASCII 문자 로 구성되어야합니다 ( 위에서 편지).

예를 들어,이 20 × 3 펜토미노 사각형 솔루션을 출력하기로 선택한 경우 :

3x20 솔루션

프로그램의 출력은 다음과 같습니다.

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

또는이 6 × 10 솔루션을 쉽게 골프화 할 수 있습니다.

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

모든 사각형 솔루션이 수행하므로 프로그램은 하나만 인쇄하면됩니다. (출력의 후행 줄 바꿈이 좋습니다.)

이 훌륭한 웹 사이트 에는 다양한 사각형 크기에 대한 많은 솔루션이 있으며 솔루션을 최대한 짧게 만들기 위해 찾아 볼 가치가 있습니다. 이것은 바이트 단위로 가장 짧은 대답이 코드 골프입니다.


15
Piet의 "퀸"인 경우 보너스.
mbomb007

@ mbomb007 12 블록 만 가지고 노는 것은 불가능합니다 : P
Sp3000

나는 국경에 공백이 허용되어야한다고 생각하지 않습니다. 그러나 그들이 있기 때문에 후행 공백을 생략 할 수 있습니까? 끝에 공백이없는 세로 5x12 솔루션을 인쇄하면 보너스를받을 수 있습니까?
John Dvorak

@ Sp3000 완전히 pentomino 사각형 솔루션으로 구성된 Piet 프로그램은 어떻습니까?
John Dvorak

@JanDvorak 후행 공백이 있으면 생략 할 수 없습니다. 인쇄 가능한 다른 ASCII 문자와 같은 문자입니다.
Calvin 's Hobbies

답변:


1

Pyth, 37 바이트

jc4.HC"&f3ªªwril3:[·)ÌDU[r)ÌDA»

데모

매우 간단한 접근 방식을 사용하십시오. 16 진 바이트를 숫자로 사용하십시오. 16 진수로 변환하면 기본 256 인코딩됩니다. 위의 마술 줄을 제공합니다. 디코딩하려면 Pyth의 기본 256 디코더 기능을 사용하고 16 진수로 변환하고 4 개의 청크로 분할 한 다음 줄 바꿈에 참여하십시오.


5

CJam (44 바이트)

제어 문자가 포함되어 있기 때문에 xxd 형식으로 제공됩니다 ( MarkDown과 함께 실제로 작동하지 않는 원시 탭 포함 ).

0000000: 2202 7e0d 8ef3 570d e085 e168 cf27 092c
0000010: a235 0c22 3235 3662 3562 332f 5f2c 2c2e
0000020: 7b32 2f27 412b 662b 7d7a 4e2a 

그것은 라인을 따라 무언가를 해독합니다.

"MAGIC STRING"256b5b3/_,,.{2/'A+f+}zN*

제어 문자를 포함하지 않으므로 브라우저 URI 디코딩 라이브러리 기능과 함께 잘 작동하는 약간 ungolfed 온라인 데모 .

기본 원칙은 5 행을 초과하는 조각이 없기 때문에 행 번호의 선형 함수에서 오프셋을 컴팩트하게 인코딩 할 수 있다는 것입니다. ).


5

배쉬 + 일반적인 리눅스 유틸리티, 50

xxd -s20 -p -c2 $0
#<30 bytes of binary data>

인코딩 된 base64에서이를 다시 작성하려면 다음을 수행하십시오.

base64 -d <<< eHhkIC1zMjAgLXAgLWMyICQwCiMiImaSaZlmkDAAMwSjRKNEqoGogYhRVVF7UXu7d3s= > pent.sh

12 개의 펜토미노가 있으므로 색상은 16 진 nybbles로 쉽게 인코딩됩니다.

산출:

$ ./pent.sh
2222
6692
6999
6690
3000
3304
a344
a344
aa81
a881
8851
5551
7b51
7bbb
777b
$ 

4

J, 49 바이트

u:64++/\|:3#.inv 1377859090 1567813024 1337683230

세로로 인접한 문자 사이의 최대 증분이 2가되도록 문자를 선택할 수 있습니다.이 사실을 사용하여 base3의 세로 증분을 인코딩합니다. 그런 다음 누적 합계를 만들고 오프셋을 추가하여 문자의 ASCII 코드를 얻습니다.

확실히 골프. (확장 정밀도 base36 숫자를 입력하는 방법을 아직 찾지 못했지만 간단한 base36은 3 바이트 만 절약해야합니다.)

산출:

AAA
ABA
BBB
DBC
DCC
DCC
DEE
DFE
FFE
FGE
FGG
GGH
HHH
IIH
JII
JJI
JKK
JKL
KKL
LLL

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


아주 좋아요 기본 256 인코딩으로 CJam에서이 차이 인코딩을 적용하면 33 바이트 ( b256이없는 48 바이트 버전 )가됩니다.
피터 테일러

대단해! 4x15에서도 작동합니다. 길이가 아닌 데이터를 가로로 저장하면 4 개의 숫자를 바이트로 묶는 데 효과적입니다. U 펜토미노가 올바른 방향을 향한 레이아웃이 필요합니다. 질문에 링크가 많이 있습니다.
레벨 리버 세인트

@steveverrill 첫 번째 줄에서 시작하는 조각이 4 개 이상이므로 base4로 코딩 할 수 없으므로 시작 오프셋이 필요합니다. 이 여분의 오프셋으로 (예 : 3#i.50 0 0 1 1 1 ... 4 4 4)이 작동 할 수 있지만 아마 (적어도 방법 I 시도) 짧은되지 않습니다.
randomra


1

루비

개정판 3, 55 바이트

i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}

Randomra의 아이디어에 대한 추가 개발로 아래의 출력 및 차이 표를 고려하십시오. 차이 테이블은 이전과 같이 압축하고 65 = 2 진 1000001을 곱하고 마스크 11001100110011을 적용하여 확장 할 수 있습니다. 그러나 Ruby는 8 비트 문자로 예측 가능하지 않습니다 (유니 코드로 해석하는 경향이 있습니다).

놀랍게도, 마지막 열은 완전히 균일합니다. 이 때문에 압축시 데이터에 대해 오른쪽 이동을 수행 할 수 있습니다. 이렇게하면 모든 코드가 7 비트 ASCII가됩니다. 확장에서는 단순히 65 대신 65 * 2 = 130을 곱하면됩니다.

첫 번째 열도 완전히 균일합니다. 따라서 제어 문자를 피하기 위해 필요한 경우 각 요소에 1을 추가 할 수 있습니다 (각 바이트에 32 개). 원하지 않는 1은 마스크 11001100110011 대신 10001100110011 = 9011을 사용하여 제거됩니다.

Solution 59 of document linked in question

Start0001

Out  Diff
2223 2222
2433 0210
2433 0000
4445 2012
6555 2110
6577 0022
6687 0110
6887 0200
8897 2010
aa99 2202
caa9 2010
cab9 0010
cbbb 0102
cdbd 0202
cddd 0020

테이블에 15 바이트를 사용하지만 실제로는 각 바이트의 6 비트 만 사용합니다. 총 90 비트입니다. 실제로 각 바이트 당 가능한 값은 36 개 뿐이며 총 2.21E23 가능성입니다. 그것은 77 비트의 엔트로피에 적합 할 것입니다.

Randomra의 증분 방식을 사용하는 Rev 2, 58 바이트

i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}

마지막으로 순진한 솔루션보다 짧은 것입니다. Rev 1의 바이트 패킹 방법을 사용한 Randomra의 증분 방식.

rev 1, 72 바이트, rev 0의 골프 버전

골프의 이유로 코드를 재정렬하기 위해 기준선에 약간의 변화가 있었지만 여전히 순진한 솔루션보다 더 길었습니다.

i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}

오프셋은 기본적으로 형식 4의 매직 스트링의 각 문자로 인코딩됩니다 BAC. 즉, 1은 오른쪽 기호를 나타내고, 16은 중간 기호를 나타내며, 왼쪽 기호는 4의 위치에 각인되어 있습니다. 이를 추출하기 위해 ASCII 코드에 65 (이진수 1000001)를 곱하여을 주면 BACBAC819 (이진수 1100110011)로 AND.A.B.C .

일부 ASCII 코드는 제어 문자를 피하기 위해 7 번째 비트 세트를 가지고 있습니다. 즉, 필요한 값보다 64가 높습니다. 이 비트는 마스크 (819)에 의해 제거되기 때문에, 값 C이 3 인 경우를 제외하고 는 이월이 발생하지 않는다. 한 곳에서만 수정해야합니다 (대신 g사용해야합니다)c 합니다).

개정 0, ungolfed 버전

a= %w{000 010 000 201 100 100 011 021 110 120 011 112 111 221 211 221 122 123 112 222}
i=2
a.each{|e|puts "%x"%(i/2*273+e.to_i(16));i+=1} 

산출

111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc

설명

다음 솔루션에서 기준선을 빼고 데이터로 저장하는 오프셋을 제공합니다. 기준선은 코드에서 i/2*273(십진수 273 = 111 16 진수) 16 진수로 재생성됩니다 .

solution   baseline   offset
AAA        AAA        000
ABA        AAA        010
BBB        BBB        000
DBC        BBB        201
DCC        CCC        100
DCC        CCC        100
DEE        DDD        011
DFE        DDD        021
FFE        EEE        110
FGE        EEE        120
FGG        FFF        011
GGH        FFF        112
HHH        GGG        111
IIH        GGG        221
JII        HHH        211
JJI        HHH        221
JKK        III        122
JKL        III        123
KKL        JJJ        112
LLL        JJJ        222

그것은 본질적으로 나의 것과 같은 접근 방식처럼 보이지만, 5의 기본으로 인코딩 해야하는 4의 단일 델타를 피할 수있었습니다.
피터 테일러

내 게시물을 게시 한 후 답변을 확인했습니다. 나는 Cjam을 따를 수는 없지만 대답에서 말한 것과 비슷한 접근법입니다. 실제로 3전체 테이블에 하나만 있습니다 (하단 근처).베이스 라인을 사용하는 것이 실제로 가능할 수도 있습니다. (골프의 이유로 기준선을 약간 변경해야 할 것 같습니다. 오히려 3을 더 많이 제공하지만 불행히도 루비의 순진한 솔루션보다 1 바이트 길어질 것 같습니다.
Level River St

이전에 명확하지 않은 경우, 저의 의도는 당신이 저보다 더 나은 일을하도록 축하하는 것이 었습니다. 그리고 나는 randomra의 차분 인코딩 접근법을 이길 것이라고 생각하지 않기 때문에 2.5의 성장률을 사용하지 않을 것입니다.
피터 테일러

@PeterTaylor 감사합니다. 축하합니다. 다른 한편으로, 당신은 기본적으로 같은 생각으로 처음에 그것을 훨씬 더 짧게 만들었으므로 축하합니다. randomra의 차이 접근 방식으로 마침내 순진한 솔루션보다 짧을 수 있습니다. 4x15에서도 잘 작동합니다 (오른쪽 pentomino 레이아웃이 주어짐). 이것이 C 또는 8. 비트 문자열과 잘 작동하는 다른 언어로 수행하는 방식입니다. Ruby는 유니 코드를 지원하므로 8 비트 문자열을 유니 코드로 해석하려고 시도하고 성가신 오류 메시지를 표시 할 수 있습니다.
Level River St

0

푸, 66 바이트

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

이것은 위의 Microscript II 솔루션과 동일한 문자 대 문자입니다 ...이 언어가 관련되어 있다고 가정합니까?
Darrel Hoffman

1
@DatrelHoffman, foo는 기본적으로 모든 것을 따옴표로 인쇄합니다
Teoc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.