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;

도전

첫 번째 방법에서 두 번째 방법으로 배열을 확장하는 프로그램 또는 함수를 작성해야합니다. 코드를 더 길게 만드는 프로그램을 작성하고 아이러니를 좋아하기 때문에 코드를 가능한 짧게 만들어야합니다.

입력은 원래 배열을 나타내는 문자열이되고 출력은 확장 된 배열 정의가됩니다. 입력이 항상 다음과 같다고 가정 할 수 있습니다.

<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

@Mego 허용되지 않습니다. 공백이 필요합니다. 나는 그것을 편집 할 것입니다.
DJMcMayhem

후행 줄 바꿈이 허용됩니까?
Luis Mendo

기능이 허용됩니까?
Mego

출력하는 대신 출력물을 반환해도 괜찮습니까? (기능의 경우)
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
cat

이 기능을 작동시킬 수 없습니다. "@ qq @ q"의 첫 번째 "@q"를 입력하면 매크로가 실행 된 다음 매크로가 다음보다 더 많이 실행 int foo[6] = {되어 종료됩니다 int foo[12(커서 "2")
LordAro

@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+ ?)+하여 큰 캡처 그룹에 넣습니다. 닫는 중괄호 또는 세미콜론과 일치하지 않습니다. 세 번째 줄 설명이 그 이유를 알려줍니다.

두 번째 줄 : $#2];$1

입력의 일부만 일치했기 때문에 일치하지 않는 부분은 여전히 ​​존재합니다. 따라서 일치하지 않는 여는 대괄호 뒤에 목록의 길이를 넣습니다 $#2. replace 수정자는 #특정 캡처 그룹이 만든 일치 수를 제공하므로 도움이됩니다. 이 경우 캡처 그룹 2. 그런 다음 닫는 괄호와 세미콜론을 넣고 마지막으로 전체 목록을 작성합니다.

input short array[] = {4, 3, 2, 1};을 사용한 경우이 교체 후의 내부 표현은 다음과 같습니다.

짧은 배열 [4]; 4, 3, 2, 1};

(닫는 중괄호와 세미콜론에 유의하십시오)

