Latihan Golf: Python [ditutup]

31

Ini adalah tantangan dalam mempraktikkan optimasi golf dengan Python - trik dan cara pintas yang dapat digunakan kembali untuk mengurangi beberapa karakter. Banyak yang akan terbiasa dengan pegolf Python dan menggunakan ide-ide umum dari Tips Python . Beberapa di antaranya menggunakan fitur khusus Python yang mungkin tidak Anda ketahui ada kecuali Anda pernah melihatnya, jadi lihatlah kiat-kiatnya jika Anda buntu.

Sasaran: Ada sepuluh masalah, masing-masing potongan referensi kode Python untuk Anda optimalkan dan deskripsi kode tidak. Sasaran Anda adalah menulis ulang agar lebih pendek tetapi masih setara secara fungsional.

Skor Anda, yang ingin Anda perkecil, adalah total panjang kode Anda semua snippet. Panjang cuplikan referensi adalah 150. Tiebreaker adalah posting paling awal.

Posting jawaban: Untuk setiap masalah, posting kode Anda dan jumlah karakternya. Anda dapat memposting cuplikan referensi jika Anda tidak menemukan sesuatu yang lebih pendek. Ini dimaksudkan agar Anda tidak melihat jawaban orang lain ketika Anda memposting jawaban Anda. Silakan beri tag spoiler untuk setiap masalah individu termasuk jumlah karakter individu. Anda dapat membiarkan jumlah total terungkap. Jangan ragu untuk membatalkan solusi Anda atau mengirim solusi baru yang belum rusak.

Detail tentang legalitas: Kesetaraan fungsional berarti kode dapat diganti dalam suatu program tanpa memengaruhi perilakunya (mengabaikan hal-hal seperti penggunaan memori dan prioritas operator sebagai bagian dari ekspresi). Ekspresi harus menghasilkan nilai yang setara dengan ==. Catat itu 1.0==1==True. Kode Anda seharusnya tidak memiliki efek samping kecuali dinyatakan lain. Saya tidak bermaksud masalah untuk menjadi versi spesifik, tetapi untuk berjaga-jaga, Anda dapat menentukan versi Python untuk setiap masalah.

Masalah 1: Tetap iterasi selama daftar Lmemiliki setidaknya 7 elemen

# 16 chars
while len(L)>=7:

Masalah 2 : Periksa apakah dua mengapung xdan ykeduanya positif.

# 11 chars
x>0 and y>0

Masalah 3 : Jika Boolean bbenar, hapus elemen pertama dari L. Jika tidak, biarkan tidak berubah.

# 12 chars
if b:L=L[1:]

Masalah 4 : Periksa apakah semua elemen dari daftar Langka yang tidak kosong sama. Untuk masalah ini, tidak apa-apa untuk memodifikasi daftar.

# 22 chars
all(x==L[0]for x in L)

Masalah 5 : Tambahkan nomor nke akhir daftar Lhanya jika Lsudah berisi nomor itu.

# 16 chars
if n in L:L+=[n] 

Masalah 6 : Ekspresikan tanda pelampung x: +1untuk positif, 0untuk 0, -1untuk negatif.

# 20 chars
abs(x)/x if x else 0

Masalah 7 Lanjutkan loop selama elemen pertama L, daftar Boolean, adalah True. Hentikan juga jika Lkosong.

# 17 chars
while L and L[0]:

Masalah 8 : Lanjutkan loop selama nlebih besar dari 1. Angka ndijamin bilangan bulat positif.

# 10 chars
while n>1:

Masalah 9 : Periksa apakah bilangan bulat yang direpresentasikan sebagai string snegatif (mis. Dimulai dengan '-').

# 9 chars
s[0]=='-'

Masalah 10 : Konversikan Boolean bke "Win"/ "Lose", dengan True-> "Win"dan False-> "Lose".

# 17 chars
["Lose","Win"][b]

Peringatan: Spoiler di bawah, jangan gulir ke bawah jika Anda ingin menyelesaikannya sendiri.

Jika Anda hanya ingin mengetahui skor optimal untuk suatu masalah:

Masalah 1:

12

Masalah 2:

5

Masalah 3:

7

Masalah 4:

13

Masalah 5:

13

Masalah 6:

8

Masalah 7:

12

Masalah 8:

9

Masalah 9:

5

Masalah 10:

15

