Thực hành Golf: Python [đã đóng]


31

Đây là một thách thức của việc thực hành tối ưu hóa golf trong Python - các thủ thuật và phím tắt có thể sử dụng lại để loại bỏ một vài ký tự. Nhiều người sẽ quen thuộc với những người chơi gôn Python và sử dụng những ý tưởng phổ biến từ Mẹo Python . Một số trong số này sử dụng các tính năng dành riêng cho Python mà bạn có thể không biết tồn tại trừ khi bạn nhìn thấy chúng, vì vậy hãy xem các mẹo nếu bạn bị mắc kẹt.

Mục tiêu: Có mười vấn đề, mỗi đoạn mã tham chiếu của mã Python để bạn tối ưu hóa và mô tả mã. Mục tiêu của bạn là viết lại nó ngắn hơn nhưng vẫn tương đương về chức năng.

Điểm số của bạn, mà bạn đang cố gắng giảm thiểu, là tổng độ dài mã của bạn tất cả các đoạn. Độ dài của đoạn trích tham chiếu là 150. Tiebreaker là bài đăng sớm nhất.

Gửi câu trả lời: Đối với mỗi vấn đề, hãy đăng mã của bạn và số ký tự của nó. Bạn có thể đăng đoạn tham chiếu nếu bạn không tìm thấy nội dung ngắn hơn. Nó dự định rằng bạn không nhìn vào câu trả lời của người khác khi bạn đăng bài của bạn. Vui lòng spoiler-tag từng vấn đề riêng lẻ bao gồm cả số lượng ký tự riêng lẻ. Bạn có thể để lại tổng số tiết lộ. Bây giờ hãy thoải mái hủy bỏ giải pháp của bạn hoặc đăng các giải pháp mới chưa bị phá hỏng.

Chi tiết về tính hợp pháp: Tương đương về chức năng có nghĩa là mã có thể được thay thế trong một chương trình mà không ảnh hưởng đến hành vi của nó (bỏ qua những thứ như sử dụng bộ nhớ và ưu tiên toán tử là một phần của biểu thức). Biểu thức sẽ tạo ra các giá trị tương đương bởi ==. Lưu ý rằng 1.0==1==True. Mã của bạn sẽ không có tác dụng phụ trừ khi có quy định khác. Tôi không có ý định các vấn đề cụ thể theo phiên bản, nhưng chỉ trong trường hợp, bạn có thể chỉ định một phiên bản Python cho từng vấn đề.

Vấn đề 1: Tiếp tục lặp lại miễn là danh sách Lcó ít nhất 7 yếu tố

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

Vấn đề 2 : Kiểm tra xem hai phao xycả hai đều dương.

# 11 chars
x>0 and y>0

Vấn đề 3 : Nếu Boolean blà đúng, loại bỏ phần tử đầu tiên của L. Nếu không, hãy để nó không thay đổi.

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

Bài 4 : Kiểm tra xem tất cả các phần tử của danh sách Lsố không trống có bằng nhau không. Đối với vấn đề này, bạn có thể sửa đổi danh sách.

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

Vấn đề 5 : Nối một số nvào cuối danh sách Lchỉ khi Lđã chứa số đó.

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

Bài 6 : Thể hiện dấu phao x: +1cho dương, 0cho 0, -1cho âm.

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

Bài toán 7 Tiếp tục một vòng lặp miễn là phần tử đầu tiên của L, một danh sách Booleans, là True. Cũng dừng lại nếu Ltrống.

# 17 chars
while L and L[0]:

Bài 8 : Tiếp tục một vòng lặp miễn nlà lớn hơn 1. Số nđược đảm bảo là số nguyên dương.

# 10 chars
while n>1:

Bài 9 : Kiểm tra xem một số nguyên được biểu thị dưới dạng chuỗi scó âm hay không (nghĩa là bắt đầu bằng '-').

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

Bài 10 : Chuyển đổi Boolean bthành "Win"/ "Lose", với True-> "Win"False-> "Lose".

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

Cảnh báo: Spoiler bên dưới, không cuộn xuống nếu bạn muốn tự giải quyết chúng.

Nếu bạn chỉ muốn biết điểm tối ưu cho một vấn đề:

Vấn đề 1:

12

Vấn đề 2:

5

Vấn đề 3:

7

Vấn đề 4:

13

Vấn đề 5:

13

Vấn đề 6:

số 8

Vấn đề 7:

12

Vấn đề 8:

9

Vấn đề 9:

5

Vấn đề 10:

15


3
Tôi đã bỏ phiếu để đóng, vì thử thách này gây ra những câu trả lời trùng lặp và thực sự là nhiều câu hỏi trong một, vì không có sự tương tác nào giữa các thử thách riêng lẻ. Tôi nghĩ rằng nếu chúng ta có những câu hỏi như vậy, chỉ nên có một câu trả lời, đó là wiki cộng đồng.
Wrzlprmft

