Golf Uygulaması: Python [kapalı]


31

Bu Python'da golf optimizasyonu yapma zorluğudur - tekrar kullanılabilir püf noktaları ve birkaç karakterden kurtulmak için kısayollar. Birçoğu Python golfçülerine aşina olacak ve Python İpuçları'ndan ortak fikirleri kullanacaktır . Bunların bazıları, görmediğiniz sürece var olamayacağınızı bildiğiniz Python'a özgü özellikler kullanır, bu nedenle takılı kalmışsanız ipuçlarına bakın.

Hedef: On tane sorun var, her biri Python kodunu optimize etmeniz için bir referans pasajı ve kodun bir açıklamasını yapıyor. Amacınız, daha kısa ama yine de işlevsel olarak eşdeğer olması için yeniden yazmak.

En aza indirmeye çalıştığınız puanınız, tüm snippet'lerin kodunuzun toplam uzunluğudur. Referans parçacıklarının uzunluğu 150'dir. Tiebreaker en erken mesajdır.

Cevapları yazma: Her problem için kodunuzu ve karakter sayısını girin. Daha kısa bir şey bulamazsanız referans pasajını gönderebilirsiniz. Sizinkini gönderirken başkalarının cevaplarına bakmamanız amaçlanmıştır. Lütfen bireysel karakter sayısı da dahil olmak üzere her problemi spoiler-etiketleyin. Toplam sayıyı açık bırakabilirsiniz. Çözümünüzü dağıtmaktan veya yeni dağıtılmamış çözümleri göndermek için şimdi çekinmeyin.

Yasallık ile ilgili detaylar: İşlevsel denklik, kodun bir programda davranışını etkilemeden değiştirilebileceği anlamına gelir (bellek kullanımı ve bir ifadenin parçası olarak operatör önceliği gibi şeyler dikkate alınmaz). İfadeler, eşdeğerde değerler üretmelidir ==. Bunu not al 1.0==1==True. Aksi belirtilmedikçe, kodunuzun hiçbir yan etkisi olmamalıdır. Sorunların sürüme özgü olmasını istemiyorum, ancak her durumda, her sorun için bir Python sürümü belirleyebilirsiniz.

Sorun 1: Listede Len az 7 öğe bulunduğundan yinelemeye devam et

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

Sorun 2 : İki yüzen olmadığını kontrol edin xve yher ikisi de olumludur.

# 11 chars
x>0 and y>0

Sorun 3 : Boolean bdoğruysa, ilk öğesini kaldırın L. Aksi takdirde, değişmeden bırakın.

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

Sorun 4 : Boş olmayan bir Lnumara listesinin tüm öğelerinin eşit olup olmadığını kontrol edin . Bu sorun için, listeyi değiştirmek sorun değil.

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

Sorun 5 : nListenin sonuna Lyalnızca Lbu numarayı içeriyorsa bir numara ekleyin .

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

Problem 6 : Şamandıranın işaretini ifade edin x: +1pozitif 0için, 0 -1için, negatif için.

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

Problem 7 Bir LBoolean listesinin ilk elemanı olduğu sürece bir döngüye devam edin True. Ayrıca Lboşsa durdurun .

# 17 chars
while L and L[0]:

Sorun 8 : n1'den büyük olduğu sürece bir döngüye devam edin . Sayının npozitif bir tamsayı olduğu garanti edilir.

# 10 chars
while n>1:

Sorun 9 : Bir dizge olarak temsil edilen bir tamsayının snegatif olup olmadığını kontrol edin (yani '-' ile başlar).

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

Sorun 10 : Bir Boole dönüştürme biçin "Win"/ "Lose"ile, True-> "Win"ve False-> "Lose".

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

Uyarı: Aşağıdaki Spoiler, bunları kendiniz çözmek istiyorsanız aşağı kaydırmayın.

Sadece bir problem için en uygun puanı bilmek istiyorsanız:

Sorun 1:

12

Sorun 2:

5

Sorun 3:

7

Problem 4:

13

Sorun 5:

13

Sorun 6:

8

Sorun 7:

12

Sorun 8:

9

Sorun 9:

5

Sorun 10:

15


3
Kapatmaya oy verdim, çünkü bu meydan okuma tekrarlanan cevapları kışkırtıyor ve etkili bir şekilde birçok soru, çünkü bireysel zorluklar arasında hiçbir etkileşim yok. Bu tür sorularımız olursa, topluluk wiki olan tek bir cevap olması gerektiğini düşünüyorum.
Wrzlprmft