Tidak
sumber
3
Saya memilih untuk menutup, karena tantangan ini memicu jawaban rangkap dan secara efektif ada banyak pertanyaan dalam satu, karena tidak ada interaksi antara tantangan individu sama sekali. Saya pikir jika kita memiliki pertanyaan seperti itu, seharusnya hanya ada satu jawaban, yaitu wiki komunitas.
Wrzlprmft
2
@Wrzlprmft: Entah bagaimana itu tantangan yang menarik. Tetapi setelah memiliki 7 kontribusi besar, sekarang, saya menyarankan untuk mengendurkan aturan dan memungkinkan solusi yang tidak terganggu untuk satu masalah, karena jika tidak, pengiriman yang sempurna mungkin tetap tersembunyi di balik skor total biasa-biasa saja secara keseluruhan.
Falko
2
Saya pikir ini adalah ide yang bagus dan kita harus berlatih golf untuk lebih banyak bahasa.
Robbie Wxyz
2
@Wrzlprmft sekarang ada diskusi tentang ini di meta . Silakan sampaikan pendapat Anda di sana, untuk diskusi yang lebih mudah tanpa mencemari komentar pertanyaan ini.
FireFly
3
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena tantangan multi-bagian tanpa interaksi antara bagian tidak diizinkan. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Jawaban:

21

Total: 104 101 99 karakter

Masalah 1

12 karakter
while L[6:]:

Masalah 2

5 karakter
x>0<y

Masalah 3

7 karakter
L=L[b:]

Masalah 4

13 karakter
len(set(L))<2
L[1:]==L[:-1]

Masalah 5

13 karakter
L+=set(L)&{n}

Masalah 6

11 karakter
(x>0)-(x<0)

8 karakter (Python 2)
cmp(x,0)

Masalah 7

12 karakter
while[.5]<L:

Masalah 8

9 karakter
while~-n:

Masalah 9

5 karakter
s<'.'

Masalah 10

15 karakter
'LWoisne'[b::2]

grc
sumber
@FryAmTheEggman Bisakah Anda menjelaskan efek sampingnya? Saya bermaksud itu menjadi solusi yang valid.
xnor
@ xnor Nevermind, saya sepenuhnya salah. Saya belajar sesuatu hari ini :)
FryAmTheEggman
Saya percaya solusi ini akan optimal, mengingat beberapa solusi 99 dan fakta bahwa saya tidak dapat menemukan yang lebih baik. Saya akan senang melihat peningkatan. Karena ini adalah 99 pertama, saya menerimanya.
xnor
7

Ukuran total: 128 122 120 117 116 115 111 107 104

Masalah 1

Tetap iterasi selama daftar Lmemiliki setidaknya 7 elemen.

15 karakter
while len(L)>6:
(Ya, saya bisa menghemat 3 byte pada ini, tapi saya tidak sengaja melihat jawaban solusi Sp3000, jadi saya tidak akan mengklaim tiga byte itu.)

Masalah 2

Periksa apakah dua mengapung xdan ykeduanya positif.

5 karakter
x>0<y

Masalah 3

Jika Boolean bbenar, hapus elemen pertama dari L. Jika tidak, biarkan tidak berubah.

7 karakter
L=L[b:]

Masalah 4

Periksa apakah semua elemen daftar Langka yang tidak kosong sama. Untuk masalah ini, tidak apa-apa untuk memodifikasi daftar.

13 karakter
L[1:]==L[:-1]

Masalah 5

Tambahkan nomor nke akhir daftar Lhanya jika Lsudah berisi nomor itu.

15 karakter
L+=[n]*(n in L)
atau
L+=[n][:n in L]

Masalah 6

Ekspresikan tanda pelampung x: +1untuk positif, 0untuk 0, -1untuk negatif.

8 chars, Python 2
cmp(x,0)
Menurut dokumen ini mungkin mengembalikan nilai positif / negatif, tetapi konsensus apakah selalu mengembalikan -1, 0, 1.

Masalah 7

Lanjutkan lingkaran selama elemen pertama dari L, daftar Boolean, adalah True. Hentikan juga jika Lkosong.

12 karakter
while[1]<=L:

Masalah 8

Lanjutkan loop selama nlebih besar dari 1. Angka ndijamin bilangan bulat positif.

9 karakter
while~-n:

Masalah 9

Periksa apakah bilangan bulat yang direpresentasikan sebagai string snegatif (mis. Dimulai dengan '-').

5 karakter
s<'.'

Masalah 10

Konversikan Boolean bke "Win"/ "Lose", dengan True-> "Win"dan False-> "Lose".

15 karakter
"LWoisne"[b::2]

Martin Ender
sumber
Bisakah Anda juga spoiler panjang masing-masing?
xnor
@ xnor Tidak masalah, selesai.
Martin Ender
7

Total: 106 104 102 karakter

Masalah 1

12 karakter
while L[6:]:

Masalah 2

5 char
x>0<y
Huzzah untuk chaining perbandingan

Masalah 3

7 karakter
L=L[b:]
Konversi implisit lama yang baik

Masalah 4

13
len(set(L))<2

Sebagai alternatif: Cara
L[1:]==L[:-1]