2
@Wrzlprmft: Bằng cách nào đó, đây là một thử thách thú vị. Nhưng sau khi có 7 đóng góp lớn, bây giờ, tôi khuyên bạn nên nới lỏng các quy tắc và cho phép các giải pháp không bị làm phiền đối với các vấn đề đơn lẻ, bởi vì nếu không, các bài nộp hoàn hảo có thể vẫn bị ẩn sau tổng điểm trung bình.
Falko

2
Tôi nghĩ rằng đây là một ý tưởng tuyệt vời và chúng ta nên tập luyện golf để có nhiều ngôn ngữ hơn.
Robbie Wxyz

2
@Wrzlprmft hiện đang có một cuộc thảo luận về vấn đề này trên meta . Hãy nói lên ý kiến ​​của bạn ở đó, để thảo luận dễ dàng hơn mà không làm ô nhiễm ý kiến ​​của câu hỏi này.
FireFly

3
Tôi đang bỏ phiếu để đóng câu hỏi này dưới dạng ngoài chủ đề vì các thử thách đa phần không có tương tác giữa các phần không được phép. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Câu trả lời:


21

Tổng cộng: 104 101 99 ký tự

Vấn đề 1

12 ký tự
while L[6:]:

Vấn đề 2

5 ký tự
x>0<y

Vấn đề 3

7 ký tự
L=L[b:]

Vấn đề 4

13 ký tự
len(set(L))<2
L[1:]==L[:-1]

Vấn đề 5

13 ký tự
L+=set(L)&{n}

Vấn đề 6

11 ký tự
(x>0)-(x<0)

8 ký tự (Python 2)
cmp(x,0)

Vấn đề 7

12 ký tự
while[.5]<L:

Bài 8

9 ký tự
while~-n:

Bài 9

5 ký tự
s<'.'

Bài 10

15 ký tự
'LWoisne'[b::2]


@FryAmTheEggman Bạn có thể giải thích tác dụng phụ? Tôi dự định đó là một giải pháp hợp lệ.
xnor

@xnor Nevermind, tôi đã hoàn toàn sai. Tôi đã học được điều gì đó ngày hôm nay :)
FryAmTheEggman

Tôi tin rằng các giải pháp này là tối ưu, dựa trên nhiều giải pháp 99 và thực tế là tôi không thể tìm thấy bất cứ điều gì tốt hơn. Tôi rất vui khi thấy một sự cải thiện mặc dù. Vì đây là 99 đầu tiên, tôi chấp nhận nó.
xnor

7

Tổng kích thước: 128 122 120 117 116 115 111 107 104

Vấn đề 1

Tiếp tục lặp lại miễn là danh sách Lcó ít nhất 7 yếu tố.

15 ký tự
while len(L)>6:
(Có, tôi có thể tiết kiệm 3 byte cho việc này, nhưng tôi vô tình thấy câu trả lời của giải pháp Sp3000, vì vậy tôi sẽ không yêu cầu ba byte đó.)

Vấn đề 2

Kiểm tra xem hai phao xycả hai đều dương.

5 ký tự
x>0<y

Vấn đề 3

Nếu Boolean blà true, loại bỏ phần tử đầu tiên của L. Nếu không, hãy để nó không thay đổi.

7 ký tự
L=L[b:]

Vấn đề 4

Kiểm tra xem tất cả các yếu tố của một danh sách Lsố không trống có bằng nhau không. Đối với vấn đề này, bạn có thể sửa đổi danh sách.

13 ký tự
L[1:]==L[:-1]

Vấn đề 5

Chỉ nối một số nvào cuối danh sách Lnếu Lđã chứa số đó.

15 ký tự
L+=[n]*(n in L)
hoặc
L+=[n][:n in L]

Vấn đề 6

Thể hiện dấu phao x: +1cho dương, 0cho 0, -1cho âm.

8 ký tự, Python 2
cmp(x,0)
Theo tài liệu, điều này có thể trả về bất kỳ giá trị dương / âm nào, nhưng sự đồng thuận là nó luôn trả về -1, 0, 1.

Vấn đề 7

Tiếp tục một vòng lặp miễn là phần tử đầu tiên của L, một danh sách Booleans, là True. Cũng dừng lại nếu Ltrống.

12 ký tự
while[1]<=L:

Bài 8

Tiếp tục một vòng lặp miễn nlà lớn hơn 1. Số nđược đảm bảo là một số nguyên dương.

9 ký tự
while~-n:

Bài 9

Kiểm tra xem một số nguyên được biểu thị dưới dạng một chuỗi scó âm hay không (nghĩa là bắt đầu bằng '-').

5 ký tự
s<'.'

Bài 10

Chuyển đổi Boolean bthành "Win"/ "Lose", với True-> "Win"False-> "Lose".

15 ký tự
"LWoisne"[b::2]


Bạn có thể vui lòng làm hỏng chiều dài cá nhân quá?
xnor

@xnor Không có vấn đề, xong.
Martin Ender

7

Tổng cộng: 106 104 102 ký tự