세 번째 줄 : +`((\w+[).+;(\S+ )*)(-?\d+).+

이것은 루프 섹션입니다. 이는 루프의 어떤 단계도 입력을 변경하지 않을 때까지 실행됨을 의미합니다. 먼저 배열 이름을 찾은 다음 여는 괄호를 찾습니다 : (\w+\[). 그런 다음 임의의 수의 문자와 세미콜론 : .+;. 그런 다음 목록과 다시 일치하지만 이번에는 각 숫자 다음에 숫자와 쉼표 만 표시되며 그 뒤에 공백이 있습니다 (\S+ )*. 그런 다음 목록의 마지막 숫자 (-?\d+)와 그 뒤에 남은 모든 문자를 캡처합니다 .+.

넷째 줄 : $1¶$2$#3] = $4;

그런 다음 배열 이름과 목록으로 바꾸고 줄 바꿈을 $1¶합니다. 다음으로, 마지막 요소 (본질적으로 list.length - 1) 없이 배열 이름 뒤에 이전에 일치 한 목록의 길이를 넣습니다 $2$#3. 뒤에 공백이있는 닫는 대괄호와 어설 션 연산자가 이어지고, 그 다음에 숫자 목록의 마지막 요소가옵니다.] = $4;

처음 교체 한 후 내부 표현은 다음과 같습니다.

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

닫는 중괄호와 세미콜론 .+은 세 번째 줄의 끝으로 인해 사라졌습니다 . 세 번 더 교체 한 후 내부 표현은 다음과 같습니다.

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

세 번째 줄과 일치하는 항목이 없기 때문에 네 번째 줄은 아무것도 바꾸지 않으며 문자열이 반환됩니다.

TL; DR : 먼저 int list 형식을 약간 변경합니다. 그런 다음 목록의 마지막 요소와 이름을 가져 와서 배열 초기화 후에 넣습니다. 우리는 int리스트가 비워 질 때까지 이것을한다. 그런 다음 변경된 코드를 다시 제공합니다.

온라인으로 사용해보십시오!


누군가 나를 이겼습니다 .... :(
CalculatorFeline

M!`G`비슷하지만, 상당히 다릅니다. 조심해.
CalculatorFeline

세 번째 줄 설명은 나를 혼란스럽게한다. 첫 번째 항목은 뒤에 공백이없는 유일한 항목이며 마지막 항목은 아닙니다.
CalculatorFeline

@ CatsAreFluffy 나는 지금 문구를 조금 바꿔 보았습니다. 내가 의미하는 것은 앞에 오는 것이 아니라 숫자 뒤에 오는 공백이었습니다 . 나는 "뒤에"의 의미를 완전히 이해하지 못했다고 생각합니다. 오전 2시에 코드 설명을 작성해서는 안됩니다.
daavko

@daavko "뒤에"는 일반적으로 구어체 영어로 "뒤에"즉 "따르는"을 의미합니다. 넌 괜찮 았어
Nic Hartley

9

V, 37 바이트

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

V는 필자가 작성한 2D 문자열 기반 골프 언어로 vim으로 설계되었습니다. 이것은 커밋 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.

이 유니 코드 광기를 입력하기 어려울 수 있으므로이 뒤집을 수있는 16 진 덤프로 파일을 만들 수 있습니다.

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. +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

string에서 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 아, 잘 잡아. 감사!
homersimpson

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
}

두 개의 단축키는 m수정자를 사용하여 scanf가 %s자체 메모리를 할당하고 (문자 배열을 선언하는 저장), 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- 문자열을 많이 사용 합니다.

언 골프 버전 :

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- 현을 잊었다. 그것들은 골프에 매우 유용 할 것입니다!
Morgan Thrapp

난 당신이 정상적인 루프 대신 지능형리스트를 사용하여 바이트를 저장할 수 있다고 생각
someonewithpc

@someonewithpc : 아뇨, 실제로 1 바이트를 더할 것입니다
vaultah

5

루비, 127 (110) 108 99 88 바이트

단일 인수를 입력으로 사용하는 익명 함수 전체 프로그램, STDIN에서 입력을 읽습니다. 파일을 파이프하는 경우 후행 줄 바꿈은 선택 사항입니다. 반환 값 출력 문자열을 인쇄합니다.

@TimmyD는 그들의 모든 비-에 슬랑을 치는 도전에 대한 그들의 해결책에 대해 자랑스러워하고 마침내 그들이 게시 한 114 바이트 Powershell 솔루션을 극복했습니다. Cᴏɴᴏʀ O'Bʀɪᴇɴ의 수법을 나누고 후반부를 쪼개는 수법이 ]도움이되었습니다.

splat 연산자를 더 사용해야합니다. 너무 유용합니다!

@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};"}

AFAICT 과제는 전체 프로그램을 작성하는 것입니다.
vaultah

@vaultah 코드 골프의 기본값은 프로그램 또는 기능입니다.
Mego

@Mego : OP가 "프로그램을 작성해야합니다"
vaultah

@ vaultah 일반적으로 코드 골프를 사용하면 함수를 사용할 수 있지만 전체 프로그램으로 2 바이트를 절약 할 수 있다고 말하면 왜 안됩니까?
Value Ink

Ooof ... PowerShell이 ​​그렇게 할 수 있다고 생각하지 않습니다. +1
AdmBorkBork

4

05AB1E , 52 50 47 바이트

암호:

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

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


1
그것은 당신의 05AB1E 답변을 찾기 위해 다른 모든 답변을 건너 뛰는 시점에 도달했습니다. 언어는 절대적으로 나를 매료시킵니다.
WorseDoughnut

1
@WorseDoughnut 감사합니다! 그것은 누군가가 05AB1E에 대해 나에게 말한 가장 좋은 것입니다 :)!
Adnan

4

자바 스크립트 (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

Pyth- 53 50 46 45 44 바이트

@FryAmTheEggman 덕분에 2 바이트가 절약되었습니다.

+Jhcz\[+`]lKcPecz\{d\;j.es[ecJd`]kd\=dPb\;)K

테스트 스위트 .


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을 가져 옵니다 .

우리는 목록을 구성,의 처음 세 항목이 될 것입니다 "foo[", 6하고 "]". 를 얻으려면 6, 우리는 분할 d내장 변수 k= ", ", Y에 정수의 ANK 결과 목록 y향후 사용을위한 변수와 길이를 가지고 ( #). ']문자 리터럴입니다.

남아있는 것은 일련의 형식의 문자열을 구성하는 것 ";\nfoo[i] = x"입니다. 이를 위해 다음과 같이 연결합니다. ';, n(개행에 내장), b(첫 번째 캡처 그룹), ,#y(Python과 동일 range(len(y))), c(두 번째 캡처 그룹) 및 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

Perl 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 +, 114105 바이트

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

입력 문자열을 사용 $args하고 -replace아무것도 대괄호이야, 그 다음은 수행 -split공백에. 우리는 첫 번째 비트에 저장하는 $a, 제 2 비트에 $b상기 =$c한로 배열 요소 $d. 아래 예제의 경우, foo$abar에 저장 $b하고 모든 배열을에 저장 $d합니다.

우리는 그 다음 출력이 첫 행 "$a ..."및 중간 변환 $d형태의 문자열 배열로 {1,, 2,... 100};에 의해 정기적 INT 배열 -join한 다음, 하나 개의 스트링으로 함께를 보내고 통해 실행 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;

아휴! 나는 다른 비 -esolang을 때리는 것에 대한 귀하의 의견을 도전으로 내 루비 답변을 골랐습니다. 그래도 좋은 일이지만 +1입니다.
Value Ink

트윗 담아 가기 나중에 105로 돌아갑니다. ;-)
AdmBorkBork

나는 당신의 105에게 전화하고 99를 올릴 것입니다! : D
Value Ink

더 이상 Retina를 때리는 일이 없습니다.
CalculatorFeline

3

C, 278280 바이트

골프 :

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

어, 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
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 바이트 입니다. 흠. 따옴표를 제외시켜야합니까?
muru

예, 따옴표를 제외 할 수 있습니다. 당신은 때때로으로 나열 C+O bytesCO각각 코드와 옵션에서 바이트를 나타냅니다. 물론 나는 일반적으로 BEGIN블록을 사용하기 때문에 그것에 대해 생각할 필요가 없습니다. : p
Robert Benson 17 년

2

자바 스크립트 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

@ 닐 감사합니다, 바이트를 저장했습니다!
Conor O'Brien

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,";");}

또는 ungolfed :

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+. 유형, 배열 이름 및 각 값을 캡쳐합니다. 값의 개수 인-2 n의 길이로 저장 c합니다. 출력은 보간 된 유형, 이름 및 길이 문자열로 구성되며 개행으로 구분 된 각 정의 행과 결합됩니다. 어떤 이유로 든와 c[]같습니다 c[1].

Dennis의 도움으로 32 바이트를 절약했습니다!


1

파이썬 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])

온라인으로 사용해보십시오

골프 제안에 대한 Kevin Lau 감사


1

파이썬 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

MATL , 68 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

클로저, 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.