ฝึกซ้อมกอล์ฟ: Python [ปิด]


31

นี่เป็นความท้าทายของการฝึกฝนการเพิ่มประสิทธิภาพของกอล์ฟใน Python ซึ่งเป็นเทคนิคและทางลัดที่นำมาใช้ซ้ำเพื่อกำจัดอักขระบางตัว หลายคนจะคุ้นเคยกับนักกอล์ฟงูหลามและใช้ความคิดร่วมกันจากเคล็ดลับหลาม คุณลักษณะเหล่านี้บางอย่างใช้คุณสมบัติเฉพาะของ Python ที่คุณอาจไม่ทราบว่ามีอยู่เว้นแต่คุณจะเห็นคุณลักษณะเหล่านี้ดังนั้นให้ดูที่เคล็ดลับหากคุณติดขัด

เป้าหมาย: มีปัญหาสิบประการแต่ละตัวอย่างข้อมูลอ้างอิงของรหัส Python เพื่อให้คุณสามารถปรับให้เหมาะสมและคำอธิบายของรหัสจะเกิดขึ้น เป้าหมายของคุณคือเขียนใหม่ให้สั้นลง แต่ยังเทียบเท่ากับการใช้งานได้

คะแนนของคุณซึ่งคุณกำลังพยายามย่อให้เล็กสุดคือความยาวทั้งหมดของโค้ดของคุณตัวอย่างทั้งหมด ความยาวของตัวอย่างข้อมูลอ้างอิงคือ 150 Tiebreaker เป็นโพสต์แรกสุด

การโพสต์คำตอบ:สำหรับแต่ละปัญหาให้โพสต์โค้ดและจำนวนตัวอักษร คุณสามารถโพสต์ข้อมูลอ้างอิงได้หากคุณไม่พบข้อมูลที่สั้นลง คุณตั้งใจจะไม่ดูคำตอบของคนอื่นเมื่อคุณโพสต์ โปรดติดแท็กสปอยเลอร์แต่ละปัญหารวมถึงจำนวนตัวละครแต่ละตัว คุณสามารถออกจากการนับทั้งหมดที่เปิดเผย อย่าลังเลที่จะยกเลิกการแก้ปัญหาของคุณตอนนี้หรือโพสต์โซลูชั่นใหม่ที่ไม่ทำลาย

