Jimmy các mảng xuống


23

Đồng nghiệp của tôi, Jimmy là một người mới đối với C / C ++. Anh ấy cũng là một người học chậm. Bây giờ, để công bằng, mã của anh ta luôn biên dịch, nhưng anh ta có một số thói quen thực sự cẩu thả. Ví dụ, mọi người đều biết rằng bạn có thể định nghĩa một mảng như thế này:

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

Tất cả mọi người, ngoại trừ Jimmy. Ông tin chắc rằng cách duy nhất để tạo ra một mảng là như thế này:

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

Tôi tiếp tục sửa lỗi này cho anh ta trong phần đánh giá mã, nhưng anh ta sẽ không học. Vì vậy, tôi cần bạn viết một công cụ tự động làm điều này cho anh ta khi anh ta cam kết.

Các thách thức

Tôi muốn bạn viết một chương trình đầy đủ hoặc một hàm lấy chuỗi đa dòng làm đầu vào và xuất ra phiên bản nhỏ gọn hơn của mảng C. Đầu vào sẽ luôn theo định dạng này, bao gồm khoảng trắng:

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;

Nói tóm lại, đầu vào sẽ luôn hợp lệ và được xác định rõ C. Chi tiết hơn:

Tất cả các định danh sẽ được tạo thành chỉ bằng các chữ cái và dấu gạch dưới. Độ dài sẽ luôn có ít nhất một, và sẽ không bao giờ có bất kỳ chỉ số nào bị thiếu hoặc nằm ngoài giới hạn. Bạn cũng có thể cho rằng các chỉ mục theo thứ tự. Ví dụ:

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

là tất cả các đầu vào không hợp lệ và có thể gây ra hành vi không xác định trong trình của bạn. Bạn cũng có thể cho rằng tất cả các số sẽ là số thập phân hợp lệ, âm hoặc dương. Đầu vào sẽ không có không gian bên ngoài. Đầu ra phải luôn theo định dạng này, bao gồm khoảng trắng:

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

Đây là một số dữ liệu mẫu:

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

Bạn có thể lấy đầu vào và đầu ra của mình ở bất kỳ định dạng hợp lý nào, chẳng hạn như STDIN / STDOUT, đối số hàm và giá trị trả về, đọc và ghi tệp, v.v. Câu trả lời ngắn nhất bằng byte thắng!


¹Đây là thụ động-tích cực và là một ý tưởng khủng khiếp. Bạn đã không nhận được ý tưởng này từ tôi.


8
Tôi xin lỗi đến Jimmy
DJMcMayhem


@DLosc À, đó là những gì mà Jimmy đang sử dụng trong kịch bản cam kết trước của anh ấy!
Bergi

9
Tất nhiên rằng Jimmy không phải là một tay golf mã.
jimmy23013

Thử thách này thực sự làm rỉ tai Jimmies của tôi .
DanTheMan

Câu trả lời:


8

Vim 43 36 byte

Bạn không cần phải đưa cho Jimmy một kịch bản, chỉ cần dạy anh ấy sử dụng một trình soạn thảo văn bản phù hợp. (trả lại theo nghĩa đen cho rõ ràng)

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

Tốt đẹp! Trong trường hợp cụ thể này, <C-a>ngắn hơn t], đó là một hack nhỏ thú vị. Ngoài ra, tôi nghĩ rằng về mặt kỹ thuật bạn cần 2 <cr>vì nó yêu cầu xác nhận.
DJMcMayhem

Câu trả lời của Vim cho các thử thách chơi gôn mã tiêu chuẩn nên được tính bằng byte.
Martin Ender

Ngoài ra, norm df=ngắn hơns/.*=//g
DJMcMayhem

1
Ngoài ra, 3wC] = {<esc>là ngắn hơn <C-a>di]$s = {<esc>.
DJMcMayhem

1
@Geobits Emacs của bạn trả lời ở đâu?
Neil

7

CJam, 43 36 byte

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

Ví dụ trực tuyến

Giải trình:

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

Xin chân thành cảm ơn Martin Ender vì những cải tiến trong câu trả lời đầu tiên của tôi.


6

JavaScript (ES6), 65 64 63 byte

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

5

Võng mạc , 30 28 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Hãy thử trực tuyến!

Giải trình

Chúng tôi sẽ sử dụng đầu vào sau đây làm ví dụ:

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

Giai đoạn 1

\d+];¶.+ 
] = {

Lưu ý rằng có một khoảng trắng ở dòng đầu tiên.

Chúng tôi bắt đầu bằng cách khớp một số theo sau ];và một nguồn cấp dữ liệu, và sau đó mọi thứ cho đến không gian cuối cùng trên dòng tiếp theo. Trận đấu này chỉ có thể được tìm thấy ở cuối dòng đầu tiên (do ];). Tất cả điều này được thay thế bằng ] = {. Đó là, nó biến đổi đầu vào ví dụ của chúng tôi thành:

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

Giai đoạn 2

;¶.+=
,

Bây giờ chúng tôi khớp tất cả mọi thứ từ một ;đến lên =trên dòng tiếp theo và thay thế bằng một ,. Điều này biến đổi chuỗi thành:

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

Giai đoạn 3

;
};