2
@ Wrzlprmft: Her nasılsa ilginç bir mücadele. Ancak 7 büyük katkıdan sonra, şimdi, kuralları rahatlatmayı ve tek tek sorunlara gönderilmemiş çözümlere izin vermeyi öneriyorum çünkü aksi halde mükemmel sunumlar toplam vasat toplam puanların arkasına gizlenmiş kalabilir.
Falko

2
Bunun iyi bir fikir olduğunu düşünüyorum ve daha fazla dil için golf uygulamalarımız olması gerektiğini düşünüyorum.
Robbie Wxyz

2
@Wrzlprmft şimdi bu konuda meta üzerinde bir tartışma var . Lütfen, bu sorunun yorumlarını kirletmeden daha kolay tartışma için görüşünüzü iletin.
FireFly

3
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü parçalar arasında etkileşimi olmayan çok parçalı zorluklara izin verilmiyor. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Yanıtlar:


21

Toplam: 104 101 99 karakter

1. sorun

12 karakter
while L[6:]:

Sorun 2

5 karakter
x>0<y

Sorun 3

7 karakter
L=L[b:]

4. sorun

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

5. sorun

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

6. Sorun

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

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

Sorun 7

12 karakter
while[.5]<L:

8. sorun

9 karakter
while~-n:

Sorun 9

5 karakter
s<'.'

Sorun 10

15 karakter
'LWoisne'[b::2]


@FryAmTheEggman Yan etkileri açıklayabilir misiniz? Bunun geçerli bir çözüm olmasını amaçlamıştım.
xnor

@xnor Nevermind, tamamen yanılmışım. Bugün bir şey öğrendim :)
FryAmTheEggman

Birden fazla 99 çözüm ve daha iyi bir şey bulamadığım gerçeği göz önüne alındığında, bu çözümlerin optimal olduğuna inanıyorum. Yine de bir iyileşme görmekten mutlu olurum. Bu ilk 99 olduğundan, kabul ediyorum.
xnor

7

Toplam boyut: 128 122 120 117 116 115 111 107 104

1. sorun

Listede Len az 7 eleman bulunduğundan yinelemeye devam edin .

