Jimmy array ini turun


23

Rekan kerja saya, Jimmy agak baru di C / C ++. Dia juga tipe pembelajar yang lambat. Sekarang, agar adil, kodenya selalu dikompilasi, tetapi ia memiliki beberapa kebiasaan yang sangat ceroboh. Misalnya, semua orang tahu bahwa Anda dapat mendefinisikan array seperti ini:

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

Semua orang, kecuali Jimmy. Dia yakin bahwa satu - satunya cara untuk membuat array adalah seperti ini:

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

Saya terus memperbaiki ini untuknya dalam review kode, tetapi dia tidak akan belajar. Jadi saya ingin Anda menulis alat yang secara otomatis melakukan ini untuknya ketika ia melakukan¹.

Tantangan

Saya ingin Anda menulis program lengkap atau fungsi yang menggunakan string multiline sebagai input, dan menampilkan versi yang lebih ringkas dari array C. Masukan akan selalu mengikuti format ini, termasuk spasi:

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;

Singkatnya, input akan selalu valid dan didefinisikan dengan baik C. Secara lebih rinci:

Semua pengidentifikasi akan terdiri dari hanya huruf dan garis bawah. Panjangnya akan selalu setidaknya satu, dan tidak akan pernah ada indeks yang hilang atau keluar dari batas. Anda juga dapat mengasumsikan bahwa indeks sudah beres. Sebagai contoh:

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

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

dan

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

semua input tidak valid, dan dapat menyebabkan perilaku yang tidak ditentukan dalam kiriman Anda. Anda juga dapat mengasumsikan bahwa semua angka akan menjadi angka desimal yang valid, negatif atau positif. Input tidak akan memiliki ruang asing. Output harus selalu mengikuti format ini, termasuk spasi:

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

Berikut ini beberapa contoh data:

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

Anda dapat mengambil input dan output Anda dalam format apa pun yang masuk akal, seperti STDIN / STDOUT, argumen fungsi dan nilai pengembalian, membaca dan menulis file dll. Lubang standar berlaku. Jawaban terpendek dalam byte menang!


¹Ini pasif-agresif dan ide yang mengerikan. Anda tidak mendapatkan ide ini dari saya.


8
Saya minta maaf kepada Jimmy
DJMcMayhem


@Doscosc Ah, itulah yang digunakan Jimmy dalam skrip pra-komitnya!
Bergi

9
Tentu saja Jimmy bukan pegolf kode.
jimmy23013

Tantangan ini benar-benar mengganggu Jimmies saya .
DanTheMan

Jawaban:


8

Vim, 43 36 byte

Anda tidak perlu memberi Jimmy skrip, cukup ajari dia untuk menggunakan editor teks yang tepat. (Pengembalian literal untuk kejelasan)

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

Bagus! Dalam contoh khusus ini, <C-a>lebih pendek dari t], yang merupakan hack kecil yang menyenangkan. Juga, saya pikir Anda secara teknis membutuhkan 2 <cr>karena meminta konfirmasi.
DJMcMayhem

Jawaban Vim untuk tantangan kode-golf standar harus dinilai dalam byte.
Martin Ender

Juga, norm df=lebih pendek daris/.*=//g
DJMcMayhem

1
Juga, 3wC] = {<esc>lebih pendek dari <C-a>di]$s = {<esc>.
DJMcMayhem

1
@Geobits Di mana jawaban Emacs Anda?
Neil

7

CJam, 43 36 byte

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

Contoh Online

Penjelasan:

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

Terima kasih banyak untuk Martin Ender atas peningkatan jawaban CJam pertama saya.


6

JavaScript (ES6), 65 64 63 byte

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

5

Retina , 30 28 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Cobalah online!

Penjelasan

Kami akan menggunakan input berikut sebagai contoh:

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

Tahap 1

\d+];¶.+ 
] = {

Perhatikan bahwa ada spasi tambahan di baris pertama.

Kami mulai dengan mencocokkan nomor yang diikuti oleh ];dan linefeed, dan kemudian semuanya hingga ruang terakhir di baris berikutnya. Pertandingan ini hanya dapat ditemukan di akhir baris pertama (karena ];). Semua ini diganti dengan ] = {. Artinya, ia mengubah contoh input kami menjadi:

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

Tahap 2

;¶.+=
,

Sekarang kami mencocokkan semuanya dari ;atas hingga =pada baris berikutnya dan ganti dengan a ,. Ini mengubah string menjadi:

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

Tahap 3

;
};

