ICS海事标志字母


14

船舶使用“国际信号代码”标志字母进行通信,尤其是静态信号。

您面临的挑战是编写一个程序或函数,该程序或函数将采用STDIN中的字符串或作为参数,并以ICS标志字母显示相应的文本。如果您的语言未显示在屏幕上,则可以保存到文件。

您的程序或函数应支持大写和小写字母AZ,以及SpaceNewline。与其他字符的行为是不确定的。

显示器应足够大,以 能够水平显示至少8个标记,垂直显示 6个标记。如果在收到换行符之前到达右边缘,或者消息太长而无法垂直显示,则行为是不确定的。

标记字母如下所示(罗马字母仅供参考,输出中不需要。)

在此处输入图片说明

尺寸图

对于这些标志的尺寸,没有统一的标准,因此,出于本挑战的目的,应遵循以下规定:

标志应为60x60像素,水平和垂直之间应留有30像素的间隙。

A和B上的燕尾切口应深15像素。

所有其他线应为水平,垂直或成45度角。

通过将标志划分为侧面3、4、5或6个正方形的虚构NxN网格来定位特征。请参考上图,但需要进一步说明:

A,E,H,K,L和U基于2x2网格:每个颜色区域的宽度应为30像素。F中菱形的点也应位于标志两侧的中间。

J和T基于3x3网格:每个波段应为20个像素。

P,N和S基于4x4网格。Y的对角线也应将标志的边缘分成4个。

C,D,R和X应基于5x5网格。十字架的带和臂的宽度应为12像素。

G,W,M,V基于6x6网格。G的带和W的边界应为10像素宽。M和V上的叉臂应覆盖标志每个边缘的前10个像素和最后10个像素,沿长边缘保留40个像素的三角形区域。

I的圆圈应位于标记的中心,并且直径为30像素。

上述文字的误差为+/- 1像素。如果您的语言仅支持可缩放的图形,则可以将“像素”解释为“单位”。

色彩

颜色应为您的语言或其文档定义的红色,白色,蓝色,黄色和黑色。如果您的语言没有定义颜色,则可以使用以下颜色:红色FF0000,白色FFFFFF,蓝色0000FF,黄色FFFF00,黑色0000000。

背景应为灰色(r,g和b通道相等,强度在25%和75%之间。)

计分/漏洞

这是代码高尔夫。以字节为单位的最短代码获胜。

不允许出现标准漏洞

不能使用用于显示标志的内置函数或库函数。输出应为非文本(尤其是不得使用unicode字符来构建标志形状。)

JFK got
my VHS
PC
and XLR
web quiz

应该产生以下

在此处输入图片说明


我不确定您的意思是“ 显示器应该足够大,可以水平显示至少8个标志,垂直显示6个标志 ”,特别是考虑到您的测试用例显示的输出只有5个标志高。仅仅是答案必须处理不超过这些尺寸的消息,而不必处理更大的尺寸,还是您打算要求所有行至少填充8个字符,所有消息至少填充6行?
彼得·泰勒

1
@PeterTaylor如果您的程序或语言足够智能,可以根据输出调整显示的大小,则如果输出较小,则无需将显示填充到8x6。输出应为灰色背景,且应为矩形(所有线至少填充到最长线的长度上。)
Level River St

Answers:


15

CJam,464个字节

您以为CJam没有图像处理功能?好吧,你想的对!但是我不会阻止我的。

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

该程序以CJam可能的最佳方式输出图像:作为保存为PPM文件时代表图像的文本。顺便说一句,甚至不要尝试使用在线解释器来运行它。你会炸毁堆栈。使用Java解释器运行它,并使用像这样的命令将输出通过管道传递到文件java -jar cjam-0.6.4.jar flags.cjam > flags.ppm。输入完毕后,在Unix上使用ctrl + D或在Windows上使用ctrl + Z发送EOF(可能需要在换行符之后立即发送)。

样品

如果确实需要,我可以尝试将原始的〜3MB图像源粘贴到某个地方。但是以下是在GIMP中打开并转换为PNG的结果:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

说明

图像标题在源中易于识别,由幻数,宽度,高度和最大通道值组成。因此输出为690 * 690图像(足够用于8 * 8 60px标志,它们之间的间距为30px),每个R,G和B值的范围为0到4。

图像数据初始化为填充为3的690 * 690 * 3阵列,从而使整个图像变为浅灰色。然后读取输入,将其转换为大写字母,并分成几行。循环处理这些行,每次迭代将标志Y坐标增加90,而在每一行中,循环处理每个字符,每次迭代将标志X坐标增加90。现在魔术开始了。

每个字符都映射到标志的像素函数,该函数在调用时返回标志上位置(X,Y)处像素的颜色。这就是大多数辛苦工作去的地方:简洁地将26张图像描述为数学函数。这些函数中的每一个都返回8-15之间的颜色值。该范围利用以下事实:转换为基数2时,结果位数组可以解释为[1,R,G,B]。可以删除第一个元素,然后将其余元素乘以4,以轻松获得所需格式的像素值,该格式涵盖所有可能的标记颜色(以及绿色,青色和品红色)。还可以很好地得出结论,有一个单字符变量已初始化为10-15,并且由于变量不需要在语法上将它们分开的空格,

检索到函数后,只需在0和60之间对X和Y进行迭代,然后在每个步骤调用该函数,然后将结果写回到图像数据数组即可。机敏的观察者可能会注意到,每个标志函数返回的颜色值均不允许使用灰色。因此,有一些额外的逻辑可以跳过空格。但是在“ A”和“ B”上仍然有燕尾切口。因此,那里还有一些额外的逻辑。如果字符值小于“ C”,则应设置一个值,以使X循环的上限相对于Y正确变化,并且切勿绘制切出区域。

总的来说,我对这个结果如何感到非常满意。花了很多工作,但是很有趣。某些标志与参考图像并不完全匹配,但是我认为我将所有形状都在目标的1px之内(如果有任何形状超出此范围,请告诉我,我将对其进行修复)。而且肯定仍有优化的潜力,因为26个标志函数之间有相当多的冗余。


有趣的第一次尝试,559个字节

尽管我从未完全完成此操作,但我也会将其发布,因为它非常有趣。代替通过(X,Y)→颜色的函数对每个标记建模,标记被绘制为简单形状的组合。但是我担心需要为每种不同的形状编写大量的渲染代码。经过大量的思考,我意识到我可以渲染它们,并进行一些巧妙的重叠和重绘,仅使用一种伪形状:在指定点的指定距离内的所有点,其中“距离”的定义是可变的。棋s距离给出一个正方形,曼哈顿距离给出一个菱形,欧几里得距离给出一个圆。这意味着每个形状都具有相同的五个参数(颜色,距离模式,x,y,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-

1
太好了,这是我一直在寻找的创造性答案。稍后将尝试运行它。
级圣河

1
这很可能是我见过的最长的CJam代码。不错,+ 1。
Alex A.

同样,CJam似乎可以节省一天。
ASCIIThenANSI

9
不幸的是,发布CJam代码超过200个字节是联邦的罪行。我将不得不把你拘留。
Deusovi '16

2

PHP,811字节

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

压缩的Blob包含26个标志中每个标志的SVG代码。然后,一个简单的循环提取并输出与输入的每个字符相对应的SVG图像。

“这是\n测试”的样本输出:

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

您可以在ideone上尝试一下,尽管它不会为您呈现该页面。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.