Bảng chữ cái cờ hàng hải ICS


14

Bảng chữ cái cờ quốc tế về tín hiệu được sử dụng bởi các tàu để liên lạc, đặc biệt là các tín hiệu tĩnh.

Thách thức của bạn là viết một chương trình hoặc hàm sẽ lấy một chuỗi từ STDIN hoặc làm đối số và hiển thị văn bản tương ứng trong bảng chữ cái cờ ICS. Nếu ngôn ngữ của bạn không hiển thị trên màn hình, việc lưu vào một tệp là chấp nhận được.

Chương trình hoặc chức năng của bạn sẽ hỗ trợ chữ AZ ở trên và chữ thường, cộng với không gianNewline . Hành vi với các nhân vật khác là không xác định.

Màn hình phải đủ lớn để hiển thị có khả năng hiển thị ít nhất 8 cờ theo chiều ngang và 6 cờ theo chiều dọc. Hành vi không được xác định nếu đạt được cạnh bên phải trước khi nhận được dòng mới hoặc nếu thông báo quá dài để phù hợp với màn hình theo chiều dọc.

Bảng chữ cái cờ như dưới đây (chữ La Mã chỉ để tham khảo, chúng không bắt buộc trong đầu ra.)

nhập mô tả hình ảnh ở đây

Kích thước

Không có tiêu chuẩn thống nhất chung về kích thước của các cờ này, vì vậy với mục đích của thử thách này, sẽ áp dụng như sau:

Cờ phải là 60x60 pixel, với khoảng cách 30 pixel giữa chúng theo chiều ngang và chiều dọc.

Các cánh én cắt trên A và B phải sâu 15 pixel.

Tất cả các dòng khác phải là ngang, dọc hoặc ở 45 độ.

Các tính năng sẽ được định vị bằng cách chia cờ thành một lưới NxN tưởng tượng có cạnh 3,4,5 hoặc 6 hình vuông. Tham khảo hình ảnh trên, nhưng để làm rõ thêm:

A, E, H, K, L và U dựa trên lưới 2x2: chiều rộng của mỗi vùng màu sẽ là 30 pixel. Ngoài ra, các điểm của viên kim cương trong F sẽ nằm ở giữa mỗi bên của lá cờ.

J và T dựa trên lưới 3x3: mỗi dải sẽ là 20 pixel.

P, N và S dựa trên lưới 4 x 4. Ngoài ra, các đường chéo của Y sẽ chia các cạnh của cờ thành 4.

C, D, R và X phải dựa trên lưới 5x5. Dải và cánh tay chéo phải rộng 12 pixel.

G, W, M, V dựa trên lưới 6x6. Các dải G và viền của W phải rộng 10 pixel. Các nhánh chữ thập trên M và V sẽ bao phủ 10 pixel đầu tiên và cuối cùng của mỗi cạnh của cờ, để lại các vùng tam giác có kích thước 40 pixel dọc theo cạnh dài.

Vòng tròn của I sẽ ở giữa cờ và có đường kính 30 pixel.

Lỗi +/- 1 pixel từ văn bản trên được cho phép. Nếu ngôn ngữ của bạn chỉ hỗ trợ đồ họa có thể mở rộng, bạn có thể hiểu "pixel" thành "đơn vị".

Màu sắc

Màu sắc sẽ là đỏ, trắng, xanh, vàng và đen như được xác định bởi ngôn ngữ của bạn hoặc tài liệu của nó. Nếu ngôn ngữ của bạn không xác định màu sắc, bạn có thể sử dụng các màu sau: Đỏ FF0000, Trắng FFFFFF, Xanh 0000FF, Vàng FFFF00, Đen 0000000.

Nền sẽ có màu xám (các kênh r, g và b bằng nhau, cường độ từ 25% đến 75%.)

Chấm điểm / sơ hở

Đây là cá tuyết. Mã ngắn nhất trong byte thắng.

Sơ hở tiêu chuẩn là không được phép.

