Perluas array C


36

Dalam bahasa pemrograman C, array didefinisikan seperti ini:

int foo[] = {4, 8, 15, 16, 23, 42};      //Foo implicitly has a size of 6

Ukuran array disimpulkan dari elemen inisialisasi, yang dalam hal ini adalah 6. Anda juga dapat menulis array C dengan cara ini, secara eksplisit mengukurnya lalu mendefinisikan setiap elemen dalam urutan:

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;

Tantangan

Anda harus menulis sebuah program atau fungsi yang memperluas array dari cara pertama ke yang kedua. Karena Anda menulis program untuk membuat kode lebih lama, dan Anda suka ironi, Anda harus membuat kode sesingkat mungkin.

Input akan berupa string yang mewakili array asli, dan output akan menjadi definisi array yang diperluas. Anda dapat dengan aman berasumsi bahwa input akan selalu terlihat seperti ini:

<type> <array_name>[] = {<int>, <int>, <int> ... };

"Ketik" dan "array_name" akan seluruhnya terdiri dari karakter alfabet dan garis bawah _. Elemen daftar akan selalu menjadi angka dalam kisaran -2,147.483.648 hingga 2.147.483.647. Input dalam format lain apa pun tidak perlu ditangani.

Spasi putih dalam output Anda harus sama persis dengan spasi putih dalam output pengujian, meskipun baris tambahan tambahan diperbolehkan.

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

Kiriman dalam bahasa apa pun dianjurkan, tetapi poin bonus jika Anda bisa melakukannya dalam C.

Papan peringkat:

Berikut adalah papan peringkat yang menunjukkan jawaban teratas:


2
Apakah spasi antara indeks array, tanda sama dengan, dan nilai yang diperlukan dalam output? Misalnya, apakah foo[0]=1;akan diterima?
Mego

@Mego Itu tidak akan diterima. Ruang putih diperlukan. Saya akan mengeditnya.
DJMcMayhem

Membuntuti baris baru diizinkan?
Luis Mendo

Apakah fungsi diizinkan?
Mego

Apakah saya tetap bisa mengembalikan output daripada mencetaknya? (dalam hal fungsi)
vaultah

Jawaban:


12

Pyth, 44 byte

