Alfabet Bendera Maritim ICS

14

Alfabet bendera kode Sinyal Internasional digunakan oleh kapal untuk komunikasi, terutama untuk sinyal statis.

Tantangan Anda adalah menulis program atau fungsi yang akan mengambil string dari STDIN atau sebagai argumen, dan menampilkan teks yang sesuai dalam alfabet bendera ICS. Jika bahasa Anda tidak ditampilkan di layar, menyimpan ke file dapat diterima.

Program atau fungsi Anda harus mendukung huruf AZ dalam huruf besar dan kecil, ditambah Space dan Newline . Perilaku dengan karakter lain tidak ditentukan.

Layar harus cukup besar untuk menampilkan mampu menampilkan setidaknya 8 bendera secara horizontal dan 6 bendera secara vertikal. Perilaku tidak terdefinisi jika tepi kanan tercapai sebelum baris baru diterima, atau jika pesan terlalu panjang untuk masuk ke tampilan secara vertikal.

Alfabet bendera adalah seperti yang ditunjukkan di bawah ini (huruf Romawi hanya untuk referensi, mereka tidak diperlukan dalam output.)

masukkan deskripsi gambar di sini

Ukuran

Tidak ada standar yang disepakati secara universal untuk dimensi bendera-bendera ini, jadi untuk tujuan tantangan ini yang berikut akan berlaku:

Bendera harus berukuran 60x60 piksel, dengan jarak 30 piksel di antaranya secara horizontal dan vertikal.

Potongan swallowtail pada A dan B harus sedalam 15 piksel.

Semua garis lainnya harus horisontal, vertikal, atau pada 45 derajat.

Fitur harus ditempatkan dengan membagi bendera menjadi kisi NxN sisi sisi 3,4,5 atau 6 kotak imajiner. Lihat gambar di atas, tetapi untuk klarifikasi lebih lanjut:

A, E, H, K, L dan U didasarkan pada kisi 2x2: lebar setiap zona warna harus 30 piksel. Juga titik-titik berlian di F harus setengah di sepanjang setiap sisi bendera.

J dan T didasarkan pada kisi 3x3: setiap pita harus 20 piksel.

P, N, dan S didasarkan pada kisi 4x4. Juga garis diagonal Y akan membagi tepi bendera menjadi 4.

C, D, R dan X harus didasarkan pada kisi 5x5. Pita dan lengan persilangan harus memiliki lebar 12 piksel.

G, W, M, V didasarkan pada kisi 6x6. Pita G dan batas W harus lebarnya 10 piksel. Lengan persilangan pada M dan V harus mencakup 10 piksel pertama dan terakhir dari setiap tepi bendera, meninggalkan zona segitiga berukuran 40 piksel di sepanjang tepi yang panjang.

Lingkaran I akan berada di tengah bendera dan memiliki diameter 30 piksel.

Kesalahan +/- 1 piksel dari teks di atas diizinkan. Jika bahasa Anda hanya mendukung grafik yang dapat diukur, Anda dapat mengartikan "piksel" berarti "satuan."

Warna

Warna harus merah, putih, biru, kuning dan hitam seperti yang didefinisikan oleh bahasa Anda atau dokumentasinya. Jika bahasa Anda tidak mendefinisikan warna, Anda dapat menggunakan yang berikut: Merah FF0000, FFFFFF Putih, Biru 0000FF, FFFF00 Kuning, Hitam 0000000.

Latar belakang harus berwarna abu-abu (r, g dan b saluran sama, antara intensitas 25% dan 75%.)

Penilaian / Celah

Ini adalah codegolf. Kode terpendek dalam byte menang.

Celah standar tidak diijinkan.

Tidak ada fungsi builtin atau library untuk menampilkan flag yang dapat digunakan. Keluaran harus non-teks (dan khususnya, karakter unicode tidak akan digunakan untuk membangun bentuk bendera.)

Contoh

JFK got
my VHS
PC
and XLR
web quiz

harus menghasilkan yang berikut ini

masukkan deskripsi gambar di sini

Level River St
sumber
Saya tidak sepenuhnya yakin apa yang Anda maksud dengan " Layar harus cukup besar untuk menampilkan setidaknya 8 bendera secara horizontal dan 6 bendera secara vertikal ", terutama mengingat bahwa test case Anda menunjukkan keluaran yang tingginya hanya 5 bendera. Apakah hanya karena jawaban harus menangani pesan hingga dimensi tersebut dan tidak diharuskan untuk menangani yang lebih besar, atau apakah Anda bermaksud mengharuskan semua baris harus diisi setidaknya 8 karakter dan semua pesan hingga minimal 6 baris?
Peter Taylor
1
@PeterTaylor Jika program atau bahasa Anda cukup cerdas untuk mengubah ukuran tampilan sesuai dengan output, tidak perlu untuk menyambungkan display ke 8x6 jika output lebih kecil. Keluaran harus memiliki latar belakang abu-abu dan berbentuk persegi panjang (semua garis empuk hingga setidaknya panjang garis terpanjang.)
Level River St

Jawaban:

15

CJam, 464 byte

Anda pikir CJam tidak memiliki fungsi manipulasi gambar? Nah, Anda berpikir benar! Tetapi saya tidak akan membiarkan itu menghentikan saya.

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

Program ini menampilkan gambar dengan cara terbaik yang dapat dilakukan CJam: sebagai teks yang mewakili gambar saat disimpan sebagai file PPM . Omong-omong, jangan coba-coba menjalankannya dengan penerjemah online; Anda akan meniup tumpukan. Jalankan dengan Java interpreter dan pipe output ke file dengan perintah like java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Setelah Anda memberikan input, kirim EOF (mungkin perlu segera setelah baris baru) dengan ctrl + D di Unix atau ctrl + Z di Windows.

