지미이 배열


23

제 동료 인 Jimmy 는 C / C ++에 익숙하지 않습니다. 그는 또한 느린 학습자입니다. 공평하게 말하면, 그의 코드는 항상 컴파일되지만, 실제로는 약간의 습관이 있습니다. 예를 들어, 모두는 다음과 같이 배열을 정의 할 수 있다는 것을 알고 있습니다.

int spam[] = {4, 8, 15, 16, 23, 42};

지미를 제외한 모든 사람. 그는 배열을 만드는 유일한 방법은 다음과 같다고 확신합니다 .

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

나는 코드 검토에서 그를 위해 이것을 고치지 만 배우지 않을 것입니다. 그래서 그가 커밋 할 때 자동으로이를 수행하는 툴을 작성해야합니다 ¹.

도전

전체 프로그램이나 여러 줄 문자열을 입력으로 사용하고 더 컴팩트 한 버전의 C 배열을 출력하는 함수를 작성하고 싶습니다. 입력은 항상 공백을 포함하여이 형식을 따릅니다.

identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;

간단히 말해서 입력은 항상 유효하고 잘 정의 된 C입니다.

모든 식별자는 문자와 밑줄로 구성됩니다. 길이는 항상 최소 1 개이며 범위 인덱스가 없거나 누락되지 않습니다. 인덱스가 순서대로 있다고 가정 할 수도 있습니다. 예를 들면 다음과 같습니다.

foo bar[3];
bar[0] = 1
bar[2] = 9;

foo bar[1];
bar[0] = 1;
bar[1] = 3;

foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3

모두 유효하지 않은 입력이므로 제출시 정의되지 않은 동작이 발생할 수 있습니다. 또한 모든 숫자가 유효한 10 진수 (음수 또는 양수)라고 가정 할 수 있습니다. 입력에 외부 공간이 없습니다. 출력은 항상 공백을 포함하여이 형식을 따라야합니다.

identifier_one identifier_two[] = {n1, n2, n3, ...};

다음은 몇 가지 샘플 데이터입니다.

Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;

Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};

Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;

Output:
char ans[] = {52, 50};

Input:
blah_blah quux[1];
quux[0] = 105;

Output:
blah_blah quux[] = {105};

STDIN / STDOUT, 함수 인수 및 리턴 값, 파일 읽기 및 쓰기 등과 같은 합리적인 형식으로 입력 및 출력을 취할 수 있습니다. 표준 허점이 적용됩니다. 바이트 단위의 최단 답변이 승리합니다!


¹ 이것은 수동적이고 공격적이고 끔찍한 아이디어입니다. 당신은 않았다 하지 나에서이 아이디어를 얻을.




@DLosc 아, 지미가 커밋 전 스크립트에서 사용하고있는 것입니다!
Bergi

9
물론 지미는 코드 골퍼가 아닙니다.
jimmy23013

이 도전은 나의 Jimmies를 정말로 녹슬었다 .
DanTheMan

답변:


8

정력, 43 36 바이트

지미에게 스크립트를 줄 필요는 없으며 적절한 텍스트 편집기를 사용하도록 가르치십시오. (명확성을위한 리터럴 리턴)

:%s/.*=//|%s/;\n/,/<cr><cr>
3wcf ] = {<esc>
$s};

좋은! 이 특정 예에서는 <C-a>보다 짧습니다 t]. 재미있는 작은 해킹입니다. 또한 <cr>확인을 요청하기 때문에 기술적으로 2가 필요하다고 생각합니다 .
DJMcMayhem


또한, norm df=보다 짧은s/.*=//g
DJMcMayhem

