ゴルフの練習:Python [終了]


31

これは、Pythonでゴルフの最適化を実践する際の課題です。再利用可能なトリックと、いくつかのキャラクターを削るショートカットです。多くの人がPythonゴルファーに精通しており、Python Tipsからの一般的なアイデアを使用します。これらのいくつかはPython固有の機能を使用しますが、これらは見たことがない限り存在しないと思われるため、立ち往生している場合はヒントをご覧ください。

目標: 10個の問題があり、それぞれが最適化のためのPythonコードの参照スニペットとコードの説明にあります。あなたの目標は、それをより短くなるように書き直すことですが、それでも機能的に同等です。

最小化しようとしているスコアは、すべてのスニペットのコードの合計長です。参照スニペットの長さは150です。Tiebreakerは最初の投稿です。

回答の投稿:各問題について、コードとその文字数を投稿します。短いものが見つからない場合は、参照スニペットを投稿できます。自分の投稿を投稿するときに他人の回答を見ないようにすることを目的としています。個々の文字数を含む個々の問題をネタバレにしてください。合計数を公開したままにすることができます。ソリューションのスポイラーを解除したり、新しいスポイラーのないソリューションを投稿してください。

合法性の詳細:機能的同等性とは、プログラムの動作に影響を与えることなくコードを置換できることを意味します(式の一部としてのメモリ使用量や演算子の優先順位などを無視します)。式は、と同等の値を生成する必要があります==。ことに注意してください1.0==1==True。特に明記しない限り、コードに副作用はありません。問題をバージョン固有のものにするつもりはありませんが、念のため、各問題にPythonバージョンを指定できます。

問題1:リストLに少なくとも7つの要素がある限り、繰り返しを続ける

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

問題2:2つのフロートxy両方が正であるかどうかを確認します。

# 11 chars
x>0 and y>0

問題3:ブール値bがtrueの場合、の最初の要素を削除しLます。それ以外の場合は、そのままにしておきます。

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

問題4L数字の空でないリストのすべての要素が等しいかどうかを確認します。この問題については、リストを変更してもかまいません。

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

問題5:既にその番号が含まれている場合にのみn、リストの最後に番号を追加します。LL

# 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がブール値のリストである限り、ル​​ープを継続しますTrueL空の場合も停止します。

# 17 chars
while L and L[0]:

問題8n1より大きい限りループを続行します。数値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
このチャレンジは重複した回答を引き起こし、個々のチャレンジ間に相互作用がないため、事実上1つの質問が多数あるため、私は終了することに投票しました。このような質問があれば、答えは1つだけで、コミュニティWikiが必要だと思います。
Wrzlprmft 14年

2
@Wrzlprmft:どういうわけか、それは興味深い挑戦です。しかし、7つの大きな貢献をした後は、ルールを緩和し、単一の問題に対する無防備なソリューションを許可することをお勧めします。
ファルコ14年

2
これはクールなアイデアであり、より多くの言語でゴルフを練習する必要があると思います。
ロビーWxyz 14年

2
@Wrzlprmftでは、これについてmetaで議論されています。この質問のコメントを汚染することなく議論を容易にするために、そこで意見を表明してください。
FireFly 14年

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 14年

複数の99のソリューションと、これ以上良いものが見つからないという事実を考えると、これらのソリューションは最適であると信じています。しかし、改善が見られてうれしいです。これは最初の99だったので、私はそれを受け入れています。
xnor

7

合計サイズ:128 122 120 117 116 115 111 107 104

問題1

リストLに少なくとも7つの要素がある限り、繰り返してください。

15文字
while len(L)>6:
(はい、これで3バイト節約できましたが、誤ってソリューションSp3000の答えを見たので、これらの3バイトを要求しません。)

問題2

2つのfloatが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正の場合0、0の場合-1、負の場合。

8文字、Python 2
cmp(x,0)
ドキュメントによると、これは正/負の値を返す可能性がありますが、コンセンサスは常に-1、0、1を返します。

問題7

Lブールのリストであるの最初の要素がである限り、ル​​ープを継続しますTrueL空の場合も停止します。

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 14年

@xnor問題ありません。
マーティンエンダー14年

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]

方法:Python 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


"LWoisne"[b::2]

または、15文字
b*"Win"or"Lose"


1
#10の代替案を以前に考えたことはありません。これは、文字列の長さに関係なく、通常のインターリーブトリックと同じ文字の節約が得られることを意味し、ブールの優先順位の問題はありません。これをヒントに追加します。
XNOR

1
@xnor Ahahaええ、かなりいいと思いました。それはあなたがが複数の文字列を持っている場合は良いようではありません、欠点である(例えばb0、1または2であり、そしてあなたがすることができるすべてがある(b-1)*"Hello"or b*"Goodbye"or"Good Afternoon"
SP3000


これは実際には3つの文字列にとって悪くありません。で括弧を削除でき~b*"Hello"ます。
xnor 14年

@xnorその時点で、["Good Afternoon","Goodbye","Hello"][b]勝つだろう:P
Sp3000 14年

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]]か?
ホタル14年

@FireFlyおっと。それほど悪くはありませんが、1バイトかかります。
feersum 14年

2
あなたの#9は素晴らしいゴルフのしゃれです!
xnor 14年

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.