t(*a,*b,c){char*z="VP\225TBUIUVAaUZ@AWVDeTf@EVWhU😎EQV😀RTYT😉UU";for(size_t*p,f,n,y,i;c--;b++){f=1<<(8-*b)/3;p=z+*b++*8+*b++%f*2;f=n=*p;for(y=i=0;i<=f%4;y=fmax(y,a[*b+i++]+n%4))n/=4;for(;i--;a[*b+i]=y+n%4)n/=4;}}
온라인으로 사용해보십시오!
ps 실제로 UTF-8로 코딩 된 UNICODE 문자로 인해 코드 크기는 221 바이트 (그러나 212 자)입니다. 그러나 tio.run 은 그것을 212 바이트 코드로 취급합니다 ...
내 컴퓨터의 코드 크기는 209 자 (218 바이트)입니다. 그러나 tio.run \225
에서 보이는 char로 바꿀 수 없었습니다.
Ungolfed 코드
// a - output array (must be zeroed), b - array of block info, c - number of blocks
// Figure codes: 2->0, 3->1, 6->2, 1->3, 5->4, 7->5, 4->6 (0,1 are L-figures, 2 is is T-figure, 3 is a line 1x4; 4,5 are zigzags; 6 is a cube 2x2)
// Vertical and horizontal positions are zero-indexed, angles = 0..3
t(*a,*b,c)
{
char*z="VP\225TBUIUVAaUZ@AWVDeTf@EVWhU😎EQV😀RTYT😉UU"; // UTF-8
//char*z="VP\225TBUIUVAaUZ@AWVDeTf@EVW\1hU😎\26EQV😀RTYT😉UU"; // 3 bytes longer (use it if you can't copy previous string correctly) :)
// Blocks
for(size_t*p,f,n,y,i;c--;b++){
f=1<<(8-*b)/3; // number of figure variants
p=z+*b++*8+*b++%f*2;
// Get top base line position (y)
f=n=*p; // figure width, TBLs and HATs
for(y=i=0;i<=f%4;
y=fmax(y,a[*b+i++]+n%4))
n/=4;
// Add heights (HATs)
for(;i--;
a[*b+i]=y+n%4)
n/=4;
}
} // 215 chars (224 bytes)
기술
각 그림의 상단 기준선 ( TBL )을 찾아서 각 수평 위치에 대해 TBL 아래의 여러 셀로 설명하겠습니다. 또한 TBL ( HAT ) 위의 셀 수 (높이)를 설명하겠습니다 .
예 :
________ ________
_ [] _____ HAT = 1,0,0 [] [] [] HAT = 0,0,0 ___ [] [] _ HAT = 0,1,1 [] [] [] HAT = 0,0,0
[] [] [] TBL = 1,1,1 [] TBL = 2,1,1 [] [] TBL = 1,1,0 [] TBL = 1,2,1
각 그림 및 각 회전 각도에 대한 TBL 및 HAT를 설명하겠습니다.
폭 TBL HAT
----- ------- -------
L- 피겨 :
311 11 10 // 0 °
2 1 0 2 // 90 °
3112 20 // // 180 °
2 3 0 0 // 270 °
3 11 1 0 1 // 0 °
2 3 0 0 // 90 °
3112 10 // // 180 °
2112 2 // 270 °
T 그림 :
311 1010 // 0 °
2212 1 // 90 °
3112 0 // // 180 °
212 1 // 270 °
선:
4 1 1 10 10 0 // 0 °, 180 °
140 // 90 °, 270 °
지그재그 :
3110 0 1 // 0 °, 180 °
2212 // // 90 °, 270 °
301111 // // 0 °, 180 °
212 1 // 90 °, 270 °
입방체:
2 2 0 0 // 모든 각도
(대체 이제 우리는 2 비트의 시퀀스로 이들 숫자를 인코딩 및 배열에 넣어야 4 0
로 3 1
- 1에 의해 감소 폭이 동일하게 될 것이다 따라서 2 비트에 맞는 "라인"90 ° 각도).
너비 (2 LSB), TBL , HAT (후진 루프의 경우 뒤로 )의 순서로 인코딩 합니다. 예 2 2 1 1 0
를 들어 T- 피겨의 270 ° 각도에 대해 1 0 1 2 1
(마지막 1 은 너비 -1 ) 로 인코딩됩니다 0b0100011001 = 281
.
12.02 업데이트 :
a) 배열을 문자열로 변환하고 18자를 저장했습니다 (이전 239 바이트 코드를 볼 수 있습니다 ) :))
b)보다 최적화 된 코드는 9 문자로 줄어 듭니다.
이것은 나의 마지막 시도이다 (나는 그렇게 생각한다, lol!) 😀
I
,R
그리고P
다른 순서로 입력 할 수?