1
또한 3wC] = {<esc>보다 짧습니다 <C-a>di]$s = {<esc>.
DJMcMayhem

1
@Geobits 당신의 이맥스는 어디에 있습니까?
Neil

7

CJam, 43 36 바이트

qN/('[/~;"[] = {"@{S/W=W<}%", "*"};"

온라인 예

설명:

qN/                                     |Read all lines to array
   ('[/~;                               |slice first line left of [
         "[] = {"                       |add formatting to stack
                 @                      |rotate to remaining lines
                  {      }%             |for each line in array
                   S/W=                 |split after last space
                       W<               |remove last character (;)
                           ", "*        |insert ", " to array
                                "};"    |add formatting

첫 번째 CJam 답변의 개선에 대해 Martin Ender 에게 감사드립니다 .


6

자바 스크립트 (ES6), 65 64 63 바이트

s=>`${s.split`[`[0]}[] = {${s.match(/-?\d+(?=;)/g).join`, `}};`

5

망막 , 30 28 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

\d+];¶.+ 
] = {
;¶.+=
,
;
};

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

설명

다음 입력을 예로 사용하겠습니다.

spam eggs[4];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;

스테이지 1

\d+];¶.+ 
] = {

첫 줄에는 후행 공백이 있습니다.

우리는 다음에 오는 숫자 ];와 줄 바꿈 을 일치시킨 다음 모든 것을 다음 줄의 마지막 공간까지 일치시킵니다. 이 일치는 첫 번째 줄의 끝에서만 찾을 수 있습니다 (으로 인해 ];). 이 모든 것이로 대체되었습니다 ] = {. 즉, 예제 입력을 다음과 같이 변환합니다.

spam eggs[] = {0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;

2 단계

;¶.+=
,

이제 우리는 모든 것을 일치 ;받는까지 =다음 줄에와 교체 ,. 문자열을 다음과 같이 변환합니다.

spam eggs[] = {0, 4, 8, -3;

3 단계

;
};

남은 것은 끝을 고치는 것이며 나머지 ;};다음 과 같이 바꿔서 수행합니다 .

spam eggs[] = {0, 4, 8, -3};

5

줄리아 112 108 105 바이트

f(s)=string(split(s,'[')[1],"[] = {",join([m[1] for m in [eachmatch(r"= *(-?\d+)",s)...]],", "),"};")

설명

string(                                                         # build output string
split(s,'[')[1],                                                # get declaration (e.g. spam eggs)
"[] = {",                                                       # add [] = {
join(                                                           # collect numbers
    [m[1] for m in [eachmatch(r"= *(-?\d+)",s)...]],            # regex out (signed) numbers
    ", "),                                                      # and join comma separated
"};"                                                            # add };
)                                                               # close string(

collect (eachmatch ())를 [eachmatch () ...]로 바꾸고 더 짧은 정규식으로 바이트를 절약했습니다.


안녕하세요, PPCG에 오신 것을 환영합니다! 이것은 훌륭한 첫 대답처럼 보입니다. 나에게서 +1 챌린지 상태는 " 합리적인 형식으로 입력 및 출력 할 수 있습니다"라고 표시되므로 eachmatch함수 호출 에서 쉼표 구분 기호 뒤의 공백을 제거하여 덜 예쁜 출력 및 -1 바이트를 제거 할 수 있습니다 . 나는 스스로 Julia를 직접 프로그래밍하지는 않았지만이 게시물을 읽는 것이 흥미로울 것입니다 : Julia의 골프 팁 . 다시 한 번 환영하고 즐거운 시간을 보내십시오. :)
Kevin Cruijssen

1
당신의 친절한 말에 대단히 감사합니다 :) PPCG는 재미있게 보였습니다. 그래서 나는 그것을 시도 할 것이라고 생각했습니다. 이 답변이 아직 존재하지 않았으므로 Julia가이 답변을 선택했습니다
nyro_0

사용하는 matchall것이 튄 것보다 짧을 것 eachmatch입니다.
Alex A.

matchall을 먼저 사용해 보았지만 각 일치 항목과 달리 정규식 그룹 (특히 관심있는 괄호 부분)을 사용할 수는 없습니다. (또는 설명서에서 찾을 수 없었습니까?)
nyro_0

3

루아, 121 바이트.

