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.)
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
sumber
Jawaban:
CJam, 464 byte
Anda pikir CJam tidak memiliki fungsi manipulasi gambar? Nah, Anda berpikir benar! Tetapi saya tidak akan membiarkan itu menghentikan saya.
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:
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,
sumber
PHP, 811 byte
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
\n
tes":( Anda dapat mencobanya di ideone , meskipun itu tidak akan membuat halaman untuk Anda.)
sumber