Kiat untuk bermain golf di 05AB1E

28

Apakah Anda punya tips untuk di 05AB1E , bahasa golf yang dibuat oleh Adnan ?

Kiat Anda harus setidaknya agak spesifik untuk 05AB1E.

Silakan kirim satu tip per jawaban.

Oliver Ni
sumber
2
Dari Ulasan: Tips pertanyaan ada di topik.
mbomb007

Jawaban:

20

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:

'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,

Cobalah online.

Program ini akan:

  1. 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 ( ¸˜)
  2. Putaran setiap kata ( vyU)
  3. Kemudian memiliki loop dalam atas setiap kata yang dikompresi dari kamus ( "€...ï"Dâvy), yang akan mencoba dijalankan sebagai program 05AB1E ( "“ÿ“".V)
  4. 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.

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:

vAyk})> 27β 255B ".•ÿ•"

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 0
  • 27β: Konversikan indeks ini dari basis 27 ke satu nomor
  • 255B: Konversi nomor ini ke Base-255 menggunakan halaman kode 05AB1E sendiri
  • ".•ÿ•": Tempatkan memimpin .•dan mengikuti sebelum string terkompresi ini

Berikut 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 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 "Žÿ" ë "•ÿ•"

Cobalah online.

Berikut ini contoh jawaban di mana @Emigna menggunakan •3Èñ•untuk integer 246060.

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:

Z>© β 255B ®s"•ÿ•ÿв"

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 basis max+1ke satu nomor
  • 255B: 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 ):

[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
  • Tetapi dalam kasus ini, Ž9¦Sdengan 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)
  • Tetapi dalam hal ini •1∊}•bdengan 6 byte akan menjadi pilihan terbaik (daftar integer terkompresi, dengan biner sebagai pengganti , 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 ):

Kevin Cruijssen
sumber
12

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+:

I    # Input_1.
 I   # Input_2.
  +  # Add them up.

Uji di sini


Namun, dengan menggunakan input implisit , kita dapat mempersingkat menjadi hanya 1 byte, yaitu +:

+    # Take two numbers implicitly and add them up.

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:

3    # Push the number 3 on top of the stack.
 +   # Request implicit input and add to the 3.

Uji di sini

Adnan
sumber
8

Substring

£adalah perintah untuk mengambil bkarakter pertama dari string a.
ex: "hello_world"5£ -> "hello"

Tetapi jika bdaftar indeks itu malah membagi string menjadi bagian-bagian (upto) ukuran itu.
ex: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']

Emigna
sumber
8

Variabel yang ditentukan sebelumnya

Mereka agak tersembunyi di 05AB1E. Berikut daftar semua variabel yang telah ditentukan:

  • ¾, mendorong 0jika counter_variable tidak diubah sebelum perintah ini.
  • X, mendorong 1jika variabel X tidak diubah sebelum perintah ini dengan U.
  • Y, mendorong 2jika variabel Y tidak diubah sebelum perintah ini dengan V.
  • ®, mendorong -1jika 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.)
Adnan
sumber
24
¾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:

Mari kita lakukan sesuatu yang mirip dengan yang terakhir, jadi asumsikan kita menggunakan Λfungsi Canvas dengan tiga parameter berikut:

  • a :[3,3,5,5,7,7,9,9]
  • b :!@#
  • c :[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:

  1. Gambar 3karakter ( !@#) ke atas (arah 0)
  2. Gambar 3-1karakter ( !@) ke kanan (arah 2)
  3. Gambar 5-1karakter ( #!@#) ke bawah (arah 4)
  4. Gambar 5-1karakter ( !@#!) ke kiri (arah 6)
  5. Gambar 7-1karakter ( @#!@#!) ke atas (arah 0)
  6. Gambar 7-1karakter ( @#!@#!) ke kanan (arah 2)
  7. Gambar 9-1karakter ( @#!@#!@#) ke bawah (arah 4)
  8. Gambar 9-1karakter ( !@#!@#!@) ke kiri (arah 6)

Ada di -1sana karena garis tumpang tindih. Jadi dua langkah pertama adalah:

#
@
!

Dan

 !@

Yang digabungkan adalah:

#!@
@
!

Beberapa catatan kecil:

  • Terlepas dari opsi [0,7]ada beberapa opsi spesifik yang tersedia, yang pada dasarnya menerjemahkan ke urutan-urutan tertentu.
  • 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:
Kevin Cruijssen
sumber
1
Saya bahkan tidak menyadari bahwa 05AB1E memiliki kanvas!
MilkyWay90
Bagaimana ... bagaimana Anda mengetahui hal ini? Kode sumber?
Magic Gurita Guci
1
@MagicOctopusUrn Sebagian besar dari jawaban @Adnan ini (PS: jawaban terbarunya cukup jelas juga ). Untuk itu +×8saya memang sudah mencari kode sumbernya.
Kevin Cruijssen
5

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 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 .

Luis Mendo
sumber
@NeilA. Terima kasih! Tautan diperbarui
Luis Mendo
3

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 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ˆ¼]¯¥

Emigna
sumber
3

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 dengan s(swap) dan Š(triple-swap a,b,cke 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 ).
  • .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
  • (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 . 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 , 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 .
Kevin Cruijssen
sumber
2

Vektorisasi otomatis

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 ).

Adnan
sumber
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.

Guci Gurita Ajaib
sumber
2

05AB1E ASCII-Seni Golf

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"

Cobalah online.

Ini dicapai dengan:

  1. Daftar karakter unik dalam gambar ASCII.
  2. Memesannya dengan berapa kali mereka muncul dalam string dalam urutan menurun (paling banyak terjadi pada karakter yang paling sedikit terjadi).
  3. Balikkan dua item pertama jika gambar ASCII dimulai dengan karakter yang paling muncul (untuk mencegah angka 0 di bilangan bulat yang dikompresi).
  4. Memetakan karakter input ke 0-9A-Za-zdalam urutan itu, masing-masing karakter yang berbeda mendapatkan karakter pemetaan mereka sendiri, hingga setiap karakter diganti.
  5. Kompres basis itu, menggunakan basis tertinggi yang perlu Anda ganti (berdasarkan jumlah karakter unik).
  6. Basis mengkonversikannya kembali ke basis-255 (untuk kompresi 05AB1E).
  7. 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.


Contoh output untuk Draw the XNOR digital timing diagram (214 byte, 9 karakter unik):

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

Akan menjadi:

05AB1E , 106 byte

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

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 ..

               # 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)
Guci Gurita Ajaib
sumber
1
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.

12345û50000-

Ini akan menghasilkan: 123404321 .

Adnan
sumber
0

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 :

  • 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.
Adnan
sumber
Saya tahu ini telah diposting setahun yang lalu, tetapi tidak [, µdan εjuga merupakan bagian dari loop / iterasi normal?
Kevin Cruijssen
Juga, memohon ydimungkinkan dengan beberapa di antaranya sekarang.
Magic Gurita Guci