function g(s)print(s:gmatch('.-%[')()..'] = {'..s:gsub('.-\n','',1):gsub('.-([%d.-]+);\n?','%1, '):gsub(',%s+$','};'))end

설명

function g(s)
    print(                              -- Print, Self Explaintry.
        s:gmatch('.-%[')()..'] = {'     -- Find the 'header', match the first line's class and assignment name (everything up to the 'n]') and append that. Then, append ] = {.
                                        -- In the eggs example, this looks like; 'spam eggs[] = {' now
        ..                              -- concatenate...
        s:gsub('.-\n','',1)             -- the input, with the first line removed.
        :gsub('.-([%d.-]+);\n?','%1, ') -- Then that chunk is searched, quite boringly, a number followed by a semicolon, and the entire string is replaced with an array of those,
                                        -- EG, '1, 2, 3, 4, 5, 6, '
        :gsub(',%s+$','};')          -- Replace the final ', ' (if any) with a single '};', finishing our terrifying combination
    )
end

3

배치, 160 바이트

@echo off
set/ps=
set s=%s:[=[] = {&rem %
set r=
:l
set t=
set/pt=
if "%t%"=="" echo %r%};&exit/b
set t=%t:* =%
set r=%r%%s%%t:~2,-1%
set s=, 
goto l

참고 : 줄 set s=,은 공백으로 끝납니다. STDIN에서 입력을받습니다. 그 이상한 라인 3은 입력 (예를 소요 int spam[6];하고, 변화 [[] = {&rem의 결과로 set s=int spam[] = {&rem 6];다음 두 문장으로 해석됩니다있는, set s=int spam[] = {그리고 rem 6];후자있는 코멘트입니다. 그런 다음 각 줄을 우리가 최초의 우주에있는 텍스트까지 삭제 (때문에 당신이 할 수있는 =패턴에 사용 하지 않고 일치하는 것은 욕심이 없습니다)) 값을 추출하십시오.


3

C, 121 바이트

n=2;main(i){for(;putchar(getchar())^91;);for(printf("] = {");~scanf("%*[^=]%*c%d",&i);n=0)printf(", %d"+n,i);puts("};");}

3

파이썬 112 111

나에게 매우 간단하게 생각 나는 개선 사항을 제안하십시오.

def f(l):
 a,*b=l.split('\n')
 return a[:a.index('[')]+'[] = {'+', '.join(r.split(' = ')[1][:-1]for r in b)+'};'


# TEST

lines = """spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;"""
print (f(lines))
assert f(lines) == 'spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};'

간단히 살펴보면에 쓸모없는 공백이 있음을 알 수 [:-1] for있습니다.
Yytsi

2

05AB1E , 31 30 28 바이트

žh-|vy#¤¨ˆ\}¨… = ¯ïžuDÀÀ‡';J

설명

žh-¨                            # remove numbers and ";" from first input
    |v      }                   # for each of the rest of the inputs
      y#                        # split on spaces
        ¤¨                      # take the last element (number) minus the last char (";") 
          ˆ\                    # store in global array and throw the rest of the list away
             … =                # push the string " = "
                 ¯ï             # push global array and convert to int
                   žuDÀÀ‡       # replace square brackets of array with curly ones
                         ';     # push ";"
                           J    # join everything and display

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

Adnan 덕분에 바이트 절약


žuDÀÀ대신 „[]„{}바이트 를 저장합니다 :).
Adnan

@Adnan : 맞아, 잘 잡아!
Emigna

2

자바 7 159 158 149 154 바이트

String c(String[]a){a[0]=a[0].split("\\d")[0]+"] = {\b";for(String i:a)a[0]+=i.split("= [{]*")[1];return a[0].replace(";",", ").replaceFirst("..$","};");}

@cliffroot 덕분에 여러 바이트가 저장 되었습니다 .

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

class M{
  static String c(String[] a){
    a[0] = a[0].split("\\d")[0] + "] = {\b";
    for(String i : a){
      a[0] += i.split("= [{]*")[1];
    }
    return a[0].replace(";", ", ").replaceFirst("..$", "};");
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "spam eggs[10];", "eggs[0] = 0;", "eggs[1] = 4;",
      "eggs[2] = 8;", "eggs[3] = -3;", "eggs[4] = 3;", "eggs[5] = 7;", "eggs[6] = 888;",
      "eggs[7] = 555;", "eggs[8] = 0;", "eggs[9] = -2;" }));
    System.out.println(c(new String[]{ "char ans[2]", "ans[0] = 52;", "ans[1] = 50;" }));
    System.out.println(c(new String[]{ "blah_blah quux[1];", "quux[0] = 105;" }));
  }
}