Không có chức năng dựng sẵn hoặc thư viện để hiển thị cờ có thể được sử dụng. Đầu ra không phải là văn bản (và đặc biệt, các ký tự unicode sẽ không được sử dụng để xây dựng hình dạng cờ.)

Thí dụ

JFK got
my VHS
PC
and XLR
web quiz

nên sản xuất như sau

nhập mô tả hình ảnh ở đây


Tôi không hoàn toàn chắc chắn ý của bạn là " Màn hình phải đủ lớn để hiển thị ít nhất 8 cờ theo chiều ngang và 6 cờ theo chiều dọc ", đặc biệt là trường hợp thử nghiệm của bạn hiển thị đầu ra chỉ cao 5 cờ. Có phải chỉ là các câu trả lời phải xử lý các thông báo theo các kích thước đó và không bắt buộc phải xử lý các thông báo lớn hơn hoặc bạn có ý định yêu cầu tất cả các dòng phải được đệm ít nhất 8 ký tự và tất cả các thông báo cho ít nhất 6 dòng không?
Peter Taylor

1
@PeterTaylor Nếu chương trình hoặc ngôn ngữ của bạn đủ thông minh để thay đổi kích thước màn hình theo đầu ra, thì không cần phải hiển thị màn hình thành 8x6 nếu đầu ra nhỏ hơn. Đầu ra phải có nền màu xám và hình chữ nhật (tất cả các dòng được đệm ít nhất bằng chiều dài của dòng dài nhất.)
Level River St

Câu trả lời:


15

CJam, 464 byte

Bạn nghĩ rằng CJam không có chức năng xử lý hình ảnh? Vâng, bạn nghĩ đúng! Nhưng tôi sẽ không để điều đó ngăn cản tôi.

"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;}/`"[]"-

Chương trình này xuất hình ảnh theo cách tốt nhất mà CJam có thể: dưới dạng văn bản đại diện cho hình ảnh khi được lưu dưới dạng tệp PPM . Thậm chí, đừng thử chạy nó với trình thông dịch trực tuyến; bạn sẽ thổi tung đống. Chạy nó với trình thông dịch Java và dẫn đầu ra thành một tệp với lệnh như thế nào java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Khi bạn đã cung cấp đầu vào của mình, hãy gửi EOF (có thể cần ngay sau dòng mới) với ctrl + D trên Unix hoặc ctrl + Z trên Windows.

Mẫu vật

Nếu nó thực sự mong muốn, tôi có thể thử dán nguồn hình ảnh gốc ~ 3 MB ở đâu đó. Nhưng đây là kết quả được mở trong GIMP và được xác nhận là PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alph.us.png

Giải trình

Tiêu đề hình ảnh, dễ dàng xác định trong nguồn, bao gồm số ma thuật, chiều rộng, chiều cao và giá trị kênh tối đa. Vì vậy, đầu ra là một hình ảnh 690 * 690 (đủ cho các cờ 8 * 8 60px với khoảng cách 30px giữa chúng) với mỗi giá trị R, G và B nằm trong khoảng từ 0 đến 4.

Dữ liệu hình ảnh được khởi tạo là một mảng 690 * 690 * 3 chứa đầy 3, làm cho toàn bộ hình ảnh có màu xám nhạt. Sau đó, đầu vào được đọc, chuyển đổi thành chữ hoa và chia thành các dòng. Các dòng được xử lý trong một vòng lặp, tăng tọa độ cờ Y thêm 90 mỗi lần lặp và trong mỗi dòng, mỗi ký tự được xử lý trong một vòng lặp, tăng tọa độ cờ X lên 90 mỗi lần lặp. Bây giờ phép thuật bắt đầu.

