C配列を展開する


36

Cプログラミング言語では、配列は次のように定義されます。

int foo[] = {4, 8, 15, 16, 23, 42};      //Foo implicitly has a size of 6

配列のサイズは、初期化要素(この場合は6)から推測されます。この方法でC配列を記述し、明示的にサイズを変更してから各要素を順番に定義することもできます。

int foo[6];        //Give the array an explicit size of 6
foo[0] = 4;
foo[1] = 8;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42;

チャレンジ

最初の方法から2番目の方法に配列を拡張するプログラムまたは関数を作成する必要があります。コードを長くするプログラムを作成していて、皮肉が大好きなので、コードをできるだけ短くする必要があります。

入力は元の配列を表す文字列になり、出力は拡張された配列定義になります。入力は常に次のように見えると安全に仮定できます。

<type> <array_name>[] = {<int>, <int>, <int> ... };

「Type」と「array_name」は、すべてアルファベット文字とアンダースコアで構成されます_。リストの要素は、常に-2,147,483,648〜2,147,483,647の範囲の数値になります。他の形式の入力を処理する必要はありません。

出力の空白は、テスト出力の空白と正確に一致する必要がありますが、末尾の改行は許可されます。

テストIO:

#in
short array[] = {4, 3, 2, 1};

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


#in
spam EGGS[] = {42};

#out
spam EGGS[1];
EGGS[0] = 42;


#in
terrible_long_type_name awful_array_name[] = {7, -8, 1337, 0, 13};

#out
terrible_long_type_name awful_array_name[5];
awful_array_name[0] = 7;
awful_array_name[1] = -8;
awful_array_name[2] = 1337;
awful_array_name[3] = 0;
awful_array_name[4] = 13;

任意の言語での送信が推奨されますが Cで実行できる場合はボーナスポイントになります。

リーダーボード:

上位の回答を示すリーダーボードは次のとおりです。


2
配列インデックス、等号、および値の間にスペースが必要ですか?たとえば、foo[0]=1;受け入れられるでしょうか?
メゴ

@Megoそれは受け入れられないでしょう。空白が必要です。私は中にいることを編集します。
DJMcMayhem

末尾の改行は許可されますか?
ルイスメンドー

機能は許可されていますか?
メゴ

出力する代わりに出力を返すことはできますか?(機能の場合)
vaultah

回答:


12

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.

この答えは私の側のとげです。私はvimで勝つことができると思っていましたが、私の人生では、最後の2〜3バイトを取得することはできません。= Dいい答えです!
DJMcMayhem

28

Vimは、54、52、49 47、キーストローク


2wa0<esc>qqYp<c-a>6ldf @qq@q$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
                       @qq@q  '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];"

3
vim-golfを読むたびに、私はすべてのコーディング(ほとんどの場合、その他のGUIエディターのキーボードコマンド)がこのようになり、私の心が1分間曲がる(Vimは完全にチューリングします(よりクールになります)) :P