bodoh untuk mendapatkan negasi dari apa yang kita inginkan dengan Python 2:
","in`set(L)`

Saya tidak yakin apa relevansi "tidak apa-apa untuk memodifikasi daftar" adalah, karena yang terbaik yang dapat saya pikirkan adalah 14 karakter (dan sebenarnya salah):
L==[L.pop()]+L

Masalah 5

13 karakter
L+={n}&set(L)
Melakukan hal-hal yang funky dengan set

Masalah 6

11 karakter
(x>0)-(x<0)

Masalah 7

12 karakter
while[1]<=L:
Menggunakan urutan daftar leksikografis

Masalah 8

9 karakter
while~-n:

Masalah 9

5 karakter
s<"."
Menggunakan urutan leksikografis

Masalah 10

15 karakter
"LWoisne"[b::2]

Atau:
b*"Win"or"Lose"

Sp3000
sumber
1
Saya belum mempertimbangkan alternatif Anda ke # 10 sebelumnya. Ini berarti bahwa seseorang dapat memperoleh penghematan karakter yang sama dengan trik interleaving yang biasa terlepas dari panjang string, kecuali masalah prioritas di bool. Saya akan menambahkan ini ke tips.
xnor
1
@xnor Ahaha ya, saya pikir itu cukup bagus. Ini tidak sebagus ketika Anda memiliki lebih banyak string, yang merupakan downside (misalnya b0, 1 atau 2, dan yang dapat Anda lakukan adalah (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000
Itu sebenarnya tidak buruk untuk tiga string. Anda dapat menghapus parens dengan ~b*"Hello".
xnor
@ xnor Pada titik itu, ["Good Afternoon","Goodbye","Hello"][b]akan menang: P
Sp3000
6

Total: 99 byte

Masalah 1

12 byte
while L[6:]:

Masalah 2

5 byte
x>0<y

Masalah 3

7 byte
L=L[b:]

Masalah 4

13 byte
len(set(L))<2

14 byte alternatif
min(L)==max(L)
set(L)=={L[0]}

Masalah 5

13 byte
L+=set(L)&{n}

Masalah 6

8 byte
cmp(x,0)

Masalah 7

12 byte
while[1]<=L:

Masalah 8

9 byte
while~-n:

Masalah 9

5 byte
s<'.'

Masalah 10

15 byte
b*"Win"or"Lose"
- atau -
"LWoisne"[b::2]

primo
sumber
4

1: 12
while L[6:]:
2: 5
y>0<x
3: 7
L=L[b:]
4: 15
L==L[:1]*len(L)
5: 15
L+=[n]*(n in L)atau L+=[n][:n in L]
6: 11
Ini adalah satu-satunya yang ekspresi idiomatiknya tidak langsung melompat ke pikiran saya, tetapi saya rasa saya menemukan jawaban yang tepat. Sunting: Tidak, itu mengerikan.
(x>0)-(x<0)
7:12
while[1]<=L:
Atau jika program selesai setelah itu, while L[0]bagus.
8: 9
while~-n:
9: 5
Banyak string dapat digunakan di sini tetapi "metode naif" itu lucu.
s<'0'
10:15
'LWoisne'[b::2]

Total: 106

feersum
sumber
Bukankah # 4 Anda harus digunakan [L[0]]?
FireFly
@FireFly Whoops. Ini tidak seburuk itu, tetapi biaya satu byte.
feersum
2
Nomor 9 Anda adalah permainan golf yang menyenangkan!
xnor
3

Total ukuran: 123 121 120 116

# 1

(12) while L[6:]:

# 2

(10) min(x,y)>0

# 3

(7) L=L[b:]

# 4

(13) len(set(L))<2atauL[1:]==L[:-1]

# 5

(15) L+=[n]*(n in L)

# 6

(14) x and abs(x)/xatau (terinspirasi oleh solusi Claudiu setelah menyerah)x and(x>0)*2-1

# 7

(15) while[0]<L[:1]:

# 8

(9) while~-n:

# 9

(5) s<'.'

# 10

(15) b*"Win"or"Lose"

FireFly
sumber
1

Total: 121

Upaya pertama:

Masalah 1

15 karakter
while len(L)>6:

Masalah 2

5 karakter
x>0<y

Masalah 3

7 karakter
L=L[b:]

Masalah 4

13 karakter
len(set(L))<2

Masalah 5

16 karakter
if n in L:L+=[n]

Masalah 6

16 karakter
x and(1,-1)[x<0]

Masalah 7

16 karakter
while(L+[0])[0]:

Masalah 8

10 karakter
while n>1:

Masalah 9

8 karakter
s[0]<'0'

Masalah 10

15 karakter
"LWoisne"[b::2]

Claudiu
sumber