Karena itu bukan bagian dari Wiki pada halaman GitHub 05AB1E (saya pikir seharusnya begitu), saya hanya akan menambahkannya di sini sekarang sehingga saya lebih mengerti sendiri.
Bagaimana cara menggunakan kamus?
05AB1E memiliki file kamus words.ex berikut yang berisi semua kata yang diketahuinya. Tetapi bagaimana kita mengakses kata-kata dalam kamus ini? Mari kita ambil kata "testing"sebagai contoh:
"testing"dapat ditemukan pada baris 1453 file kamus. Karena dua baris pertama bukanlah kata-kata, dan kita membutuhkan kata yang diindeks 0, kita kurangi 3.
Jadi, sekarang kita memiliki indeks ( 1450), tetapi bagaimana cara menggunakannya?
Kami membuka dan memulai string terkompresi dengan “† . Kami kemudian melihat kolom kedua dari file info.txt . (Begitu €juga 00; ‚adalah 01; dll.)
Dalam hal "testing"ini berarti î(14) dan »(50).
"testing"Karenanya String yang dikompresi adalah: “Cobalah secara online. Seperti dengan hampir semua potongan kode 05AB1E, trailing “adalah opsional jika Anda tidak mengakses string, jadi tanpa bekerja juga dalam kasus ini .
Beberapa hal yang perlu diperhatikan:
Semua karakter yang tidak memiliki indeks apa pun di file info.txt dapat digunakan apa adanya. Ini dapat berguna untuk menambahkan sebuah ske output jamak, bukan kata tunggal atau menggunakan tanda baca seperti ,.?!misalnya. ÿ(string-interpolasi) juga dapat digunakan ketika Anda ingin memasukkan nilai dari tumpukan di dalam string.
CATATAN: Setiap karakter longgar yang tidak memiliki indeks dalam file info.txt dihitung sebagai kata untuk jenis kompresi di bawah ini.
† Ada berbagai jenis string terkompresi yang dapat Anda gunakan:
': Ambil satu kata terkompresi apa adanya (tidak 'diperlukan tambahan) - 'î»: "testing"
„: Membawa dua kata terkompresi dengan pembatas ruang (tidak „diperlukan tambahan) - „î»î»: "testing testing"
…: Membawa tiga kata terkompresi dengan pembatas ruang (tidak …memerlukan trailing ) - …î»î»î»: "testing testing testing"
“: Ambil string terkompresi dengan pembatas ruang - “î»î»“: "pengujian pengujian"
’: Ambil string terkompresi seperti tanpa spasi implisit - ’î»î»’: "testingtesting"
”: Ambil string yang dikompresi dalam judul-kasus dengan pembatas ruang - ”î»î»”: "Pengujian Pengujian"
‘: Ambil string terkompresi dalam huruf besar penuh dengan pembatas ruang - ‘î»î»‘: "TESTING TESTING"
Di sini program yang berguna untuk mendapatkan string terkompresi berdasarkan input kata yang dibatasi ruang:
Ambil input sebagai huruf kecil, hapus karakter non-alfabet (kecuali spasi), lalu pisahkan kata-kata dengan spasi ( lAð«Ã#), atau bungkus kata-kata dalam daftar jika hanya satu kata yang dimasukkan ( ¸˜)
Putaran setiap kata ( vyU)
Kemudian memiliki loop dalam atas setiap kata yang dikompresi dari kamus ( "€...ï"Dâvy), yang akan mencoba dijalankan sebagai program 05AB1E ( "“ÿ“".V)
Dan jika itu sama dengan kata saat ini, ia akan mencetaknya dan menghancurkan lingkaran dalam XlQiy?1#
Dengan input good bye worldmaka output akan menjadi “‚¿Þ¡‚ï“. Cobalah online.
CATATAN: Anda masih harus melihat apakah kata itu ada dalam kamus agar generator ini berfungsi, dan itu akan mengabaikan karakter khusus atau kata-kata jamak. Hanya kata-kata yang persis sama dalam kamus yang akan ditemukan.
Bagaimana cara mengompresi string bukan bagian dari kamus?
Meskipun file kamus words.ex cukup besar (tepatnya 10.000 kata), Anda mungkin perlu kata yang bukan bagian dari kata itu, atau string yang hanya omong kosong belaka. Jadi adakah cara untuk mengompresnya juga?
Tentu saja ada, dengan menggunakan .•, yang merupakan string berbasis alfabet-255 berbasis kompresi. CATATAN: Metode ini hanya dapat digunakan untuk karakter dalam alfabet dan spasi huruf kecil.
Berikut ini adalah program yang berguna untuk mengonversi kata / string ke string berbasis-alfabet dasar-255 yang dikompresi:
Katakanlah kita ingin menggunakan angka yang sangat besar untuk sesuatu, tetapi itu tidak dapat diambil dengan perhitungan pow. Sebagai contoh, katakanlah kita ingin mengakses integer besar 18238098189071058293untuk alasan apa pun.
Dalam hal ini, kita dapat menggunakan kedua pengarah dan pengurutan •untuk mengompres angka dalam format [1-9][0-9]+.
Nomor contoh di atas akan menjadi •15Y₁Ò'Θpc•. Cobalah online. Sekali lagi, sama seperti dengan string kamus terkompresi, trailing •secara opsional dapat dihapus .
Secara opsional, ketika integer cukup kecil sehingga hanya 2 karakter yang dikompresi yang harus digunakan, kita dapat menggunakan Žsebagai gantinya, dalam hal ini kita tidak akan memerlukan byte tambahan untuk menutupnya dan integer dikompresi dalam 3 byte, bukan 4. Untuk contoh, integer 13562akan menghasilkan •rl•, tetapi karena hanya menggunakan dua karakter, itu bisa menjadi Žrlgantinya.
Juga, angka dalam rentang [101, 355]dapat dikompresi dalam 2 byte menggunakan Ƶditambah karakter tambahan dari codepage 05AB1E. Jadi misalnya, Ƶ–bisa digunakan untuk integer 250. Berikut ikhtisar semua nomor yang tersedia. Karakter-karakter ini dikonversi dari Base-255 ke Base-10, dan kemudian ditambahkan 101 (karena angka dalam kisaran [0,100]sudah 1 atau 2 byte).
Bagaimana ini 15Y₁Ò'Θpcdan rldibuat? Sangat sederhana, nomor tersebut dikonversi ke Base-255 menggunakan codepage 05AB1E sendiri. Jadi, Anda dapat menggunakan program berikut untuk mendapatkan nomor dikompresi, yang kemudian akan digunakan Ƶ., Ž..atau •...•tergantung pada ukuran integer terkompresi:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
Kompresi bilangan bulat vs Kompresi bilangan bulat:
Dengan kedua hal ini bisa berjalan baik. Terkadang daftar terkompresi lebih pendek, terkadang bilangan bulat terkompresi, kadang-kadang alternatif yang sama sekali berbeda lebih pendek. Jadi selalu gunakan penilaian Anda sendiri dan keterampilan bermain golf untuk kemungkinan bermain golf lebih jauh, daripada mengandalkan generator di atas sepenuhnya. Berikut beberapa contoh:
•a½₄Ƶ6®í• adalah 9 byte (dihasilkan oleh generator integer besar terkompresi)
•1∊}•2вJ adalah 8 byte (dihasilkan oleh generator daftar integer terkompresi dengan tambahan bergabung)
Tetapi dalam hal ini •1∊}•bdengan 6 byte akan menjadi pilihan terbaik (daftar integer terkompresi, dengan biner sebagai pengganti 2в, yang secara implisit bergabung)
[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]( digunakan dalam jawaban saya ini ):
•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+Namun lebih pendek 2 byte, dengan memadatkan daftar dengan masing-masing nilai 26 lebih rendah, dan kemudian menambahkannya dengan `₂ + ` . Trik ini menambahkan nilai byte tunggal kemudian dapat digunakan cukup sering untuk menyimpan byte dalam daftar terkompresi.
Kembali pada hari-hari ketika 05AB1E dirilis, input tersirat cukup baru dan mewah. Saat ini tampaknya perlu untuk melacak dengan bahasa kompetitif lainnya (seperti Jelly, MATL, Pyth, dll).
Misalnya, ketika Anda ingin menambahkan dua angka, Anda dapat melakukan II+:
Ini hanya terjadi ketika panjang tumpukan lebih kecil dari arity operator. Contoh terakhir adalah 3+. Arity dari +operator adalah 2 sementara hanya ada 1 elemen di stack:
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
¾mendorong 0 => itu tentang non-mnemonik karena mendapat
Fatalize
6
@Fatalize: 0 mendorong 0 juga. ¾mendorong variabel penghitung yang diinisialisasi sebagai 0. Jika Anda hanya ingin menekan 0, 0 tentu saja lebih alami, tetapi jika Anda ingin mendorong 5,0,7, 5¾7adalah 2 byte lebih pendek dari 5 0 7.
Emigna
7
Kembali di hari saya, ¾berarti .75, dan saya pernah mengalahkan Pyth dengan fakta itu . Bahasa-bahasa golf bermodel baru ini tidak memiliki petunjuk tentang mnemonik ...
ETHproduk
31
Tidak tahu apa yang Anda semua bicarakan: hal. print(3 / 4)di Python 2 memberi saya 0.
Adnan
2
Jika pada awalnya, Mmendorong -Inf.
mbomb007
7
Menggunakan Kanvas ( Λatau .Λ)
Karena itu bukan bagian dari dokumen, dan @Adnan saat ini agak terlalu sibuk untuk menulisnya, saya meminta izin untuk menambahkannya sebagai tip di sini untuk saat ini.
Fungsi Canvas ( Λatau .Λ) dapat digunakan untuk menggambar garis ASCII di layar. Ini memiliki tiga parameter yang diperlukan:
a Panjang: Ukuran garis. Ini bisa berupa bilangan bulat tunggal, atau daftar bilangan bulat
b String: Karakter yang ingin kita tampilkan. Ini bisa berupa karakter tunggal, string, daftar karakter, atau daftar string (dalam tiga kasus terakhir ini akan menggunakan semuanya satu per satu termasuk bungkus)
c Direction: Arah yang harus ditarik oleh garis-karakter. Secara umum kita memiliki digit[0,7]untuk arah, dimana kita dapat menggunakan satu atau beberapa. Ada juga beberapa opsi khusus yang memerlukan karakter tertentu (lebih lanjut tentang itu nanti).
Arah-digit [0,7]peta ke arah berikut:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
Beberapa contoh 05AB1E menjawab di mana Kanvas digunakan:
Canvas builtin secara implisit akan menambahkan spasi tambahan untuk membuat output menjadi persegi panjang.
The Λakan menampilkan segera, dan .Λhasil string yang didorong ke stack, yang kita dapat masih digunakan kembali, memodifikasi, dan melakukan apa saja dengan yang kita inginkan. Beberapa contoh:
Seperti pada bahasa berbasis stack lainnya, fungsi 05AB1E biasanya memunculkan (menggunakan) input mereka dari stack dan mendorong outputnya ke stack.
Namun, beberapa fungsi mendapatkan input dari stack tanpa mengonsumsinya. Contohnya adalah headfungsi ¬,, yang menghasilkan elemen pertama dari daftar input. Lihat program contoh di sini: ¬+. Ini menambahkan nomor pertama dari daftar input ke setiap nomor dari daftar itu.
Untuk mengetahui fungsi mana yang muncul dan dapatkan, lihat kolom terkait di file informasi fungsi .
Loop dan kondisional secara otomatis menerima kurung penutup di akhir program, jadi Anda hanya perlu menambahkannya dalam kode jika Anda perlu sesuatu di luar loop / kondisional.
Sebagai contoh, program ini (ungolfed) membuat daftar nbilangan prima pertama tidak perlu tanda kurung tutup.
[¹¾Q#NpiNˆ¼
Tetapi jika kita ingin melakukan beberapa operasi pada daftar yang dihasilkan, misalnya mengambil delta kita harus menutup loop terlebih dahulu.
[¹¾Q#NpiNˆ¼]¯¥
½(jika 1, maka naikkan counter_variable sebesar 1) tidak diperlukan pada akhir a µ(sementara counter_variable ! = a, do ...), karena dilakukan secara implisit ( menyimpan byte dalam jawaban saya ini ).
.Bsecara implisit terpecah pada baris baru. Ini berguna dalam jawaban saya ini ketika kami sedang mencari alternatif untuk ¡(split) sambil tetap menyimpan item kosong (CATATAN: Solusi dalam jawaban tertaut tidak berfungsi ketika elemen berisi spasi tambahan setelah pemisahan.) - Semoga sebuah builtin akan ditambahkan ke split tetapi tetap baris kosong di masa depan
SÖ(yang mana dari digit dari integer-input dapat membagi secara merata-integer input) akan berisi angka itu sendiri untuk digit 0(bukan kesalahan divide-by-zero). Misalnya, 1053akan menghasilkan[1,1053,0,1] (1053 habis dibagi 1 dan 3; tidak habis dibagi 5; dan memberikan kesalahan pembagian-oleh-nol untuk 0). Ini cukup berguna dalam jawaban saya ini dengan mengambil kekuatan daftar, karena hanya 1kebenaran di 05AB1E dan yang lainnya falsey. SÖPmenghasilkan kebenaran (1 ) karena itu berarti input-integer dibagi rata oleh masing-masing digit.
Setelah melihat û(palindromize string yang diberikan) saya terkejut tidak ada builtin is_palindrome . Tetapi kemudian saya menyadari hanya 2 byte yang diperlukan untuk mencapai itu, yaitu ÂQ(di mana Âbifurcate, yang merupakan kependekan dari DR: Duplicate & Reverse copy;Q untuk memeriksa apakah dua nilai teratas pada stack sama).
Saat Anda ingin memfilter daftar dengan banyak hal, biasanya lebih murah untuk memiliki beberapa filter lepas daripada semua digabung menjadi satu. Karena ketika Anda memiliki dua filter Anda akan memerlukan sesuatu di sepanjang baris Ds*(duplikat, swap, gandakan untuk bertindak sebagai logis-DAN) vs }ʒ(tutup filter pertama, filter lagi) ketika Anda menggunakan dua filter. Misalnya: dalam tantangan ini kita harus membuat daftar semua angka yang panjangnya empat digit, mengandung setidaknya satu 0, dan dengan jumlah digit sama dengan 9. Menggunakan rentang [1000,10000]mencakup jumlah empat digit, tetapi kemudian Anda dibiarkan dengan dua filter lagi. Awalnya saya menggunakan ₄4°ŸʒD0åsSO9Q*(14 byte), tetapi dengan menggunakan dua filter byte dapat disimpan: ₄4°Ÿʒ0å}ʒSO9Q(13 byte). (Yang kemudian di-golf menjadi ₄4°ŸεW°ö9Q(10 byte) oleh @Grimy.)
Saat Anda ingin zip dengan integer 0sebagai pengisi, Anda bisa menggunakan 0ζ. Namun satu masalah dengan ini adalah bahwa filler 0akan menjadi string "0", jadi jika Anda kemudian mencoba mengurutkan dengan string campuran dan integer, ini kemungkinan besar tidak akan memberikan hasil yang Anda inginkan. Di sini contoh bagaimana hal itu akan mengurutkan daftar dalam zip: 0ζ€{. Ini bisa diperbaiki dengan menambahkan cast eksplisit untuk int ( ï) setelah zip, dan hanya kemudian semacam: 0ζï€{. Namun, menggunakan ¾konstanta seperti 0dengan zip-filler, akan menyebabkannya tetap menjadi bilangan bulat bukan string selama zip. Jadi ¾ζ€{akan menghemat satu byte di sini. Tip ini disediakan oleh @ Mr.Xcoder untuk menghemat satu byte dalam jawaban saya ini .
Jika Anda ingin menjumlahkan digit beberapa angka dalam daftar, Anda bisa menggunakannya €SO. Namun lebih pendek menggunakan 1ö, yang secara otomatis membuat vektorisasi. Tip ini disediakan oleh @Grimy untuk menyimpan byte di sini (dan 2 byte di sini ).
Jika Anda hanya berurusan dengan bilangan bulat non-negatif, dan Anda ingin memeriksa di dalam filter apakah itu 0 atau 1, Anda tentu saja dapat menggunakan yang jelas 2‹. Namun, menggunakan !(faktorial) juga hanya akan menghasilkan 1 (kebenaran) untuk 0dan 1, dan setiap nilai lainnya akan menghasilkan sesuatu yang lebih tinggi (dan dengan demikian falsey, karena hanya 1benar di 05AB1E). Tip ini disediakan oleh @Grimy untuk menyimpan byte di sini .
Perhatikan bahwa beberapa operator di 05AB1E membuat vektor secara otomatis pada array. Misalnya, kode 5L3+, yang membongkar ke kode semu berikut:
[1, 2, 3, 4, 5] + 3
akan menjadi:
[4, 5, 6, 7, 8]
Jika tidak melakukan vektorisasi secara otomatis, Anda juga dapat menggunakan €operator. Dibutuhkan perintah karakter tunggal, dan melakukan itu (monadik) operator pada setiap elemen. Contoh untuk membagi setiap elemen adalah kode berikut ( coba di sini ):
€S
Sedangkan Soperator normal akan membagi setiap elemen dalam array dan meratakannya menjadi satu array ( coba di sini ).
Bagaimana Anda menetapkan elemen ke-n dalam array?
Andrew Savinykh
@AndrewSavinykh Saat ini, tidak ada builtin untuk itu, tapi itu adalah sesuatu yang ingin saya terapkan.
Adnan
@ Adnan saya menemukan cara untuk melakukannya. Buat daftar lain yang memiliki nilai untuk ditetapkan juga di indeks ke-n. Kemudian gabungkan daftar menggunakan ñdidahului dengan nilai n(indeks). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007
@ mbomb007 Itu mungkin, satu-satunya masalah adalah Anda tidak dapat memodifikasi array setelahnya, karena perintah gabungan hanya menggunakan string sebagai argumen (dan mengonversi daftar menjadi string).
Adnan
2
Memesan Input
Urutan yang Anda masukkan dapat memiliki efek drastis pada kode Anda, dan, seringkali, jika Anda menggunakan suntuk menukar bagian atas tumpukan dengan hal tertinggi berikutnya di tumpukan, Anda tidak memikirkan masalah dengan benar. Coba atur ulang input dan lihat apakah Anda dapat menghilangkan kebutuhan untuk bertukar dengan menukar input sebelumnya, menambahkannya ke stack sebelumnya atau menggandakannya di suatu tempat. I&O yang paling jelas bisa menjadi jawaban 05AB1E yang paling tidak berhasil.
Memesannya dengan berapa kali mereka muncul dalam string dalam urutan menurun (paling banyak terjadi pada karakter yang paling sedikit terjadi).
Balikkan dua item pertama jika gambar ASCII dimulai dengan karakter yang paling muncul (untuk mencegah angka 0 di bilangan bulat yang dikompresi).
Memetakan karakter input ke 0-9A-Za-zdalam urutan itu, masing-masing karakter yang berbeda mendapatkan karakter pemetaan mereka sendiri, hingga setiap karakter diganti.
Kompres basis itu, menggunakan basis tertinggi yang perlu Anda ganti (berdasarkan jumlah karakter unik).
Basis mengkonversikannya kembali ke basis-255 (untuk kompresi 05AB1E).
Format segala sesuatu dalam format: •<compressed_integer>•“<sorted_distinct_characters>“ÅвJ.
The “memungkinkan Anda untuk juga kompres string kutipan "; yang Åвakan menggunakan string ini ke basis-mengkonversi bilangan bulat dihasilkan dengan menggunakan string sebagai dasar adat; dan Jakan menggabungkan semua karakter ini menjadi satu string, yang merupakan output secara implisit.
Menerima pola dengan hingga dan termasuk 62 karakter unik, bagus untuk seni ASCII.
Semakin sedikit jumlah karakter unik, semakin baik kompresi.
Omong-omong, karena 05AB1E telah mengubah halaman kode, basis maksimum diubah dari 214 ke 255 .
Adnan
1
Mungkin sesuatu untuk ditambahkan ke jawaban Anda (atau memodifikasi generator dengan), tetapi jika kurang dari 10 karakter berbeda sedang digunakan dalam seni ASCII, Anda dapat golf dengan dua byte. Yaitu generator Anda memberikan byter 22-ini , tetapi itu bisa 20-byter ini .
Kevin Cruijssen
@KevinCruijssen idenya adalah apa yang saya coba sampaikan, tidak benar-benar mengklaim bahwa generator itu sesuatu yang baik: P. Jujur saya ragu itu bahkan masih berjalan pada osabie. Saya menulis itu beberapa waktu yang lalu!
Magic Gurita Guci
@MagicOctopusUrn Tidak yakin apakah itu berjalan dalam penulisan ulang Elixir, tetapi pasti masih berfungsi dalam versi warisan. Saya sudah mengedit Base-214 ke Base-255 tentang membagi dua tahun lalu seperti yang disebutkan dalam komentar Adnan di atas. Selain itu itu bekerja dengan baik dan saya telah menggunakannya beberapa kali (meskipun golf setiap kali lebih jauh;;)). Generasi string dan angka berfungsi dengan baik!
Kevin Cruijssen
Ini adalah versi yang ditingkatkan. (Sangat jelek dan ditulis dengan cepat, tetapi berhasil). Ini akan membuat contoh Anda 108 byte, bukan 113. Peningkatan yang saya lakukan adalah: mengurutkan karakter yang berbeda pada kemunculan tertinggi terlebih dahulu (kecuali kemunculan tertinggi adalah karakter pertama, dalam hal ini akan menukar dua karakter teratas) sehingga dikompresi integer sekecil mungkin; menggunakan <str><compr_int><int>вèJbukannya Anda <compr_int><int>BžLR<str>‡; dan menggunakan “bukan "sebagai string-quotes, jadi "bisa menjadi bagian dari input.
Kevin Cruijssen
1
String dan int adalah tipe yang sama
Bukan sesuatu yang disetujui semua orang, tetapi itu berhasil.
Pertimbangkan dua program berikut:
4 5+
"4""5"+
Keduanya menghasilkan 9 . Itu karena setiap nilai pertama kali dievaluasi (dengan ast.literal_eval). Karena itu, kita dapat melakukan semua operator manipulasi string pada int dan semua operator manipulasi string pada string.
Sebagai contoh, 12345ûpalindromize nomor tersebut 12345, menghasilkan 123454321. Setelah itu, kita bisa melakukan matematika reguler pada nomor ini.
v, yang berulang pada setiap elemen s [0], s [1], .., s [n] .
ʒ, yang bukan loop, tapi perintah filter-by . Kami menyalahgunakan perintah ini karena perilaku yang tidak disengaja dalam perulangan melalui setiap elemen.
Dengan menggunakan loop ini, kita dapat memperoleh loop tersembunyi berikut :
Alih-alih gF, Anda bisa menggunakan vyang juga memiliki N-index yang bisa digunakan.
The vy -> ʒpengganti sedikit lebih rumit:
Anda harus segera mencetak hasilnya. Ini mengesampingkan pencetakan otomatis dari mencetak bagian atas tumpukan.
Cuplikan kode dijalankan pada tumpukan sementara baru . Ini berarti bahwa potongan yang bergantung pada tumpukan tidak dapat digunakan.
Memohon ytidak mungkin dilakukan dalam loop semacam ini.
Jawaban:
Karena itu bukan bagian dari Wiki pada halaman GitHub 05AB1E (saya pikir seharusnya begitu), saya hanya akan menambahkannya di sini sekarang sehingga saya lebih mengerti sendiri.
Bagaimana cara menggunakan kamus?
05AB1E memiliki file kamus words.ex berikut yang berisi semua kata yang diketahuinya. Tetapi bagaimana kita mengakses kata-kata dalam kamus ini? Mari kita ambil kata
"testing"
sebagai contoh:"testing"
dapat ditemukan pada baris 1453 file kamus. Karena dua baris pertama bukanlah kata-kata, dan kita membutuhkan kata yang diindeks 0, kita kurangi 3.Jadi, sekarang kita memiliki indeks (
1450
), tetapi bagaimana cara menggunakannya?Kami membuka dan memulai string terkompresi dengan
“
† . Kami kemudian melihat kolom kedua dari file info.txt . (Begitu€
juga 00;‚
adalah 01; dll.)Dalam hal
"testing"
ini berartiî
(14) dan»
(50)."testing"
Karenanya String yang dikompresi adalah:“
Cobalah secara online. Seperti dengan hampir semua potongan kode 05AB1E, trailing“
adalah opsional jika Anda tidak mengakses string, jadi tanpa bekerja juga dalam kasus ini .Beberapa hal yang perlu diperhatikan:
Semua karakter yang tidak memiliki indeks apa pun di file info.txt dapat digunakan apa adanya. Ini dapat berguna untuk menambahkan sebuah
s
ke output jamak, bukan kata tunggal atau menggunakan tanda baca seperti,.?!
misalnya.ÿ
(string-interpolasi) juga dapat digunakan ketika Anda ingin memasukkan nilai dari tumpukan di dalam string.CATATAN: Setiap karakter longgar yang tidak memiliki indeks dalam file info.txt dihitung sebagai kata untuk jenis kompresi di bawah ini.
† Ada berbagai jenis string terkompresi yang dapat Anda gunakan:
'
: Ambil satu kata terkompresi apa adanya (tidak'
diperlukan tambahan) -'î»
: "testing"„
: Membawa dua kata terkompresi dengan pembatas ruang (tidak„
diperlukan tambahan) -„î»î»
: "testing testing"…
: Membawa tiga kata terkompresi dengan pembatas ruang (tidak…
memerlukan trailing ) -…î»î»î»
: "testing testing testing"“
: Ambil string terkompresi dengan pembatas ruang -“î»î»“
: "pengujian pengujian"’
: Ambil string terkompresi seperti tanpa spasi implisit -’î»î»’
: "testingtesting"”
: Ambil string yang dikompresi dalam judul-kasus dengan pembatas ruang -”î»î»”
: "Pengujian Pengujian"‘
: Ambil string terkompresi dalam huruf besar penuh dengan pembatas ruang -‘î»î»‘
: "TESTING TESTING"Di sini program yang berguna untuk mendapatkan string terkompresi berdasarkan input kata yang dibatasi ruang:
Cobalah online.
Program ini akan:
lAð«Ã#
), atau bungkus kata-kata dalam daftar jika hanya satu kata yang dimasukkan (¸˜
)vyU
)"€...ï"Dâvy
), yang akan mencoba dijalankan sebagai program 05AB1E ("“ÿ“".V
)XlQiy?1#
Dengan input
good bye world
maka output akan menjadi“‚¿Þ¡‚ï“
. Cobalah online.CATATAN: Anda masih harus melihat apakah kata itu ada dalam kamus agar generator ini berfungsi, dan itu akan mengabaikan karakter khusus atau kata-kata jamak. Hanya kata-kata yang persis sama dalam kamus yang akan ditemukan.
Berikut ini contoh di mana saya gunakan
…Ÿ™‚ï!
untuk string "hello world!" dan’‚¿Þ¡ ÿ ‚ï!’
untuk string "selamat tinggal ÿ dunia!". Perhatikan bagaimana spasi dan tanda seru digunakan, karena mereka tidak memiliki indeks dalam file info.txt. Selain itu, ini digunakanÿ
untuk memasukkan "kejam" yang berada di bagian atas tumpukan, yang sayangnya bukan bagian dari kamus (tetapi masih dikompresi menggunakan metode di bagian di bawah).Bagaimana cara mengompresi string bukan bagian dari kamus?
Meskipun file kamus words.ex cukup besar (tepatnya 10.000 kata), Anda mungkin perlu kata yang bukan bagian dari kata itu, atau string yang hanya omong kosong belaka. Jadi adakah cara untuk mengompresnya juga?
Tentu saja ada, dengan menggunakan
.•
, yang merupakan string berbasis alfabet-255 berbasis kompresi. CATATAN: Metode ini hanya dapat digunakan untuk karakter dalam alfabet dan spasi huruf kecil.Berikut ini adalah program yang berguna untuk mengonversi kata / string ke string berbasis-alfabet dasar-255 yang dikompresi:
Cobalah online. .
Apa yang dilakukan oleh program ini di atas adalah:
vAyk})>
: Ambil indeks alfabet 1-indeks dari masing-masing input, dengan spasi menjadi indeks 027β
: Konversikan indeks ini dari basis 27 ke satu nomor255B
: Konversi nomor ini ke Base-255 menggunakan halaman kode 05AB1E sendiri".•ÿ•"
: Tempatkan memimpin.•
dan mengikuti•
sebelum string terkompresi iniBerikut ini contoh jawaban tempat @Kaldo gunakan
.•zíΘ•
untuk mengompres kata "angsa".Bagaimana cara mengompres bilangan bulat besar?
Katakanlah kita ingin menggunakan angka yang sangat besar untuk sesuatu, tetapi itu tidak dapat diambil dengan perhitungan pow. Sebagai contoh, katakanlah kita ingin mengakses integer besar
18238098189071058293
untuk alasan apa pun.Dalam hal ini, kita dapat menggunakan kedua pengarah dan pengurutan
•
untuk mengompres angka dalam format[1-9][0-9]+
.Nomor contoh di atas akan menjadi
•15Y₁Ò'Θpc•
. Cobalah online. Sekali lagi, sama seperti dengan string kamus terkompresi, trailing•
secara opsional dapat dihapus .Secara opsional, ketika integer cukup kecil sehingga hanya 2 karakter yang dikompresi yang harus digunakan, kita dapat menggunakan
Ž
sebagai gantinya, dalam hal ini kita tidak akan memerlukan byte tambahan untuk menutupnya dan integer dikompresi dalam 3 byte, bukan 4. Untuk contoh, integer13562
akan menghasilkan•rl•
, tetapi karena hanya menggunakan dua karakter, itu bisa menjadiŽrl
gantinya.Juga, angka dalam rentang
[101, 355]
dapat dikompresi dalam 2 byte menggunakanƵ
ditambah karakter tambahan dari codepage 05AB1E. Jadi misalnya,Ƶ–
bisa digunakan untuk integer250
. Berikut ikhtisar semua nomor yang tersedia. Karakter-karakter ini dikonversi dari Base-255 ke Base-10, dan kemudian ditambahkan 101 (karena angka dalam kisaran[0,100]
sudah 1 atau 2 byte).Bagaimana ini
15Y₁Ò'Θpc
danrl
dibuat? Sangat sederhana, nomor tersebut dikonversi ke Base-255 menggunakan codepage 05AB1E sendiri. Jadi, Anda dapat menggunakan program berikut untuk mendapatkan nomor dikompresi, yang kemudian akan digunakanƵ.
,Ž..
atau•...•
tergantung pada ukuran integer terkompresi:Cobalah online.
Berikut ini contoh jawaban di mana @Emigna menggunakan
•3Èñ•
untuk integer246060
.Bagaimana cara mengompresi daftar integer?
Terkadang Anda ingin mengompres seluruh daftar bilangan alih-alih satu nomor. Sebagai contoh, katakanlah kita menginginkan daftar
[5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]
untuk alasan apa pun. Dalam hal ini, kita dapat menggunakan yang berikut sebagai gantinya:•4βŸ{©£MG]q‡dZΘp•94в
Cobalah secara online.Di sini program yang berguna untuk menghasilkan angka terkompresi ini dan Basis yang ingin dikonversi menjadi:
Cobalah online.
Apa yang dilakukan oleh program ini di atas adalah:
Z>
: Dapatkan nomor maks + 1 dari daftar masukan (©
: dan simpan di register)β
: Konversi daftar input dari basismax+1
ke satu nomor255B
: Kompres nomor tunggal ini (seperti yang kami lakukan pada bagian di atas)®s"•ÿ•ÿв"
: Mengembalikan hasil dalam format: leading•
, number terkompresi•
,, max + 1, trailingв
Berikut ini contoh jawaban tempat saya gunakan
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
untuk mengompres daftar[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
.PS: Dalam jawaban ini
•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô
adalah alternatif yang sama dengan byte (57), karena semua angka memiliki dua digit. Dalam beberapa kasus (terutama daftar kecil) ini bisa menjadi alternatif yang lebih pendek.Kompresi bilangan bulat vs Kompresi bilangan bulat:
Dengan kedua hal ini bisa berjalan baik. Terkadang daftar terkompresi lebih pendek, terkadang bilangan bulat terkompresi, kadang-kadang alternatif yang sama sekali berbeda lebih pendek. Jadi selalu gunakan penilaian Anda sendiri dan keterampilan bermain golf untuk kemungkinan bermain golf lebih jauh, daripada mengandalkan generator di atas sepenuhnya. Berikut beberapa contoh:
[44, 59]
( digunakan dalam jawaban @Emigna ini ):•A–•60в
adalah 7 byte (dihasilkan oleh generator daftar integer terkompresi)•H|•2ô
atau•H|•2ä
atau hardcoded44 59‚
semua 6 byteŽH|2ô
atauŽH|2ä
keduanya 5 byte„,;Ç
dengan 4 byte akan menjadi pilihan terbaik (codepoint karakter ',' dan ';')[2,4,6,0]
( digunakan dalam jawaban @Emigna ini ):•3ā•7в
adalah 6 byte (dihasilkan oleh generator daftar integer terkompresi)Ž3ā7в
adalah 5 byteŽ9¦S
dengan 4 byte akan menjadi pilihan terbaik (bilangan bulat terkompresi 2460 ke daftar angka)10101001100101001
( digunakan dalam jawaban saya ini ):•a½₄Ƶ6®í•
adalah 9 byte (dihasilkan oleh generator integer besar terkompresi)•1∊}•2вJ
adalah 8 byte (dihasilkan oleh generator daftar integer terkompresi dengan tambahan bergabung)•1∊}•b
dengan 6 byte akan menjadi pilihan terbaik (daftar integer terkompresi, dengan biner sebagai pengganti2в
, yang secara implisit bergabung)[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
( digunakan dalam jawaban saya ini ):•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
adalah 57 byte (dihasilkan oleh generator daftar integer terkompresi)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + Öηôî®À8 † 6 / ðÎ6ùøΓ ° ÓĆ; ˆ © Ā • 2ô` juga 57 byte (bilangan bulat terkompresi, dibagi menjadi beberapa bagian berukuran 2)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ ,λ₂ϦP(Ì•65в₂+
Namun lebih pendek 2 byte, dengan memadatkan daftar dengan masing-masing nilai 26 lebih rendah, dan kemudian menambahkannya dengan `₂ + ` . Trik ini menambahkan nilai byte tunggal kemudian dapat digunakan cukup sering untuk menyimpan byte dalam daftar terkompresi.sumber
Masukan implisit
Kembali pada hari-hari ketika 05AB1E dirilis, input tersirat cukup baru dan mewah. Saat ini tampaknya perlu untuk melacak dengan bahasa kompetitif lainnya (seperti Jelly, MATL, Pyth, dll).
Misalnya, ketika Anda ingin menambahkan dua angka, Anda dapat melakukan
II+
:Uji di sini
Namun, dengan menggunakan input implisit , kita dapat mempersingkat menjadi hanya 1 byte, yaitu
+
:Uji di sini
Ini hanya terjadi ketika panjang tumpukan lebih kecil dari arity operator. Contoh terakhir adalah
3+
. Arity dari+
operator adalah 2 sementara hanya ada 1 elemen di stack:Uji di sini
sumber
Substring
£
adalah perintah untuk mengambilb
karakter pertama dari stringa
.ex:
"hello_world"5£
->
"hello"
Tetapi jika
b
daftar indeks itu malah membagi string menjadi bagian-bagian (upto) ukuran itu.ex:
"hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
sumber
Variabel yang ditentukan sebelumnya
Mereka agak tersembunyi di 05AB1E. Berikut daftar semua variabel yang telah ditentukan:
¾
, mendorong0
jika counter_variable tidak diubah sebelum perintah ini.X
, mendorong1
jika variabel X tidak diubah sebelum perintah ini denganU
.Y
, mendorong2
jika variabel Y tidak diubah sebelum perintah ini denganV
.®
, mendorong-1
jika register tidak diubah sebelum perintah ini dengan©
.¯
, mendorong[]
(array kosong) jika tidak ada yang ditambahkan ke global_array sebelum perintah ini.¸
, mendorong[""]
tumpukan kosong jika tidak ada input. (Terima kasih @Emigna untuk menemukan yang ini.)sumber
¾
mendorong 0 => itu tentang non-mnemonik karena mendapat¾
mendorong variabel penghitung yang diinisialisasi sebagai 0. Jika Anda hanya ingin menekan 0, 0 tentu saja lebih alami, tetapi jika Anda ingin mendorong5,0,7
,5¾7
adalah 2 byte lebih pendek dari5 0 7
.¾
berarti.75
, dan saya pernah mengalahkan Pyth dengan fakta itu . Bahasa-bahasa golf bermodel baru ini tidak memiliki petunjuk tentang mnemonik ...print(3 / 4)
di Python 2 memberi saya0
.M
mendorong-Inf
.Menggunakan Kanvas (
Λ
atau.Λ
)Karena itu bukan bagian dari dokumen, dan @Adnan saat ini agak terlalu sibuk untuk menulisnya, saya meminta izin untuk menambahkannya sebagai tip di sini untuk saat ini.
Fungsi Canvas (
Λ
atau.Λ
) dapat digunakan untuk menggambar garis ASCII di layar. Ini memiliki tiga parameter yang diperlukan:[0,7]
untuk arah, dimana kita dapat menggunakan satu atau beberapa. Ada juga beberapa opsi khusus yang memerlukan karakter tertentu (lebih lanjut tentang itu nanti).Arah-digit
[0,7]
peta ke arah berikut:Beberapa contoh 05AB1E menjawab di mana Kanvas digunakan:
Mari kita lakukan sesuatu yang mirip dengan yang terakhir, jadi asumsikan kita menggunakan
Λ
fungsi Canvas dengan tiga parameter berikut:[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
Ini akan menghasilkan output sebagai berikut:
Cobalah online.
Jadi bagaimana cara kerjanya? Nah, berikut adalah langkah-langkah dengan input di atas:
3
karakter (!@#
) ke atas (arah0
)3-1
karakter (!@
) ke kanan (arah2
)5-1
karakter (#!@#
) ke bawah (arah4
)5-1
karakter (!@#!
) ke kiri (arah6
)7-1
karakter (@#!@#!
) ke atas (arah0
)7-1
karakter (@#!@#!
) ke kanan (arah2
)9-1
karakter (@#!@#!@#
) ke bawah (arah4
)9-1
karakter (!@#!@#!@
) ke kiri (arah6
)Ada di
-1
sana karena garis tumpang tindih. Jadi dua langkah pertama adalah:Dan
Yang digabungkan adalah:
Beberapa catatan kecil:
[0,7]
ada beberapa opsi spesifik yang tersedia, yang pada dasarnya menerjemahkan ke urutan-urutan tertentu.+
('+
Inline) diterjemahkan menjadi pola04402662
, yang menciptakan+
-cross dengan lengan panjang yang diberikan. Lihat itu dalam aksi.×
('×
Inline) diterjemahkan menjadi pola15513773
, yang menciptakanX
-cross dengan lengan panjang yang diberikan. Lihat itu dalam aksi.8
kembali ke asal tempat kami mulai menggambar. Lihat dalam aksi dan lihat perbedaannya tanpa8
.Λ
akan menampilkan segera, dan.Λ
hasil string yang didorong ke stack, yang kita dapat masih digunakan kembali, memodifikasi, dan melakukan apa saja dengan yang kita inginkan. Beberapa contoh:sumber
+×8
saya memang sudah mencari kode sumbernya.Pop atau dapatkan
Seperti pada bahasa berbasis stack lainnya, fungsi 05AB1E biasanya memunculkan (menggunakan) input mereka dari stack dan mendorong outputnya ke stack.
Namun, beberapa fungsi mendapatkan input dari stack tanpa mengonsumsinya. Contohnya adalah
head
fungsi¬
,, yang menghasilkan elemen pertama dari daftar input. Lihat program contoh di sini:¬+
. Ini menambahkan nomor pertama dari daftar input ke setiap nomor dari daftar itu.Untuk mengetahui fungsi mana yang muncul dan dapatkan, lihat kolom terkait di file informasi fungsi .
sumber
Persyaratan dan loop
Loop dan kondisional secara otomatis menerima kurung penutup di akhir program, jadi Anda hanya perlu menambahkannya dalam kode jika Anda perlu sesuatu di luar loop / kondisional.
Sebagai contoh, program ini (ungolfed) membuat daftar
n
bilangan prima pertama tidak perlu tanda kurung tutup.[¹¾Q#NpiNˆ¼
Tetapi jika kita ingin melakukan beberapa operasi pada daftar yang dihasilkan, misalnya mengambil delta kita harus menutup loop terlebih dahulu.
[¹¾Q#NpiNˆ¼]¯¥
sumber
Kiat golf 05AB1E kecil
Akan memperluas ini dengan tips golf kecil yang saya pelajari di sepanjang jalan. (Baru saja memulai 05AB1E secara pribadi.)
D
(duplikat) danÐ
(rangkap tiga) dalam kombinasi dengans
(swap) danŠ
(triple-swapa,b,c
kec,a,b
) biasanya lebih pendek daripada menggunakan©
(simpan di global_variable ) dan®
(push global_variable ) di dalam loop. Ini menyimpan satu byte dalam jawaban saya ini , serta dua byte dalam jawaban saya ini .½
(jika 1, maka naikkan counter_variable sebesar 1) tidak diperlukan pada akhir aµ
(sementara counter_variable ! = a, do ...), karena dilakukan secara implisit ( menyimpan byte dalam jawaban saya ini )..B
secara implisit terpecah pada baris baru. Ini berguna dalam jawaban saya ini ketika kami sedang mencari alternatif untuk¡
(split) sambil tetap menyimpan item kosong (CATATAN: Solusi dalam jawaban tertaut tidak berfungsi ketika elemen berisi spasi tambahan setelah pemisahan.) - Semoga sebuah builtin akan ditambahkan ke split tetapi tetap baris kosong di masa depanSÖ
(yang mana dari digit dari integer-input dapat membagi secara merata-integer input) akan berisi angka itu sendiri untuk digit0
(bukan kesalahan divide-by-zero). Misalnya,1053
akan menghasilkan[1,1053,0,1]
(1053 habis dibagi 1 dan 3; tidak habis dibagi 5; dan memberikan kesalahan pembagian-oleh-nol untuk 0). Ini cukup berguna dalam jawaban saya ini dengan mengambil kekuatan daftar, karena hanya1
kebenaran di 05AB1E dan yang lainnya falsey.SÖP
menghasilkan kebenaran (1
) karena itu berarti input-integer dibagi rata oleh masing-masing digit.û
(palindromize string yang diberikan) saya terkejut tidak ada builtin is_palindrome . Tetapi kemudian saya menyadari hanya 2 byte yang diperlukan untuk mencapai itu, yaituÂQ
(di manaÂ
bifurcate, yang merupakan kependekan dariDR
: Duplicate & Reverse copy;Q
untuk memeriksa apakah dua nilai teratas pada stack sama).Ds*
(duplikat, swap, gandakan untuk bertindak sebagai logis-DAN) vs}ʒ
(tutup filter pertama, filter lagi) ketika Anda menggunakan dua filter. Misalnya: dalam tantangan ini kita harus membuat daftar semua angka yang panjangnya empat digit, mengandung setidaknya satu0
, dan dengan jumlah digit sama dengan9
. Menggunakan rentang[1000,10000]
mencakup jumlah empat digit, tetapi kemudian Anda dibiarkan dengan dua filter lagi. Awalnya saya menggunakan₄4°ŸʒD0åsSO9Q*
(14 byte), tetapi dengan menggunakan dua filter byte dapat disimpan:₄4°Ÿʒ0å}ʒSO9Q
(13 byte). (Yang kemudian di-golf menjadi₄4°ŸεW°ö9Q
(10 byte) oleh @Grimy.)0
sebagai pengisi, Anda bisa menggunakan0ζ
. Namun satu masalah dengan ini adalah bahwa filler0
akan menjadi string"0"
, jadi jika Anda kemudian mencoba mengurutkan dengan string campuran dan integer, ini kemungkinan besar tidak akan memberikan hasil yang Anda inginkan. Di sini contoh bagaimana hal itu akan mengurutkan daftar dalam zip:0ζ€{
. Ini bisa diperbaiki dengan menambahkan cast eksplisit untuk int (ï
) setelah zip, dan hanya kemudian semacam:0ζï€{
. Namun, menggunakan¾
konstanta seperti0
dengan zip-filler, akan menyebabkannya tetap menjadi bilangan bulat bukan string selama zip. Jadi¾ζ€{
akan menghemat satu byte di sini. Tip ini disediakan oleh @ Mr.Xcoder untuk menghemat satu byte dalam jawaban saya ini .€SO
. Namun lebih pendek menggunakan1ö
, yang secara otomatis membuat vektorisasi. Tip ini disediakan oleh @Grimy untuk menyimpan byte di sini (dan 2 byte di sini ).2‹
. Namun, menggunakan!
(faktorial) juga hanya akan menghasilkan 1 (kebenaran) untuk0
dan1
, dan setiap nilai lainnya akan menghasilkan sesuatu yang lebih tinggi (dan dengan demikian falsey, karena hanya1
benar di 05AB1E). Tip ini disediakan oleh @Grimy untuk menyimpan byte di sini .sumber
Vektorisasi otomatis
Perhatikan bahwa beberapa operator di 05AB1E membuat vektor secara otomatis pada array. Misalnya, kode
5L3+
, yang membongkar ke kode semu berikut:akan menjadi:
Jika tidak melakukan vektorisasi secara otomatis, Anda juga dapat menggunakan
€
operator. Dibutuhkan perintah karakter tunggal, dan melakukan itu (monadik) operator pada setiap elemen. Contoh untuk membagi setiap elemen adalah kode berikut ( coba di sini ):Sedangkan
S
operator normal akan membagi setiap elemen dalam array dan meratakannya menjadi satu array ( coba di sini ).sumber
ñ
didahului dengan nilain
(indeks). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8AMemesan Input
Urutan yang Anda masukkan dapat memiliki efek drastis pada kode Anda, dan, seringkali, jika Anda menggunakan
s
untuk menukar bagian atas tumpukan dengan hal tertinggi berikutnya di tumpukan, Anda tidak memikirkan masalah dengan benar. Coba atur ulang input dan lihat apakah Anda dapat menghilangkan kebutuhan untuk bertukar dengan menukar input sebelumnya, menambahkannya ke stack sebelumnya atau menggandakannya di suatu tempat. I&O yang paling jelas bisa menjadi jawaban 05AB1E yang paling tidak berhasil.sumber
05AB1E ASCII-Seni Golf
Kode di bawah ini membantu mengubah ASCII-art menjadi 05AB1E menggunakan konversi basis kustom.
Cobalah online.
Ini dicapai dengan:
0-9A-Za-z
dalam urutan itu, masing-masing karakter yang berbeda mendapatkan karakter pemetaan mereka sendiri, hingga setiap karakter diganti.•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.The
“
memungkinkan Anda untuk juga kompres string kutipan"
; yangÅв
akan menggunakan string ini ke basis-mengkonversi bilangan bulat dihasilkan dengan menggunakan string sebagai dasar adat; danJ
akan menggabungkan semua karakter ini menjadi satu string, yang merupakan output secara implisit.Menerima pola dengan hingga dan termasuk 62 karakter unik, bagus untuk seni ASCII.
Semakin sedikit jumlah karakter unik, semakin baik kompresi.
Contoh output untuk Draw the XNOR digital timing diagram (214 byte, 9 karakter unik):
Akan menjadi:
05AB1E , 106 byte
Cobalah online.
(106/214) * 100 = 49,53% ukuran string ASCII-art asli.
Yang merupakan byte-count yang sama dengan kiriman saya yang sebenarnya untuk tantangan di 05AB1E (legacy).
Penjelasan kode:
CATATAN: Kode sama sekali tidak golf. Cepat ditulis untuk mengonversi ASCII art ke kompresi yang paling efisien, jadi cukup jelek dan panjang ..
sumber
<str><compr_int><int>вèJ
bukannya Anda<compr_int><int>BžLR<str>‡
; dan menggunakan“
bukan"
sebagai string-quotes, jadi"
bisa menjadi bagian dari input.String dan int adalah tipe yang sama
Bukan sesuatu yang disetujui semua orang, tetapi itu berhasil.
Pertimbangkan dua program berikut:
Keduanya menghasilkan 9 . Itu karena setiap nilai pertama kali dievaluasi (dengan
ast.literal_eval
). Karena itu, kita dapat melakukan semua operator manipulasi string pada int dan semua operator manipulasi string pada string.Sebagai contoh,
12345û
palindromize nomor tersebut12345
, menghasilkan123454321
. Setelah itu, kita bisa melakukan matematika reguler pada nomor ini.Ini akan menghasilkan: 123404321 .
sumber
Loop dan iterator tersembunyi
05AB1E memiliki loop dan iterator normal berikut:
F
, yang berulang melalui 0 .. n-1 .G
, yang beralih melalui 1 .. n-1 .ƒ
, yang berulang melalui 0 .. n .v
, yang berulang pada setiap elemen s [0], s [1], .., s [n] .ʒ
, yang bukan loop, tapi perintah filter-by . Kami menyalahgunakan perintah ini karena perilaku yang tidak disengaja dalam perulangan melalui setiap elemen.Dengan menggunakan loop ini, kita dapat memperoleh loop tersembunyi berikut :
gF
, Anda bisa menggunakanv
yang juga memilikiN
-index yang bisa digunakan.vy -> ʒ
pengganti sedikit lebih rumit:y
tidak mungkin dilakukan dalam loop semacam ini.sumber
[
,µ
danε
juga merupakan bagian dari loop / iterasi normal?y
dimungkinkan dengan beberapa di antaranya sekarang.