-join("$args"-split'\b'|%{(,$(,$_[0]*$n+$_))[!!($n=$($_-1))]})
オンラインでお試しください!
壊す
なんてこった!
$argsRLE文字列を含む単一の要素配列であるから開始し、引用符で囲むことにより実際の文字列に強制します。
次に、単語の境界で分割します(\b正規表現内)でます。これにより、文字列の配列が得られます。各要素は、数字または数字の後に続くBFトークンのいずれかです。一例では、この分割された配列の最初の4つの要素であるので10、+]>+>、3、+>(すべての文字列です)。
次に、各要素を処理するためにForEach-Object(%)にパイプします。
真ん中は、よく知られたPowerShellのゴルフィズムです。それは基本的にDIY三項演算子であり、2要素の配列を作成し、テストするブール式を使用してインデックスを作成します。偽の結果は要素0、真の結果は要素1になります。
この場合、実際には単項コンマ,演算子を使用して単一の要素配列を作成します。これは、実際のケースでは出力が必要ないためです。
後で実行される場合でも、最初にインデクサーを見てみましょう。
この考え方は、$_(現在の要素)が有効な数値または他の文字列のいずれかである可能性があるということです。それは数だ場合は、私が欲しい$n、その数の値がマイナス(番号ではなく、文字列として)1であることを。そうでない場合、私は欲しい$n false-y。
PowerShellは通常、右側の値を左側の型に強制しようとしますが、操作に依存する場合があります。さらにに関しては、"10"+5あなたに新しい文字列を与える"105"一方で、10+"5"あなたの整数を与えるだろう(15)。
ただし、文字列は減算できないため、代わりにPowerShellは減算の左側にある文字列を使用して自動的に数値を推測できるため、"10"-5が得られ5ます。
SOから始めます$_-1。これは、$_実際に数値である場合に必要な数値を提供しますが、そうでない場合は何も取得しません。表面的には、「何も」は偽であるが、問題はその割り当ての実行を停止することであるため、$nため、以前の値を保持します。私が欲しいものではありません!
それを部分式でラップすると、失敗したときに偽の値が得られます: $($_-1)。
すべてが割り当てられ$n、その割り当て自体が括弧で囲ま$nれているため、割り当てられた値もパイプラインに渡されます。
インデクサーで使用しているため1、変換が成功した場合は、2つのブールnot式!!を使用してこの値をブール値に変換します。成功した数値変換は最終的にtrueになりますが、偽りのない0ことはその偽りの三元配列の唯一の要素を返すことを可能にする甘い、甘いものを与えます。
その配列に戻ると、要素は次のとおりです。 $("$($_[0])"*$n*$_) $(,$_[0]*$n+$_)
"$($_[0])"-これは、現在の要素の最初の文字を取得するための厄介な長い方法です(たとえば、+から取得します+[>+)が、[char]オブジェクトとしてではなく、文字列として取得します。文字列に数字を掛けて複製することができるので、文字列にする必要がありますが、文字ではできません。
実際[char]、文字列の代わりに配列を使用して(別の単項コンマを使用して,)4文字を保存することができたので、引用符と余分なサブ式を削除できました。私がすることができ、その要素を複製する配列を掛けます。そして、とにかくこの反復の結果全体-joinが配列であり、編集する必要があるため、ここで配列を使用しても追加コストは発生しません。
次に、その文字列配列にを乗算して$n、それを数$n回複製します。リコール$nすることができ$nullそれは、前の桁の値から1を引いた値で。
次に+$_、現在の要素を、その要素の複製された最初の文字の最後に追加します。それ$nがマイナス1です。
このように10+[>+して、$n最終的に9になります。その後、9を作成し、それを文字列に+追加して+[>+、必要な10に加えて、ライドに必要な他の単一要素を取得します。
要素は、部分式に包まれ$()たときため$nである$nullので、式全体が失敗し、アレイに障害が発生した作成して、そのインデクサが実行されることはありません$n割り当てれることは決してありません。
この3項トリックを使用した理由は、その特異性の1つです。実際の3項演算子とは異なり、要素を定義する式は、そのことについては最初、彼らが「選択」されているかどうかを評価し、取得します。
割り当ててから$n別の反復で使用する必要があるため、これは役立ちます。3項配列要素の値は前の反復の$n値で評価され、インデクサー$nは現在の反復に再割り当てします。
そのため、ForEach-Objectループは、想定されるすべて(無視する一連のエラー)を出力しますが、新しい文字列の配列として出力します。
そのため、すべてを括弧で囲み、その後に単項-joinを付けて出力文字列を提供します。