Mỗi ký tự được ánh xạ tới chức năng pixel của cờ, khi được gọi, sẽ trả về màu của pixel tại vị trí (X, Y) trên cờ. Đây là nơi mà hầu hết các công việc khó khăn đã diễn ra: mô tả chính xác 26 hình ảnh dưới dạng các hàm toán học. Mỗi hàm này trả về một giá trị màu từ 8-15. Phạm vi này lợi dụng thực tế là, khi được chuyển đổi sang cơ sở 2, mảng bit kết quả có thể được hiểu là [1, R, G, B]. Phần tử đầu tiên có thể được loại bỏ và phần còn lại nhân với 4 để dễ dàng đưa ra một giá trị pixel theo định dạng mong muốn bao gồm tất cả các màu cờ có thể (cũng như màu lục, lục lam và đỏ tươi). Nó cũng hoạt động độc đáo rằng có các biến một ký tự được khởi tạo thành 10-15 và vì các biến không cần một khoảng trống để phân tách chúng theo cú pháp,

Khi chức năng được truy xuất, đó chỉ là vấn đề lặp lại trên cả X và Y từ 0-60, gọi hàm ở mỗi bước và ghi kết quả trở lại mảng dữ liệu ảnh. Một người quan sát sắc sảo có thể nhận thấy rằng các giá trị màu được trả về bởi mỗi hàm cờ không cho phép màu xám. Vì vậy, có một chút logic để bỏ qua không gian. Nhưng vẫn còn những vết cắt đuôi én trên 'A' và 'B'. Vì vậy, có một chút logic thêm ở đó, quá. Nếu giá trị ký tự nhỏ hơn 'C', một giá trị được đặt sao cho giới hạn trên của vòng X thay đổi chính xác đối với Y và các khu vực cắt không bao giờ được rút ra.

Nhìn chung, tôi khá hài lòng với cách thức này xuất hiện. Phải mất rất nhiều công sức, nhưng nó rất vui. Một số cờ không khớp hoàn toàn với hình ảnh tham chiếu, nhưng tôi nghĩ rằng tôi có tất cả các hình dạng nằm trong phạm vi 1px của mục tiêu (nếu có nhiều hơn thế, hãy cho tôi biết và tôi sẽ sửa chúng). Và chắc chắn vẫn còn tiềm năng để tối ưu hóa, vì có một lượng dư thừa khá lớn giữa 26 chức năng cờ.


Suy ra lần thử đầu tiên, 559 byte

Tôi chưa bao giờ hoàn thành việc này, tôi cũng sẽ đăng nó, vì nó khá thú vị. Thay vì mô hình hóa mỗi cờ theo chức năng (X, Y) → màu sắc, các cờ được vẽ như một thành phần của các hình dạng đơn giản. Nhưng tôi đã lo lắng về việc cần phải viết một số lượng đáng kể mã kết xuất cho mỗi hình dạng khác nhau. Sau rất nhiều suy ngẫm, tôi nhận ra rằng tôi có thể kết xuất tất cả chúng, với một số chồng chéo và rút tiền thông minh, chỉ với một hình dạng giả: tất cả các điểm trong một khoảng cách xác định của một điểm xác định, trong đó định nghĩa về "khoảng cách" là khác nhau. Khoảng cách bàn cờ cho một hình vuông, khoảng cách Manhattan cho một viên kim cương và khoảng cách Euclide cho một hình tròn. Điều này có nghĩa là mọi hình dạng đều có cùng năm tham số (màu sắc, chế độ khoảng cách, 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
Tuyệt vời, đây là loại câu trả lời sáng tạo mà tôi đang tìm kiếm. Sẽ cố gắng để chạy nó sau.
Cấp sông St

1
Đây hoàn toàn có thể là mã CJam dài nhất tôi từng thấy. Mặc dù công việc tốt, +1.
Alex A.

Một lần nữa, CJam xuất hiện để cứu ngày.
ASCIIThenANSI

9
Thật không may, đó là hành vi phạm tội của liên bang khi đăng mã CJam dài hơn 200 byte. Tôi sẽ phải đưa bạn vào tù.
Deusovi

2

PHP, 811 byte

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 nén chứa mã SVG cho mỗi trong số 26 cờ. Một vòng lặp đơn giản sau đó trích xuất và xuất hình ảnh SVG tương ứng với từng ký tự của đầu vào.

Đầu ra mẫu cho "Đây là \nmột thử nghiệm":

<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>

( Bạn có thể dùng thử tại ideone , mặc dù nó sẽ không hiển thị trang cho bạn.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.