รายละเอียดเกี่ยวกับความถูกต้องตามกฎหมาย: การทำงานที่เท่าเทียมกันหมายถึงรหัสสามารถถูกแทนที่ในโปรแกรมโดยไม่มีผลกระทบต่อพฤติกรรมของมัน (ไม่สนใจสิ่งต่าง ๆ เช่นการใช้หน่วยความจำและความสำคัญของโอเปอเรเตอร์ ==การแสดงออกควรผลิตที่มีค่าเทียบเท่าโดย 1.0==1==Trueโปรดสังเกตว่า รหัสของคุณไม่ควรมีผลข้างเคียงเว้นแต่จะระบุไว้เป็นอย่างอื่น ฉันไม่ได้ตั้งใจที่จะให้ปัญหาเฉพาะรุ่น แต่ในกรณีที่คุณสามารถระบุรุ่น Python สำหรับแต่ละปัญหา

ปัญหาที่ 1:วนซ้ำอย่างต่อเนื่องตราบใดที่รายการLมีองค์ประกอบอย่างน้อย 7 รายการ

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

ปัญหาที่ 2 : ตรวจสอบว่าทั้งสองลอยxและyทั้งสองเป็นบวก

# 11 chars
x>0 and y>0

ปัญหา 3 : ถ้าบูลีนเป็นความจริงเอาองค์ประกอบแรกของb Lมิฉะนั้นปล่อยให้มันไม่เปลี่ยนแปลง

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

ปัญหาที่ 4 : ตรวจสอบว่าองค์ประกอบทั้งหมดของรายการLตัวเลขที่ไม่ว่างเปล่ามีค่าเท่ากันหรือไม่ สำหรับปัญหานี้คุณสามารถแก้ไขรายการได้

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

ปัญหาที่ 5 : ผนวกหมายเลขnต่อท้ายรายการLเท่านั้นหากLมีหมายเลขนั้นอยู่แล้ว

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

ปัญหาที่ 6 : แสดงสัญลักษณ์ของการลอยx: +1สำหรับบวก, 0สำหรับ 0, -1สำหรับลบ

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

ปัญหา 7ดำเนินการต่อห่วงตราบเท่าที่องค์ประกอบแรกของLรายการ Booleans Trueเป็น หยุดถ้าLว่างเปล่าด้วย

# 17 chars
while L and L[0]:

ปัญหาที่ 8 : วนซ้ำต่อไปตราบใดที่nมากกว่า 1 จำนวนnจะได้รับการรับประกันว่าเป็นจำนวนเต็มบวก

# 10 chars
while n>1:

ปัญหาที่ 9 : ตรวจสอบว่าจำนวนเต็มที่แทนด้วยสตริงsเป็นลบหรือไม่ (เช่นเริ่มต้นด้วย '-')

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

ปัญหา 10 : แปลงบูลีนbไป"Win"/ "Lose"มีTrue-> "Win"และ->False"Lose"

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

คำเตือน: สปอยเลอร์ด้านล่างอย่าเลื่อนลงหากคุณต้องการแก้ปัญหาด้วยตนเอง

หากคุณต้องการทราบคะแนนที่ดีที่สุดสำหรับปัญหา:

ปัญหาที่ 1:

12

ปัญหาที่ 2:

5

ปัญหาที่ 3:

7

ปัญหาที่ 4:

13

ปัญหาที่ 5:

13

ปัญหาที่ 6:

8

ปัญหาที่ 7:

12

ปัญหาที่ 8:

9

ปัญหาที่ 9:

5

ปัญหาที่ 10:

15


3
ฉันโหวตให้ปิดเพราะความท้าทายนี้กระตุ้นให้เกิดคำตอบที่ซ้ำกันและมีคำถามมากมายในหนึ่งเดียวเนื่องจากไม่มีการโต้ตอบระหว่างความท้าทายแต่ละอย่างใด ๆ ฉันคิดว่าถ้าเรามีคำถามเช่นนั้นควรมีเพียงหนึ่งคำตอบซึ่งเป็นวิกิชุมชน
Wrzlprmft

2
@Wrzlprmft: อย่างใดมันเป็นความท้าทายที่น่าสนใจ แต่หลังจากได้รับการสนับสนุนอย่างยอดเยี่ยมถึง 7 ครั้งตอนนี้ฉันขอแนะนำให้ผ่อนคลายกฎและอนุญาตการแก้ปัญหาที่ไม่ถูกทำลายสำหรับปัญหาเดียว
Falko

2
ฉันคิดว่านี่เป็นความคิดที่ยอดเยี่ยมและเราควรฝึกเล่นกอล์ฟสำหรับภาษาอื่น ๆ อีกมากมาย
Robbie Wxyz

2
@Wrzlprmft ตอนนี้จะมีการอภิปรายเกี่ยวกับเรื่องนี้ในเมตา โปรดแสดงความคิดเห็นของคุณที่นั่นเพื่อการสนทนาที่ง่ายขึ้นโดยไม่ทำให้เสียความเห็นของคำถามนี้
FireFly

3
ฉันลงคะแนนเพื่อปิดคำถามนี้เป็นหัวข้อนอกเพราะความท้าทายหลายส่วนที่ไม่มีการโต้ตอบระหว่างส่วนต่าง ๆ ไม่ได้รับอนุญาต meta.codegolf.stackexchange.com/a/8464/45941
Mego

คำตอบ:


21

ทั้งหมด: 104 101 99 ตัวอักษร

ปัญหาที่ 1

12 ตัวอักษร
while L[6:]:

ปัญหาที่ 2

5 ตัวอักษร
x>0<y

ปัญหาที่ 3

7 ตัวอักษร
L=L[b:]

ปัญหาที่ 4

13 ตัวอักษร
len(set(L))<2
L[1:]==L[:-1]

ปัญหาที่ 5

13 ตัวอักษร
L+=set(L)&{n}

ปัญหาที่ 6

11 ตัวอักษร
(x>0)-(x<0)

8 ตัวอักษร (Python 2)
cmp(x,0)

ปัญหาที่ 7

12 ตัวอักษร
while[.5]<L:

ปัญหาที่ 8

9 ตัวอักษร
while~-n:

ปัญหาที่ 9

5 ตัวอักษร
s<'.'

ปัญหาที่ 10

15 ตัวอักษร
'LWoisne'[b::2]


@FryAmTheEggman คุณช่วยอธิบายผลข้างเคียงได้ไหม? ฉันตั้งใจที่จะเป็นทางออกที่ถูกต้อง
xnor

@ xnor ไม่เป็นไรฉันผิดทั้งหมด ฉันได้เรียนรู้บางอย่างในวันนี้ :)
FryAmTheEggman

ฉันเชื่อว่าแนวทางเหล่านี้จะดีที่สุดเนื่องจากมี 99 โซลูชันที่หลากหลายและความจริงที่ว่าฉันไม่สามารถหาอะไรที่ดีกว่านี้ได้ ฉันยินดีที่จะเห็นการปรับปรุง ตั้งแต่นี้เป็น 99 แรกฉันยอมรับมัน
xnor