これを機能させることはできません-最初の「@q」(「@ qq @ q」)を入力すると、マクロが実行され、明らかに必要以上に実行されint foo[6] = {int foo[12(カーソルオンで「2」)
ロードアロ

@LordAroおそらく言及すべきだった。これは、qに既にマクロがあり、それが記録中に実行されて混乱するためです。ここでそれを回避する方法を説明しました:codegolf.stackexchange.com/a/74663/31716
DJMcMayhem

1
@LordAroああ、あの、何がそれを引き起こしているのか知っている。バイトを保存するdf<space>ように変更しdWましdf<space>たが、6行目のマクロから抜け出すことを忘れていましたが、できdWませんでした。リビジョンをロールバックします。それを指摘してくれてありがとう!
DJMcMayhem

1
これは最短の回答ではありませんが、最も印象的なものです。
isaacg

10

網膜、108の 104 100 69バイト

バイトカウントはISO 8859-1エンコードを前提としています。

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

これを破って、PowerShell ...

コードの説明

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

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

二行目: $#2];$1

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

inputの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リストが空になるまでこれを行います。次に、変更したコードを返します。

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


誰かが私にそれを打ち負かした.... :(
CalculatorFeline

M!`G`似ていますが、まったく同じではありません。注意してください。
CalculatorFeline

3行目の説明は私を混乱させます。最初の項目は、最後の項目ではなく、背後にスペースがない唯一の項目です。
CalculatorFeline

@CatsAreFluffy今、言葉遣いを少し変えてみました。私が意味したのは、数字の前ではなく、数字の後に続くスペースです。「背後」の意味を十分に理解していなかったと思います。午前2時にコードの説明を書くべきではありません。
-daavko

@daavko「ビハインド」は通常、口語英語では「後」、つまり「フォロー」を意味します。元気でした。
ニックハートリー

9

V、37バイト

2Eé0òYp6ldf ò$dT]ddÎdwf{xwC;
gg"1P

Vは、vimを基に設計された、2Dの文字列ベースのゴルフ言語です。これはcommit 17の時点で機能します。

説明:

これは、かなり短いですが、vimの答えを直接翻訳したものです。

2E                               "Move to the end of 2 words forward.
  é0                             "Insert a single '0'
    ò       ò                    "Recursively do:
     Yp6ldf                      "Yank, paste, move 6 right, delete until space.
             $dT]                "Move to the end of line, delete backwards until ']'
                 dd              "Delete this line
                   Î             "Apply the following to every line:
                    dwf{xwC;<\n> "Delete word, move to '{' and delete it, Change to end of line, and enter ';'

それから私達にちょうどあります:

gg"1P     "Move to line 1, and paste buffer '1' behind us.

このユニコードの狂気は入りにくいため、このリバーシブルhexdumpでファイルを作成できます。

00000000: 3245 e930 f259 7001 366c 6466 20f2 2464  2E.0.Yp.6ldf .$d
00000010: 545d 6464 ce64 7766 7b78 7743 3b0d 6767  T]dd.dwf{xwC;.gg
00000020: 2231 500a                                "1P.

これは、Vをインストールして次を入力することで実行できます。

python main.py c_array.v --f=file_with_original_text.txt

1
Designed off of vim.2注:1.ほとんどの人はfromそうoff ofではないと言っています。2。これが存在しなかった理由。1
Rɪᴋᴇʀ

8

C、215バイト、196バイト

@tucuxiのおかげで19バイトが節約されました!

ゴルフ:

char i[99],o[999],b[99],z[99];t,x,n,c;main(){gets(i);sscanf(i,"%s %[^[]s",b,z);while(sscanf(i+t,"%*[^0-9]%d%n",&x,&n)==1)sprintf(o,"%s[%d] = %d;\n",z,c++,x),t+=n;printf("%s %s[%d];\n%s",b,z,c,o);}

ゴルフをしていない:

/*
 *  Global strings:
 *   i: input string
 *   o: output string
 *   b: input array type
 *   z: input array name
*/
char i[ 99 ], o[ 999 ], b[ 99 ], z[ 99 ];

/* Global ints initialized to zeros */
t, x, n, c;

main()
{
    /* Grab input string from stdin, store into i */
    gets( i );

    /* Grab the <type> <array_name> and store into b and z */
    sscanf( i, "%s %[^[]s", b, z );

    /* Grab only the int values and concatenate to output string */
    while( sscanf( i + t, "%*[^0-9]%d%n", &x, &n ) == 1 )
    {
        /* Format the string and store into a */
        sprintf( o, "%s[%d] = %d;\n", z, c++, x );

        /* Get the current location of the pointer */
        t += n;
    }

    /* Print the <type> <array_name>[<size>]; and output string */
    printf( "%s %s[%d];\n%s", b, z, c, o );
}

リンク:

http://ideone.com/h81XbI

説明:

を取得する<type> <array_name>ためのsscanf()フォーマット文字列は次のとおりです。

%s          A string delimited by a space
    %[^[]   The character set that contains anything but a `[` symbol
         s  A string of that character set

文字列からint値を抽出するにはint foo[] = {4, 8, 15, 16, 23, 42};、基本的にこの関数を使用して文字列をトークン化します。

while( sscanf( i + t, "%*[^0-9]%d%n", &x, &n ) == 1 )

ここで:

  • i入力文字列(a char*
  • t のポインタ位置オフセットです i
  • xint文字列から実際に解析される
  • n 見つかった数字を含む消費された文字の合計です

sscanf()フォーマット文字列は、この意味します:

%*            Ignore the following, which is..
  [^0-9]      ..anything that isn't a digit
        %d    Read and store the digit found
          %n  Store the number of characters consumed

入力文字列をchar配列として視覚化する場合:

int foo[] = {4, 8, 15, 16, 23, 42};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
00000000001111111111222222222233333
01234567890123456789012345678901234

int 4、インデックス13に位置している8、というように、インデックス16で、これは何のようなループルックスで各実行の結果です:

Run 1)  String: "int foo[] = {4, 8, 15, 16, 23, 42};"
        Starting string pointer: str[ 0 ]
        Num chars consumed until after found digit: 14
        Digit that was found: 4
        Ending string pointer: str[ 14 ]

Run 2)  String: ", 8, 15, 16, 23, 42};"
        Starting string pointer: str[ 14 ]
        Num chars consumed until after found digit: 3
        Digit that was found: 8
        Ending string pointer: str[ 17 ]

Run 3)  String: ", 15, 16, 23, 42};"
        Starting string pointer: str[ 17 ]
        Num chars consumed until after found digit: 4
        Digit that was found: 15
        Ending string pointer: str[ 21 ]

Run 4)  String: ", 16, 23, 42};"
        Starting string pointer: str[ 21 ]
        Num chars consumed until after found digit: 4
        Digit that was found: 16
        Ending string pointer: str[ 25 ]

Run 5)  String: ", 23, 42};"
        Starting string pointer: str[ 25 ]
        Num chars consumed until after found digit: 4
        Digit that was found: 23
        Ending string pointer: str[ 29 ]

