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个字节)。但是我无法\225
在tio.run中用可见的char 代替
非高尔夫代码
// 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 HATs
----- ------- -------
L字:
3 1 1 1 1 0 0 // 0°
2 1 1 0 2 // 90°
3 1 1 2 0 0 0 // 180°
2 3 1 0 0 // 270°
3 1 1 1 0 0 1 // 0°
2 1 3 0 0 // 90°
3 2 1 1 0 0 0 // 180°
2 1 1 2 0 // 270°
T型图:
3 1 1 1 0 1 0 // 0°
2 1 2 0 1 // 90°
3 1 2 1 0 0 0 // 180°
2 2 1 1 0 // 270°
线:
4 1 1 1 1 0 0 0 0 // 0°,180°
1 4 0 // 90°,270°
之字形:
3 1 1 0 0 1 1 // 0°,180°
2 1 2 1 0 // 90°,270°
3 0 1 1 1 1 0 // 0°,180°
2 2 1 0 1 // 90°,270°
立方体:
2 2 2 0 0 //任何角度
现在我们应该编码这些数字作为2位的序列,并把成阵列(代替4 0
通过3 1
为“线”,以适应在2位的90°角-结果将是相同的;可以通过1和减小宽度)。
我们将按顺序编码:宽度(以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个字符。
这是我最后一次尝试(我是这么认为的,哈哈!) 😀
I
,R
并P
可以以不同的顺序输入?