Tất cả những gì còn lại là sửa chữa kết thúc và chúng tôi làm điều này bằng cách thay thế duy nhất còn lại ;bằng };:

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

5

Julia, 112 108 105 byte

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

Giải trình

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(

Các byte được lưu bằng cách thay thế tập hợp (everymatch ()) bằng [Eachmatch () ...] và với regex ngắn hơn


Xin chào, chào mừng đến với PPCG! Đây trông giống như một câu trả lời đầu tiên tuyệt vời. +1 từ tôi. Vì thách thức nêu rõ " Bạn có thể lấy đầu vào và đầu ra của mình ở bất kỳ định dạng hợp lý nào ", bạn có thể xóa khoảng trắng sau dấu tách dấu phẩy trong eachmatchlệnh gọi hàm để có đầu ra nhỏ hơn và byte byte. Bản thân tôi chưa bao giờ lập trình ở Julia, nhưng bạn có thể thấy bài đăng này rất thú vị để đọc: Mẹo chơi golf ở Julia . Một lần nữa chào đón, và tận hưởng kỳ nghỉ của bạn. :)
Kevin Cruijssen

1
cảm ơn rất nhiều vì những lời tốt đẹp của bạn :) PPCG có vẻ rất vui khi xem xét, vì vậy tôi nghĩ tôi sẽ thử. Chọn Julia cho câu trả lời này vì nó chưa có mặt
nyro_0

Sử dụng matchallcó thể sẽ ngắn hơn so với bắn tung tóe eachmatch.
Alex A.

tôi đã thử sử dụng matchall trước, nhưng nó không cho phép tôi sử dụng các nhóm regex (phần trong ngoặc đơn mà tôi đặc biệt quan tâm) trái ngược với từng đối thủ. (hoặc tôi không thể tìm thấy nó trong tài liệu?)
nyro_0

3

Lua, 121 byte.

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

Giải thích

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

Mẻ, 160 byte

@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

Lưu ý: Dòng set s=,kết thúc bằng một khoảng trắng. Đưa đầu vào vào STDIN. Dòng 3 kỳ lạ đó lấy đầu vào (ví dụ int spam[6];và thay đổi [thành [] = {&remkết quả set s=int spam[] = {&rem 6];, sau đó được hiểu là hai câu lệnh set s=int spam[] = {rem 6];sau đó là một nhận xét. Sau đó, với mỗi dòng chúng tôi sẽ xóa văn bản lên khoảng trắng đầu tiên (vì bạn có thể 't sử dụng =trong một mẫu và kết hợp là không tham lam) và trích xuất giá trị.


3

C, 121 byte

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

3

Con trăn 112 111

Rất đơn giản với tôi, xin vui lòng đề xuất bất kỳ cải thiện mà đến với tâm trí.

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};'

Nhìn nhanh, tôi có thể thấy rằng có một khoảng trắng vô dụng tại [:-1] for.
Yytsi

2

05AB1E , 31 30 28 byte

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

Giải trình

ž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

Hãy thử trực tuyến!

Đã lưu một byte nhờ Adnan


žuDÀÀthay vì „[]„{}tiết kiệm một byte :).
Ad Nam

@Ad Nam: Phải, bắt tốt!
Emigna

2

Java 7, 159 158 149 154 byte

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

Nhiều byte được lưu nhờ @cliffroot .

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

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

1
vài byte được lưuString 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 Cảm ơn! Thật vậy, một số thủ thuật hay như sử dụng Stringlại tham số và thay thế char cuối cùng bằng "};");thay vì "")+"};";.
Kevin Cruijssen

2

Perl, 42 + 2 ( -0p) = 44 byte

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

Cần -p-0cờ để chạy. Ví dụ :

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

1

Thạch , 27 byte

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

Hãy thử trực tuyến!

Giải trình

Ỵ         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

sed 51

1s,\[.*,[] = {,
:
N
s,\n.*= ,,
s/;/, /
$s/, $/};/
t

1

Java, 106 byte

Thao tác chuỗi trong Java là địa ngục, như mọi khi.

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

Đây là một câu trả lời regex thuần túy. Tạo một liên kết đơn String, sau đó thực hiện replaceXxxcho đến khi nó ổn.

Kiểm tra và không được phép:

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

Thạch , 33 byte

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

Dùng thử

Làm sao?

ỴḊḲ€Ṫ€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 '=')

Cử tri xuống - có gì sai với nó?
Jonathan Allan


0

JavaScript, 125 byte

Tôi biết nó dài hơn những người khác, nhưng tôi thực sự muốn sử dụng eval. Chỉ để cho vui.

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

Để chạy, dán sau đây vào đây :

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 byte

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};';}

Tên hàm dài đã giết cái này: D

Hãy thử các thử nghiệm ở đây !


0

V , 25 , 24 byte

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

Hãy thử trực tuyến! Điều này chứa một <esc>ký tự không thể in được , vì vậy đây là một hexdump:

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

Giải trình:

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:
                          };    "'};'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.