C 配列を展開する

ヴィム、54、52、49 47回のキーストローク

2wa0<esc>qqYp<c-a>6ldf @[email protected]$dT]dd:%norm dwf{xwC;<CR>gg"0P

説明:

2wa0<esc>                     'Move 2 words forward, and insert a 0.
         qq                   'Start recording in register Q
           Yp                 'Duplicate the line
             <c-a>6l          'Increment the next number then move 6 spaces right
                    df        'Delete until the next space
                       @[email protected]  'Recursively call this macro

バッファは次のようになります:

int foo[0] = {4, 8, 15, 16, 23, 42};
int foo[1] = {8, 15, 16, 23, 42};
int foo[2] = {15, 16, 23, 42};
int foo[3] = {16, 23, 42};
int foo[4] = {23, 42};
int foo[5] = {42};
int foo[6] = {42};

カーソルは最終行にあります。

後半:

$                           'Move to the end of the line
 dT]                        'Delete back until we hit a ']'
    dd                      'Delete this whole line.
      :%norm         <CR>   'Apply the following keystrokes to every line:
             dw             'Delete a word (in this case "int")
               f{x          '(f)ind the next '{', then delete it.
                  wC;       'Move a word, then (C)hange to the end of this line, 
                            'and enter a ';'
                             

元の配列宣言を追加するだけです。

gg        'Move to line one
  "0P     'Print buffer '0' behind us. Buffer '0' always holds the last deleted line,
          'Which in this case is "int foo[6];"

Pyth、44 バイト

++Khcz\]lJ:z"-?\d+"1"];"VJs[ecKd~hZ"] = "N\;

テスト スイート

正規表現と文字列の切り刻み。特に賢いわけではありません。

説明:

++Khcz\]lJ:z"-?\d+"1"];"VJs[ecKd~hZ"] = "N\;
                                                Implicit: z = input()
    cz\]                                        Chop z on ']'
   h                                            Take string before the ']'
  K                                             Store it in K
 +                                              Add to that
         :z"-?\d+"1                             Find all numbers in the input
        J                                       Store them in J
       l                                        Take its length.
+                  "];"                         Add on "];" and print.
                       VJ                       For N in J:
                         s[                     Print the following, concatenated:
                            cKd                 Chop K on spaces.
                           e                    Take the last piece (array name)
                               ~hZ              The current interation number
                                  "] = "        That string
                                        N       The number from the input
                                         \;     And the trailing semicolon.

網膜、108 104 100 69 バイト

バイト数は、ISO 8859-1 エンコーディングを想定しています。

].+{((\S+ ?)+)
$#2];$1
+`((\w+\[).+;(\S+ )*)(-?\d+).+
$1¶$2$#3] = $4;

これをやっつけろ、PowerShell...

コードの説明

最初の行: ].+{((\S+ ?)+)

まず、型、配列名、開き括弧 (1 バイト節約) を保持する必要があるため、それらを一致させません。したがって、閉じ括弧、任意の数の文字、開き中括弧を一致させます:].+{ .次に、番号リストを照合します。これまでに見つけた最短はこれです:((\S+ ?)+) .任意の数の非スペース文字 (数字、マイナス記号の可能性、コンマの可能性を含む) と、その後に続くスペース (存在する場合も存在しない場合もあります) と一致します:\S+ ? .この文字グループは、必要な回数だけ繰り返されます:(\S+ ?)+ 大規模なキャプチャ グループに入れます。閉じ中括弧またはセミコロンと一致しないことに注意してください。 3 行目の説明で理由がわかります。

2 行目: $#2];$1

入力の一部のみを一致させたので、一致しない部分がまだ残っています。したがって、リストの長さは、一致しない開始ブラケットの後に置きます:$#2 .置換修飾子 # 特定のキャプチャ グループが作成した一致の数が得られるため、これに役立ちます。この場合、グループ 2 をキャプチャします .次に、閉じ括弧とセミコロンを置き、最後にリスト全体を置きます。

入力 short array[] = {4, 3, 2, 1}; あり 、この置換後の内部表現は次のとおりです:

short array[4];4, 3, 2, 1};

(右中括弧とセミコロンに注意してください)

3 行目: +`((\w+[).+;(\S+ )*)(-?\d+).+

これはループセクションです。つまり、ループ内のステージで入力が変更されなくなるまで実行されます。最初に配列名を照合し、その後に左括弧を続けます:(\w+\[) .次に、任意の数の任意の文字とセミコロン:.+; .次に、リストを再度照合しますが、今回は数字と各数字の後のコンマのみで、その後にスペースが続きます:(\S+ )* .次に、リストの最後の数字 (-?\d+) を取得します。 およびその後ろにある残りの文字:.+ .

4 行目: $1¶$2$#3] = $4;

次に、それを配列名とリストに置き換え、その後に改行を続けます:$1¶ .次に、最後の要素を除いて、配列名を配置し、その後に以前に一致したリストの長さを続けます (基本的に list.length - 1 ):$2$#3 .閉じ括弧とスペースを含む代入演算子が続き、これに数値リストの最後の要素が続きます:] = $4;

最初の置換後、内部表現は次のようになります:

short array[4];4, 3, 2, 
array[3] = 1;

.+ のおかげで、右中括弧とセミコロンが消えたことに注意してください。 3 行目の最後。さらに 3 回置換すると、内部表現は次のようになります。

short array[4];
array[0] = 4;
array[1] = 3;
array[2] = 2;
array[3] = 1;

3 行目までに一致するものがないため、4 行目は何も置き換えず、文字列が返されます。

TL;DR: まず、int リスト形式を少し変更します。次に、リストの最後の要素と名前を取得し、配列の初期化の後に配置します。 int リストが空になるまでこれを行います。次に、変更されたコードを返します。

オンラインで試してみてください!