15 karakter
while len(L)>6:
(Evet, bu konuda 3 bayt tasarruf edebilirim, ancak yanlışlıkla Sp3000'in cevabını gördüm, bu yüzden bu üç baytı talep etmeyeceğim.)

Sorun 2

İki yüzmenin olup olmadığını xve yher ikisinin de pozitif olup olmadığını kontrol edin .

5 karakter
x>0<y

Sorun 3

Boolean bdoğruysa, ilk öğesini kaldır L. Aksi takdirde, değişmeden bırakın.

7 karakter
L=L[b:]

4. sorun

Boş olmayan bir Lnumara listesinin tüm öğelerinin eşit olup olmadığını kontrol edin . Bu sorun için, listeyi değiştirmek sorun değil.

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

5. sorun

nListenin sonuna Lyalnızca Lbu sayıyı içeriyorsa bir numara ekleyin .

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

6. Sorun

Bir şamandıranın işaretini ifade edin x: +1pozitif 0için, 0 -1için, negatif için.

8 karakter, Python 2
cmp(x,0)
Dokümanlara göre, bu herhangi bir pozitif / negatif değer verebilir, ancak fikir birliği her zaman -1, 0, 1 döndürür.

Sorun 7

Bir LBoolean listesinin ilk elemanı olduğu sürece bir döngüye devam edin True. Ayrıca Lboşsa durdurun .

12 karakter
while[1]<=L:

8. sorun

Döngü n1'den büyük olduğu sürece devam edin . Sayının npozitif bir tamsayı olduğu garanti edilir.

9 karakter
while~-n:

Sorun 9

Bir dizge olarak temsil edilen bir tamsayının snegatif olup olmadığını kontrol edin (yani, '-' ile başlar).

5 karakter
s<'.'

Sorun 10

Bir Boole dönüştürme biçin "Win"/ "Lose"ile True-> "Win"ve False-> "Lose".

15 karakter
"LWoisne"[b::2]


Bireysel uzunlukları da bozabilir misiniz?
xnor

@ xnor Sorun yok, bitti.
Martin Ender

7

Toplam: 106 104 102 karakter

1. sorun

12 karakter
while L[6:]:

Sorun 2


x>0<y
Karşılaştırma zincirleme için 5 karakter Huzzah

Sorun 3

7 karakter
L=L[b:]
İyi eski örtük dönüşüm

4. sorun

13
len(set(L))<2

Alternatif olarak:
L[1:]==L[:-1]

Python 2'de istediklerimizin olumsuzluğunu almanın aptalca yolu:
","in`set(L)`

“Listeyi değiştirmenin uygun olduğu” nin alaka düzeyinin ne olduğundan emin değilim, çünkü en iyi düşünebildiğim 14 karakter (ve aslında yanlış):
L==[L.pop()]+L

5. sorun

13 karakter
L+={n}&set(L)
Setlerle korkak şeyler yapmak

6. Sorun

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

Sorun 7

12 karakter
while[1]<=L:
Listelerin sözlük sırasını kullanır

8. sorun

9 karakter
while~-n:

Sorun 9

5 karakter
s<"."
Dizelerin sözlükbilimsel sıralamasını kullanır

Sorun 10

15 karakter
"LWoisne"[b::2]

Alternatif:
b*"Win"or"Lose"


1
10 numaraya alternatifini daha önce düşünmemiştim. Kişi, booldaki öncelikli sorunları engelleyerek, dizelerin uzunluğuna bakılmaksızın normal serpiştirme numarası ile aynı karakter tasarrufunu elde edebileceği anlamına gelir. Bunu ipuçlarına ekleyeceğim.
xnor

1
@xnor Ahaha evet, oldukça güzel olduğunu düşündüm. Olsa bile, daha fazla dizeleri varken, bu dezavantajlıdır (örneğin b, 0, 1 veya 2 ve tüm yapabileceğiniz (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon"),
Sp3000


Bu aslında üç tel için fena değil. İle parens kaldırabilirsiniz ~b*"Hello".
xnor

@xnor Bu noktada ["Good Afternoon","Goodbye","Hello"][b]kazanır: P
Sp3000

6

Toplam: 99 bayt

1. sorun

12 bayt
while L[6:]:

Sorun 2

5 bayt
x>0<y

Sorun 3

7 bayt
L=L[b:]

4. sorun

13 bayt
len(set(L))<2

14 bayt alternatifler
min(L)==max(L)
set(L)=={L[0]}

5. sorun

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

6. Sorun

8 bayt
cmp(x,0)

Sorun 7

12 bayt
while[1]<=L:

8. sorun

9 bayt
while~-n:

Sorun 9

5 bayt
s<'.'

Sorun 10

15 bayt
b*"Win"or"Lose"
- veya -
"LWoisne"[b::2]


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)veya L+=[n][:n in L]
6: 11
Deyimsel bir ifadenin aklıma hemen sıçramamış olduğu tek ifade bu, ama doğru cevabı buldum. Düzenleme: Hayır, korkunçtu.
(x>0)-(x<0)
7: 12
while[1]<=L:
Veya bundan sonra program tamamlanmışsa while L[0], iyi olur.
8: 9
while~-n:
9: 5
Burada pek çok karakter dizisi çalışacak ancak “naif yöntem” komik.
s<'0'
10: 15
'LWoisne'[b::2]

Toplam: 106


# 4'ünüzü kullanmak zorunda kalmaz mıydı [L[0]]?
FireFly

@FireFly Whoops. O kadar kötü değil, ama bir bayta mal oluyor.
feersum

2
9'nuz harika bir golf cezası!
xnor

3

Toplam büyüklük: 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))<2veyaL[1:]==L[:-1]

5.

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

6.

(14) x and abs(x)/xveya (vazgeçtikten sonra Claudiu'nun çözümünden ilham aldı)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"


1

Toplam: 121

İlk denemeler:

1. sorun

15 karakter
while len(L)>6:

Sorun 2

5 karakter
x>0<y

Sorun 3

7 karakter
L=L[b:]

4. sorun

13 karakter
len(set(L))<2

5. sorun

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

6. Sorun

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

Sorun 7

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

8. sorun

10 karakter
while n>1:

Sorun 9

8 karakter
s[0]<'0'

Sorun 10

15 karakter
"LWoisne"[b::2]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.