Saya harap gambar ini terlihat akrab bagi Anda.
Ini adalah salah satu hantu Pacman dalam keadaan "rentan" , setelah Pacman memakan pil kekuatan.
Tantangan
Bayangkan hantu kita dalam bingkai kecil, menggunakan seni ASCII. Pada skala normal (lebih lanjut tentang ini nanti), setiap kotak pada gambar di atas harus sesuai dengan satu karakter, dan frame harus memiliki pemisahan satu karakter ke atas dan ke bawah, dan pemisahan dua karakter ke kiri dan kanan hantu :
####################
# #
# #### #
# ######## #
# ########## #
# ############ #
# ############ #
# ### ## ### #
# #### ## #### #
# ############## #
# ############## #
# ## ## ## ## #
# # ## ## ## # #
# ############## #
# ## ### ### ## #
# # ## ## # #
# #
####################
Tapi ini tidak terlihat sangat cantik. #
mungkin bukan pilihan terbaik untuk piksel aktif. Selain itu, sel-sel karakter tidak persegi, yang membuat teman kita terlihat lebih seperti hantu daripada yang sudah ada.
Jadi, untuk memiliki lebih banyak fleksibilitas, gambar akan berubah sesuai dengan tiga parameter input:
- Karakter yang akan digunakan untuk piksel aktif;
- Faktor skala horisontal;
- Faktor skala vertikal.
Misalnya, dengan %
, 4
, 2
ouput akan menjadi gambar tampak lebih baik
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%%
%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%
%%%% %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Aturan
Semua bawaan diizinkan.
Masukan diambil dalam format apa pun yang masuk akal dan urutan apa pun. Input pertama di atas (karakter untuk piksel aktif) dijamin menjadi karakter ASCII yang dapat dicetak (kode 32 hingga 126).
Trailing space setelah setiap baris atau trailing newlines setelah baris terakhir dapat diterima.
Golf kode, byte paling sedikit menang.
sumber
Jawaban:
CJam,
535149 bytePerhatikan bahwa tiga karakter tidak dapat dicetak. Cobalah online!
Latar Belakang
Setengah bagian kanan dari keluaran yang tidak dikunci identik dengan yang kiri, sehingga cukup untuk menyandikan salah satunya. Jika kita mengganti spasi dengan nol dan bukan spasi dengan yang, kita dapatkan
di mana setiap baris dapat diartikan sebagai angka biner. Ini menghasilkan
Cara termudah untuk menyandikan informasi ini adalah mengganti setiap integer dengan karakter Unicode pada titik kode itu, tetapi mereka semua membutuhkan dua byte untuk dikodekan dengan UTF-8.
Dengan XORing integer dengan 544, kami menyimpan semua kecuali dua integer di bawah 128 dan menghindari byte nol.
Hasilnya adalah
sebagai bilangan bulat atau
sebagai string yang lolos.
Bagaimana itu bekerja
sumber
Perl,
1131051041009796Menambahkan +2 untuk
-ap
Saran oleh dev-null, simpan 9 byte Memperbaiki hitungan yang salah seperti diketahui oleh Dennis
Jalankan menggunakan
echo "2 4 %" | perl -ap pacman.pl
pacman.pl
:kecuali bahwa string
"\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"
harus ditulis dalam bentuk biner dengan tanda kutip tunggalSpasi sebagai karakter pengganti menjadi string kosong dan mengarah ke garis pendek. Tapi semuanya akan terlihat kosong
sumber
Dyalog APL, 64 byte
Ini mengambil faktor skala sebagai argumen kiri dan karakter sebagai argumen kanannya, yaitu:
Penjelasan:
⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'
: Setengah kiri hantu, tanpa perbatasan. (Ini simetris.) Setiap karakter memiliki bit set yang tinggi, untuk mencegah pemilihan karakter yang tidak dicetak⎕AV
, tetapi hanya 7 byte pertama yang digunakan.0,⍪⍨0⍪0,0,
: tambahkan batas kosong di kiri, atas, dan bawah1⍪⍨1⍪1,
: tambahkan bingkai di sebelah kiri, atas, dan bawah,∘⌽⍨
: gabung dengan cermin vertikal1+
: tambahkan 1, karena array 1-diindeks secara default' '⍵[
...]
: gunakan matriks itu sebagai indeks ke dalam string' '⍵
, sehingga setiap 0 dipetakan ke kosong dan masing-masing 1 dipetakan ke⍵
.⍺,⊂
: lampirkan matriks dan gabungkan ke faktor skala/
: lipatan kanan dengan fungsi berikut:/∘⍉
: transpos dan skala secara horizontalsumber
MATL , 71 byte
Cobalah online!
Penjelasan
Gambar simetris secara horizontal, sehingga hanya setengah bagian kiri yang perlu dikodekan. Setiap baris 10-pixel diberi kode biner sebagai angka antara 0 dan 1023. Pixel aktif dikodekan sebagai 0 bukan 1, jadi baris pertama adalah angka 0 daripada 1023.
Karena baris berturut-turut berbeda hanya dengan beberapa piksel, angka-angka selanjutnya disandikan berbeda. Jadi setiap baris akan diterjemahkan sebagai jumlah kumulatif dari semua angka hingga baris itu, diikuti oleh konversi ke biner.
Angka-angka yang dibutuhkan saat itu
0 diperkenalkan di MATL menggunakan
O
fungsi, yang menghindari pemisah dengan angka tetangga. Juga, tanda-tanda negatif tidak menyiratkan byte tambahan karena berfungsi sebagai pemisah.Setelah array telah dibuat, secara kumulatif dijumlahkan, didekodekan secara biner, dan dicerminkan secara horizontal. Array 2D yang dihasilkan digunakan untuk mengindeks string dua-char untuk menghasilkan hasilnya. String ini dari bentuk
'% '
, di mana'%'
input char.Seperti dicatat oleh @Conor, kode ini juga berfungsi dengan dua karakter sebagai input. Dalam hal ini string terakhir yang diindeks ke dalam akan berupa
'%_ '
, di mana inputnya adalah string dua-char'%_'
. Ruang hanya akan diabaikan, karena array pengindeksan hanya membahas dua karakter pertama.sumber
C (gcc) ,
199197 byte-2 byte terima kasih kepada @JonathanFrech
Cobalah online!
188 byte (tidak dicetak)
Atas perkenan @JonathanFrech.
Cobalah online!
Tidak ada yang spektakuler yang terjadi. Seperti orang lain perhatikan, hantu itu sangat simetris. Gambar itu sendiri memiliki lebar 20 unit, tetapi kecuali untuk baris atas dan bawah, tiga kolom paling kanan adalah identik. Ini memungkinkan kami untuk menyimpan setengah dari gambar sebagai karakter daripada harus menggunakan bilangan bulat:
String yang dihasilkan dibalik untuk menambah beberapa byte pada memiliki descending for loop (juga memecahkan masalah yang mengganggu dengan heksadesimal lolos). Loop lain dapat dibalik tanpa masalah berkat simetri.
Setiap karakter digeser ke kiri dan diberi batas (dengan perhatian khusus pada baris pertama dan terakhir). Maka itu hanya masalah menghasilkan string dengan skala yang benar.
Semua untuk loop membuat saya merasa ada cara yang lebih baik.
sumber
\xff
tidak dapat diganti denganÿ
( TIO )?Serius, 116 byte
Baris baru itu penting. Hexdump:
Strategi yang sama dengan jawaban CJam Dennis , tetapi nilainya dikodekan dalam hex, bukan XOR dengan 544, dan manipulasi string jauh lebih sulit di Seriously.
Cobalah online!
sumber
BBC BASIC,
239236232214 bytePanggilan
PROCM(1,1,35)
menghasilkan hantu yang terbuat dari simbol #. Argumen untuk PROCM adalah: skala horizontal, skala vertikal, nilai karakter ASCII.Program ini akan bekerja baik untuk Brandy Basic, dan BASIC 2 pada Model B. asli
sumber
Batch,
740722720 byteSunting: Disimpan
1820 byte dengan menghapus spasi yang tidak perlu.sumber
Stax , 45 byte
Jalankan dan debug itu
Penjelasan:
sumber
JavaScript (ES6), 167 byte
Berdasarkan jawaban @ Dennis. Saya kira Anda bisa memotong byte lain dengan menggunakan FF literal bukan
\f
, tapi saya ragu saya bisa menempelkannya di sini. Ketika mencoba ini Anda juga mungkin ingin menggunakan\u01CA
bukanNJ
karakter.Sedihnya, menambahkan spasi ke argumen karakter menghabiskan 6 byte.
sumber
Python 2,
838828618 byteDisimpan 210 byte dengan menggunakan string daripada array, terima kasih kepada Dennis untuk saran itu, saya tahu saya bisa membuat lebih baik, tetapi untuk sekarang ini merupakan peningkatan yang baik.
Ini adalah yang terbaik yang bisa saya lakukan, saya tidak terlalu baik dengan grafik di baris perintah.Saya mengambil hantu kecil sebagai basis.
Saya menggunakan ascii 219 secara default, karena dengan char itu, hantu itu terlihat sangat keren !!!
Golf
Cobalah repl.it
Tidak disatukan
Uji
sumber
Python 2, 244 byte
sumber
Python 2, 169 byte
Cobalah online!
Penjelasan:
Seperti dalam jawaban Dennis , setiap karakter dalam string ini mewakili representasi biner dari satu baris setengah kiri "gambar", XOR 544.
Untuk setiap karakter dalam string, lakukan hal berikut:
Ubah karakter menjadi representasi integer, lalu lakukan biner XOR dengan 544. Kemudian ubah integer ini menjadi string karakter representasi binernya, seperti '0xb111111111111'.
Untuk setiap karakter dalam sengatan, mulai dari posisi 2 (yang melompati 0b di awal), lakukan hal berikut:
Jika karakter == "1", ganti dengan karakter yang disediakan, jika tidak gantilah dengan spasi. Kemudian salin karakter ini x kali. (x = 0 akan menghasilkan string kosong.)
Gabungkan semua string menjadi satu string panjang, dipisahkan dengan string kosong "".
buat string b + kebalikan dari b, lalu buat array yang berisi y instance dari string ini (y = 0 akan menghasilkan daftar kosong []), lalu tambahkan daftar ini ke daftar z.
Akhirnya, cetak untuk menyaring setiap string yang dihasilkan, dipisahkan oleh jeda baris.
sumber