ICS 해상 깃발 알파벳


14

국제 신호 코드 플래그 알파벳 은 선박, 특히 정적 신호의 통신에 사용됩니다.

STDIN에서 문자열을 가져 오거나 인수로 사용하는 프로그램이나 함수를 작성하고 해당 텍스트를 ICS 플래그 알파벳으로 표시해야합니다. 언어가 화면에 표시되지 않으면 파일로 저장할 수 있습니다.

프로그램 또는 기능 은 대문자 및 소문자 AZ공백줄 바꿈 문자를 지원해야합니다 . 다른 문자와의 동작은 정의되어 있지 않습니다.

디스플레이는 수평으로 최소 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 픽셀을 덮으며 삼각형 영역은 긴 모서리를 따라 40 픽셀로 남습니다.

I의 원은 깃발의 중앙에 있으며 지름은 30 픽셀입니다.

위의 텍스트에서 +/- 1 픽셀의 오류가 허용됩니다. 언어가 확장 가능한 그래픽 만 지원하는 경우 "픽셀"을 "단위"로 해석 할 수 있습니다.

그림 물감

색상은 해당 언어 또는 문서에 정의 된대로 빨강, 흰색, 파랑, 노랑 및 검정이어야합니다. 언어가 색상을 정의하지 않으면 빨간색 FF0000, 흰색 FFFFFF, 파란색 0000FF, 노란색 FFFF00, 검은 색 0000000을 사용할 수 있습니다.

배경은 회색이어야합니다 (r, g 및 b 채널은 25 % ~ 75 % 강도).

득점 / 루프 홀

이것은 codegolf입니다. 바이트 단위의 최단 코드가 이깁니다.

표준 허점 은 허용되지 않습니다.

플래그를 표시하기위한 내장 함수 나 라이브러리 함수를 사용할 수 없습니다. 출력은 텍스트가 아니어야합니다 (특히 유니 코드 문자는 플래그 모양을 만드는 데 사용되지 않아야합니다).

JFK got
my VHS
PC
and XLR
web quiz

다음을 생성해야합니다

여기에 이미지 설명을 입력하십시오


" 테스트 화면에 높이가 5 플래그 인 출력이 표시되는 경우" 디스플레이가 수평으로 최소 8 플래그 , 수직으로 6 플래그를 표시 할만큼 충분히 커야합니다. "라는 의미가 무엇인지 잘 모르겠습니다 . 응답이 해당 차원까지의 메시지를 처리해야하고 더 큰 메시지를 처리 ​​할 필요가없는 것입니까, 아니면 모든 줄을 8 자 이상으로 채우고 모든 메시지를 6 줄 이상으로 채워야합니까?
Peter Taylor

1
@PeterTaylor 프로그램 또는 언어가 출력에 따라 디스플레이 크기를 조정할만큼 지능적인 경우 출력이 더 작은 경우 디스플레이를 8x6으로 채울 필요가 없습니다. 출력은 회색 배경이어야하고 직사각형이어야합니다 (모든 라인은 최소한 가장 긴 라인의 길이까지 채워집니다).
Level River St

답변:


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 파일 로 저장할 때 이미지를 나타내는 텍스트로 CJam이 할 수있는 최선의 방법으로 이미지를 출력 합니다 . 그건 그렇고, 온라인 통역사와 함께 실행하지 마십시오. 당신은 스택을 날려 버릴 것입니다. 으로 실행 자바 인터프리터 같은 명령으로 파이프 출력을 파일로 java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. 입력을 제공 한 후에는 Unix에서는 ctrl + D, Windows에서는 ctrl + Z를 사용하여 EOF (줄 바꿈 바로 다음에 필요할 수도 있음)를 보내십시오.

견본

정말로 원한다면 원래 ~ 3MB 이미지 소스를 어딘가에 붙여 넣을 수 있습니다. 그러나 다음은 김프에서 열린 결과이며 PNG로 이어졌습니다.

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

설명

소스에서 쉽게 식별 할 수있는 이미지 헤더는 매직 수, 너비, 높이 및 최대 채널 값으로 구성됩니다. 따라서 출력은 0에서 4까지의 각 R, G 및 B 값으로 690 * 690 이미지 (30 * 간격 사이에 8 * 8 60 픽셀 플래그에 충분 함)입니다.

이미지 데이터는 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) → 색상의 함수로 각 플래그를 모델링하는 대신 간단한 모양의 구성으로 플래그가 그려집니다. 그러나 각기 다른 모양에 대해 상당한 양의 렌더링 코드를 작성해야하는 것에 대해 걱정했습니다. 많은 숙고 끝에, 나는 하나의 의사 모양으로, 영리하게 겹치거나 겹쳐서 그것들을 모두 렌더링 할 수 있다는 것을 깨달았습니다. "거리"의 정의는 가변적입니다. 체스 판 거리는 사각형, 맨해튼 거리는 다이아몬드, 유클리드 거리는 원을 나타냅니다. 이는 모든 모양이 5 개의 매개 변수 (색상, 거리 모드, 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
훌륭합니다. 이것은 제가 찾던 창의적인 답변입니다. 나중에 실행하려고합니다.
Level River St

1
이것은 내가 본 것 중 가장 긴 CJam 코드입니다. 그래도 잘 했어, +1
Alex A.

다시 CJam은 하루를 저장하는 것으로 보입니다.
ASCIIThenANSI

9
불행히도 CJam 코드를 200 바이트 이상으로 게시하는 것은 연방법 위반입니다. 당신을 구류해야합니다
Deusovi

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에서 시도해 볼 수는 있지만 페이지를 렌더링하지는 않습니다.)

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