回答:
PythはPythonに非常に似ているため、PythonプログラムをPythに翻訳するのは非常に簡単です。ただし、Pythはコマンドごとに1文字の言語であるため、Pythをそのまま記述するのは難しい場合があります。最初にPythonで書くことにより、一度に考えることは少なくなります(Pythonはコーディングが非常に簡単な言語であるため)。
Pythには、3つのカテゴリの変数があります。汎用の事前初期化変数、ユーザー入力に基づいて事前初期化された変数、および最初の使用時に暗黙的に割り当てを生成する変数です。
b = "\n"
d = " "
k = ""
G = "abcdefghijklmnopqrstuvwxyz"
H = {} # (empty dict)
N = '"'
T = 10
Y = []
Z = 0
Q = eval(input())
z = input()
これらの初期化は、関連する変数がコード内の文字列の外側で使用される場合にのみ、指定されたプログラムで実行されることに注意してください。さらに、両方が使用される場合、順序はQ
、次にz
です。
J
およびK
。両方を同じ値に初期化する場合は、などの式を使用して初期化できます。KJ0
これは、lengthierと同等J0K0
です。
これは新しいソフトウェアであるため、バグがある可能性があります。問題を報告してください。
行末の文字列には、終了引用符は必要ありません。例えば:
"Hello, world!
完全に有効なHello Worldプログラムです。
C
基本圧縮に使用これは実際には文書化されておらず、文字列のCは実際には直接chr-> intではなく、ベース256->ベース10(1つの文字列で同じ)です。これは、intの圧縮に非常に役立ちます。このスクリプトを使用して圧縮できます。
sCMjQ256
取り12345678910
、それはßÜ>
(そこにいくつかの印刷できないもの)になります。
また、intの配列では、それらを連結できます。また、コードポイントに変換し、ベース128の数値として処理することで、大きな文字列でも使用できます。
のもう1つの使用法はC
、@ xnorにこれを見せてくれてありがとう、任意の大きな数字を作ることです。素朴な方法は次のとおりです。
^TT
しかし、次の方法で1バイト改善できます。
CG
このベース256は、アルファベット全体を逆変換します。結果156490583352162063278528710879425690470022892627113539022649722
=〜1.56e62
。
完全なドキュメントは後で追加されます。
ラムダの引数た場合map
またはreduce
単に引数に一つの操作を適用し,,あなたは短いフォームを使用し、できるM
とF
。fMx
はと同等でmfdx
、fFx
はと同じです.UfbZx
。たとえば、入力として数値のリストを取得し、各数値が増分されるとしましょう。最初のアプローチは次のとおりです。
mhdQ
ただし、次のように書き換えることができます。
hMQ
同様のことがに適用さreduce
れF
ます。例として、整数のリストの積を計算するという課題があるとします。繰り返しますが、最初の試行は次のとおりです。
.U*bZQ
ただし、ではF
、次のように短縮できます。
*FQ
3バイト削ります...悪くない!
Q
関数に入力が欠落している場合は補完されるため、必要ありません*F
私はPythをかなり定期的に改善しており、あまり有用でない機能を削除し、より有用な機能を追加しているので、最新情報に注目し、定期的に実装のコピーを更新してください。
最近追加された機能:(10/19/14現在)
y
:*2
数値として、および文字列とリストのすべてのサブセットのリストとして機能します。例えば:
pyth -c 'y"abc'
['', 'a', 'b', 'c', 'ab', 'ac', 'bc', 'abc']
f
:f
通常はfilterコマンドです。現在、2番目の引数として数値を指定して呼び出すと、その数値で始まり1ずつカウントアップする無限シーケンスをフィルター処理し、結果のシーケンスの最初の要素を返します。
たとえば、10億を超える最小の素数を見つけるコードは次のとおりです。
pyth -c 'f!tPT^T9'
1000000007
yz
か?mvdczd
...最短の方法ですることはできません
y
が複数の非常に簡単に解析される入力形式、たとえばPython形式など、1つだけを持つ必要はないと思うので、古いものを捨てました。それで、はいmvdczd
、残念ながら、やらなければならないと思います。
r
の文字列処理スイートに追加しました。
r
とても便利に見えます。
@
、Fdr1 + 1 @ Q2Iq%Qd0d のルート操作を使用して係数計算機を作成する方法を疑問に思っています。使用しようとすると、index
代わりにデフォルトの意味が使用されます。この動作を回避する方法はありますか?
関数のデフォルト値がゴルフに役立つ場合があります。Pythは実際にこれをサポートしています(驚いたことに)。例えば:
DC=Z1RZ;C;C5
印刷されます:
1
5
これを行うときに、JとKを使用して文字を保存することもできます。
DgJ1K1R+JKg;g2;g2 3
プリント:
2
3
5
これは通常、再帰アルゴリズムに役立ちます。
これはもはや機能しませんが、誰かが古いバージョンのPythを使用してゴルフをしたい場合に備えて、ここに残しました。
これは、今日の新しい変更です。
Q
評価された入力に対して自動的に初期化される変数です。アリティを解決するのに必要な回数だけ、Pythプログラムの最後に暗黙的に追加されます。ゴルフにこれを使用する方法の例を見るために、入力のCollatz関数を計算したいとします。
最短の書き方は次のとおりです。
@,/Q2h*3QQ
ただし、Q
ファイルの末尾ではsが暗黙的であるため、次のように簡単に記述できます。
@,/Q2h*3
2バイトを節約します。
注非必須の引数を持つ関数を充填これらの引数を持っていないということ。例えば、c"12 12"
暗黙的を持っていないQ
ため、c
唯一の1つの引数が必要です。
変数をそれ自体の機能に設定し、特定の回数繰り返す必要があるとします。たとえば、入力からCollatzシーケンスの後で100番を見つける問題を考えてみましょう。初期数がの場合、シーケンス内の次の数を見つける最短の方法Q
は
@,/Q2h*Q3Q
これを100回適用して結果を印刷する最も明白な方法は
V100=Q@,/Q2h*Q3Q;Q
100回ループし、毎回Qの値を更新してから、ループを終了してQを出力します。
代わりに、シーケンス変数(H
)を無視するreduce関数を使用できます。
u@,/G2h*G3GU100Q
これは2文字短くなります。シーケンス内の要素と同じ回数だけループしようとすると、3文字短くなります。
シーケンスのいずれかが条件を満たしているかどうかを確認する場合、通常はを使用します.Em
。たとえば、リスト内のいずれかが5以上であるかどうかを確認する場合:
.Emgd5Q
しかし、sm
sumはboolsで機能するため、true / falseではなくtrue / falseである必要があるだけであれば機能します。
smgd5Q
f
ilter を使用して、さらに短くすることもできます。
fgT5Q
最後のものは本当にthoughいように見えます。
.A
ll については、私が考えることができる唯一のことは、反対の条件を使用し、1文字保存するためにそれを否定することです.Am
:
!f<T5Q
F
:forループ。Pythonのように。
V
:範囲にわたるforループ。変数も範囲も指定する必要がないため、2文字短くなります。
W
:whileループ。Pythonのように。
#
:無限のwhileループ。エラーまたは明示的なブレークでエスケープします。Pythでのみtry ... except
機能します。
D
:一般的な定義。Pythonと同じです。
L
:1つの引数、Pythonのラムダのような割り当て関数はありませんが、名前が付けられています。関数名、変数名、およびリターン(R
)を指定する必要はないため、3文字短くなります。
f
:フィルター-入力ラムダで真理を返す入力シーケンスの要素を選択します。
f
:入力以上の最初の整数で、真のフィルター結果が得られます。
m
:マップ-入力ラムダを使用して入力シーケンスの要素を変換します。
u
:Reduce-入力ラムダで入力シーケンスを折りたたみ、アキュムレータを3番目の引数に初期化します。
o
:順序-入力ラムダをキーとして使用する入力シーケンスの古い要素。
通常、特定の問題には複数の可能性があり、それぞれでテストソリューションを作成することによってのみ、どれが最短であるかを判断できます。
.x
最近ではtry-exceptブロックに使用できます。
.x{some_statments}{except_block - can this be empty}
。
# ... B
は、式の内部にいない場合はこの方法で使用できます
2つの要素を切り替えるのは非常に費用のかかる作業です。そのため、使用したい2つのアプローチがあります。
準備として、リストを定義し、Y
いくつかの番号を入力します。目標は、2番目と3番目の要素を切り替えることです。
=Y[1 3 5 3 6 7)AGH,1 2
単純にtmp変数を割り当て、J = Q[G]
最初のリストの割り当てをY[G] = Y[H]
行い、次に2番目の最後の割り当てを行いY[H] = J
ます。ここでのコツは、2つのリスト割り当てをネストすることです。したがって、印刷を抑制したり、referを2回使用したりする必要はありませんY
。
J@YGXXYG@YHHJ
の代わりに
J@YG XYG@YHXYHJ
切り替えたい要素がリスト内で一意である場合、このアプローチを使用します。本当に短いです。そのため、今回は1番目と3番目の要素を切り替えます(値1
と5
は一意です)。
=Y[1 3 5 3 6 7)K,Z2
これはリストの翻訳機能を使用します:
XYm@YdK)
この翻訳は、すべての要素を置き換えY[0]
てY[1]
、すべてY[1]
にY[0]
。そのため、値が一意でない場合、悪いことが起こりました。たとえば、K,1 2
結果はになり[1, 5, 3, 5, 6, 7]
ます。
ステートメントがコードの最後のステートメントである場合、閉じ括弧はオプションです。
<newline>
コードが命令型プログラミングスタイルで記述されている場合、中間結果を簡単に出力できるため、デバッグが非常に簡単です。(パーマリンク)
FN.:Q2 loop
=Y+-Y-FNhN some random command
Y print intermediate result
;Y end for loop and print result
しかし、大量のPythプログラムは、map、filter、reduceなどの関数型プログラミングの要素を使用しているため、単純な印刷はできません。しかし、\n
コマンドを使用して、まだ可能です。
u
(reduce)を使用する同じコードは次のようになります:(permalink)
u .:Q2Y reduce .:Q2, start with G = Y
+-G-FHhH random command
中間値を出力する場合は、単に挿入するだけです\n
:(permalink)
u .:Q2Y reduce
\nG print(G)
+-\nG-FHhH random command
\na
a
改行で出力してを返しますa
。したがって、プログラムの機能を変更することを心配することなく、どこにでも挿入できます。
g#
たとえば、あなたが持っていると仮定J=5
してK=12
。その後、g#JK
= 12、およびg#KJ
= 12も同様です。
これは@ Pietu1998によって発見されました。
誰かがすでにそれを見つけたかどうかはわかりませんが、2バイトでmax(A、B)を実行するクールな方法があります。3を使用する必要はありませんeS,AB
。g#AB
同じことをします。(ただし、max(1、A-B + 1)回ループするため、非常に非効率的です。最適化は、Bのように大きくなる可能性が高い数値を置くことです。)
Packed Pythは新しい「プログラミング言語」であり、Pythとまったく同じですが、文字ごとに8ビットではなく文字ごとに7ビットを使用します。
これを使用するには、pythリポジトリーを複製します。ファイルpacked-pyth.py
はインタープリターです。
あなたのコードがであるとしましょう"Hello, world!
。
まず、ファイルにそれを入れます: echo -n '"Hello, world!' > code.pyth
次に、PythコードをPacked Pythファイルにパックします。 python3 packed-pyth.py -p code.pyth code.ppyth
最後に、Packed Pythコードを実行します。 python3 packed-pyth.py code.ppyth
コードを実行するとき、-d
実際に実行されているPythコードが何であるかを確認するフラグを提供し、コードを含むファイルの後に2番目のコマンドライン引数として入力を提供できます。
逆さま:
欠点:
ASCIIのみ。
インタラクティブな入力はありません。
完全なデバッグオプションは使用できません。
悪いエラー報告。
I
とGCD を使用した分割可能性テスト免責事項:これは、負でない整数でのみ機能します。
2つの非負整数が割り切れるかどうかを確認するには、次の操作を実行できます。
iI<divisor><dividend>
場合によって割り切れるBと≥B≥0 、次いでGCD(A、B)= B。
必ずしもバイトを節約するわけではありません!%<dividend><divisor>
が、次の理由で節約がもたらされる可能性があります。
Q
配当のような)暗黙的なものを微調整できる場合があります。<pfn>
単独で機能するため、として使用できます。0
ます。iI
は、それ自体では関数!%
ですが、そうではないため、プレフィックス関数として使用できます。