Tujuan Anda adalah untuk menulis encoder semaphore bendera , yang akan mengubah kalimat yang diberikan menjadi karakter semaphore bendera yang sesuai, sesuai dengan sistem semaphore yang dijelaskan di Wikipedia .
Asumsikan bahwa input adalah satu kalimat yang diberikan melalui stdin (atau setara). Keluaran Anda harus berupa serangkaian karakter semafor, dengan setiap baris mewakili satu kata dari kalimat. Anda hanya perlu berurusan dengan alfabet (AZ) dan harus mengabaikan semua karakter non-spasi lainnya, tetapi Anda harus dapat menangani huruf besar dan kecil. Output Anda diizinkan mengandung spasi putih tambahan.
Karakter semafor harus ditampilkan sebagai kotak 3x3, dengan posisi O
di tengah dan bendera diwakili oleh karakter | - / \
. Setiap karakter semafor harus dipisahkan dari karakter yang berdekatan dengan spasi, dan setiap baris harus dipisahkan oleh garis kosong. Jangan khawatir tentang membungkus kata-kata yang mungkin terlalu panjang untuk tampilan Anda - berpura-pura bahwa garis Anda memiliki panjang yang tak terbatas.
Input sampel:
abcdefg hijklmn opqrstu vwxyz
Output sampel:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Input sampel:
This is Code Golf.
Output sampel:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Karena ini adalah kode-golf , solusi terpendek menang.
and each row must be separated by a blank line
=> setiap kata dimaksudkan, bukan?Jawaban:
Perl,
282264251247245243241240236233229227220218216214 karakterDengan beberapa jeda garis prettifying:
Butuh beberapa saat untuk menyelesaikannya (upaya pertamaku pada jawaban Perl). Ini didasarkan pada ide yang mirip dengan banyak jawaban lain. Setiap bendera dapat berada di salah satu dari 8 posisi, ada dua bendera, dan kedua bendera tersebut tidak dapat berada di posisi yang sama. Ini berarti saya dapat mengkodekan posisi kedua flag dalam satu byte - yang juga berarti saya dapat menerjemahkan langsung dari karakter ke pengkodeannya menggunakan
y///
fungsi Perl (operator?). Begitu:-Karena itu:
Saya telah lolos dari beberapa karakter yang berada di luar rentang yang biasa digunakan untuk mempermudah penyalinan dan menempelkan program - tetapi saya cukup yakin saya bisa menulis program untuk mengganti kode pelarian dengan karakter itu sendiri menyelamatkan saya kira-kira 30 karakter.
sumber
Python,
244238233232Ini menggunakan trik favorit saya: pengodean single-track. Saya telah memberi label bit semaphore (sbits)
untuk mendapatkan bagan berikut yang sbits terjadi untuk surat yang mana:
setiap huruf muncul tepat dua kali dalam bagan, karena pemberi sinyal memiliki dua tangan. Kemudian, saya melihat ini sebagai grafik pada huruf az, dengan tepi antara huruf berbagi sbits, dengan tepi berlabel sesuai dengan sbit bersama. Idealnya, saya akan menemukan jalur Hamilton melalui grafik ini, sehingga tepi berikutnya tidak memiliki label yang sama. Tidak ada jalur seperti itu ... jadi Anda akan perhatikan bahwa variabel
e
berisi surat itub
dua kali.Dengan jalur hampir-Hamilton
e
saya, saya membangun sebuah arrayd
label sbit yang digunakan dalam traversale
. Kemudian, untuk mencari tahu di mana harus meletakkan lengannya, pemberi sinyal hanya perlu menemukan huruf yang diinginkan dalam bagan praktis berikutdari mana tangannya berada pada posisi tepat di bawah, dan di bawah & kanan surat itu.
sumber
to_lower()
kelower()
. Juga, itu memberikan kesalahan ketika saya mencoba memberikan input non-alfabet.Scala, 272 karakter
Tidak diseret (well, kurang golf):
sumber
Ruby, 287 karakter
Masukan harus diberikan pada STDIN.
sumber
Scala
494 tanpa baris baru520 dengan baris baru:ungolfed:
Penjelasan:
Saya mengamati pola-jam, tetapi tidak dengan 12 jam, tetapi 8. Dan Starttime adalah 0 adalah, di mana jam 6 adalah, dan a, b, c adalah kode pertama, dengan bendera (satu) pertama di Selatan.
Karena flag 1 dan 2 tidak dapat dibedakan, kami dapat mengurutkan semua kombinasi dengan angka yang lebih rendah untuk flag pertama terlebih dahulu. Sayangnya, urutan yang baik dari awal terganggu, ketika j tidak mengikuti saya, tetapi k, l, m, dan kemudian menjadi berantakan.
Karenanya saya mengatur ulang kunci saya untuk pemetaan:
Jika kita mengurangi 'a' dari setiap karakter, kita mendapatkan angka dari (0 hingga 7 + 6 + 5 + ... + 1). Kami dapat memetakan angka dari kotak karakter
Sepasang dua angka dapat memetakan dua bendera, di mana angka pertama adalah indeks dari 0 hingga 6 untuk bendera pertama, dan bendera kedua bukanlah angka dari 1 hingga 7 untuk bendera kedua, tetapi untuk jarak dari pertama ke bendera kedua. (2,2) berarti, bendera pertama adalah BARAT, dan yang kedua adalah dua langkah searah jarum jam dari sana, ke UTARA.
sumber
object Main extends Application
blok, tetapi itu tampaknya tidak cukup.readLine
pada baris terakhir dengan"readLine"
itu harus berfungsi (kode 2,8 kompatibel).Haskell
331357339 karakterGolf:
Tidak Disatukan:
Pengkodean adalah di
[hour, minute]
mana jam memiliki 8 jam dan 8 menit. Menit bergerak lebih cepat daripada jam. Jika jam berdetik di mana jam dan menit akan sama, tambahkan 1 ke jam dan 2 juga sebagai menit (lihat contoh centang kedua di atas). Itulah satu-satunya cara peningkatan jam. Jam TIDAK bertambah ketika menit mencapai beberapa menit sewenang-wenang. Hanya ketika menit akan sama dengan jam. Dalam kode yang tidak diubah,clock
mengubah huruf menjadi jam yang mewakili semafor. Sebagian besar jam dibangun berdasarkan detakan dari yang sebelumnya. Sisanya kode keras. Tidak ada yang lebih dari kode.sumber
Perl,
356, 275 karakterSejumlah besar karakter disimpan dengan mengganti 'jika lain' menjadi '? : 'konstruksi.
sumber
<>
alih-alih,$ARGV[0]
Anda dapat mengambil input dari stdin dan menggunakanlc
untuk mengubah semua karakter menjadi huruf kecil. Ini memiliki manfaat tambahan untuk menghemat 4 karakter. Itu tidak menangani karakter non-alfabet juga, tetapi bisa dibilangYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
tidak terlalu jelas tentang apa yang harus dilakukan dengan mereka ...PowerShell ,
198192191188 byteCobalah online!
Output berisi satu baris baris kosong.
Kurang golf:
sumber
Arang , 70 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Pisahkan input dengan huruf kecil pada spasi dan lewati setiap kata.
Ulangi setiap karakter.
Pisahkan string yang dikompresi
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
pada spasi dan loop di atas setiap grup huruf.Jika grup berisi huruf saat ini maka buat garis ke arah saat ini.
Putar 45 ° searah jarum jam.
Keluarkan pusat
o
dan pindah ke posisi huruf berikutnya.Pindah ke awal kata berikutnya.
sumber