Run 6)  String: ", 42};"
        Starting string pointer: str[ 29 ]
        Num chars consumed until after found digit: 4
        Digit that was found: 42
        Ending string pointer: str[ 33 ]

1
o介してsprintf内で連結することにより、strcatの使用を回避できます%s。これは約7文字を削る必要があります。
tucuxi

@tucuxiああ、いいキャッチ。ありがとう!
ホーマーシンプソン

7

C、195180バイト

195バイトのオリジナル:

ゴルフ:

char*a,*b,*c,*d;j;main(i){scanf("%ms %m[^]]%m[^;]",&a,&b,&c);
for(d=c;*d++;i+=*d==44);printf("%s %s%d];\n",a,b,i);
for(d=strtok(c,"] =,{}");j<i;j++,d=strtok(0," ,}"))printf("%s%d] = %s;\n",b,j,d);}

なし:

char*a,*b,*c,*d;
j;
main(i){
    scanf("%ms %m[^]]%m[^;]",&a,&b,&c); // m-modifier does its own mallocs
    for(d=c;*d++;i+=*d==44);            // count commas
    printf("%s %s%d];\n",a,b,i);        // first line
    for(d=strtok(c,"] =,{}");j<i;j++,d=strtok(0," ,}"))
        printf("%s%d] = %s;\n",b,j,d);  // each array value
}

2つのショートカットは、m修飾子を使用してscanfを取得しています%s独自のメモリを割り当て(char配列を宣言することを保存する)ために使用し、strtok(これはデフォルトでインクルードなしでも使用可能)を使用して数値解析部分を行います。


180バイトの更新:

char*a,*b,*c,e[999];i;main(){scanf("%ms %m[^]]%m[^}]",&a,&b,&c);
for(c=strtok(c,"] =,{}");sprintf(e,"%s%s%d] = %s;\n",e,b,i++,c),
c=strtok(0," ,"););printf("%s %s%d];\n%s",a,b,i,e);}

なし:

char*a,*b,*c,e[999];
i;
main(){
    scanf("%ms %m[^]]%m[^}]",&a,&b,&c);
    for(c=strtok(c,"] =,{}");sprintf(e,"%s%s%d] = %s;\n",e,b,i++,c),c=strtok(0," ,"););
    printf("%s %s%d];\n%s",a,b,i,e);
}

文字列に追加するというbnf679のアイデアを使用して、コンマをカウントする必要を回避します。


6

Python 3.6(プレリリース)、133

m,p=str.split,print;y,u=m(input(),'[');t,n=m(y);i=m(u[5:-2],', ')
l=len(i);p(t,n+f'[{l}];')
for x in range(l):p(n+f'[{x}] = {i[x]};')

f-stringsを多用します

ゴルフされていないバージョン:

y, u = input().split('[')
t, n = y.split()
i = u[5:-2].split(', ')
l = len(i)
print(t, n + f'[{l}];')
for x in range(l):
    print(n + f'[{x}] = {i[x]};')

1
うわー、私はf-stringsを忘れました。それらはゴルフに非常に役立つでしょう!
モーガンスラップ16

私はあなたが通常のループの代わりに、リストの内包表記を使用してバイトを保存することができると思う
someonewithpc

@someonewithpc:いや、それは実際に1つの余分なバイトを追加します
vaultah

5

ルビー、127 110 108 99 88バイト

入力として単一の引数を持つ匿名関数。完全なプログラム。STDINから入力を読み取ります。(ファイルをパイプする場合、末尾の改行はオプションです。)戻り値出力文字列を出力します。

@TimmyDが挑戦として他のすべての非エソランを破るソリューションについて自慢し、最終的に(執筆時点で)彼らが投稿した114バイトのPowershellソリューションを克服しました。CᴏɴᴏʀO'Bʀɪᴇɴのスプリットオンのトリック]、後半をてスプライシングし、数字を助けました。

スプラット演算子をもっと使用する必要があります。とても便利です!

@NeilのJavaScript ES6の回答からトリックを借りて、gsuband を使用する代わりに単語をスキャンすることでバイトを節約しsplitました。

t,n,*l=gets.scan /-?\w+/;i=-1
puts t+" #{n}[#{l.size}];",l.map{|e|n+"[#{i+=1}] = #{e};"}

任務は完全なプログラムを書くことです。
vaultah

@vaultahコードゴルフのデフォルトは、プログラムまたは関数がある
MEGO

@Mego:OPは「プログラムを作成する必要があります」
-vaultah

@vaultah通常、コードゴルフでは関数を使用できますが、完全なプログラムで2バイト節約できたので、どうしてですか?
バリューインク

Ooof ... PowerShellでそれを理解できるとは思いません。+1
AdmBorkBork

4

05AB1E52 50 47バイト

コード:

