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.
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:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
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).
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:
vAyk})> 27β 255B ".•ÿ•"
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".
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, integer 13562
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 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₁Ò'Θpc
dan rl
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:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
Berikut ini contoh jawaban di mana @Emigna menggunakan •3Èñ•
untuk integer 246060
.
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:
Z>© β 255B ®s"•ÿ•ÿв"
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 basis max+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 hardcoded 44 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 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 ):
•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.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+
:
I # Input_1.
I # Input_2.
+ # Add them up.
Namun, dengan menggunakan input implisit , kita dapat mempersingkat menjadi hanya 1 byte, yaitu +
:
+ # Take two numbers implicitly and add them up.
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.
£
adalah perintah untuk mengambil b
karakter pertama dari string a
.
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']
Mereka agak tersembunyi di 05AB1E. Berikut daftar semua variabel yang telah ditentukan:
¾
, mendorong 0
jika counter_variable tidak diubah sebelum perintah ini.X
, mendorong 1
jika variabel X tidak diubah sebelum perintah ini dengan U
.Y
, mendorong 2
jika variabel Y tidak diubah sebelum perintah ini dengan V
.®
, 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.)¾
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 mendorong 5,0,7
, 5¾7
adalah 2 byte lebih pendek dari 5 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 saya 0
.
M
mendorong -Inf
.
Λ
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:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
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:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
Jadi bagaimana cara kerjanya? Nah, berikut adalah langkah-langkah dengan input di atas:
3
karakter ( !@#
) ke atas (arah 0
)3-1
karakter ( !@
) ke kanan (arah 2
)5-1
karakter ( #!@#
) ke bawah (arah 4
)5-1
karakter ( !@#!
) ke kiri (arah 6
)7-1
karakter ( @#!@#!
) ke atas (arah 0
)7-1
karakter ( @#!@#!
) ke kanan (arah 2
)9-1
karakter ( @#!@#!@#
) ke bawah (arah 4
)9-1
karakter ( !@#!@#!@
) ke kiri (arah 6
)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 pola 04402662
, yang menciptakan +
-cross dengan lengan panjang yang diberikan. Lihat itu dalam aksi.×
( '×
Inline) diterjemahkan menjadi pola 15513773
, yang menciptakan X
-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:
+×8
saya memang sudah mencari kode sumbernya.
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 .
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ˆ¼]¯¥
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 dengan s
(swap) dan Š
(triple-swap a,b,c
ke c,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 digit 0
(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 hanya 1
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 dari DR
: 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 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.)0
sebagai pengisi, Anda bisa menggunakan 0ζ
. Namun satu masalah dengan ini adalah bahwa filler 0
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 seperti 0
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 menggunakan 1ö
, 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) untuk 0
dan 1
, dan setiap nilai lainnya akan menghasilkan sesuatu yang lebih tinggi (dan dengan demikian falsey, karena hanya 1
benar 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 S
operator normal akan membagi setiap elemen dalam array dan meratakannya menjadi satu array ( coba di sini ).
ñ
didahului dengan nilai n
(indeks). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
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.
Kode di bawah ini membantu mengubah ASCII-art menjadi 05AB1E menggunakan konversi basis kustom.
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
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; dan J
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):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
Akan menjadi:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(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).
CATATAN: Kode sama sekali tidak golf. Cepat ditulis untuk mengonversi ASCII art ke kompresi yang paling efisien, jadi cukup jelek dan panjang ..
|» # Take multi-line input
© # Store it in the register to reuse later
ÐÙS # Only leave unique characters (as list)
DŠ¢ø # Map it with the count for each of those characters
Σθ}R # Sort it based on that count (highest to lowest)
€н # Remove the count again, so the sorted characters remain
¬®sÅ?i # If the input starts with the most occurring character:
D2£RDŠKsì} # Swap the first two characters in the list
J© # Join everything together, and store it in the register to reuse later
žLR‡ # Map each character to [0-9A-Za-z]
®gö # Get the amount of unique characters, and convert it to that Base
₅B # And then convert that to Base-255
®s # Push the string and swap so the compressed integer is at the top again
"•ÿ•“ÿ“ÅвJ" # Insert it in the correct output format
# `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•" # (after which the result is output implicitly with trailing newline)
<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.
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.
12345û50000-
Ini akan menghasilkan: 123404321 .
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 menggunakan v
yang juga memiliki N
-index yang bisa digunakan.vy -> ʒ
pengganti sedikit lebih rumit:
y
tidak mungkin dilakukan dalam loop semacam ini.[
, µ
dan ε
juga merupakan bagian dari loop / iterasi normal?
y
dimungkinkan dengan beberapa di antaranya sekarang.