++Khcz\]lJ:z"-?\d+"1"];"VJs[ecKd~hZ"] = "N\;

Suite uji

Ekspresi reguler dan pemotongan string. Tidak terlalu pintar.

Penjelasan:

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

Jawaban ini adalah duri di sisiku. Saya pikir saya akan bisa memenangkannya dalam vim, tetapi untuk kehidupan saya, saya tidak bisa mendapatkan 2-3 byte terakhir. = D Jawaban yang bagus!
DJMcMayhem

28

Vim, 54, 52, 49 47 penekanan tombol


2wa0<esc>qqYp<c-a>6ldf @qq@q$dT]dd:%norm dwf{xwC;<CR>gg"0P

Penjelasan:

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

Sekarang buffer kita terlihat seperti ini:

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

dan kursor kami ada di baris terakhir.

Babak kedua:

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

Sekarang semuanya terlihat bagus, kita hanya perlu menambahkan array-declaration yang asli. Jadi kami lakukan:

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
Setiap kali saya membaca vim-golf, saya menyadari semua pengkodean yang saya lakukan (kebanyakan perintah keyboard di editor GUI saya yang lain-lain) terlihat seperti ini, dan pikiran saya agak membengkok selama satu menit (Vim baru saja selesai lengkap (dan lebih dingin)) : P
cat

Saya tidak bisa menjalankan ini - ketika saya mengetik "@q" pertama (dari "@ qq @ q"), makro berjalan kemudian, dan tampaknya berjalan lebih jauh dari yang seharusnya, mendapatkan hal-hal seperti int foo[6] = {dan berakhir dengan int foo[12(kursor aktif "2")
LordAro

@ LordAro saya mungkin seharusnya menyebutkan itu. Itu karena sudah ada makro di q, dan itu berjalan saat Anda merekam, mengacaukannya. Saya menjelaskan cara menyiasatinya di sini: codegolf.stackexchange.com/a/74663/31716
DJMcMayhem

1
@ LordAro Oh, ya, aku tahu apa yang menyebabkan itu. Saya mengubah df<space>untuk dWmenyimpan byte, tapi saya lupa itu df<space>akan keluar dari makro pada baris 6, tetapi dWtidak. Saya akan mengembalikan revisi. Terima kasih telah menunjukkan itu!
DJMcMayhem

1
Meskipun ini bukan jawaban yang terpendek, ini adalah yang paling mengesankan.
isaacg

10

Retina, 108 104 100 69 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

].+{((\S+ ?)+)
$#2];$1
+`((\w+\[).+;(\S+ )*)(-?\d+).+
$1¶$2$#3] = $4;

Kalahkan ini, PowerShell ...

Penjelasan kode

Garis pertama: ].+{((\S+ ?)+)

Pertama, kita perlu menyimpan tipe, nama array, dan braket pembuka (ini menghemat satu byte), jadi kita tidak cocok dengan mereka. Jadi kita sesuai penutupan braket, jumlah karakter, dan pembukaan penjepit keriting: ].+{. Kemudian kami mencocokkan daftar nomor. Terpendek saya sudah bisa menemukan sejauh ini adalah ini: ((\S+ ?)+). Kami mencocokkan sejumlah karakter non-ruang (termasuk nomor, mungkin tanda negatif, dan kemungkinan koma), diikuti dengan spasi, yang mungkin atau mungkin tidak ada: \S+ ?. Kelompok karakter ini kemudian diulang sebanyak yang diperlukan: (\S+ ?)+dan dimasukkan ke dalam grup menangkap besar. Perhatikan bahwa kami tidak cocok dengan kurung kurawal penutupan atau titik koma. Penjelasan baris ketiga memberitahukan alasannya.

Baris kedua: $#2];$1

Karena kami hanya mencocokkan bagian input, bagian yang tidak cocok akan tetap ada. Jadi kita menempatkan panjang daftar setelah braket pembukaan yang tak tertandingi: $#2. Pengganti ganti #membantu kami dengan itu, karena memberi kami jumlah kecocokan yang dibuat oleh grup penangkap tertentu. Dalam hal ini menangkap grup 2. Lalu kami memasang tanda kurung penutup dan tanda titik koma, dan akhirnya seluruh daftar kami.

Dengan input short array[] = {4, 3, 2, 1};, representasi internal setelah penggantian ini adalah:

array pendek [4]; 4, 3, 2, 1};

(perhatikan kurung kurawal penutupan dan titik koma)

Baris ketiga: +`((\w+[).+;(\S+ )*)(-?\d+).+

Ini adalah bagian lingkaran. Itu berarti itu berjalan sampai tidak ada tahap dalam loop membuat perubahan pada input. Pertama kita sesuai dengan nama array, diikuti oleh bracket pembukaan: (\w+\[). Kemudian jumlah sewenang-wenang dari setiap karakter dan titik koma: .+;. Kemudian kita mencocokkan daftar lagi, tapi kali ini hanya angka dan koma setelah setiap nomor, yang memiliki ruang mengikuti mereka: (\S+ )*. Kemudian kita menangkap nomor terakhir dalam daftar: (-?\d+)dan setiap karakter yang tersisa di balik itu: .+.

Baris keempat: $1¶$2$#3] = $4;

Kami kemudian menggantinya dengan nama array dan daftar diikuti dengan baris baru: $1¶. Berikutnya, kami menempatkan nama array, diikuti oleh panjang daftar sebelumnya cocok, tanpa elemen terakhir (dasarnya list.length - 1): $2$#3. Diikuti oleh braket penutup dan operator tugas dengan spasi, dan ini diikuti oleh elemen terakhir dari daftar nomor kami:] = $4;

Setelah pertama kali diganti, representasi internal terlihat seperti ini:

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

Perhatikan bahwa kurung kurawal penutup dan titik koma menghilang, berkat .+pada akhir baris ketiga. Setelah tiga penggantian lagi, representasi internal terlihat seperti ini:

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

Karena tidak ada lagi yang cocok dengan baris ketiga, keempat tidak menggantikan apa pun dan string dikembalikan.

TL; DR: Pertama kita sedikit mengubah format daftar int. Kemudian kita mengambil elemen terakhir dari daftar dan nama, dan meletakkannya setelah inisialisasi array. Kami melakukan ini sampai daftar int kosong. Lalu kami mengembalikan kodenya.

Cobalah online!


Seseorang mengalahkan saya untuk itu .... :(
CalculatorFeline

M!`dan G`mirip, tetapi tidak persis sama. Hati-hati.
CalculatorFeline

Penjelasan baris ketiga membingungkan saya. Item pertama adalah satu-satunya tanpa spasi di belakangnya, bukan yang terakhir.
CalculatorFeline

@CatsAreFluffy Saya mencoba mengubah kata-katanya sedikit sekarang. Yang saya maksud adalah ruang yang mengikuti angka, bukan sebelumnya. Saya kira saya tidak sepenuhnya menyadari arti "di belakang". Saya seharusnya tidak menulis penjelasan kode pada jam 2 pagi.
daavko

@daavko "Di belakang" biasanya berarti "setelah" yaitu "mengikuti", dalam bahasa Inggris sehari-hari. Kamu baik-baik saja.
Dana Gugatan Monica

9

V, 37 Bytes

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

V adalah bahasa golf berbasis string 2D yang saya tulis, didesain off of vim. Ini berfungsi pada komit 17 .

Penjelasan:

Ini cukup banyak terjemahan langsung dari jawaban vim saya , walaupun secara signifikan lebih pendek.

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

Maka kita hanya punya:

gg"1P     "Move to line 1, and paste buffer '1' behind us.

Karena kegilaan unicode ini sulit untuk dimasukkan, Anda dapat membuat file dengan hexdump yang dapat dibalik ini:

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.

Ini dapat dijalankan dengan menginstal V dan mengetik:

python main.py c_array.v --f=file_with_original_text.txt

1
Designed off of vim.2 catatan: 1. kebanyakan orang mengatakan fromtidak off of, dan 2. mengapa ini tidak ada. +1
Rɪᴋᴇʀ

8

C, 215 byte , 196 byte

19 byte disimpan berkat @tucuxi!

Golf:

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

Tidak Disatukan:

/*
 *  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 );
}

Link:

http://ideone.com/h81XbI

Penjelasan:

Untuk mendapatkan <type> <array_name>, sscanf()string format adalah ini:

%s          A string delimited by a space
    %[^[]   The character set that contains anything but a `[` symbol
         s  A string of that character set

Untuk mengekstrak nilai int dari string int foo[] = {4, 8, 15, 16, 23, 42};, pada dasarnya saya tokenize string dengan fungsi ini:

while( sscanf( i + t, "%*[^0-9]%d%n", &x, &n ) == 1 )

dimana:

  • iadalah string input (a char*)
  • t adalah offset lokasi pointer i
  • xadalah yang sebenarnya intdiurai dari string
  • n adalah total karakter yang dikonsumsi, termasuk digit yang ditemukan

The sscanf()format string berarti ini:

%*            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

Jika Anda memvisualisasikan string input sebagai array char:

int foo[] = {4, 8, 15, 16, 23, 42};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
00000000001111111111222222222233333
01234567890123456789012345678901234

dengan int 4berada di indeks 13, 8di indeks 16, dan seterusnya, seperti inilah hasil dari setiap putaran dalam loop:

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
Anda dapat menghindari penggunaan strcat dengan menggabungkan odi dalam sprintf, via %s. Ini harus mencukur sekitar 7 karakter.
tucuxi

@tucuxi Ah, tangkapan yang bagus. Terima kasih!
homersimpson

7

C, 195 180 byte

195 byte asli:

golf:

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

ungolfed:

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
}

Kedua pintasan tersebut menggunakan mpengubah untuk mendapatkan scanf %suntuk mengalokasikan memorinya sendiri (menyimpan deklarasi array char), dan menggunakan strtok(yang juga tersedia secara default, tanpa menyertakan) untuk melakukan bagian penguraian angka.


Pembaruan 180-byte:

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

ungolfed:

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

Menggunakan gagasan bnf679 tentang menambahkan string untuk menghindari keharusan menghitung koma.


6

Python 3.6 (pra-rilis), 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]};')

Sangat sering menggunakan f-string .

Versi tidak disatukan:

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
Woah, saya lupa tentang f-string. Itu akan sangat berguna untuk golf!
Morgan Thrapp

Saya pikir Anda dapat menyimpan byte dengan menggunakan pemahaman daftar daripada loop normal
someonewithpc

@someonewithpc: nggak, itu akan benar-benar menambah 1 byte tambahan
vaultah

5

Ruby, 127 110 108 99 88 bytes

Fungsi anonim dengan argumen tunggal sebagai input. Program lengkap, membaca input dari STDIN. (Jika Anda mem-pipe file, baris baru yang tertinggal adalah opsional.) Pengembalian Mencetak string keluaran.

Mengambil @TimmyD membual tentang solusi mereka mengalahkan semua non-esolang lain sebagai tantangan, dan akhirnya mengatasi (pada saat penulisan) solusi Powershell 114 byte yang telah mereka posting. Trik Cᴏɴᴏʀ O'Bʀɪᴇɴ dengan membagi ]dan menyambung babak kedua untuk mendapatkan angka membantu.

Saya perlu menggunakan lebih banyak operator percikan. Ini sangat berguna!

Meminjam trik dari jawaban JavaScript ES6 @ Neil untuk menghemat lebih banyak byte dengan memindai kata-kata alih-alih menggunakan gsubdan split..

t,n,*l=gets.scan /-?\w+/;i=-1
puts t+" #{n}[#{l.size}];",l.map{|e|n+"[#{i+=1}] = #{e};"}

AFAICT tugasnya adalah menulis program lengkap.
vaultah

@ vaultah Default untuk kode golf adalah program atau fungsi
Mego

@Mego: OP mengatakan "Anda harus menulis sebuah program"
vaultah

@ Vaultah biasanya saya akan mengatakan bahwa kode golf memungkinkan saya untuk menggunakan fungsi, tetapi program lengkap menyelamatkan saya 2 byte, jadi mengapa tidak?
Value Ink

Ooof ... Saya tidak berpikir PowerShell bisa turun ke sana. Punya +1
AdmBorkBork

4

05AB1E , 52 50 47 byte

Kode:

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

Menggunakan pengodean CP-1252 . Cobalah online! .


1
Sudah sampai pada titik di mana saya melewatkan semua jawaban lain hanya mencari jawaban 05AB1E Anda. Bahasa itu benar-benar membuat saya terpesona.
WorseDoughnut

1
@WorseDoughnut Terima kasih! Itu adalah hal terbaik yang pernah dikatakan seseorang kepada saya tentang 05AB1E :)!
Adnan

4

JavaScript (ES6), 100 byte

(s,[t,n,...m]=s.match(/-?\w+/g))=>t+` ${n}[${m.length}];`+m.map((v,i)=>`
${n}[${i}] = ${v};`).join``

Karena hanya kata-kata yang penting, ini bekerja hanya dengan mencocokkan semua kata dalam string asli, ditambah tanda minus di depan, kemudian membangun hasilnya. (Awalnya saya pikir saya akan menggunakan replacetetapi ternyata menjadi ikan haring merah.)


[t,n,...m]hampir sebuah visi mistik
edc65

4

Pyth - 53 50 46 45 44 byte

2 byte disimpan berkat @FryAmTheEggman.

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

Test Suite .


4

Pip , 48 47 byte

qR`(\S+)(. = ).(.+)}`{[b#Yd^k']';.n.b.,#y.c.y]}

Mengambil input dari stdin dan mencetak ke stdout.

Penjelasan

Tl; dr: Melakukan penggantian regex, menggunakan grup tangkap dan fungsi panggilan balik untuk menyusun hasilnya.

The qvariabel khusus membaca garis masukan. Regex adalah (\S+)(. = ).(.+)}, yang cocok dengan segala sesuatu kecuali tipe (termasuk spasi tambahan) dan titik koma akhir. Menggunakan contoh pertama dari pertanyaan, kelompok menangkap mendapatkan foo[, ] = dan 4, 8, 15, 16, 23, 42.

Penggantian adalah nilai balik dari fungsi yang tidak disebutkan namanya {[b#Yd^k']';.n.b.,#y.c.y]}, yang disebut dengan seluruh pertandingan ditambah kelompok penangkap sebagai argumen. Dengan demikian, dalam fungsi tersebut, bdapatkan grup tangkapan 1, cgrup 2, dan dgrup 3.

Kami membangun daftar, tiga item pertama yang akan "foo[", 6dan "]". Untuk mendapatkan 6, kita membagi dvariabel bawaan k= ", ", Yletakkan daftar bilangan bulat yang dihasilkan ke dalam yvariabel untuk digunakan di masa mendatang, dan ambil panjangnya ( #). ']adalah karakter literal.

Yang tersisa adalah membangun serangkaian string bentuk ";\nfoo[i] = x". Untuk melakukannya, kita menggabungkan berikut: ';, n(built-in untuk newline), b(1 kelompok capture), ,#y(setara dengan Python range(len(y))), c(2 capture kelompok), dan y. Penggabungan bekerja secara itemwise pada daftar dan rentang, sehingga hasilnya adalah daftar string. Menyatukan semuanya, nilai kembali fungsi akan menjadi daftar seperti ini:

["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]
]

Karena daftar ini digunakan dalam Rpenempatan string , secara implisit dilemparkan ke string. Konversi list-to-string default di Pip menggabungkan semua elemen:

"foo[6];
foo[0] = 4;
foo[1] = 5;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42"

Akhirnya, hasilnya (termasuk jenis dan titik koma akhir, yang tidak cocok dengan regex dan dengan demikian tetap tidak berubah) dicetak secara otomatis.


4

Perl 5.10, 73 72 68 66 +1 + (untuk -n switch) = 67 byte

perl -nE '($t,$n,@a)=/[-[\w]+/g;say"$t $n".@a."];";say$n,$i++,"] = $_;"for@a'

Ini adalah tantangan yang bagus untuk Perl dan yang terpendek di antara bahasa tujuan umum sejauh ini. Setara dengan

($t, $n, @a) = /[-[\w]+/g;
say "$t $n" . @a . "];";
say $n, $i++, "] = $_;" for @a;

4

PowerShell v2 +, 114 105 byte

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

Mengambil string input $argsdan -replaces bracket persegi dengan apa-apa, kemudian melakukan -splitpada spasi putih. Kami menyimpan bit pertama ke $a, bit ke dalam $b, =ke $c, dan elemen array ke dalam $d. Untuk contoh di bawah ini, ini menyimpan fooke $adan barke $b, dan semua array ke $d.

Kami maka output baris pertama kami dengan "$a ..."dan di tengah transformasi $ddari array string bentuk sebuah {1,, 2,, ... 100};untuk int array biasa oleh -joining bersama-sama menjadi satu string, maka berjalan melalui iexdua kali (mirip dengan eval). Kami menyimpan array yang dihasilkan kembali $dsebelum memanggil .lengthmetode untuk mengisi nomor yang sesuai di antara []di dalam garis output.

Kami kemudian mengirimkan $dmelalui satu lingkaran dengan |%{...}. Setiap iterasi yang kita hasilkan "$b..."dengan variabel penghitung yang $idienkapsulasi dalam tanda kurung dan nilai saat ini $_. The $ivariabel mulai uninitialized (setara dengan $null) tetapi ++akan dilemparkan ke intsebelum output, sehingga akan mulai produksi pada 0, semua sebelum incrementing $iuntuk loop iterasi berikutnya.

Semua jalur keluaran ditinggalkan di jalur pipa, dan keluaran ke terminal tersirat pada penghentian program.

Contoh

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;

Wah! Saya berhasil mendapatkan jawaban Ruby saya dengan melewati Anda dengan mengambil komentar Anda tentang mengalahkan yang bukan esolang lainnya sebagai tantangan! Kerja bagus, +1.
Value Ink

@KevinLau Terima kasih! Kembali pada Anda dengan 105 sekarang. ;-)
AdmBorkBork

Saya akan menelepon 105 Anda, dan memberi Anda 99! : D
Value Ink

Tidak lagi mendekati pemukulan Retina.
CalculatorFeline

3

C, 278 280 byte

golf:

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

ungolfed:

/* 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);
        }
    }
}

Saat mengerjakan ini seseorang memposting versi yang lebih pendek menggunakan sscanf untuk parsing daripada menggunakan data pointer ... bagus!

PEMBARUAN: Melihat spasi yang hilang di sekitar nilai yang sama dalam pencetakan elemen, tautan online IDE: http://ideone.com/KrgRt0 . Perhatikan implementasi ini mendukung angka negatif ...


2

Awk, 101 byte

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

Lebih mudah dibaca:

{
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
}
  • Saya mengatur pemisah bidang untuk semuanya kecuali huruf, angka, garis bawah dan -. Jadi, bidangnya adalah nama jenis, nama variabel, dan angka.
  • Jumlah bidang akan 1 (untuk tipe) + 1 (untuk nama) + N (angka) + 1 (bidang kosong setelah trailing };). Jadi, ukuran array adalah NF - 3.
  • Kemudian hanya mencetak garis khusus untuk deklarasi, dan mengulangi angka-angka.
  • Saya harus menetapkan FSapakah ketika memanggil awk (menggunakan -F) atau di BEGINblok. Demi singkatnya, ....

1
Sebenarnya, FSharus ditugaskan di BEGINatau menggunakan -Fjika tidak, itu tidak akan digunakan untuk membagi baris pertama, dan karena hanya ada 1 baris input ...
Robert Benson

@ RobertTenson Anda benar, jadi perintahnya 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}'adalah 102 byte yang tidak dihitung dengan awksendirinya. Hmmm. Apakah saya bisa mengecualikan penawaran?
muru

Ya, Anda dapat mengecualikan kutipan. Terkadang Anda mencantumkannya di C+O bytesmana Cdan Omasing-masing mewakili byte dari kode dan opsi. Tentu saja saya biasanya hanya menggunakan BEGINblok, jadi saya tidak perlu memikirkannya. : p
Robert Benson

2

JavaScript ES6, 134 132 130 129 byte

Disimpan 1 byte berkat Neil.

x=>(m=x.match(/(\w+) (\w+).+{(.+)}/),m[1]+` `+(q=m[2])+`[${q.length-1}];
`+m[3].split`, `.map((t,i)=>q+`[${i}] = ${t};`).join`
`)

Tidak `[${i}] = `+t+";"seharusnya `[${i}] = ${t};`?
Neil

@Neil Terima kasih, menyimpan satu byte!
Conor O'Brien

2

bash, 133 129 byte

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]/};"
}

Upaya pertama, pastikan posisinya lebih pendek.


2

D, 197 , 188 byte

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

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

Saya tidak tahu D, tetapi bisakah Anda membaca tanda kurung siku sebagai bagian dari namanya? Itu akan menghemat Anda harus menulis braket persegi secara terpisah nanti.
DLosc

2

Julia, 154 134 101 byte

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])

Ini adalah fungsi yang menerima string dan mengembalikan string dengan satu baris baru.

Tidak Disatukan:

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

Kami mendefinisikan csebagai array yang cocok dengan input pada ekspresi reguler -?\w+. Ini mencakup jenis, nama array, lalu setiap nilai. Kami menyimpan nsebagai panjangc - 2, yang merupakan jumlah nilai. Output dibangun sebagai tipe, nama dan string panjang diinterpolasi, dikombinasikan dengan setiap baris definisi yang dipisahkan oleh baris baru. Untuk alasan apa pun, c[]sama dengan c[1].

Disimpan 32 byte dengan bantuan dari Dennis!


1

Python 2, 159 byte

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])

Cobalah online

Terima kasih Kevin Lau untuk beberapa saran golf


1

Python 3, 116 byte

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

Pisahkan input ke dalam jenis, nama, dan daftar angka. Setelah mencetak array yang mendeklarasikan, cetak elemen-elemen dengan cara penghitungan secara manual melalui angka-angka, menghilangkan tanda baca berlebih yang melekat pada yang pertama dan terakhir.

Pendekatan berbeda di Python 2 keluar ke 122 byte:

a,b=input()[:-2].split('] = {')
l=eval(b+',')
print a+`len(l)`+"];"
for y in enumerate(l):print a.split()[1]+'%s] = %s;'%y

Idenya adalah evaldaftar nomor sebagai tuple, dengan koma di akhir sehingga nomor tunggal diakui sebagai tipe. Daftar angka yang disebutkan memberikan tupel ke format string di.


1

PHP, 143 byte

Golf

<?$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];";

Tidak disatukan

<?  
$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

Input diambil melalui argumen baris perintah. Mencicipi:

C:\(filepath)>php Expand.php "int foo[] = {4,8,15,16,23,42};"

Keluaran:

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 byte

'\w+'XX2:H#)XKxXIZc'['KnV'];'v!K"I2X)'['X@qV'] = '@g';'6$h

Ini bukan C, tetapi ia menggunakan sprintffungsi C-like Nah, itu membuang-buang 4 byte.

Cobalah online!

          % 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

Clojure, 115 byte

#(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))))

Saya tidak dapat menggabungkan awful_array_name[5];dan awful_array_name[0] = 7;bagian dengan baik sehingga mereka akan menggunakan kembali kode: /

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.