Pertama saya pernah Pemrograman Puzzle & Kode Golf adalah Tujuh-Slash Tampilan . Inilah Tantangan pertama saya, juga berdasarkan tampilan 7-segmen.
Saya sering memikirkan, selain angka, huruf apa yang bisa saya tampilkan menggunakan layar 7 segmen sederhana. Ternyata banyak surat bisa ditampilkan. Bahkan, semua kecuali huruf K, M, V, W, X dapat ditampilkan menggunakan tampilan 7-segmen tunggal. Ini karena Anda dapat menampilkan huruf kecil atau huruf besar. misalnya
"abcdef" dapat ditampilkan sebagai
_ _ _ _
!_!!_ ! _!!_ !_
! !!_!!_ !_!!_ !
Perhatikan bahwa setiap karakter adalah matriks 3x3 yang terdiri dari !
dan _
.
Tentu saja, tampilan 7-segmen dapat digunakan untuk menampilkan angka dan simbol:
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
Beberapa huruf dapat memiliki huruf besar dan kecil:
_ _
! _ !_!!_ ! ! ! _ ! !
!_ !_ ! !! ! ! !!_!!_!!_!!_!
Berikut ini karakter lengkapnya:
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_! _!!_
Perhatikan bahwa ada spasi putih ( ), tanda hubung (
-
) dan tanda tanya ( ?
). Hurufnya I
, O
dan Z
sama dengan angka 1
, 0
dan 2
masing - masing.
Dalam tantangan ini, Anda akan menulis program atau fungsi untuk menampilkan string menggunakan format tampilan 7-segmen di atas.
Aturan
Anda dapat menulis suatu program atau fungsi
Ini adalah kode-golf, kode terpendek dalam byte menang
Program atau fungsi Anda harus mengambil input dari STDIN atau sebagai parameter. Dan mengeluarkan string ke STDOUT atau sebagai string dalam 3 baris tanpa spasi sebelum diakhiri dengan baris baru. Tangani huruf besar / kecil
CHIOU
dengan benar.Anda dapat mencetak spasi spasi tambahan
Anda harus mengikuti format di atas. Menggunakan tanda garis bawah
_
dan tanda seru!
untuk membentuk tampilan 7-segmen Anda.Anda harus mendukung spasi putih (
), tanda hubung (
-
) dan tanda tanya (?
)Jika string berisi karakter yang tidak didukung (k, m, v, w, x), karakter kesalahan tunggal (3 garis horizon, lihat contoh) ditampilkan. Selain 5 karakter yang tidak didukung, Anda dapat menganggap input terdiri dari hanya set karakter yang didukung.
Saya memilih untuk tidak memiliki huruf untuk huruf kecil L (
l
) karena kebingungan tetapi jika Anda cenderung, Anda dapat menampilkannya seperti1
kanan atau kiri.
Contohnya
$./a.out Start
_ _
!_ !_ !_! _ !_
_!!_ ! !! !_
$./a.out "7-seg dIsplay"
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
$./a.out "0123456789 chiou-?"
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
_ _ _ _ _ _ _ _
!_!!_ _ _!!_ !_ ! !_ !! _ _ !_!!_! _ !_ !_ _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "Bad Form"
_
_
_
$./a.out "Hello"
_
!_!!_ ! ! _
! !!_ !_ !_ !_!
$./a.out "World"
_
_
_
k, m, v, w, x
tidak ditampilkan.\r
) dengan umpan baris (LF,\n
). * nix menggunakan LF dan Windows menggunakan CRLF. Hanya sistem warisan tertentu yang menggunakan CR dengan sendirinya. Informasi lebih lanjut di sini: en.wikipedia.org/wiki/NewlineJawaban:
CJam,
123114112110 byteDi atas menggunakan notasi tanda kuret, karena kode mengandung karakter yang tidak patut dicetak. Salah satunya adalah byte nol (
^@
), yang berarti bahwa kode ini hanya dapat dieksekusi dari baris perintah.Dengan biaya hanya dua byte lagi (dengan total 112 ), kita dapat memperbaikinya.
Kali ini, semua karakter dapat dicetak. Cobalah online di penerjemah CJam .
Contoh dijalankan
Ide (versi yang dapat dicetak)
Setiap karakter dapat ditampilkan pada layar 9-segmen
dengan mengganti beberapa karakter karakternya dengan spasi.
Kita dapat mengubah karakter tertentu menjadi bilangan bulat dengan mengganti setiap segmen yang ditampilkan, dalam urutan bacaan alami, dengan 1 , masing-masing segmen tidak ditampilkan dengan 0 dan mempertimbangkan hasil angka biner.
Segmen pertama dan ketiga tidak pernah ditampilkan, jadi ini akan menghasilkan bilangan bulat dalam kisaran [0,64) dan [128.192) .
Kita dapat menyandikan masing-masing bilangan bulat ini sebagai satu byte, tetapi setengahnya akan menghasilkan karakter yang tidak dapat dicetak. Jadi, kami menambahkan 64 ke setiap bilangan bulat sebelum memberikan karakter, yang memastikan bahwa titik kode berada dalam rentang [64.128) dan [192.256) .
Satu-satunya karakter yang tidak dapat dicetak dalam dua rentang ini adalah DEL (titik kode 127), yang terkait dengan konfigurasi tampilan yang tidak diinginkan berikut ini:
Kita dapat membalikkan pengkodean di atas dengan menambahkan 448 == 512 - 64 ke setiap titik kode, mengkonversi ke basis 2 dan menghapus digit biner pertama.
Semua yang tersisa untuk menemukan cara yang efisien untuk mengaitkan segmen yang disandikan ini dengan karakter ASCII yang sesuai.
Jika kita memetakan karakter
" -chiou"
ke karakter";=KMVWX"
dan mengonversi seluruh input menjadi huruf besar, kita bisa menyimpan penyandian untuk semua karakter antara0
(titik kode 48) danZ
(titik kode 90), memberikan kisaran 43.Pengindeksan array adalah modular dalam CJam, jadi jika
A
adalah string dengan panjang 43A86=
,,A43=
danA0=
semua menghasilkan hasil yang sama. Karakter dengan titik kode 86 adalahV
, jadi kami hanya menyimpan segmen yang dikodekan dari V - Z dan 0 - U , secara berurutan.Dalam kode aktual, kami memilih tanda at sebagai karakter "bentuk buruk", ganti seluruh input dengan string
"@"
jika mengandung huruf terlarang dan balikkan langkah-langkah dari atas.Kode (versi yang dapat dicetak)
sumber
Perl,
475469424390280272 bytemulti-line dengan komentar:
Pola bit yang mengkodekan segmen disimpan dalam string (melarikan diri 3 karakter yang tidak dapat digunakan menggunakan
\x
dan menggunakan\0
ruang) dan dipetakan ke karakter input menggunakan operator transliterasi Perl.Untuk 5 dari 7 segmen, bitwise dan digunakan bersama dengan operator ternary untuk menghasilkan spasi atau karakter segmen. Untuk dua segmen kiri bawah (dikodekan oleh 2 dan 4 dalam bitset), pencarian substring ke string 8 karakter digunakan untuk menyimpan 2 byte.
Terima kasih kepada Dom Hastings untuk tips golfnya di Perl.
Versi lama (menggunakan regex untuk menyandikan pola), 390 byte:
multi-line dengan komentar:
String dibaca dan diperiksa untuk karakter yang tidak valid menggunakan regex, keluar jika ada yang ditemukan. Kemudian karakter huruf kecil yang diizinkan diganti untuk karakter yang tidak valid dan seluruh string dikonversi menjadi huruf kecil.
Baris dihasilkan satu per satu, dengan 1 segmen per huruf pada baris pertama dan 3 pada dua lainnya. Untuk setiap baris, string diproses satu karakter pada satu waktu dan karakter tersebut dicocokkan dengan regex untuk setiap segmen untuk memeriksa apakah! atau _ harus ditampilkan. Menggunakan regex berarti bahwa untuk karakter di mana segmen tidak diatur, dibutuhkan nol bit per segmen per karakter untuk menyandikan apakah akan mengaturnya, dan bagi mereka yang membutuhkan rata-rata sedikit kurang dari 8 bit karena rentang karakter regex dapat bekas. Jadi berhasil sekitar 3 atau 4 bit per segmen per karakter di set, atau sekitar 21-24 bit per karakter.
Itu tidak menangani pembungkus garis.
sumber
' '
dapat diganti dengan$"
dan' '
dapat menjadi$"x3
yang trims off,\n
s Anda bisa menjadi baris baru harfiah untuk menghilangkan beberapa lagi. Jalan keluar awal Anda juga dapat disingkat, menggunakan die, sehinggaif(/[kmvwx]/i){print" -\n"x3;exit}
menjadidie" - "x3if(/[kmvwx]/i)
. Dengan sedikit fudging juga Anda dapat mengatur ulang loop untuk menghindari tanda kurung dan Anda tidak perlu$z
menyimpan lebih banyak lagi!$_=lc<>
tidak berfungsi, karena kode tersebut tidak dapat membedakan CHIOU huruf besar dan kecilGangguan umum,
488416Contoh
Dengan
"abcdefg'hijklnopqrstuz"
, cetakan:Catatan
Karakter dan representasi mereka dikodekan dalam angka ini dalam basis 36:
Representasi biner dari digit ini dibagi dalam kelompok-kelompok 17 bit.
Sebagai contoh, kelompok terakhir dari 17 bit adalah
110000111101010
, yang didekomposisi di sini dalam dua bagian:110000
, kode karakter0
111101010
, penyandian gambar, paling baik disajikan sebagai berikut:Bit di "kolom" pertama dan terakhir adalah untuk
!
karakter, yang ada di kolom tengah untuk_
karakter. Bila perlu, versi huruf besar dan kecil dari karakter disimpan.Fungsi ini berulang tiga kali lebih dari string input, satu untuk setiap baris output, mencari karakter yang cocok dalam tabel (atau default ke 146, alias tiga bar), dan mencetak representasi di baris saat ini.
sumber
'
karakter, yang bagus; namun, itu akan ditampilkan di luar kemampuan tampilan 7-segmen. Jika Anda memindahkan!
1 baris ke bawah, itu akan menjadi sempurna.'
karakter dan mengedit pertanyaan karenaK
karena pada kenyataannya, saya menempatkanK
di tempat yang salah di input string ("... jlKn ...") ;-) Anda dapat melihat triple bar (kesalahan) hanya setelah L. Terima kasih telah memperhatikannya.JavaScript (ES6),
380352324 byte( Catatan: Kode menggunakan notasi tanda sisipan, karena mengandung beberapa karakter yang tidak dapat dicetak . Untuk mendapatkan kode asli, klik di sini dan pilih data mentah. Dan tidak,
h
ini bukan program CJam.;)Disebut sebagai
d("7-seg display")
atau mirip. Bekerja di Firefox 40, tetapi mungkin tidak di browser lain. Untuk beberapa alasan, cuplikan HTML / JS tidak menyimpan yang tidak dapat dicetak, tetapi Anda dapat menyalin-menempelkan data mentah dari sini .Tidak Disatukan:
( Catatan:
g
danh
telah diisi dengan spasi untuk mencocokkan8
,-
,ÿ
danspace
dengan nilai-nilai yang sesuai Unicode mereka.)Penjelasan:
Saya segera memperhatikan bahwa 7 segmen, diubah menjadi
0
/1
bit, akan cocok dengan 128 karakter Unicode pertama. Masalah dengan ide ini adalah bahwa 1/4 dari karakter ini adalah karakter kontrol yang tidak dapat dicetak. Menggunakannya dalam kode saya akan membuatnya terlihat sangat berantakan (atau sangat cerdas; saya belum memutuskan yang mana). Untuk mengatasi ini sambil menjaga sisa kode sederhana, saya datang dengan ide ini:Dengan pengecualian
-
, spasi , dan kesalahan , tidak ada karakter yang kehilangan kedua segmen vertikal bawah. Jadi untuk memastikan bahwa semua karakter tetap berada di antara0020
dan007f
, saya hanya memetakan 64 dan 32 bit ke segmen ini, seperti :Angka 5 segmen lainnya tidak terlalu penting; mereka dapat diatur dengan cara lain dan masih memiliki semua karakter yang sama "in-bounds".
Sebagai contoh, inilah versi A yang disandikan :
Saya kemudian memasukkan versi yang dikodekan dari setiap karakter 7-seg di
h
. Namun,8
menghasilkan007f
( kode kontrol hapus ; konstan tidak peduli bagaimana segmen disusun), ruang menghasilkan0000
( kode nol ; juga konstan),-
menghasilkan0002
, dan kesalahan menghasilkan0007
. Saya menyalin-disisipkan byte mentah ke posisi yang benar untuk8
,-
dan kesalahan ; ruang dengan mudah dicapai\0
.Setelah semua pengkodean ini, yang harus saya lakukan adalah menggunakannya untuk mendekode string dan output dalam format yang dapat dibaca 7-seg. Saya menggunakan for for dan tiga variabel (
x
,,y
danz
, masing-masing sesuai dengan garis output) untuk pergi melalui masing-masing karakter dalam string dan menambahkan 7-seg yang setara dengan output. Saya memilihÿ
untuk karakter kesalahan karena AFAIK, itu bukan pada keyboard apa pun, dan itu adalah karakter terakhir dalamu+0000-u+00ff
jangkauan. Mungkin saya bisa lebih cerdas dan dipilihΞ
(huruf Yunani xi) sebagai gantinya ....;)Edit 1: Disimpan sekelompok ruang dengan menciptakan mini-fungsi untuk menentukan apakah
!
,_
ataudiperlukan.
Sunting 2: Menyimpan lebih banyak ruang menggunakan trik yang saya pelajari sejak saya terakhir mengunjungi posting ini.
Seperti biasa, saran sangat dihargai!
sumber