Yang tersisa hanyalah memperbaiki bagian akhir dan kami melakukan ini dengan mengganti yang tersisa ;dengan };:

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

Penjelasan

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(

Bytes yang disimpan dengan mengganti collect (Eachmatch ()) dengan [Eachmatch () ...] dan dengan regex yang lebih pendek


Hai, selamat datang di PPCG! Ini sepertinya jawaban pertama yang bagus. +1 dari saya. Karena tantangan menyatakan " Anda dapat mengambil input dan output dalam format apa pun yang masuk akal ", Anda dapat menghapus spasi setelah pemisah koma dalam eachmatchpanggilan fungsi untuk output yang kurang cantik dan -1 byte. Saya sendiri tidak pernah memprogram dalam Julia, tetapi Anda mungkin menemukan posting ini menarik untuk dibaca: Tips untuk bermain golf di Julia . Sekali lagi selamat datang, dan nikmati masa tinggal Anda. :)
Kevin Cruijssen

1
terima kasih banyak atas kata-kata baikmu :) PPCG sepertinya menyenangkan untuk dilihat, jadi kupikir aku akan mencobanya. Pilih Julia untuk jawaban ini karena belum ada
nyro_0

Menggunakan matchallmungkin akan lebih pendek daripada menampar eachmatch.
Alex A.

saya mencoba menggunakan matchall pertama, tetapi tidak membiarkan saya menggunakan regex kelompok (bagian dalam tanda kurung apa yang saya sangat tertarik) sebagai lawan setiap pertandingan. (atau saya tidak bisa menemukannya di dokumentasi?)
nyro_0

3

Lua, 121 Bytes.

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

Dijelaskan

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

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

Catatan: Garis set s=,berakhir dengan spasi. Mengambil input pada STDIN. Bahwa garis aneh 3 mengambil input (misalnya int spam[6];dan perubahan [dalam [] = {&remmenghasilkan set s=int spam[] = {&rem 6];yang kemudian akan ditafsirkan sebagai dua pernyataan, set s=int spam[] = {dan rem 6];, yang terakhir yang merupakan komentar. Kemudian untuk setiap baris kita menghapus teks hingga ruang pertama (karena Anda bisa dapat digunakan =dalam suatu pola dan pencocokannya tidak serakah) dan ekstrak nilainya.


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

Python 112 111

Sangat mudah bagi saya, tolong sarankan perbaikan apa pun yang terlintas dalam pikiran.

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

Pada pandangan cepat, saya bisa melihat bahwa ada spasi putih yang tidak berguna di [:-1] for.
Yytsi

2

05AB1E , 31 30 28 byte

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

Penjelasan

ž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

Cobalah online!

Menyimpan satu byte, terima kasih kepada Adnan


žuDÀÀbukannya „[]„{}menyimpan byte :).
Adnan

@ Adnan: Benar, tangkapan bagus!
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("..$","};");}

Beberapa byte disimpan berkat @cliffroot .

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

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

1
beberapa byte disimpanString 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 Terima kasih! Memang beberapa trik bagus seperti menggunakan kembali Stringdalam parameter dan mengganti karakter terakhir dengan "};");bukan "")+"};";.
Kevin Cruijssen

2

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

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

Kebutuhan -pdan -0bendera untuk dijalankan. Contohnya :

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

1

Jelly , 27 byte

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

Cobalah online!

Penjelasan

Ỵ         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

Manipulasi string di Jawa adalah neraka, seperti biasa.

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

Ini adalah jawaban regex murni. Buat satu gabungan String, kemudian lakukan replaceXxxsampai ok.

Pengujian dan 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

Jelly , 33 byte

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

TryItOnline

Bagaimana?

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

Down voter - ada apa dengan itu?
Jonathan Allan


0

JavaScript, 125 byte

Saya tahu ini lebih panjang dari yang lain, tetapi saya benar-benar ingin menggunakannya eval. Hanya untuk bersenang-senang.

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

Untuk menjalankan, rekatkan yang berikut ke sini :

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

Nama fungsi panjang membunuh ini: D

Coba testcases di sini !


0

V , 25 , 24 byte

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

Cobalah online! Ini mengandung <esc>karakter yang tidak patut dicetak, jadi ini adalah hexdump:

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

Penjelasan:

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:
                          };    "'};'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.