… = ¡`¦¨¨ð-',¡©gr¨s«„];«,®v¹ð¡¦¬s\¨N"] = "y';J,

CP-1252エンコードを使用します。オンラインでお試しください!


1
05AB1Eの回答を探しているだけで、他のすべての回答をスキップするようになりました。この言語は私を魅了します。
-WorseDoughnut

1
@WorseDoughnutありがとうございます!これは、誰かが05AB1Eについて私に言った中で最も素晴らしいことです:)!
アドナン

4

JavaScript(ES6)、100バイト

(s,[t,n,...m]=s.match(/-?\w+/g))=>t+` ${n}[${m.length}];`+m.map((v,i)=>`
${n}[${i}] = ${v};`).join``

重要なのは単語だけなので、これは元の文字列内のすべての単語と先頭のマイナス記号を照合するだけで機能し、結果を構築します。(もともと私は使用するつもりreplaceだったが、それは赤いニシンであることが判明した。)


[t,n,...m]ほとんど神秘的なビジョン
edc65


4

ピップ48 47バイト

qR`(\S+)(. = ).(.+)}`{[b#Yd^k']';.n.b.,#y.c.y]}

stdinから入力を受け取り、stdoutに出力します。

説明

Tl; dr:キャプチャグループとコールバック関数を使用して結果を構築し、正規表現の置換を行います。

q特殊変数は、入力の行を読み取ります。正規表現はです(\S+)(. = ).(.+)}。これは、型(末尾のスペースを含む)と最後のセミコロンを除くすべてに一致します。質問から最初の例を使用して、キャプチャグループを取得foo[] = 4, 8, 15, 16, 23, 42

置換は、名前のない関数の戻り値であり、{[b#Yd^k']';.n.b.,#y.c.y]}一致全体とキャプチャグループを引数として呼び出されます。したがって、関数内で、bキャプチャグループ1をc取得し、グループ2をd取得し、グループ3 を取得します。

私たちは、リストを構築し、最初の3つの項目は次のようになります"foo["6"]"。を取得する6にはd、組み込み変数で分割しますk = ", "Y分割し、結果の整数のリストyを将来の使用のために追加し、長さ(#)を取得します。']文字リテラルです。

残っているのは、フォームの一連の文字列を作成すること";\nfoo[i] = x"です。そのために、次を連結します:';n(改行の組み込み)、b(最初のキャプチャグループ)、,#y(Pythonと同等range(len(y)))、c(2番目のキャプチャグループ)、およびy。連結はリストと範囲に対して項目ごとに機能するため、結果は文字列のリストになります。すべてをまとめると、関数の戻り値は次のようなリストになります。

["foo[" 6 "]"
 [";" n "foo[" 0 "] = " 4]
 [";" n "foo[" 1 "] = " 8]
 [";" n "foo[" 2 "] = " 15]
 [";" n "foo[" 3 "] = " 16]
 [";" n "foo[" 4 "] = " 23]
 [";" n "foo[" 5 "] = " 42]
]

このリストは文字列のR配置で使用されているため、暗黙的に文字列にキャストされます。Pipのデフォルトのリストから文字列への変換では、すべての要素が連結されます。

"foo[6];
foo[0] = 4;
foo[1] = 5;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42"

最後に、結果(正規表現と一致しなかったため変更されないままのタイプと最終セミコロンを含む)が自動印刷されます。


4

5.10、73 72 68 66 + 1(-nスイッチ用)= 67バイト

perl -nE '($t,$n,@a)=/[-[\w]+/g;say"$t $n".@a."];";say$n,$i++,"] = $_;"for@a'

これはPerlにとって素晴らしい挑戦であり、これまでのところ汎用言語の中で最も短いものです。に相当

($t, $n, @a) = /[-[\w]+/g;
say "$t $n" . @a . "];";
say $n, $i++, "] = $_;" for @a;

4

PowerShell v2 +、114 105バイト

$a,$b,$c,$d=-split$args-replace'\[]';"$a $b[$(($d=-join$d|iex|iex).length)];";$d|%{"$b[$(($i++))] = $_;"}

入力文字列$args-replace取得し、何もない角括弧をsしてから、-split空白に対して実行します。最初のビットを$aに、2番目のビットを$bに、=$c、そして配列要素をに格納し$dます。以下、例えば、この店舗foo$abar$b、アレイの全てに$d

私たちは、その後、出力を持つ私たちの最初の行"$a ..."と途中で変換$d形式の文字列の配列から{1,2,... 100};による定期的なint配列に-join、その後、1つの文字列にまとめ、それをINGのを通してそれを実行しているiex二度(に類似eval)。その結果の配列を保存して$dから、.lengthからメソッドを、間に適切な番号を入力します[]、出力行の。

次に$d、でループを送信します|%{...}。各反復では、カッコ内にカプセル化され"$b..."たカウンター変数$iと現在の値を出力します$_$i変数は(と同等の未初期化を開始します$null)が、++それをキャストしますint、それは時の出力を開始しますので、出力の前に0すべてのインクリメントする前に、$i次のループの繰り返しのために。

すべての出力行はパイプライン上に残され、端末への出力はプログラムの終了時に暗黙的に行われます。

PS C:\Tools\Scripts\golfing> .\expand-a-c-array.ps1 "foo bar[] = {1, 2, 3, -99, 100};"
foo bar[5];
bar[0] = 1;
bar[1] = 2;
bar[2] = 3;
bar[3] = -99;
bar[4] = 100;

ふう!私は、他の非エソランを打つことについてのあなたのコメントを挑戦としてとることで、私のRubyの答えをあなたの過去のものにした。良い仕事ですが、+ 1。
バリューインク

@KevinLauありがとう!今、105でyaに戻ります。;-)
AdmBorkBork

私はあなたの105に電話し、99を上げます!:D
バリューインク

Retinaを打ち負かすことはもうありません。
CalculatorFeline

3

C、278 280バイト

ゴルフ:

x,e,l,d;char *m,*r,*a;char i[999];c(x){return isdigit(x)||x==45;}main(){gets(i);m=r=&i;while(*r++!=32);a=r;while(*++r!=93);l=r-a;d=r-m;for(;*r++;*r==44?e++:1);printf("%.*s%d];\n",d,m,e+1);r=&i;while(*r++){if(c(*r)){m=r;while(c(*++r));printf("%.*s%d] = %.*s;\n",l,a,x++,r-m,m);}}}

なし:

/* global ints
 * x = generic counter
 * e = number of elements
 * l = length of the array type
 * d = array defination upto the first '['
 */
x,e,l,d;
/* global pointers
 * m = memory pointer
 * r = memory reference / index
 * a = pointer to the start of the array type string
 */
char *m,*r,*a;
/* data storage for stdin */
char i[999];
c(x){return isdigit(x)||x=='-';}
main(){
    gets(i);
    m=r=&i;
    while(*r++!=32);                // skip first space
    a=r;
    while(*++r!=93);                // skip to ']'
    l=r-a;
    d=r-m;
    for(;*r++;*r==44?e++:1);        // count elements
    printf("%.*s%d];\n",d,m,e+1);   // print array define
    r=&i;
    while(*r++) {                   // print elements
        if(c(*r)) {                 // is char a - or a digit?
            m=r;
            while(c(*++r));         // count -/digit chars
            printf("%.*s%d] = %.*s;\n",l,a,x++,r-m,m);
        }
    }
}

この作業中に、誰かがデータポインターを使用するのではなく、解析のためにsscanfを使用して短いバージョンを投稿しました...素晴らしいものです!

更新:要素の印刷、IDEオンラインリンク:http : //ideone.com/KrgRt0で等号の周りに不足しているスペースが 見つかりました。この実装は負の数をサポートしていることに注意してください...


2

Awk、101バイト

{FS="[^[:alnum:]_-]+";printf"%s %s[%d];\n",$1,$2,NF-3;for(i=3;i<NF;i++)printf$2"[%d] = %d;\n",i-3,$i}

より読みやすい:

{
FS="[^[:alnum:]_-]+"
printf "%s %s[%d];\n", $1, $2, NF - 3
for (i=3; i < NF; i++)
    printf $2"[%d] = %d;\n", i-3, $i
}
  • フィールドセパレーターを、アルファベット、数字、アンダースコア、およびを除くすべてに設定します-。したがって、フィールドは型名、変数名、および数字になります。
  • フィールドの数は、1(タイプの場合)+ 1(名前の場合)+ N(数値)+ 1(末尾の後の空のフィールド};)です。したがって、配列のサイズはNF - 3です。
  • 次に、宣言のための特別な行を出力し、数字をループします。
  • 私がすべき割り当てFSのいずれかのawk(使用して呼び出す場合-F)またはでBEGINブロックを。簡潔にするために、…。

1
実際には、入力FSするBEGINか使用し-Fないかのいずれかで割り当てる必要があります。そうしないと、最初の行を分割するために使用されず、入力が1行しかないため...
Robert Benson

@RobertBensonあなたは正しいので、コマンドはになりますawk '-F[^[:alnum:]_-]+' '{printf"%s %s[%d];\n",$1,$2,NF-3;for(i=3;i<NF;i++)printf$2"[%d] = %d;\n",i-3,$i}'。これは、それawk自体をカウントしない102バイトです。うーん。引用符を除外できますか?
ムル

はい、引用符を除外できます。あなたは時々それをC+O bytesどこにリストし、それぞれコードとオプションからバイトCO表します。もちろん、通常はBEGINブロックを使用するだけなので、考える必要はありません。:p
ロバートベンソン

2

JavaScriptのES6、134の 132 130 129バイト

Neilのおかげで1バイト節約されました。

x=>(m=x.match(/(\w+) (\w+).+{(.+)}/),m[1]+` `+(q=m[2])+`[${q.length-1}];
`+m[3].split`, `.map((t,i)=>q+`[${i}] = ${t};`).join`
`)

すべきでは`[${i}] = `+t+";"ない`[${i}] = ${t};`
ニール

@Neilありがとう、バイトを節約しました!
コナーオブライエン

2

バッシュ、 133 129バイト

read -a l
d="${l[@]:0:2}"
e=("${l[@]:3}")
echo "${d%?}${#e[@]}];"
for i in "${!e[@]}"
{
echo "${l[0]}[$i] = ${e[$i]//[!0-9]/};"
}

最初の試み、それを短くする可能性を確認してください。


2

D、197、188バイト

import std.array,std.stdio;void main(){string t,n,e;readf("%s %s] = {%s}",&t,&n,&e);auto v=e.replace(",","").split;writeln(t,' ',n,v.length,"];");foreach(i,c;v)writeln(n,i,"] = ",c,";");}

または未使用:

import std.array, std.stdio;

void main() {
    string type, nameAndBracket, elems;
    readf("%s %s] = {%s}", &type, &nameAndBracket, &elems);

    // remove all commas before splitting the string into substrings
    auto vector = elems.replace(",","").split();

    // writeln is shorter than fln by 1 char when filled in
    writeln(type, ' ', nameAndBracket, vector.length, "];");

    // print each element being assigned
    foreach(index, content; vector)
        writeln(nameAndBraket, index, "] = ", content, ";");
}

Dはわかりませんが、名前の一部として開き角かっこを読むことができますか?これにより、後で角括弧を個別に記述する必要がなくなります。
DLosc

2

ジュリア、154 134 101バイト

f(s,c=matchall(r"-?\w+",s),n=endof(c)-2)=c[]" "c[2]"[$n];
"join([c[2]"[$i] = "c[i+3]";
"for i=0:n-1])

これは、文字列を受け入れ、単一の末尾改行を含む文字列を返す関数です。

ゴルフをしていない:

function f(s, c = matchall(r"-?\w+", s), n = endof(c) - 2)
    c[] " " c[2] "[$n];\n" join([c[2] "[$i] = " x[i+3] ";\n" for i = 0:n-1])
end

c正規表現の入力と一致する配列として定義します-?\w+。タイプ、配列名、各値をキャプチャします。nの長さとして保管c値の数である-2ます。出力は、補間されたタイプ、名前、および長さの文字列として構築され、改行で区切られた各定義行と組み合わされます。何らかの理由で、はとc[]同じc[1]です。

デニスの助けを借りて32バイトを節約しました!


1

Python 2、159バイト

s=input().split()
t,n,v=s[0],s[1][:-2],''.join(s[3:])
a=v[1:-2].split(',')
print'%s %s[%d];'%(t,n,len(a))
for i in range(len(a)):print'%s[%d] = %s;'%(n,i,a[i])

オンラインで試す

ゴルフの提案をしてくれたケビン・ラウに感謝


1

Python 3、116バイト

t,v,_,*l=input().split();v=v[:-1]+'%s]'
print(t,v%len(l)+';');i=0
for x in l:print(v%i,'= %s;'%x.strip('{,};'));i+=1

入力をタイプ、名前、および数字のリストに分割します。配列宣言を印刷した後、数値を手動で列挙して要素を印刷し、最初と最後の句読点に付加された余分な句読点を削除します。

Python 2の異なるアプローチは122バイトになりました。

a,b=input()[:-2].split('] = {')
l=eval(b+',')
print a+`len(l)`+"];"
for y in enumerate(l):print a.split()[1]+'%s] = %s;'%y

アイデアはeval、単一の数値が型として認識されるように、数字のリストをタプルとして、最後にカンマを付けてすることです。数値の列挙リストは、文字列形式のタプルを提供します。


1

PHP、143バイト

ゴルフ

<?$t=count($n=explode(' ',preg_replace('/[^\s\w]/','',$argv[1])))-3;echo"$n[0] {$n[1]}[$t];";for($i=2;$t>$j=++$i-3;)echo$n[1]."[$j] = $n[$i];";

非ゴルフ

<?  
$t = count(                                  // Get the number of elements for our array...
    $n = explode(' ',                            // After split the input on whitespace...
    preg_replace('/[^\s\w]/','',$argv[1])))-3;  // After removing all special characters.
echo "$n[0] {$n[1]}[$t];";                     // First line is type, name, and count.
for($i=2;                                        // Loop through array elements
    $t > $j = ++$i-3;)                         // Assign j to be the actual index for our new array
    echo $n[1]."[$j] = $n[$i];";                // Print each line

入力はコマンドライン引数を介して取得されます。サンプル:

C:\(filepath)>php Expand.php "int foo[] = {4,8,15,16,23,42};"

出力:

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

0

MATL68 64 58バイト

'\w+'XX2:H#)XKxXIZc'['KnV'];'v!K"I2X)'['X@qV'] = '@g';'6$h

これはCではありませんsprintf、4バイトを浪費していたCのような関数 Nahを使用します。

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

          % Take input implicitly
'\w+'XX   % Find substrings that match regex '\w+'. Gives a cell array
2:H#)     % Split into a subarray with the first two substrings (type and name), and 
          % another with the rest (numbers that form the array)
XKx       % Copy the latter (numbers) into clipboard K. Delete it
XI        % Copy the former (type and name) into clipboard I
Zc        % Join the first two substrings with a space
'['       % Push this string
K         % Paste array of numbers
nV        % Get its length. Convert to string
'];'      % Push this string
v!        % Concatenate all strings up to now. Gives first line of the output
K"        % For each number in the array
  I2X)    %   Get name of array as a string
  '['     %   Push this string
  X@qV    %   Current iteration index, starting at 0, as a string
  '] = '  %   Push this string
  @g      %   Current number of the array, as a string
  ';'     %   Push this string
  5$h     %   Concatenate top 6 strings. This is a line of the output
          % Implicity end for each
          % Implicitly display

0

Clojure、115バイト

#(let[[t n & v](re-seq #"-?\w+"%)](apply str t" "n\[(count v)"];\n"(map(fn[i v](str n"["i"] = "v";\n"))(range)v))))

コードを再利用できるようにawful_array_name[5];awful_array_name[0] = 7;パーツとパーツをうまくマージできませんでした:/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.