Gambarkan cangkir kopi Ascii ini:
Hai Hai Hai __________ / \ __ | J | \ | A | | | V | | | A | __ / \ __________ /
Poin Brownie untuk skrip kopi atau java :)
Kode terpendek dalam byte, fungsi atau program, mengikuti baris baru atau ruang putih dapat diterima, minum!
Jawaban:
SOGL , 48 byte
Penjelasan:
SOGL memiliki kompresi string bawaan dan salah satu yang dimilikinya adalah kompresi kamus char. Lebih baik lagi, ia memiliki tipe kompresi boxstring di mana satu-satunya karakter yang tersedia adalah "/ \ | _- \ n". Jadi keseluruhan program adalah sebuah string yang terbungkus dalam "'(the" implisit).
Tali yang saya berikan pada kompresor adalah (lolos):
sumber
JavaScript (ES6),
110104 byteDisimpan 4 byte berkat edc65
Bagaimana itu bekerja
Kompresi seni ASCII asli dicapai dengan mengganti semua urutan 2 hingga 10 ruang berturut-turut dan dua urutan 10 garis bawah berturut-turut dengan satu digit:
N
ruang berurutan dikodekan dengan digitN-1
.9
.Kami menggunakan
N-1
daripadaN
agar kami tidak perlu menggunakan lebih dari satu digit. Maka kebutuhan++n
ketika decoding.Ekspresi
n>>3
(pergeseran bitwise ke kanan) sama dengan 0 untukn = 1
ken = 7
dan sama dengan 1 untukn = 8
(tidak digunakan) dann = 9
. Oleh karena itu,' _'[n>>3]
berikan garis bawah untuk9
, dan ruang untuk semua nilai yang dijumpai lainnya.Satu-satunya kasus khusus adalah urutan 10 ruang berurutan tepat di atas "JAVA". Pengkodean dengan
9
konflik akan dengan urutan garis bawah. Jadi kita perlu membaginya menjadi dua urutan 5 ruang, disandikan sebagai44
.sumber
f=
). Anda dapat menyimpan 4 byte dengan cara ini:n>>3
alih- alih+!(n&7)
,9
alih-alih_8
(dua kali) dan44
bukannya9
f=
... Terima kasih atas byte yang disimpan!' '
). Tapi tidak yakin bagaimana melakukannya. Apa yang dilakukan bit shift? Mengapa kita menambah n?Jelly ,
6764 byte-2 bytes terima kasih kepada Dennis (1. hapus redundant
”
, dan 2. ganti transpos dan run-length decodeZŒṙ
,, dengan pengurangan oleh elemen repetitionx/
,.)Cobalah online!
Bagaimana?
“...“...’
adalah daftar dua angka dasar-250 terkompresi:D
dikonversi ke desimal untuk menghasilkan dua daftar digit:x/
mengurangi dengan pengulangan elemen untuk memberikan satu daftar digit (mengulangi angka dari daftar pertama dengan nilai yang sesuai dari yang lain):ị
menginstruksikan untuk mengindeks ke dalam daftar hak, satu berdasarkan dan modular (0 indeks ke item paling kanan). Daftar di sebelah kanan,,¶_/\|JAVo
adalah karakter yang digunakan dalam urutan yang disyaratkan di mana pilcrow¶
,, adalah titik kode yang sama dengan umpan baris. Mitra penutupan“
tidak diperlukan karena ini adalah akhir dari program:Jelly melakukan cetakan implisit dari daftar ini, yang, karena berisi karakter, dicetak seolah-olah itu adalah string:
sumber
”
bersifat implisit dan Anda dapat menggantinyaZŒṙ
denganx/
. Selain itu, meskipun tidak memiliki byte, menggunakan¶
alih-alih baris baru literal membuat kode imo lebih dapat redable.CoffeeScript ES6,
214180 byteCoffeeScript, 135 byte dengan hardcoding
sumber
Python 2,
174172171167 byteTidak ada hard-coding.
Tidak ada pengkodean Base-64.
Tidak Ada Regex.
Disimpan 2 byte dengan mengeksternalkan
'_'*10
dan dengan mengeksploitasi konversi PythonTrue -> 1
danFalse -> 0
.Disimpan 1 byte dengan menghapus spasi yang tidak perlu.
Disimpan 4 byte berkat @TuukkaX!
sumber
] for
danin [
.[2,7,4]
dan[3,4,5,6]
ke2,4,7
dan3,4,5,6
.PowerShell ,
136124123105 byteCobalah online!
Terima kasih kepada @briantist karena menemukan
-replace
metode yang lebih pendek yang saya tahu ada di suatu tempat.Ini mengambil string dengan angka menggantikan jumlah ruang yang diperlukan. Kami kemudian regex
-replace
digit dengan ekspresi skrip$(" "*$1)
. Jadi, misalnya, baris pertama dari string adalah$(" "*2)o
, baris kedua adalah$(" "*7)o
dan seterusnya. Karena triple-quoting, ini dibiarkan sebagai string pada pipa. Kami membuangnya keiex
(kependekan dariInvoke-Expression
dan mirip denganeval
), yang memproses ekspresi skrip dan meninggalkan string multi-line yang dihasilkan pada pipa. Output tersirat.sumber
($_,' '*$_)[+$_-in48..57]
- tidak peduli apa yang saya ubah tampaknya gagal untuk saya.space
oleho
dan barfs.GNU sed ,
113112 bytesPengkodean dasar, ini menyimpan 3 ruang sebagai
S
,\n
sebagai@
dan 5 menggarisbawahi sebagaiU
. Saya akan terus mencoba kombinasi untuk menemukan sesuatu yang lebih pendek.Cobalah online!
Solusi sepele untuk mencetak string langsung diberikan di bawah ini. Ini memiliki 136 byte, menghasilkan kompresi 18%, menggunakan skema pengkodean di atas.
Cobalah online!
sumber
ss
sebagaiS
menyimpan 1 byte.S
menyimpan 3 ruang, tidaks
. Saya pikir saya akan mengedit yang ini sebagai gantinya, karena ia menyimpan jumlah transformasi yang sama.MATL,
8786838278 byteSolusi ini memecah kopi menjadi dua bagian: "gelembung" dan cangkir. Untuk membuat gelembung, kami membuat matriks jarang dengan 111 yang terletak di tiga lokasi dan mengubahnya menjadi array karakter
Untuk komponen mug, kami mengandalkan kompresi string
Kedua komponen dicetak ke output dan baris baru secara otomatis ditempatkan di antara komponen
Cobalah di MATL Online
sumber
Python 2 ,
128127 byte-1 byte terima kasih kepada Rod (gunakan perkalian tuple
('_'*10,)
untuk menghindari deklarasi).Cobalah online!
Catatan: bahwa garis miring terbalik ganda yang diperlukan sebelum pindah baris.
Segala sesuatu di antara
'''
dan'''
merupakan string tunggal, keduanya%s
adalah formatters yang digantikan oleh konten trailing%(...)
tuple, yang pada gilirannya berisi dua salinan'_'*10
melalui penggandaan tuple(...)*2
. The'_'*10
Melakukan String perkalian untuk menghasilkan'__________'
.Kode melintasi karakter,
c
, itu seluruh string menggunakanfor c in '''...
dan menciptakan string baru dengan bergabung (join(...)
)baik jumlah ruang diidentifikasi oleh
c
,int(c)
, jikac
adalah digitatau
c
sendiri- yang digit diidentifikasi oleh
'0'<c<':'
untuk menyimpan lebihc.isdigit()
.sumber
u,u
dengan('_'*10,)*2
dan mencabutu
deklarasiJava 8,
294289248 byteGolf:
Dalam semangat kompleksitas kolmogorov , ini tidak menyulitkan string ke output. Sebaliknya, ia menggunakan fakta bahwa ada banyak kasus beberapa ruang diikuti oleh karakter yang dapat dicetak. Ini mengkodekan jumlah spasi yang mendahului karakter dalam byte orde tinggi karakter, dengan karakter ASCII aktual dalam byte orde rendah.
Tidak Disatukan:
sumber
\u0641
.F
. Seharusnya memungkinkan untuk memasukkan keduanya di sana.0x
awalan membantu.if
berlebihan, misalnya) dan mencukur sekitar 1/6 ukuran.Befunge,
158105101 byteCobalah online!
Karakter dalam string pertama kali dikodekan sebagai indeks ke dalam tabel pencarian dari sepuluh nilai yang mungkin. Indeks kemudian dikelompokkan menjadi pasangan, masing-masing pasangan digabungkan menjadi satu nomor (i1 + i2 * 10) di kisaran 0 hingga 99. Dengan hati-hati memilih urutan tabel pencarian, kami dapat menjamin bahwa nilai-nilai tersebut akan selalu valid Karakter ASCII yang dapat direpresentasikan dalam string literal.
Ini adalah rincian kode itu sendiri:
Kita mulai dengan menginisialisasi elemen terakhir dari tabel pencarian dengan karakter baris baru (ASCII 10).
Kami kemudian menggunakan string literal untuk mendorong konten yang disandikan ke tumpukan.
Akhirnya kita mengulang nilai-nilai stack, decoding dan menghasilkan dua karakter sekaligus.
Baris terakhir memegang tabel pencarian: elemen ke-9 adalah ruang tersirat, dan ke-10 (baris baru) diatur secara manual, seperti yang dijelaskan sebelumnya.
sumber
Retina , 71 byte
Berbeda dari jawaban saya yang lain , jawaban ini ditulis dengan tangan.
(Ada ruang tambahan di akhir)
Cobalah online!
Prinsipnya masih memiliki string "terkompresi" dari mana secangkir kopi dapat direkonstruksi dengan substitusi. Mencoba substitusi yang berbeda ternyata yang patut dilakukan hanyalah:
=
berubah menjadi__________
(10 garis bawah)sumber
Common Lisp,
125123122120 120byteSaya menyimpan 6 byte, menggunakan ide memasukkan saja ke dalam string, bukan
~&
s.Ide untuk perbaikan disambut.
sumber
Python3, 206 byte
sumber
s=' '
variabel dan menggunakannya.'o\n'
memiliki panjang yang sama dengan'o'+n
.print(*(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'),sep='\n')
ataufor x in(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'):print(x)
, keduanya 197. Masih lebih lama dari 136 hard code .Pyth, 80 byte
Penerjemah online tersedia di sini.
Dekode run-length sederhana.
sumber
C - 179
Solusi dengan penggunaan luas format string:
Ini adalah versi yang lebih mudah dibaca:
sumber
void g(){puts(" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\__________/\n");}
Retina , 99 byte
Solusi ini dihasilkan secara otomatis menggunakan skrip ini .
(Ada spasi tambahan di banyak baris)
Ini bekerja dengan menggunakan angka 1,2,3,4 menggantikan beberapa urutan karakter yang diulang dalam string target dan kemudian menggantikannya kembali.
Saya tahu itu bisa golf lebih dengan mengubah kode ini atau mengubah pendekatan sepenuhnya, tetapi karena tantangan meta-golf kolmogorov memiliki hasil yang cukup mengecewakan saya ingin mencoba menggunakan skrip saya pada tantangan nyata.
Cobalah online!
sumber
3
dan kemudian bergerak substitusi hingga sebelum 3. Anda juga dapat mengubah2\n
ke2\n3
dan bergerak substitusi ini untuk sebelum 3. Cobalah secara online!1\n__________
ke1\n_____
dan kemudian mengubah masing-masing1
di substitusi utama untuk11
Cobalah secara online!Python 3.6
(tidak bersaing)Inilah upaya saya di Huffman encoding. Sudah pasti golf lebih lanjut jika ada yang mau mengambil ide.
Literal dapat dikompresi lebih lanjut lagi dengan mengkonversi ke base64 atau lainnya, dan pohon Huffman dapat dioptimalkan untuk menghasilkan bitarray yang lebih pendek.
sumber
Bahasa GameMaker, 138 byte
sumber
C, 141 Bytes
Pemakaian
Solusi Mudah, 148 Bytes:
sumber
PHP, 116 byte
Ini sangat mirip dengan jawaban Arnauld - dan melakukan hal yang hampir sama. Jalankan dengan
-r
.sumber
zsh, 86 byte
Penjelasan: string itu adalah seni ascii cup java yang dikompresi gzip. Saya menggunakan
printf
, karena denganecho
,zcat
mencetak peringatan, danecho -e
satu karakter lebih panjang. Itu tidak bekerja denganbash
ataush
, karena mereka pikir itu file biner. Karena Anda tidak dapat secara efektif menempelkan output dari browser, inilah file yang dapat digunakan.sumber
Java 9 / JShell, 299 byte
Tidak Disatukan:
Penggunaan di JShell:
Mengkodekan setiap karakter sebagai sepuluh bit yang terdiri dari hitungan jumlah spasi sebelum karakter dalam tiga bit tinggi diikuti oleh titik kode dalam tujuh bit rendah.
(Karena hanya ada tiga bit untuk penghitungan, ia tidak bisa mewakili lebih dari tujuh spasi berturut-turut, dan ada sepuluh spasi pada satu titik dalam string. Ini dikodekan sebagai hitungan enam, diikuti oleh spasi, dan kemudian hitungan tiga diikuti oleh karakter berikutnya.)
Sayangnya, ia kalah dari solusi Java 140 byte yang sepele ini:
sumber
05AB1E , 85 byte
Cobalah online!
sumber