골프 연습 : 파이썬 [폐쇄]


31

이것은 파이썬에서 골프 최적화를 연습하는 데 어려움이 있습니다. 몇 가지 문자를 제거하는 재사용 가능한 트릭과 바로 가기입니다. 많은 사람들이 파이썬 골퍼들에게 친숙 할 것이며 파이썬 팁의 일반적인 아이디어를 사용할 것 입니다. 이러한 기능 중 일부는 보지 않는 한 존재하지 않을 수도있는 Python 관련 기능을 사용하므로 갇힌 경우 팁을 살펴보십시오.

목표 : 10 가지 문제가 있습니다. 각 문제는 여러분이 최적화 할 수있는 Python 코드의 참조 스 니펫과 코드 설명입니다. 목표는 짧지 만 기능적으로 동등한 것으로 다시 작성하는 것입니다.

최소화하려는 점수는 모든 코드 조각의 총 길이입니다. 참조 스 니펫의 길이는 150입니다. Tiebreaker는 가장 빠른 게시물입니다.

답변 게시 : 각 문제에 대해 코드와 문자 수를 게시하십시오. 더 짧은 것을 찾지 못하면 참조 스 니펫을 게시 할 수 있습니다. 답변을 게시 할 때 다른 사람의 답변을 보지 않도록 고안되었습니다. 개별 문자 수를 포함하여 각 개별 문제에 스포일러 태그를 지정하십시오. 공개 된 총 개수를 그대로 둘 수 있습니다. 솔루션을 손상시키지 않고 새로운 솔루션을 게시하십시오.

적법성에 대한 세부 사항 : 기능적 동등성은 코드의 동작에 영향을주지 않고 프로그램에서 코드를 대체 할 수 있음을 의미합니다 (표현의 일부로 메모리 사용 및 연산자 우선 순위 등을 무시 함). 식은과 동등한 값을 생성해야합니다 ==. 참고하십시오 1.0==1==True. 달리 명시되지 않는 한 코드에는 부작용이 없어야합니다. 문제가 버전에 따라 다르지는 않지만 각 경우에 대해 Python 버전을 지정할 수 있습니다.

문제 1 : 목록에 L7 개 이상의 요소가있는 한 계속 반복

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

문제 2 : 두 개의 수레 여부를 확인 x하고는 y모두 긍정적이다.

# 11 chars
x>0 and y>0

문제 3 : 부울 b이 true 인 경우 의 첫 번째 요소를 제거하십시오 L. 그렇지 않으면 변경하지 마십시오.

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

문제 4 : 비어 있지 않은 L숫자 목록 의 모든 요소 가 같은지 확인하십시오. 이 문제의 경우 목록을 수정해도됩니다.

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

문제 5 : n목록 에 번호 LL이미있는 경우에만 번호 를 목록 끝에 추가하십시오 .

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

문제 6 : float의 부호를 표현하십시오 x. +1양수, 00, -1음수.

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

문제 7L 부울 목록 인의 첫 번째 요소가 이면 루프를 계속합니다 True. L비어 있으면 중지하십시오 .

# 17 chars
while L and L[0]:

문제 8 : n1보다 크면 루프를 계속 하십시오. 숫자 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
저는 이것이 멋진 아이디어라고 생각하며 더 많은 언어를위한 골프 연습이 필요하다고 생각합니다.
로비 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 Nevermind, 나는 완전히 틀렸다. 나는 오늘 무언가를 배웠다 :)
FryAmTheEggman

여러 99 솔루션과 더 이상 찾을 수 없다는 사실을 감안할 때 이러한 솔루션이 최적이라고 생각합니다. 그래도 개선을 보게되어 기쁩니다. 이것이 처음 99 이었으므로 받아들입니다.
xnor

7

총 크기 : 128 122 120 117 116 115 111 107 104

문제 1

목록에 L7 개 이상의 요소가있는 한 계속 반복하십시오 .

15 자
while len(L)>6:
(예, 이것에 3 바이트를 절약 할 수는 있지만 우연히 솔루션 Sp3000의 답변을 보았으므로 3 바이트를 요구하지 않습니다.)

문제 2

두 수레 여부를 확인 x하고 y모두 긍정적이다.

5 자
x>0<y

문제 3

부울 b이 true이면의 첫 번째 요소를 제거하십시오 L. 그렇지 않으면 변경하지 마십시오.

7 자
L=L[b:]

문제 4

비어 있지 않은 L숫자 목록 의 모든 요소 가 동일한 지 확인하십시오. 이 문제의 경우 목록을 수정해도됩니다.

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

문제 5

해당 번호 가 이미 포함 된 경우에만 n목록 끝에 번호 를 추가하십시오 .LL

15 자
L+=[n]*(n in L)
이상
L+=[n][:n in L]

문제 6

float의 부호를 표시합니다 x. +1양수이면 00, -1음 수면

8 문자, Python 2
cmp(x,0)
문서에 따르면 양수 / 음수 값을 반환 할 수 있지만 항상 -1, 0, 1을 반환한다는 합의입니다.

문제 7

L부울 목록 인의 첫 번째 요소가 이면 루프를 계속합니다 True. L비어 있으면 중지하십시오 .

12 자
while[1]<=L:

문제 8

n1보다 크면 루프를 계속 하십시오. 숫자 n는 양의 정수 여야합니다.

9 자
while~-n:

문제 9

문자열로 표시된 정수 s가 음수 인지 확인하십시오 (즉, '-'로 시작).

5 자
s<'.'

문제 10

부울 변환 b"Win"/ "Lose"와, True-> "Win"False->"Lose" .

15 자
"LWoisne"[b::2]


개별 길이도 망칠 수 있습니까?
xnor

@xnor 문제 없습니다.
Martin Ender 2014

7

총 : 106 104 102 문자

문제 1

12 자
while L[6:]:

문제 2


x>0<y
비교 체인을위한 5 자 Huzzah

문제 3

7 자
L=L[b:]
오래된 묵시적 변환

문제 4

13
len(set(L))<2

대안 :
L[1:]==L[:-1]

파이썬 2에서 우리가 원하는 것을 부정하는 어리석은 방법 :
","in`set(L)`

나는 "목록을 수정해도 괜찮다"의 관련성이 확실하지 않다. 실제로 잘못) :
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


실제로 세 줄에는 나쁘지 않습니다. 으로 파 렌스를 제거 할 수 있습니다 ~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 Whoops. 그렇게 나쁘지는 않지만 1 바이트 비용이 듭니다.
feersum

2
당신의 # 9는 훌륭한 골프장입니다!
xnor

3

총 사이즈 : 123121120 116

#1

(12) while L[6:]:

# 2

(10) min(x,y)>0

#삼

(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.