7

ขนาดทั้งหมด: 128 122 120 117 116 115 111 107 104

ปัญหาที่ 1

วนซ้ำอย่างต่อเนื่องตราบใดที่รายการLมีองค์ประกอบอย่างน้อย 7 องค์ประกอบ

15 ตัวอักษร
while len(L)>6:
(ใช่ฉันสามารถบันทึกได้ 3 ไบต์ แต่ฉันเห็นคำตอบของ Sp3000 โดยไม่ได้ตั้งใจดังนั้นฉันจะไม่เรียกร้องทั้งสามไบต์)

ปัญหาที่ 2

ตรวจสอบว่าสองลอยxและyทั้งสองบวก

5 ตัวอักษร
x>0<y

ปัญหาที่ 3

ถ้าบูลีนเป็นความจริงเอาองค์ประกอบแรกของb Lมิฉะนั้นปล่อยให้มันไม่เปลี่ยนแปลง

7 ตัวอักษร
L=L[b:]

ปัญหาที่ 4

ตรวจสอบว่าองค์ประกอบทั้งหมดของรายการLตัวเลขที่ไม่ว่างเปล่ามีค่าเท่ากันหรือไม่ สำหรับปัญหานี้คุณสามารถแก้ไขรายการได้

13 ตัวอักษร
L[1:]==L[:-1]

ปัญหาที่ 5

ต่อท้ายหมายเลขnท้ายรายการLถ้าLมีหมายเลขนั้นอยู่แล้ว

15 ตัวอักษร
L+=[n]*(n in L)
หรือ
L+=[n][:n in L]

ปัญหาที่ 6

แสดงสัญลักษณ์ของการลอยx: +1สำหรับบวก, 0สำหรับ 0, -1สำหรับลบ

8 chars, Python 2
cmp(x,0)
ตามเอกสารสิ่งนี้อาจส่งคืนค่าบวก / ลบใด ๆ แต่ฉันทามติก็คือมันจะส่งกลับ -1, 0, 1

ปัญหาที่ 7

ยังคงห่วงตราบเท่าองค์ประกอบแรกของLรายการ Booleans Trueเป็น หยุดถ้าLว่างเปล่าด้วย

12 ตัวอักษร
while[1]<=L:

ปัญหาที่ 8

วนซ้ำต่อไปตราบใดที่nมากกว่า 1 จำนวนnจะได้รับการรับประกันว่าเป็นจำนวนเต็มบวก

9 ตัวอักษร
while~-n:

ปัญหาที่ 9

ตรวจสอบว่าจำนวนเต็มแทนสตริงsเป็นลบหรือไม่ (เช่นเริ่มต้นด้วย '-')

5 ตัวอักษร
s<'.'

ปัญหาที่ 10

แปลงบูลีนbไป"Win"/ "Lose"มีTrue-> "Win"และ->False"Lose"

15 ตัวอักษร
"LWoisne"[b::2]


คุณช่วยลดความยาวของสปอยเลอร์ได้ไหม?
xnor

@xnor ไม่มีปัญหาเกิดขึ้น
Martin Ender

7

ทั้งหมด: 106 104 102 ตัวอักษร

ปัญหาที่ 1

12 ตัวอักษร
while L[6:]:

ปัญหาที่ 2

5 ตัวอักษร
x>0<y
Huzzah สำหรับการเปรียบเทียบการโยง

ปัญหาที่ 3

7 ตัว
L=L[b:]
แปลงที่ดีโดยปริยายเก่า

ปัญหาที่ 4

13
len(set(L))<2

อีกทางเลือกหนึ่ง:
L[1:]==L[:-1]

วิธีโง่ ๆ ที่จะลบล้างสิ่งที่เราต้องการใน Python 2:
","in`set(L)`

ฉันไม่แน่ใจว่าความเกี่ยวข้องของ "การปรับเปลี่ยนรายการ" เป็นเรื่องที่เกี่ยวข้องหรือไม่เพราะสิ่งที่ฉันคิดว่าดีที่สุดคือ 14 ตัวอักษร (และเป็น ผิดจริง):
L==[L.pop()]+L

ปัญหาที่ 5

13 ตัวอักษร
L+={n}&set(L)
ทำสิ่งที่ขี้ขลาดกับชุด

ปัญหาที่ 6

11 ตัวอักษร
(x>0)-(x<0)

ปัญหาที่ 7

12 ตัวอักษร
while[1]<=L:
ใช้ลำดับของรายการพจนานุกรม