산출:

spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
char ans[] = {52, 50};
blah_blah quux[] = {105};

1
적은 바이트 절약String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
cliffroot

@cliffroot 감사합니다! 실제로 String매개 변수에서를 다시 사용 하고 마지막 문자를 "};");대신에 대체하는 것과 같은 멋진 트릭 이 "")+"};";있습니다.
케빈 크루이 센

2

펄, 42 + 2 ( -0p) = 44 바이트

s%\d+].*%] = {@{[join",",/(-?\d+);/g]}};%s

필요 -p-0실행할 와 플래그. 예를 들면 :

perl -0pe 's%\d+].*%] = {@{[join",",/(-?\d+);/g]}};%s' <<< "blah_blah quux[1];
quux[0] = 105;"

1

젤리 , 27 바이트

Ỵ©ḢḟØDṖ“ = {”®Ḳ€Ṫ€Ṗ€j⁾, ⁾};

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

설명

Ỵ         Split into lines
 ©Ḣ       Take the first one, store the others in ®
   ḟØD    Remove digits
      Ṗ   Remove trailing ;

“ = {”    Print a literal string

®         Recall the remaining lines
 Ḳ€       Split each into words
   Ṫ€     Keep each last word
     Ṗ€   Remove each trailing ;

j⁾,       Join by “, ”
    ⁾};   Literal “};”


1

자바, 106 바이트

Java에서 문자열 조작은 항상 그렇습니다.

a->a[0].join("",a).replaceAll(";\\w+\\[\\d+\\] = ",", ").replaceAll("\\d+\\], ","] = {").replace(";","};")

이것은 순수한 정규식 답변입니다. 하나의 연결 String을 만든 다음 replaceXxx괜찮을 때까지 수행 하십시오.

테스트 및 ungolfed :

import java.util.function.Function;

public class Main {

  public static void main(String[] args) {
    Function<String[], String> f = a ->
        String.join("", a)                          // I think this would join. Not sure, though. Golfed into a[0].join because static members are accessible from instances.
            .replaceAll(";\\w+\\[\\d+\\] = ", ", ") // replace with regex
            .replaceAll("\\d+\\], ", "] = {")       // replace with regex
            .replace(";", "};");                    // replace no regex

    String[] spam = {
      "int spam[6];",
      "spam[0] = 4;",
      "spam[1] = 8;",
      "spam[2] = 15;",
      "spam[3] = 16;",
      "spam[4] = 23;",
      "spam[5] = 42;"
    };
    test(f, spam, "int spam[] = {4, 8, 15, 16, 23, 42};");

    String[] eggs = {
      "spam eggs[10];",
      "eggs[0] = 0;",
      "eggs[1] = 4;",
      "eggs[2] = 8;",
      "eggs[3] = -3;",
      "eggs[4] = 3;",
      "eggs[5] = 7;",
      "eggs[6] = 888;",
      "eggs[7] = 555;",
      "eggs[8] = 0;",
      "eggs[9] = -2;"
    };
    test(f, eggs, "spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};");

    String[] ans = {
      "char ans[2];",
      "ans[0] = 52;",
      "ans[1] = 50;"
    };
    test(f, ans, "char ans[] = {52, 50};");

    String[] quux = {
      "blah_blah quux[1];",
      "quux[0] = 105;"
    };
    test(f, quux, "blah_blah quux[] = {105};");

  }

