จิมมี่อาร์เรย์เหล่านี้ลง


23

จิมมี่ผู้ร่วมงานของฉันเป็นคนใหม่สำหรับ 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 ในรายละเอียดเพิ่มเติม:

ตัวระบุทั้งหมดจะประกอบด้วยตัวอักษรและขีดล่างเท่านั้น ความยาวจะมีอย่างน้อยหนึ่งครั้งและจะไม่มีดัชนีหายไปหรือไม่อยู่ในขอบเขต คุณอาจคิดว่าดัชนีอยู่ในลำดับ ตัวอย่างเช่น:

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

เป็นอินพุตที่ไม่ถูกต้องทั้งหมดและอาจทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดในการส่งของคุณ คุณอาจสมมติว่าตัวเลขทั้งหมดนั้นเป็นเลขทศนิยมที่ถูกต้องเป็นลบหรือบวก อินพุตจะไม่มีช่องว่างที่ไม่เกี่ยวข้อง ผลลัพธ์ควรเป็นไปตามรูปแบบนี้เสมอรวมถึงช่องว่าง:

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 อาร์กิวเมนต์ของฟังก์ชันและค่าส่งคืนการอ่านและการเขียนไฟล์ ฯลฯ ใช้ช่องโหว่มาตรฐาน คำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!


“ นี่เป็นความก้าวร้าวและความคิดที่แย่มาก คุณไม่ได้รับแนวคิดนี้จากฉัน


8
ฉันขอโทษจิมมี่
DJMcMayhem


@DLosc Ah นั่นคือสิ่งที่จิมมี่ใช้ในสคริปต์ก่อนส่งมอบของเขา!
Bergi

9
แน่นอนว่าจิมมี่ไม่ใช่นักกอล์ฟรหัส
jimmy23013

ความท้าทายนี้ทำให้Jimmies ของฉันเกิดสนิมจริงๆ
DanTheMan

คำตอบ:


8

เป็นกลุ่ม 43 36 ไบต์

คุณไม่จำเป็นต้องให้สคริปต์ของ Jimmy เพียงแค่สอนให้เขาใช้โปรแกรมแก้ไขข้อความที่เหมาะสม (ผลตอบแทนที่แท้จริงเพื่อความชัดเจน)

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

ดี! ในตัวอย่าง<C-a>นี้จะสั้นกว่าt]ซึ่งเป็นแฮ็คเล็ก ๆ น้อย ๆ ที่สนุกสนาน นอกจากนี้ฉันคิดว่าคุณต้องการ 2 ในทางเทคนิค<cr>เพราะมันขอการยืนยัน
DJMcMayhem

คำตอบที่เป็นกลุ่มสำหรับความท้าทายรหัสมาตรฐานกอล์ฟควรได้คะแนนเป็นไบต์
Martin Ender

นอกจากนี้norm df=จะสั้นกว่าs/.*=//g
DJMcMayhem

1
นอกจากนี้จะสั้นกว่า3wC] = {<esc> <C-a>di]$s = {<esc>
DJMcMayhem

1
@Geobits Emacs ของคุณอยู่ที่ไหนตอบ?
Neil

7

CJam, 43 36 bytes

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

ขอขอบคุณMartin Enderสำหรับการปรับปรุงคำตอบ CJam แรกของฉัน



5

เรติน่า30 30ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส 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

Julia, 112 108 105 Bytes

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 () ... ]] และ regex ที่สั้นลง


สวัสดียินดีต้อนรับสู่ PPCG! ดูเหมือนว่าคำตอบแรกที่ดี +1 จากฉัน เนื่องจากความท้าทายระบุว่า " คุณสามารถนำเข้าและส่งออกของคุณในรูปแบบที่เหมาะสม " คุณสามารถลบช่องว่างหลังจากตัวคั่นเครื่องหมายจุลภาคในการeachmatchเรียกใช้ฟังก์ชันสำหรับเอาต์พุตที่ไม่ค่อยสวยและ -1 ไบต์ ฉันไม่เคยโปรแกรมในจูเลียตัวเอง แต่คุณอาจพบที่น่าสนใจนี้โพสต์อ่าน: เคล็ดลับสำหรับการเล่นกอล์ฟในจูเลีย ยินดีต้อนรับอีกครั้งและเพลิดเพลินกับการเข้าพักของคุณ :)
Kevin Cruijssen

1
ขอบคุณมากสำหรับคำพูดที่ดีของคุณ :) PPCG ดูเหมือนจะสนุกกับการดูดังนั้นฉันคิดว่าฉันจะลองดู เลือก Julia สำหรับคำตอบนี้เนื่องจากยังไม่ปรากฏ
nyro_0

ใช้matchallมีแนวโน้มที่จะสั้นกว่า eachmatchsplatting
Alex A.

ฉันลองใช้ matchall ก่อน แต่มันไม่อนุญาตให้ฉันใช้กลุ่ม regex (ส่วนหนึ่งในวงเล็บที่ฉันสนใจเป็นพิเศษ) ตรงข้ามกับแต่ละแมทช์ (หรือฉันหาไม่พบในเอกสารประกอบ?)
nyro_0

3

Lua, 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

Python 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

Java 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

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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 ขอบคุณ! อันที่จริงบางเทคนิคที่ดีเช่นอีกครั้งที่ใช้Stringในพารามิเตอร์และการเปลี่ยนถ่านสุดท้ายด้วยแทน"};"); "")+"};";
Kevin Cruijssen

2

Perl, 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

Java, 106 ไบต์

การจัดการสตริงใน Java คือนรกเช่นเคย

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

นี่คือคำตอบ regex บริสุทธิ์ ต่อกันเป็นหนึ่งเดียว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>อักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือ hexdump:

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.