Pyth adalah bahasa pemrograman prosedural yang diilhami oleh Python, dibuat oleh pengguna PPCG isaacg .
Apa tips umum yang Anda miliki untuk bermain golf di Pyth? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Pyth.
Tolong, satu tip per jawaban.
Ketahui Variabel Anda
Pyth memiliki 3 kategori variabel: variabel pra-inisialisasi generik, variabel pra-inisialisasi berdasarkan input pengguna, dan variabel yang secara implisit menghasilkan tugas pada penggunaan pertama.
Variabel umum:
Variabel input-diinisialisasi:
Perhatikan bahwa inisialisasi ini hanya akan dijalankan dalam program yang diberikan jika variabel terkait digunakan di luar string dalam kode. Selain itu, urutannya adalah
Q
, kemudianz
, jika keduanya digunakan.Penugasan pada variabel penggunaan pertama:
J
danK
. Jika Anda ingin menginisialisasi keduanya ke nilai yang sama, Anda dapat melakukannya dengan ekspresi sepertiKJ0
, yang setara dengan yang lebih panjangJ0K0
.sumber
Gunakan juru bahasa online yang lebih baru untuk menguji jawaban Anda.
Perhatikan bahwa ini adalah perangkat lunak baru, jadi mungkin bermasalah. Silakan laporkan masalah apa pun kepada saya.
sumber
String di akhir baris tidak perlu kutipan akhir. Sebagai contoh:
adalah program Hello World yang sepenuhnya valid.
sumber
Gunakan
C
untuk kompresi dasarIni sebenarnya tidak berdokumen, C pada string sebenarnya bukan direct chr -> int tetapi sebaliknya 256 -> base 10 (yang sama pada satu string char). Ini sangat membantu dalam mengompresi int, kita dapat menggunakan skrip ini untuk kompres:
Ambillah
12345678910
, itu menghasilkanßÜ>
(beberapa tidak dapat dicetak di sana).Juga dengan array int, Anda dapat menggabungkannya, dan dengan string besar dengan mengonversi ke poin kode dan memperlakukan sebagai basis 128 angka.
Penggunaan lain
C
, terima kasih @xnor karena menunjukkan ini kepada saya, membuat angka besar sewenang-wenang. Cara naif adalah:Tetapi kita bisa melakukan satu byte lebih baik dengan:
pangkalan ini 256 mendekonversi seluruh alfabet. Hasil
156490583352162063278528710879425690470022892627113539022649722
= ~1.56e62
.sumber
Sekarang ada tutorial online untuk Pyth.
Dokumentasi lengkap akan ditambahkan kemudian.
sumber
Gunakan fungsi pendek ... err ... fungsi
Ketika argumen lambda
map
ataureduce
hanya menerapkan satu operasi untuk argumen ,, Anda dapat menggunakan formulir pendek,M
danF
.fMx
sama denganmfdx
, danfFx
sama dengan.UfbZx
. Misalnya, kita ambil daftar angka sebagai input dan output masing-masing bertambah. Pendekatan pertama mungkin:Namun, itu dapat ditulis ulang sebagai:
Hal serupa berlaku untuk
reduce
denganF
. Sebagai contoh, katakan ada tantangan untuk menghitung produk dari daftar bilangan bulat. Sekali lagi, percobaan pertama mungkin:Namun, dengan
F
, itu dapat disingkat menjadi:Menghilangkan tiga byte ... tidak buruk!
sumber
Q
, karena ditambah ketika fungsi tidak ada input, membuatnya*F
Tetap perbarui implementasi Pyth Anda.
Saya secara teratur meningkatkan Pyth, menghapus fitur yang kurang berguna dan menambahkan yang lebih berguna, jadi perhatikan apa yang baru dan perbarui salinan implementasi Anda secara teratur.
Beberapa fitur yang baru ditambahkan: (per 10/19/14)
y
: Bertindak seperti*2
pada angka, dan sebagai daftar semua himpunan bagian pada string dan daftar. Misalnya:f
:f
biasanya perintah filter. Sekarang, ketika dipanggil dengan angka sebagai argumen kedua, ia akan memfilter urutan tak terbatas yang dimulai dengan angka itu dan menghitungnya, lalu mengembalikan elemen pertama dari urutan yang dihasilkan.Misalnya, inilah kode untuk menemukan perdana terkecil di atas satu miliar:
sumber
yz
?mvdczd
tidak mungkin jalan terpendek ...y
karena saya tidak berpikir Pyth perlu memiliki beberapa format input yang sangat mudah diurai, hanya satu, misalnya format Python. Jadi, ya, saya pikirmvdczd
harus dilakukan, sayangnya.r
rangkaian pemrosesan string.r
terlihat cukup bermanfaat.@
di Fdr1 + 1 @ Q2Iq% Qd0d untuk membuat faktor kalkulator. Ketika saya mencoba menggunakannya, itu default keindex
artinya sebagai gantinya. Apakah ada cara untuk mengatasi perilaku ini?Argumen yang disebutkan dalam fungsi (Tidak lagi didukung)
Terkadang, nilai-nilai standar dalam fungsi bisa berguna untuk bermain golf. Pyth sebenarnya mendukung ini (sangat mengejutkan saya). Sebagai contoh:
Akan dicetak:
Anda juga dapat menggunakan J dan K untuk menyimpan karakter saat melakukan ini:
cetakan:
Ini biasanya berguna untuk algoritma rekursif.
Ini tidak lagi berfungsi, tetapi saya telah meninggalkannya di sini jika seseorang ingin bermain golf menggunakan versi lama Pyth.
sumber
Membongkar 2 elemen tuple dengan
F
Katakanlah Anda memiliki 2 elemen tuple
J = (a, b)
,, dan Anda inginr(a,b)
, untuk beberapa fungsi 2 arity r.Cara naif untuk melakukan ini adalah
rhJeJ
.Cara mewah untuk melakukan ini adalah
r.*J
, menggunakan operator membongkar.Cara yang sangat mewah untuk melakukan ini adalah
rFJ
, menggunakan operator lipat.sumber
.u
untuk itu?.u
tampaknya mengurangi kumulatif sekarang.Gunakan fungsi aritmatika singkat
h
: Selain mengembalikan elemen pertama dari daftar, itu menambah angka, misalnyahT
dievaluasi menjadi11
. Lebih pendek dari+1T
.t
: Ini mengurangi angka (selain mengembalikan ekor daftar), misalnyatT
dievaluasi menjadi9
. Lebih pendek dari-T1
.y
: Ini menggandakan angka, misalnyayT
dievaluasi menjadi20
, lebih pendek dari*T2
atau+TT
.sumber
Gunakan
map
untuk menghasilkan daftarIni pada dasarnya setara dengan pemahaman daftar fancy python. Gunakan daftar atau rentang yang ada untuk beralih dan memetakan setiap nilai, meskipun nilainya tidak masalah.
Dua contoh:
Buat daftar 8 nol.
mZ8
dari pada*8]Z
Buat daftar 5 angka acak antara 0 dan 9:
mOT5
dari padaV5~Y]OT)
Yang kedua secara otomatis menetapkan daftar untuk
Y
(sebenarnya sebenarnya ditambahkan ke Y), tetapi bahkan=YmOTU5
lebih pendek.sumber
Q implisit di EOF
Ini adalah perubahan baru, seperti hari ini.
Q
adalah variabel yang diinisialisasi-otomatis ke input yang dievaluasi. Secara implisit ditambahkan ke akhir program Pyth, sebanyak yang diperlukan untuk membuat arity bekerja. Untuk melihat contoh cara menggunakan ini untuk bermain golf, katakanlah kita ingin menghitung fungsi Collatz dari input.Cara terpendek untuk menulisnya adalah seperti ini:
Namun, karena
Q
s adalah implisit di akhir file, kita cukup menulis:Menyimpan 2 byte.
Perhatikan bahwa fungsi dengan argumen yang tidak diperlukan tidak akan diisi dengan argumen tersebut. Misalnya,
c"12 12"
tidak akan memiliki implisitQ
, karenac
hanya membutuhkan 1 argumen.sumber
Gunakan perkecil untuk menerapkan fungsi berulang kali.
Misalkan Anda perlu mengatur variabel ke beberapa fungsi itu sendiri, dan ulangi beberapa kali. Ambil, misalnya, masalah menemukan nomor 100 nanti dalam Urutan Collatz dari input. Cara terpendek untuk menemukan nomor berikutnya dalam urutan, jika nomor awal adalah
Q
, adalahCara paling jelas untuk menerapkan ini 100 kali dan mencetak hasilnya adalah
Ulangi 100 kali, perbarui nilai Q setiap kali, lalu akhiri loop dan cetak Q.
Sebagai gantinya, kita bisa menggunakan fungsi pengurangan yang mengabaikan variabel urutan (
H
).Ini lebih pendek 2 karakter. Ini lebih pendek 3 karakter jika Anda mencoba untuk mengulang sebanyak yang ada elemen dalam urutan.
sumber
Biasanya ada alternatif yang lebih pendek dari Any
Saat Anda ingin mengetahui apakah ada urutan yang memenuhi syarat, Anda biasanya akan menggunakannya
.Em
. Misalnya, jika Anda ingin mengetahui apakah ada dalam daftar lebih besar dari atau sama dengan 5:Tetapi, jika itu hanya perlu kebenaran / kesalahan, tidak benar / salah,
sm
akan berhasil karena jumlah bekerja pada bools.Kita bahkan dapat melakukan yang lebih pendek, dengan
f
ilter:Yang terakhir terlihat sangat jelek.
Untuk
.A
ll, satu-satunya hal yang dapat saya pikirkan adalah menggunakan kondisi yang berlawanan dan meniadakannya untuk menghemat satu char.Am
:sumber
Lihatlah semua opsi aliran kontrol
Loop:
F
: Untuk loop. Sama seperti Python.V
: Untuk loop di atas rentang. Baik variabel maupun rentang harus diberikan, jadi 2 karakter lebih pendek.W
: Sementara loop. Sama seperti Python.#
: Infinite while. Melarikan diri dengan kesalahan atau jeda eksplisit.Hanyatry ... except
fitur sekarang di Pyth.Fungsi:
D
: Definisi umum. Sama seperti Python.L
: 1 argumen, tidak ada fungsi penugasan, seperti lambda Python, tetapi dinamai. Nama fungsi, nama variabel dan return (R
) tidak perlu diberikan, jadi 3 karakter lebih pendek.Pemrograman fungsional:
f
: Filter - pilih elemen dari urutan input yang mengembalikan kebenaran pada input lambda.f
: Bilangan bulat pertama lebih besar dari atau sama dengan input yang memberikan hasil filter yang benar.m
: Peta - mengubah elemen urutan input menggunakan input lambda.u
: Kurangi - lipat urutan input pada input lambda, inisialisasi akumulator ke argumen ketiga.o
: Urutan - elemen yang lebih tua dari urutan input menggunakan input lambda sebagai kuncinya.Biasanya, akan ada beberapa kemungkinan untuk setiap masalah yang diberikan, dan hanya dengan menulis solusi tes dengan masing-masing dari mereka yang dapat Anda mencari tahu mana yang terpendek.
sumber
.x
baru-baru ini dapat digunakan untuk blok coba-kecuali..x{some_statments}{except_block - can this be empty}
.# ... B
dapat digunakan dengan cara ini jika Anda tidak berada di dalam ekspresiBerpindah dua elemen dalam daftar
Mengganti dua elemen bisa menjadi tugas yang cukup mahal. Jadi, inilah dua pendekatan yang ingin Anda gunakan.
Pendekatan variabel tmp
Dalam persiapan kami mendefinisikan daftar
Y
dan mengisinya dengan beberapa angka. Tujuannya adalah untuk mengganti elemen kedua dan ketiga.Kami cukup menetapkan variabel tmp
J = Q[G]
, melakukan tugas daftar pertamaY[G] = Y[H]
dan kemudian tugas terakhir keduaY[H] = J
. Kuncinya di sini adalah untuk menumpuk dua tugas daftar, sehingga Anda tidak perlu menekan pencetakan dan tidak harus menggunakan rujukan dua kaliY
.dari pada
Pendekatan penerjemahan
Jika elemen, yang ingin Anda alihkan, unik dalam daftar, gunakan pendekatan ini. Ini sangat singkat. Jadi kali ini kita beralih elemen pertama dan ketiga (nilai
1
dan5
unik).Ini menggunakan fungsi terjemahan dari daftar:
Penerjemahan ini menggantikan setiap elemen
Y[0]
denganY[1]
dan setiapY[1]
denganY[0]
. Jadi jika nilainya tidak unik, hal-hal buruk akan terjadi. MisalnyaK,1 2
menghasilkan[1, 5, 3, 5, 6, 7]
.Perhatikan bahwa tanda kurung penutup adalah opsional, jika pernyataan itu adalah yang terakhir dalam kode Anda.
sumber
Debugging dengan
<newline>
Jika kode Anda ditulis dengan gaya pemrograman imperatif, cukup mudah untuk di-debug, karena Anda dapat dengan mudah mencetak hasil-hasil antara. ( permalink )
Tetapi sejumlah besar program Pyth menggunakan elemen pemrograman fungsional, seperti peta, filter dan kurangi, yang tidak memungkinkan pencetakan sesederhana itu. Tapi itu masih mungkin, menggunakan
\n
perintah.Kode yang sama menggunakan
u
(mengurangi) adalah: ( permalink )Jika Anda ingin mencetak nilai menengah, cukup masukkan
\n
: ( permalink )\na
mencetaka
pada baris baru dan kembalia
. Jadi Anda bisa memasukkannya di mana saja tanpa perlu khawatir mengubah fungsionalitas program.sumber
Menemukan maksimum dua bilangan bulat
Misalnya, anggap Anda punya
J=5
danK=12
. Kemudiang#JK
= 12, dang#KJ
= 12 juga.Ini ditemukan oleh @ Pietu1998, yang mengatakannya seperti ini:
Tidak yakin apakah seseorang telah menemukannya, tetapi ada cara keren untuk melakukan maks (A, B) dalam 2 byte, tidak perlu menggunakan 3 untuk
eS,AB
.g#AB
melakukan hal yang sama. (Meskipun demikian, ini sangat tidak efisien, karena loopnya max (1, A-B + 1) kali. Optimalisasi adalah menempatkan angka yang kemungkinan lebih besar dari B.)sumber
join
Metode PythThe
join
metode dalam Python dapat sering sedikit mengganggu, karena hanya bergabung string. Pythjoin
lebih murah hati. Ini mengubah semua objek dalam string secara default.Misalnya
jkUT
memberi0123456789
ataujb["abc"4,5\f]7
memberisumber
j2\a\b
->"a2b"
Memberitahu jika suatu Angka adalah Angka Utuh
Trik yang rapi adalah menggunakan
I
nvariant untuk mengetahui apakah suatu bilangan adalah bilangan bulat:Ini memeriksa apakah nomor tidak berubah ketika Anda memotongnya, dan itu tidak akan terjadi jika itu adalah angka bulat.
Misalnya, Anda bisa menggunakan ini sebagai tanda kuadrat sempurna:
sumber
Gunakan Packed Pyth
Packed Pyth adalah "bahasa pemrograman" baru yang persis sama dengan Pyth, kecuali bahwa ia menggunakan 7 bit per karakter, bukan 8 bit per karakter.
Untuk menggunakannya, klon repositori pyth . File tersebut
packed-pyth.py
adalah juru bahasa.Katakan kode Anda
"Hello, world!
.Pertama, letakkan di file:
echo -n '"Hello, world!' > code.pyth
Selanjutnya, kemas kode Pyth ke dalam file Pyth Packed:
python3 packed-pyth.py -p code.pyth code.ppyth
Terakhir, jalankan kode Packed Pyth:
python3 packed-pyth.py code.ppyth
Saat menjalankan kode, Anda dapat memberikan
-d
tanda untuk melihat apa kode Pyth yang sebenarnya sedang dijalankan, dan Anda dapat memberikan input sebagai argumen baris perintah kedua setelah file yang berisi kode.Terbalik:
Kelemahan:
Hanya ASCII.
Tidak ada input interaktif.
Opsi debug penuh tidak tersedia.
Pelaporan kesalahan yang lebih buruk.
sumber
Pengujian terbagi menggunakan
I
dan GCDPenafian: Ini hanya berfungsi untuk bilangan bulat non-negatif.
Untuk memeriksa apakah dua bilangan bulat non-negatif dapat dibagi, Anda dapat melakukan hal berikut:
Jika a dapat dibagi dengan b dan ≥ b ≥ 0 , maka gcd (a, b) = b .
Ini tidak selalu menghemat byte
!%<dividend><divisor>
, tetapi mungkin membawa Anda penghematan, karena:Q
), ketika bekerja dengan dividen.<pfn>
, karena ini adalah fungsinya sendiri.0
.Cobalah!
sumber
iI
adalah fungsi tersendiri, sedangkan!%
tidak, jadi Anda bisa menggunakannya sebagai fungsi awalan.Menetapkan variabel ke fungsi yang diterapkan pada dirinya sendiri
Jika Anda memiliki fungsi arity 1, dan ingin menerapkannya ke variabel dan menerapkannya sendiri, Anda dapat menggunakan sintaks berikut:
Dari pada:
Misalnya, jika Anda ingin menambah variabel
Z
, Anda dapat melakukan:Yang menghemat satu byte lebih
=ZhZ
.sumber