  static void test(Function<String[], String> f, String[] input, String expected) {
    System.out.printf("Result:   %s%nExpected: %s%n", f.apply(input), expected);
  }
}

0

젤리 , 33 바이트

ỴḊḲ€Ṫ€K⁾;,yṖ“{“};”j
ỴḢḟØDṖ,⁾ =,ÇK

TryItOnline

방법?

ỴḊḲ€Ṫ€K⁾;,yṖ“{“};”j - Link 1, parse and reform the values, same input as the Main link
Ỵ                   - split on line feeds
 Ḋ                  - dequeue (remove the first line)
  Ḳ€                - split each on spaces
    Ṫ€              - tail each (get the numbers with trailing ';')
      K             - join on spaces
       ⁾;,          - ";,"
          y         - map (replace ';' with ',')
           Ṗ        - pop (remove the last ',')
            “{“};”  - list of strings ["{","};"]
                  j - join (making "{" + "n0, n1, ,n2, ..." + "};")

ỴḢḟØDṖ,⁾ =,ÇK - Main link, takes one argument, the multiline string
Ỵ             - split on line feeds
 Ḣ            - head (just the first line)
   ØD         - digits yield "0123456789"
  ḟ           - filter out
     Ṗ        - pop (remove the trailing ';')
      ,   ,   - pair
       ⁾ =    - the string " ="
           Ç  - call the previous Link (1)
            K - join on spaces (add the space after the '=')

다운 유권자-무엇이 잘못 되었나요?
Jonathan Allan


0

자바 스크립트, 125 바이트

나는 그것이 다른 것보다 길다는 것을 알고 있지만 실제로 사용하고 싶었습니다 eval. 재미로.

f=function(s){m=/^(\w+ )(\w+).*?(;.*)/.exec(s)
eval("var "+m[2]+"=new Array()"+m[3]+'alert(m[1]+m[2]+"={"+eval(m[2])+"};")')}

실행하려면 다음을 여기에 붙여 넣으 십시오 .

s='int spam[6];\
spam[0] = 4;\
spam[1] = 8;\
spam[2] = 15;\
spam[3] = 16;\
spam[4] = 23;\
spam[5] = 42;'
f=function(s){m=/^(\w+ )(\w+).*?(;.*)/.exec(s)
eval("var "+m[2]+"=new Array()"+m[3]+'alert(m[1]+m[2]+"={"+eval(m[2])+"};")')}
f(s)

0

Haxe, 234 바이트

function R(L:Array<String>){var S=L[0];var W=S.indexOf(" ");var T=S.substr(0,W),M=S.substring(W+1,S.indexOf("["));var r=[for(i in 1...L.length)L[i].substring(L[i].lastIndexOf(" ")+1,L[i].length-1)].join(', ');return'$T $M[] = {$r};';}

긴 함수 이름으로 이것을 죽였습니다 : D

여기서 테스트 케이스를 사용해보십시오 !


0

V , 25 , 24 바이트

3wC] = {òJd2f $s, òhC};

온라인으로 사용해보십시오! 여기에는 인쇄 할 수없는 <esc>문자 가 포함되어 있으므로 다음은 16 진수 덤프입니다.

0000000: 3377 435d 203d 207b 1bf2 4a64 3266 2024  3wC] = {..Jd2f $
0000010: 732c 20f2 6843 7d3b                      s, .hC};

설명:

3w                              "Move forward 3 words
  C     <esc>                   "Delete everything until the end of the line, and enter this text:
   ] = {                        "'] = {'
             ò         ò        "Recursively:
              J                 "  Join these two lines (which enters a space)
               d                "  Delete everything until you
                2f              "  (f)ind the (2)nd space
                   $            "  Move to the end of this line
                    s           "  Delete a character, and enter:
                     ,          "  ', '
                                "
                        h       "Move one character to the left
                         C      "Delete everything until the end of the line, and enter this text:
                          };    "'};'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.