ปัญหาที่ 8

9 ตัวอักษร
while~-n:

ปัญหาที่ 9

5 ตัวอักษร
s<"."
ใช้การเรียงลำดับสตริง

ปัญหาที่ 10

15 ตัวอักษร
"LWoisne"[b::2]

หรือ:
b*"Win"or"Lose"


1
ฉันไม่ได้พิจารณาทางเลือกของคุณเป็นอันดับที่ 10 ก่อนหน้านี้ หมายความว่าเราสามารถประหยัดอักขระได้เช่นเดียวกับเคล็ดลับการแทรกสอดแบบปกติโดยไม่คำนึงถึงความยาวของสตริง ฉันจะเพิ่มลงในคำแนะนำ
xnor

1
@xnor Ahaha ใช่ฉันคิดว่ามันค่อนข้างดี มันไม่ดีเท่าไหร่เมื่อคุณมีสายอักขระมากกว่าซึ่งเป็นข้อเสีย (เช่นb0, 1 หรือ 2 และสิ่งที่คุณทำได้(b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000

เคล็ดลับ: codegolf.stackexchange.com/a/407/20260
xnor

ที่จริงแล้วไม่เลวสำหรับสามสาย คุณสามารถลบ parens ~b*"Hello"ด้วย
xnor

@xnor ณ จุด["Good Afternoon","Goodbye","Hello"][b]นั้นผู้ชนะจะได้รับ: P
Sp3000

6

ทั้งหมด: 99 ไบต์

ปัญหาที่ 1

12 ไบต์
while L[6:]:

ปัญหาที่ 2

5 ไบต์
x>0<y

ปัญหาที่ 3

7 ไบต์
L=L[b:]

ปัญหาที่ 4

13 ไบต์
len(set(L))<2

14 ทางเลือกไบต์
min(L)==max(L)
set(L)=={L[0]}

ปัญหาที่ 5

13 ไบต์
L+=set(L)&{n}

ปัญหาที่ 6

8 ไบต์
cmp(x,0)

ปัญหาที่ 7

12 ไบต์
while[1]<=L:

ปัญหาที่ 8

9 ไบต์
while~-n:

ปัญหาที่ 9

5 ไบต์
s<'.'

ปัญหาที่ 10

15 ไบต์
b*"Win"or"Lose"
- หรือ -
"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)หรือL+=[n][:n in L]
6: 11
นี่เป็นสิ่งเดียวที่สำนวนที่แสดงออกไม่ได้กระโดดเข้ามาในใจฉันทันที แต่ฉันคิดว่าฉันพบคำตอบที่ถูกต้อง แก้ไข: ไม่มันแย่มาก
(x>0)-(x<0)
7: 12
while[1]<=L:
หรือถ้าโปรแกรมเสร็จสมบูรณ์หลังจากนั้นwhile L[0]ก็ดี
8: 9
while~-n:
9: 5
หลายสายจะใช้งานได้ที่นี่ แต่ "วิธีไร้เดียงสา" เป็นเรื่องตลก
s<'0'
10: 15
'LWoisne'[b::2]

รวม: 106


# 4 ของคุณไม่ต้องใช้[L[0]]ใช่ไหม
FireFly

@FireFly อ๊ะ มันไม่ได้เลวร้ายอย่างนั้น แต่เสียค่าใช้จ่ายหนึ่งไบต์
feersum

2
# 9 ของคุณคือการเล่นกอล์ฟที่ยอดเยี่ยม!
xnor

3

ขนาดทั้งหมด: 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))<2หรือL[1:]==L[:-1]

# 5

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

# 6

(14) x and abs(x)/xหรือ (ได้รับแรงบันดาลใจจากทางออกของ Claudiu หลังจากเลิกใช้)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

รวม: 121

ความพยายามครั้งแรก:

ปัญหาที่ 1

15 ตัวอักษร
while len(L)>6:

ปัญหาที่ 2

5 ตัวอักษร
x>0<y

ปัญหาที่ 3

7 ตัวอักษร
L=L[b:]

ปัญหาที่ 4

13 ตัวอักษร
len(set(L))<2

ปัญหาที่ 5

16 ตัวอักษร
if n in L:L+=[n]

ปัญหาที่ 6

16 ตัวอักษร
x and(1,-1)[x<0]

ปัญหาที่ 7

16 ตัวอักษร
while(L+[0])[0]:

ปัญหาที่ 8

10 ตัวอักษร
while n>1:

ปัญหาที่ 9

8 ตัวอักษร
s[0]<'0'

ปัญหาที่ 10

15 ตัวอักษร
"LWoisne"[b::2]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.