Vấn đề 1

12 ký tự
while L[6:]:

Vấn đề 2

5 chars
x>0<y
Huzzah để so sánh xích

Vấn đề 3

7 chars
L=L[b:]
Chuyển đổi ngầm cũ tốt

Vấn đề 4

13
len(set(L))<2

Cách khác: Cách
L[1:]==L[:-1]

ngu ngốc để phủ nhận những gì chúng ta muốn trong Python 2:
","in`set(L)`

Tôi không chắc chắn mức độ liên quan của "việc sửa đổi danh sách" là gì, bởi vì điều tốt nhất tôi có thể nghĩ đến là 14 ký tự (và là thực sự sai):
L==[L.pop()]+L

Vấn đề 5

13 ký tự
L+={n}&set(L)
Làm những điều thú vị với bộ

Vấn đề 6

11 ký tự
(x>0)-(x<0)

Vấn đề 7

12 ký tự
while[1]<=L:
Sử dụng thứ tự từ điển của danh sách

Bài 8

9 ký tự
while~-n:

Bài 9

5 ký tự
s<"."
Sử dụng thứ tự từ điển của chuỗi

Bài 10

15 ký tự
"LWoisne"[b::2]

khác:
b*"Win"or"Lose"


1
Tôi đã không xem xét thay thế của bạn cho # 10 trước đây. Điều đó có nghĩa là người ta có thể nhận được mức tiết kiệm ký tự giống như thủ thuật xen kẽ thông thường bất kể độ dài của chuỗi, ngăn chặn các vấn đề ưu tiên trong bool. Tôi sẽ thêm điều này vào các mẹo.
xnor

1
@xnor Ahaha vâng, tôi nghĩ nó khá đẹp Tuy nhiên, điều đó không tốt khi bạn có nhiều chuỗi hơn, đó là nhược điểm (ví dụ: b0, 1 hoặc 2 và tất cả những gì bạn có thể làm là (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
Sp3000


Điều đó thực sự không tệ cho ba chuỗi. Bạn có thể loại bỏ các parens với ~b*"Hello".
xnor

@xnor Tại thời điểm đó, ["Good Afternoon","Goodbye","Hello"][b]sẽ giành chiến thắng: P
Sp3000

6

Tổng cộng: 99 byte

Vấn đề 1

12 byte
while L[6:]:

Vấn đề 2

5 byte
x>0<y

Vấn đề 3

7 byte
L=L[b:]

Vấn đề 4

13
len(set(L))<2

byte thay thế 14 byte
min(L)==max(L)
set(L)=={L[0]}

Vấn đề 5

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

Vấn đề 6

8 byte
cmp(x,0)

Vấn đề 7

12 byte
while[1]<=L:

Bài 8

9 byte
while~-n:

Bài 9

5 byte
s<'.'

Bài 10

15 byte
b*"Win"or"Lose"
- hoặc -
"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)hoặc L+=[n][:n in L]
6: 11
Đây là cách duy nhất mà một biểu thức thành ngữ không ngay lập tức nhảy vào tâm trí tôi, nhưng tôi nghĩ rằng tôi đã tìm thấy câu trả lời đúng. Chỉnh sửa: Không, nó thật kinh khủng.
(x>0)-(x<0)
7: 12
while[1]<=L:
Hoặc nếu chương trình được hoàn thành sau đó, while L[0]là tốt đẹp.
8: 9
while~-n:
9: 5
Nhiều chuỗi sẽ hoạt động ở đây nhưng "phương pháp ngây thơ" thật buồn cười.
s<'0'
10: 15
'LWoisne'[b::2]

Tổng cộng: 106


Số 4 của bạn có phải sử dụng [L[0]]không?
FireFly

@FireFly Rất tiếc. Nó không tệ như vậy, nhưng có giá một byte.
frageum

2
Số 9 của bạn là một cách chơi golf tuyệt vời!
xnor

3

Tổng kích thước: 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))<2hoặcL[1:]==L[:-1]

# 5

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

# 6

(14) x and abs(x)/xhoặc (lấy cảm hứng từ giải pháp của Claudiu sau khi từ bỏ)x and(x>0)*2-1

# 7

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

#số 8

(9) while~-n:

# 9

(5) s<'.'

# 10

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


1

Tổng cộng: 121

Những nỗ lực đầu tiên:

Vấn đề 1

15 ký tự
while len(L)>6:

Vấn đề 2

5 ký tự
x>0<y

Vấn đề 3

7 ký tự
L=L[b:]

Vấn đề 4

13 ký tự
len(set(L))<2

Vấn đề 5

16 ký tự
if n in L:L+=[n]

Vấn đề 6

16 ký tự
x and(1,-1)[x<0]

Vấn đề 7

16 ký tự
while(L+[0])[0]:

Bài 8

10 ký tự
while n>1:

Bài 9

8 ký tự
s[0]<'0'

Bài 10

15 ký tự
"LWoisne"[b::2]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.