Sampel

Jika benar-benar diinginkan, saya dapat mencoba menempelkan sumber gambar asli ~ 3MB di suatu tempat. Tapi di sini hasilnya dibuka di GIMP dan dikonfirmasikan ke PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Penjelasan

Header gambar, mudah diidentifikasi dalam sumbernya, terdiri dari angka ajaib, lebar, tinggi, dan nilai saluran maksimum. Jadi outputnya adalah gambar 690 * 690 (cukup untuk bendera 8 * 8 60px dengan jarak 30px di antaranya) dengan masing-masing nilai R, G, dan B mulai dari 0 hingga 4.

Data gambar diinisialisasi sebagai array 690 * 690 * 3 diisi dengan 3, membuat seluruh gambar menjadi abu-abu. Kemudian input dibaca, dikonversi ke huruf besar, dan dipisah menjadi beberapa baris. Garis-garis diproses dalam satu lingkaran, menambah koordinat bendera Y dengan 90 setiap iterasi, dan di setiap baris, setiap karakter diproses dalam satu lingkaran, menambah koordinat bendera X dengan 90 setiap iterasi. Sekarang keajaiban dimulai.

Setiap karakter dipetakan ke fungsi piksel bendera yang, ketika dipanggil, mengembalikan warna piksel pada posisi (X, Y) pada bendera. Di sinilah sebagian besar kerja keras dilakukan: menggambarkan 26 gambar dengan ringkas sebagai fungsi matematika. Masing-masing fungsi ini mengembalikan nilai warna dari 8-15. Rentang ini mengambil keuntungan dari fakta bahwa, ketika dikonversi ke basis 2, array bit yang dihasilkan dapat ditafsirkan sebagai [1, R, G, B]. Elemen pertama dapat dihapus dan sisanya dikalikan dengan 4 untuk dengan mudah memberikan nilai piksel dalam format yang diinginkan yang mencakup semua warna bendera yang mungkin (serta hijau, cyan, dan magenta). Ini juga berfungsi dengan baik bahwa ada variabel satu karakter yang diinisialisasi ke 10-15, dan karena varaibles tidak memerlukan ruang untuk memisahkannya secara sintaksis,

Setelah fungsi diambil, itu hanya masalah iterasi X dan Y dari 0-60, memanggil fungsi pada setiap langkah, dan menulis hasilnya kembali ke array data gambar. Pengamat yang cerdik mungkin memperhatikan bahwa nilai warna yang dikembalikan oleh masing-masing fungsi bendera tidak memungkinkan abu-abu. Jadi ada sedikit logika ekstra untuk melewati spasi. Tetapi masih ada potongan swallowtail pada 'A' dan 'B'. Jadi ada sedikit logika ekstra di sana juga. Jika nilai karakter kurang dari 'C', nilai diatur sedemikian rupa sehingga batas atas pada loop X bervariasi dengan benar sehubungan dengan Y dan area cut-out tidak pernah ditarik.

Secara keseluruhan, saya cukup senang dengan bagaimana ini keluar. Butuh banyak pekerjaan, tapi itu menyenangkan. Beberapa bendera tidak cocok dengan gambar referensi, tapi saya pikir saya punya semua bentuk berada dalam 1px dari target (jika ada yang mati lebih dari itu, beri tahu saya dan saya akan memperbaikinya). Dan pasti masih ada potensi untuk dioptimalkan, karena ada cukup banyak redundansi antara fungsi 26 flag.


Upaya percobaan pertama, 559 byte

Meskipun saya belum pernah menyelesaikan ini, saya akan mempostingnya juga, karena ini cukup menarik. Alih-alih memodelkan setiap bendera dengan fungsi (X, Y) → warna, bendera digambar sebagai komposisi bentuk sederhana. Tetapi saya khawatir perlu menulis sejumlah besar kode rendering untuk setiap bentuk yang berbeda. Setelah banyak merenung, saya menyadari bahwa saya bisa membuat semuanya, dengan beberapa tumpang tindih dan overdrawing pintar, hanya dengan satu bentuk semu: semua titik dalam jarak tertentu dari titik tertentu, di mana definisi "jarak" adalah variabel. Jarak papan catur memberikan persegi, jarak Manhattan memberikan berlian, dan jarak Euclidean memberikan lingkaran. Ini berarti setiap bentuk memiliki lima parameter yang sama (warna, mode jarak, 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;}/`"[]"-
Runer112
sumber
1
Luar biasa, ini adalah jenis jawaban kreatif yang saya cari. Akan mencoba menjalankannya nanti.
Level River St
1
Ini sangat mungkin kode CJam terpanjang yang pernah saya lihat. Kerja bagus, +1.
Alex A.
Sekali lagi, CJam tampaknya menyelamatkan hari.
ASCIIThenANSI
9
Sayangnya, merupakan pelanggaran federal untuk memposting kode CJam lebih dari 200 byte. Aku harus menahanmu.
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]);}}

Gumpalan terkompresi berisi kode SVG untuk masing-masing dari 26 bendera. Sebuah loop sederhana kemudian mengekstraksi dan mengeluarkan gambar SVG yang sesuai dengan setiap karakter input.

Contoh output untuk "Ini adalah \ntes":

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

( Anda dapat mencobanya di ideone , meskipun itu tidak akan membuat halaman untuk Anda.)

r3mainer
sumber