Ini adalah pertanyaan kiat untuk bermain golf di Python.
Dalam bermain golf Python, lazimnya pengiriman adalah fungsi yang didefinisikan sebagai lambda. Sebagai contoh,
f=lambda x:0**x or x*f(x-1)
Format lambda memiliki dua keuntungan besar :
- Pelat
f=lambda x:...
ataulambda x:...
lebih pendek daridef f(x):...return...
ataux=input()...print...
- Panggilan rekursif dapat digunakan untuk mengulang dengan overhead byte kecil.
Namun, lambdas memiliki kelemahan besar yaitu hanya mengizinkan satu ekspresi, tanpa pernyataan. Secara khusus, ini berarti tidak ada tugas yang disukai c=chr(x+65)
. Ini bermasalah ketika seseorang memiliki ekspresi panjang yang nilainya perlu direferensikan dua kali (atau lebih).
Tugas seperti E=enumerate
dimungkinkan di luar fungsi atau sebagai argumen opsional, tetapi hanya jika mereka tidak bergantung pada input fungsi. Argumen opsional seperti f=lambda n,k=min(n,0):...
gagal karena input n
belum didefinisikan ketika k
dievaluasi pada waktu definisi.
Hasilnya adalah bahwa kadang-kadang Anda menyedot pengulangan ekspresi panjang dalam lambda karena alternatifnya adalah non-lambda yang panjang.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Titik impas adalah sekitar 11 karakter ( detail ), yang lalu Anda beralih ke a def
atau program
. Bandingkan ini dengan titik impas panjang biasanya 5 untuk ekspresi berulang:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Bahasa lain memiliki solusi, Oktaf misalnya . Ada trik yang dikenal untuk Python, tetapi mereka panjang, kikuk, dan / atau penggunaan terbatas. Metode pendek, tujuan umum untuk mensimulasikan tugas dalam lambda akan merevolusi golf Python.
Apa cara bagi pegolf Python untuk mengatasi atau mengatasi keterbatasan ini? Gagasan potensial apa yang harus mereka pikirkan ketika mereka melihat ekspresi panjang diulang dua kali dalam lambda?
Tujuan saya dengan pertanyaan tips ini adalah untuk menyelam jauh ke dalam masalah ini dan:
- Katalog dan analisis solusi golf untuk tugas palsu di dalam lambda
- Jelajahi petunjuk baru untuk metode yang lebih baik
Setiap jawaban harus menjelaskan solusi atau petunjuk potensial.
lambda s:(s+s[::-1]).lower()
. Tentu saja ini tidak menjawab pertanyaan yang sebenarnya.strip
.Jawaban:
eval
Ini tidak terlalu bagus, tetapi jika solusi Anda sudah menggunakan
eval
beberapa cara atau bentuk, Anda biasanya dapat menggunakan teknik ini.sumber
Ekspresi penugasan dalam Python 3.8
Python 3.8 ( TIO ) memperkenalkan ekspresi penugasan , yang digunakan
:=
untuk menetapkan inline variabel sebagai bagian dari ekspresi.Ini dapat digunakan di dalam a
lambda
, di mana tugas biasanya tidak diizinkan. Membandingkan:Lihat tip ini untuk informasi lebih lanjut.
sumber
Lambda batin
Ini memungkinkan Anda untuk mendefinisikan banyak variabel sekaligus.
vs.
jauh lebih lama, tetapi jika Anda memiliki beberapa variabel, atau variabel yang lebih panjang, yang diulang berkali-kali:
vs.
Jumlah karakter
Awal:
(lambda:)()
(11 byte)Variabel pertama:
[space]a
(2 byte)Variabel berikutnya:
,b,
(3 byte)Gunakan:
a
(1 byte).(Juga menghemat kurung)
Jadi, ini membutuhkan
3n + 10
byte, di manan
jumlah variabel. Ini adalah biaya awal yang tinggi, tetapi pada akhirnya dapat membayar. Bahkan mengembalikan nilai batinnya, sehingga Anda dapat membuat sarang berlipat ganda (Meskipun ini dengan cepat akan menjadi tidak layak.)Ini benar-benar hanya berguna untuk perhitungan menengah panjang dalam pemahaman daftar bersarang, karena
def f():a=...;b=...;return
biasanya akan lebih pendek.Untuk 1 nilai, ini menghemat:,
uses * length - length - uses - 13
jadi hanya berguna ketika ekspresi itu positif.Untuk
n
ekspresi berbeda yang digunakanu
total waktu, di mana panjang gabungannyal
, ini menghemat:l - (3 * n) - u - 10 ( + brackets removed )
sumber
Gunakan Daftar
Deklarasikan daftar sebagai parameter dan gunakan
.append() or
untuk menyimpan nilai:lambda s:s.lower()+s.lower()[::-1]
berubah menjadi
lambda s,l=[]:l.append(s.lower())or l[-1]+l[-1][::-1]
Jumlah karakter:
,l=[]
5 karakterl.append()or
13 karakterl[-1]
5 karakter untuk setiap penggunaanSeri
Jumlah karakter yang ditambahkan adalah:
uses*(5-length) + 18 + length
Pada contoh sebelumnya, pernyataannya
s.lower()
adalah 9 karakter dan digunakan 2 kali, menerapkan teknik ini menambahkan 19 karakter. Jika digunakan 7 kali, akan ada pengurangan 1 karakter.Jumlah kegunaan minimal untuk teknik ini layak adalah
min_uses = (18+length)/(length-5)
Kelemahan
list
objek sehingga[0]
,.pop()
,[x:y]
dan fungsi daftar lainnya dapat digunakan untuk trik. sangat situasionalKerugian
5
Gunakan kamus
thanks @Zgarb
Ide yang sama seperti di atas. Deklarasikan kamus sebagai parameter dan gunakan
.setdefault()
untuk menyimpan (dan mengembalikan) nilainya:lambda s:s.lower()+s.lower()[::-1]
berubah menjadi
lambda s,d={}:d.setdefault(0,s.lower())+d[0][::-1]
Perhatikan bahwa, tidak seperti
list
lawannya,setdefault
mengembalikan nilai yang diberikan.Jumlah karakter:
,d={}
5 karakterd.setdefault(k,)
16 karakterd[k]
4 karakter untuk setiap penggunaanSeri
Jumlah karakter yang ditambahkan adalah:
(uses-1)*(4-length) + 21
Pada contoh sebelumnya pernyataannya
s.lower()
adalah 9 karakter dan digunakan 2 kali, menerapkan teknik ini menambahkan 16 karakter. Jika digunakan 7 kali, akan ada pengurangan 1 karakter.Jumlah kegunaan minimal untuk teknik ini layak adalah
min_uses = 1-21/(4-length)
Kelebihan / Kelemahan
4
Pertimbangan lainnya
lambda
mungkin bisa dijatuhkan dan fungsinya ditulis ulang dengandef
/input
untuk program yang lebih pendek.sumber
lambda s,d={}:d.setdefault(0,s.lower())+d[0][::-1]
Ini juga dapat digunakan kembali.list.extend
untuk menambahkan beberapa elemen sekaligus, yang akan lebih pendek daripada menggunakanlist.append
beberapa kali.Gunakan untuk mengatur variabel dan mengembalikan data setelah operasi seperti:
sumber
Daftar pemahaman
Ini lebih merupakan pilihan terakhir karena sangat tidak menarik, tetapi Anda bisa melakukan
[<expression> for <variable> in <value>]
pseudo-set variabel dalam lambda. Pada dasarnya satu-satunya poin bagus tentang metode ini adalah bahwa ekspresi batin dapat tetap dapat dibaca, yang jelas menjadi perhatian Anda saat bermain golf.
sumber