Ini sangat sederhana: Program atau fungsi Anda harus menghasilkan teks berikut:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Cetak halus
Anda dapat menulis sebuah program atau fungsi , yang mengembalikan output sebagai string atau mencetaknya ke STDOUT (atau alternatif terdekat). Anda dapat secara opsional memasukkan satu baris baru dalam output.
Mencetak gol
Jumlah byte dalam kode Anda dikalikan dengan jumlah byte unik dalam kode Anda
Skor terendah menang.
Misalnya, jawaban brainfuck atau spasi putih akan memiliki keuntungan besar di sini, karena pengali akan sangat rendah (masing-masing 8 dan 3). Namun, umumnya, menulis program dalam bahasa-bahasa tersebut menghasilkan kode yang jauh lebih lama yang dapat meniadakan keuntungan itu.
Celah standar yang tidak lagi lucu yang dilarang .
code-challenge
string
kolmogorov-complexity
durron597
sumber
sumber
bytecount~Log(X,unique)
, dengan X beberapa konstanta untuk masalah ini. Jadi unik ^ bytecount ~ konstan. Menghitung skor ini (log2) memberipython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Jadi kecuali untuk jawaban brainfuck, itu relatif konstan ...Jawaban:
Insomnia , 575 byte * 4 = 2300
Menggunakan 4 karakter
dye=
.Solusi 1b (tidak dipublikasikan): 783 byte * 3 = 2349
Hanya menggunakan 3 karakter
ey=
.Solusi 1: 826 byte * 3 = 2478
Hanya menggunakan 3 karakter:
yo~
. Suatu program digunakan untuk menghasilkan ini.Saat ini, semua program hanya menggunakan instruksi 0, 1, 2, 6. Dengan kata lain, mereka memanipulasi bit dalam satu byte dan mencetak hasilnya.
sumber
CJam,
266281456 byte *14127 unik =372433723192Cobalah online.
Penjelasan
Strategi yang saya gunakan adalah memperlakukan setiap karakter dalam string sebagai digit basis-123 dan menyandikannya sebagai angka desimal dalam program. Program kemudian mengonversi angka itu kembali ke basis 123 dan memetakan setiap basis-123 digit kembali ke karakter. Karena sulit menjelaskan mengapa program ini dalam kondisi saat ini, saya akan menjelaskan setiap versi.
Beginilah akhir dari program pada versi pertama:
Ini mengimplementasikan strategi dengan cara yang paling mudah. Angka, yang dikodekan secara normal dalam basis 10, dikonversi kembali ke basis 123 dan setiap digit basis-123 dipetakan kembali ke sebuah karakter. Tetapi ini menggunakan 4 karakter non-digit yang unik, dan mampu menghilangkan salah satu dari mereka kemungkinan akan sebanding dengan ukurannya karena harus menggunakan kode yang lebih sederhana.
Pertama, saya menyadari bahwa saya dapat menyingkirkan
b
dan:
operator dengan menciptakan mereka pada saat runtime sebagai nilai karakter ASCII mereka dikonversi kembali ke karakter (denganc
operator yang sudah ada ) dan mengevaluasi mereka dengan~
operator. Ternyata agak sulit untuk melakukan ini dengan:
operator, karena harus diurai bersama denganc
operator berikut . Saya memecahkan ini dengan menghasilkan karakter:
danc
kemudian memproduksi dan mengevaluasi karakter+
, yang menggabungkan dua karakter sebelumnya ke dalam string:c
yang kemudian dapat dievaluasi dengan benar.Kedua, saya menyadari bahwa
~
operator yang baru saja saya perkenalkan memiliki varian kelebihan muatan baru yang praktis: ketika diberi nomor, ia menghasilkan komplemen bitwise. Dengan menggunakan ini dua kali berturut-turut setelah angka, saya bisa memperkenalkan token break pada sumber tanpa efek komputasi yang dihasilkan, memungkinkan saya untuk mengganti spasi yang digunakan untuk memisahkan angka~~
.Hasil akhirnya adalah 15 byte lebih banyak kode pada akhirnya, tetapi biaya ini jauh lebih besar daripada manfaat menghilangkan 2 karakter unik dari 14. Berikut adalah perbandingan akhir versi pertama dengan akhir versi kedua:
Menggunakan kurang dari 2 operator yang saya gunakan tidak mungkin, tetapi saya masih menginginkan lebih sedikit karakter unik. Jadi langkah selanjutnya adalah menghilangkan angka. Dengan mengubah pengkodean angka sehingga setiap angka desimal benar-benar angka dasar-5, saya berpotensi menghilangkan angka 6-9. Sebelum menghilangkan apapun dari ujung prgoram, itu terlihat seperti ini:
Seperti yang disebutkan sebelumnya, menghilangkan ruang itu mudah. Tapi
b
,:
, danc
tidak akan begitu mudah, karena kode karakter mereka98
,58
dan99
masing-masing. Semua ini berisi digit yang ditandai untuk dihilangkan, jadi saya harus menemukan cara untuk mendapatkan semuanya. Dan satu-satunya operator numerik yang berguna dengan nilai karakter yang tidak mengandung 5-9 adalah pengurangan, penambahan, gandakan, dan tambahkan.Karena
98
, saya awalnya menggunakan100~~40c~40c~
, yang menurun100
dua kali. Tetapi kemudian saya menyadari bahwa saya dapat menggunakan~
operator ini lagi, karena komplemen bitwise memungkinkan saya mendapatkan angka negatif yang, ketika ditambahkan, biarkan saya meniru pengurangan. Jadi saya kemudian menggunakan100~~1~43c~
, yang menambah100
dan-2
dan 2 byte lebih kecil. Untuk58
, saya menggunakan44~~14~~43c~
, yang menambah44
dan14
. Dan untuk99
, saya menggunakan100~~40c~
, yang menurun100
.Hasil akhirnya cukup besar dan membingungkan, tetapi biaya dari jumlah yang signifikan lebih besar dan kode pemrosesan sedikit lebih besar daripada manfaat besar menghilangkan 5 karakter unik dari 12. Berikut adalah perbandingan akhir akhir program sebelum eliminasi dan setelah eliminasi:
sumber
98
,58
, dan99
) masih di luar jangkauan. Dan menambah basis hanya mengurangi ukuran total program sebesar 8-10%, yang tidak cukup untuk menebus skor 10-15% yang diperoleh dengan memiliki karakter unik yang baru. Memasukkan ulangb
operator juga tidak sepadan.floor(log_b(x)+1)
, dan itu akan berisib
simbol yang berbeda. Jadi nilainyab*floor(log_b(x)+1)
. x adalah angka besar yang diberikan, dan jika Anda plot ini untuk b, Anda akan menemukan minimum cukup banyak pada b = 3. Yaitu, panjangnya berkurang sedikit ketika Anda menggunakan basis yang lebih tinggi (log), tetapi ukuran charset meningkat secara linear, sehingga tidak sepadan. Membuat program spasi putih sederhana, tetapi hanya mendapat skor 4134.Spasi,
1157937 byte * 3 unik =34712811Dengan permintaan populer (?), Saya memposting solusi spasi putih saya.
Untuk mengurangi kode yang diperlukan, saya meng-hardcode seluruh string sebagai satu nomor biner (7 bit untuk setiap byte). Sebuah loop sederhana mengekstraksi karakter dan mencetaknya.
Kode sumber di filebin.ca.
CATATAN: Spesifikasi memungkinkan untuk bilangan bulat besar yang sewenang-wenang , tetapi juru bahasa Haskell pada halaman resmi dibatasi hingga 20 bit. Gunakan, misalnya, penerjemah ruby ini di ruang github / hostilefork / whites.
Skrip ruby untuk membuat program spasi putih (l = WHITESPACE, t = TAB, u = NEWLINE, semuanya setelah // diabaikan, menulis ke file
prog.h
):Sebagai ilustrasi, program spasi putih dalam bentuk yang dapat dibaca manusia. Lihat di bawah ini untuk skrip sederhana untuk mengubahnya menjadi program spasi putih yang sebenarnya.
Pada dasarnya, string ke output adalah bilangan bulat panjang, dan Anda perlu mengurangi nilainya.
Jadi saya mencari bahasa dengan hanya 0/1, tapi saya tidak menemukannya, dan kemudian saya ingat ada spasi putih dan mencobanya. Di spasi putih, Anda dapat memasukkan angka biner dengan 0 dan 1 secara langsung.
Kode lama, skor lebih buruk tetapi lebih menarik
Kode lama pada filebin .
Skrip ruby yang saya gunakan untuk membuat program (l = WHITESPACE, t = TAB, u = NEWLINE, semuanya setelah
//
diabaikan, menulis ke fileprog.h
):Sebagai ilustrasi, program spasi putih dalam bentuk yang dapat dibaca manusia. Lihat di bawah ini untuk skrip sederhana untuk mengubahnya menjadi program spasi putih yang sebenarnya.
Program spasi putih ini sendiri agak sederhana, tetapi ada tiga optimasi golf:
lul
untuk mengkloning tumpukan ketika ada karakter duplikatltl
untuk mengkloning entri ke-n stack jika lebih pendek daripada mendorong char secara langsungSkrip ruby sederhana untuk mengonversi kode spasi putih yang dapat dibaca manusia menjadi program spasi putih yang sebenarnya (baca file
prog.h
dan tulis ke fileprog.ws
):sumber
Ruby 144 Bytes * 39 Unique = 5616
Terkadang yang paling sederhana adalah yang terbaik.
sumber
Brainfuck, 1264 byte * 7 unik = 8848
Ya, itu skor yang mengerikan.
sumber
+.
tidak yakin itu akan menjadi lebih kecil.+
dan.
saya mendapatkan 15018 * 2 =30,036
.> <> (Ikan) - 578 byte * 8 unik = 4624
Skor saya tidak kompetitif seperti yang saya harapkan, tetapi saya pikir solusi ini masih cukup menarik untuk dikirim.
Penjelasan
Bagian pertama dari kode adalah string panjang dari digit 0-4 yang mewakili representasi basis 5 digit 3 untuk setiap karakter dalam string. Kode yang tersisa mengambil keuntungan dari
p
operator di Fish yang memungkinkan Anda untuk mengedit kode sumber program saat program sedang berjalan. Dengan menggunakan operator itu, saya dapat menghasilkan kode Ikan yang diperlukan untuk mengubah basis 5 karakter kembali ke basis 10 dan mengeluarkannya, dan kemudian memasukkan kode itu kembali ke kode sumber di awal file sebelum penerjemah mencapai akhir. dari garis dan melilit. Ketika penerjemah mencapai akhir baris, kode telah dimodifikasi agar terlihat seperti ini:Ketika kode membungkus dan mengenai
v
operator, ia turun ke baris kedua, mengenai>
operator dan berlanjut ke loop, setiap kali mengubah basis 5 mengkodekan kembali ke nilai ascii basis 10 dan kemudian mengeluarkan nilai itu. Ketika tidak ada lagi nilai pada stack,?
operator akan melompat ke;
dan program akan berakhir.sumber
7 , 273 byte × 7 byte unik = 1911, nonkompetisi (tantangan tanggal kiriman bahasa)
Cobalah online!
Sayangnya, ini adalah tantangan lama, artinya saya tidak bisa menang dengan salah satu bahasa terbaru saya. Namun, bahasa itu dibuat tanpa pengetahuan tentang tantangan (saya hanya secara acak menemukan itu dalam "pertanyaan terkait"), tetapi ternyata cukup cocok.
7 program pada PPCG biasanya dikirimkan dalam format yang dikemas, mengemas delapan perintah menjadi tiga byte (bahasa tersebut memiliki dua belas perintah, tetapi hanya delapan yang dapat muncul dalam file sumber, yang berarti bahwa tiga bit sudah cukup). Namun, bahasa ini juga mendukung format oktal di mana setiap perintah ditulis sebagai digit ASCII, dan itulah yang saya gunakan di sini, artinya hanya tujuh byte berbeda yang digunakan (
6
perintah tidak diperlukan dalam program yang hanya mencetak string sederhana).Program ini sangat sederhana; itu terdiri dari dua elemen stack, string panjang yang baru saja dicetak kata demi kata, a
7
untuk memisahkan elemen (sayangnya tidak dapat dihindari), dan403
yang merupakan cara sederhana untuk mencetak string konstan dalam 7 (40
lolos dari elemen stack kedua, sementara memindahkannya ke bagian atas tumpukan, lalu3
cetak dan buang elemen tumpukan pertama yang lama, yaitu403
sendiri).Jadi, bagaimana saya mendapatkan string sesingkat 269 byte? 7 mendukung banyak format I / O, dan salah satu formatnya adalah US-TTY , kumpulan karakter (khususnya, varian Baudot) yang banyak digunakan sebelum ASCII ditemukan. (The
5
pada awal elemen stack kedua, yaitu awal dari program, menentukan pengkodean string; sisanya adalah konten string itu sendiri.) Ini adalah set karakter lima-bit, dan perintah0
untuk5
dapat dengan aman disimpan dalam string sementara tidak terhapus secara konsisten (sehingga melarikannya sekali akan mereproduksi aslinya), sehingga bahasa menggunakan pasangan perintah (36 opsi) untuk menyandikan karakter US-TTY (32 opsi, dengan 4 digunakan untuk arahan ke 7 penerjemah itu sendiri). Tentu saja, ada lebih dari 32 karakter unik yang orang mungkin ingin hasilkan (dan lebih dari 32 karakter muncul dalam string), jadi dua karakter adalah "kode pergeseran" yang beralih di antara empat set karakter (huruf besar, huruf kecil , angka, dan "ekstensi angka" yang ditentukan pengguna yang digunakan 7 untuk karakter ASCII yang tersisa yang tidak ada dalam rangkaian karakter lain; namun, semua karakter dalam string "asli" di US-TTY sehingga detail dari ekstensi tidak masalah). Sini'Saya menghitung sepuluh shift ditambahkan ke 124 karakter input, rasio yang cukup diabaikan. Dengan demikian, kemampuan untuk menggunakan hanya lebih dari dua byte input per karakter input, kali 7 byte unik, berarti bahwa skor pada tantangan ini sangat baik. (Saya kira bahasa yang dirancang khusus untuk tantangan ini akan menggunakan semacam kompresi string, daripada set karakter yang sudah ada sebelumnya, tetapi meskipun Baudot dan US-TTY tidak dirancang untuk bermain golf, mereka masih cukup ringkas .)
sumber
Python 2,
163147145143 byte *353635 unik =5705529252205005Itu mungkin tentang sebaik saya akan mendapatkannya.
Suntingan:
.capitalize()
untuk digunakanE
.'
alih-alih tanda garis miring terbalik.+
dan beberapa spasi untuk menggunakan koma dalamprint
pernyataan.sumber
Python 2,
14508 11700 11088 10164 9486 9746 7860145 byte * 36 unique = 5220Saya melihat judul dan berpikir ini adalah tantangan yang menarik untuk Python yang agak bertele-tele. Ini adalah catatan saya ketika saya menangani masalah ini.
Percobaan pertama saya mengurangi uniques menjadi 31:
Saya pikir saya bisa melakukan yang lebih baik. Dengan menggunakan
map
, unik turun menjadi 26:Pada sekitar waktu ini, saya perhatikan dalam teks pertanyaan bahwa nilainya adalah
uniques * bytes
, bukan hanya unik! Itu berarti skor saya untuk yang di atas adalah 14508 dan 11700. Tidak terlalu kompetitif. Jadi saya sekarang mengurangi byte dengan menyimpan teks sebagai string hex:Ukuran berkurang tetapi karakter lebih unik. Tetapi jika saya menggunakan string desimal 2 digit yang dikemas dengan offset 32:
Ini memiliki jumlah byte yang sama tetapi menyimpan 3 unik.
Saya menetas rencana baru. Jika saya mengemas integer panjang Python dengan 7 bit karakter, saya bisa mengekstraksi masing-masing dengan menggeser:
Nah itu mengurangi skor menjadi 9486. Eksperimen yang menarik, tetapi tidak cukup dekat baik. Sekarang bagaimana jika saya menyingkirkan nama fungsi dan mengandalkan pemformatan string?
Saya sekarang hanya memiliki 22 uniques, tetapi skornya tidak membaik.
Ok, Bagaimana jika saya mengambil cara yang jelas dan hanya mencetak string:
Nilai 7860. Saya harus melakukan ini dulu. Tetapi saya tidak akan belajar banyak.
Saya kira saya bisa mengurangi jumlah uniques sebesar 26 jika saya secara dinamis menghasilkan bagian huruf besar, jadi:
Saya pikir Python tidak akan jauh lebih baik daripada 5220. Tugas meminimalkan karakter unik di Python tentu saja instruktif.
Pembaruan: mbomb007 memiliki solusi Python yang lebih baik dengan skor 5005. Kerja bagus.
sumber
> <> (Ikan) - 138 Bytes * 65 Unique = 8970
Rute sederhana, yaitu Hello World:
Nah, untuk terjun pertama saya ke> <> ini adalah sebuah tantangan. Saya rasa saya melihat beberapa peningkatan, tapi itu menyenangkan mempelajarinya :)
Atau membuatnya terlalu rumit - 1567 bytes * 27 Unique = 42309
sumber
r
tumpukan terbalik :) Anda juga dapat memindahkan finalo
ke ruang kosong di awal baris kedua.f f + 2 + o
berkali-kali dalam kesulitan?05AB1E , 380 byte * 11 karakter = skor 4180
Ini berpotensi non-bersaing
Cobalah online!
Mendorong perwakilan basis 5 dari karakter ASCII bergabung bersama.
Dibagi menjadi 3, dikonversi kembali menjadi desimal.
Mengonversi integer ASCII kembali ke karakter.
Bergabung kembali bersama.
sumber
Perl 6, 139 byte * 36 unik = 5004
sumber
Java 8, 141 byte * 64 karakter unik = 9.024
141 byte, 64 karakter unik. Pendekatan selain sederhana "kembalikan string" meningkatkan jumlah byte tanpa menghemat banyak karakter yang digunakan.
sumber
Perl 5 , 137 byte * 35 unik = 4795
Cobalah online!
sumber
Tcl , 345 byte, 345 x 13 = 4485
Cobalah online!
Tcl , 337 byte, 337 x 15 = 5055
Cobalah online!
Tcl , 329 byte, 329 x 16 = 5264
Cobalah online!
Tcl , 333 byte, 333 x 16 = 5328
Cobalah online!
Tcl , 148 byte, 148 x 37 = 5476
Cobalah online!
Tcl , 277 byte, 277 x 21 = 5817
Cobalah online!
Tcl , 371 byte, 371 x 16 = 5936
Cobalah online!
Tcl , 401 byte, 401 x 16 = 6416
Cobalah online!
Tcl , 403 byte, 403 x 16 = 6448
Cobalah online!
Tcl , 433 byte, 433 x 15 = 6495
Cobalah online!
Tcl , 473 byte, 473 x 14 = 6622
Cobalah online!
Tcl , 133 byte, 133 x 60 = 7980
Cobalah online!
sumber