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:
foo[0]=1;
akan diterima?Jawaban:
Pyth, 44 byte
Suite uji
Ekspresi reguler dan pemotongan string. Tidak terlalu pintar.
Penjelasan:
sumber
Vim,
54, 52, 4947 penekanan tombolPenjelasan:
Sekarang buffer kita terlihat seperti ini:
dan kursor kami ada di baris terakhir.
Babak kedua:
Sekarang semuanya terlihat bagus, kita hanya perlu menambahkan array-declaration yang asli. Jadi kami lakukan:
sumber
int foo[6] = {
dan berakhir denganint foo[12
(kursor aktif "2")df<space>
untukdW
menyimpan byte, tapi saya lupa itudf<space>
akan keluar dari makro pada baris 6, tetapidW
tidak. Saya akan mengembalikan revisi. Terima kasih telah menunjukkan itu!Retina,
10810410069 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
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 grup2
. 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:(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 (dasarnyalist.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:
Perhatikan bahwa kurung kurawal penutup dan titik koma menghilang, berkat
.+
pada akhir baris ketiga. Setelah tiga penggantian lagi, representasi internal terlihat seperti ini: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!
sumber
M!`
danG`
mirip, tetapi tidak persis sama. Hati-hati.V, 37 Bytes
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.
Maka kita hanya punya:
Karena kegilaan unicode ini sulit untuk dimasukkan, Anda dapat membuat file dengan hexdump yang dapat dibalik ini:
Ini dapat dijalankan dengan menginstal V dan mengetik:
sumber
Designed off of vim.
2 catatan: 1. kebanyakan orang mengatakanfrom
tidakoff of
, dan 2. mengapa ini tidak ada. +1C,
215 byte, 196 byte19 byte disimpan berkat @tucuxi!
Golf:
Tidak Disatukan:
Link:
http://ideone.com/h81XbI
Penjelasan:
Untuk mendapatkan
<type> <array_name>
,sscanf()
string format adalah ini:Untuk mengekstrak nilai int dari string
int foo[] = {4, 8, 15, 16, 23, 42};
, pada dasarnya saya tokenize string dengan fungsi ini:dimana:
i
adalah string input (achar*
)t
adalah offset lokasi pointeri
x
adalah yang sebenarnyaint
diurai dari stringn
adalah total karakter yang dikonsumsi, termasuk digit yang ditemukanThe
sscanf()
format string berarti ini:Jika Anda memvisualisasikan string input sebagai array char:
dengan
int
4
berada di indeks 13,8
di indeks 16, dan seterusnya, seperti inilah hasil dari setiap putaran dalam loop:sumber
o
di dalam sprintf, via%s
. Ini harus mencukur sekitar 7 karakter.C,
195180 byte195 byte asli:
golf:
ungolfed:
Kedua pintasan tersebut menggunakan
m
pengubah untuk mendapatkan scanf%s
untuk mengalokasikan memorinya sendiri (menyimpan deklarasi array char), dan menggunakanstrtok
(yang juga tersedia secara default, tanpa menyertakan) untuk melakukan bagian penguraian angka.Pembaruan 180-byte:
ungolfed:
Menggunakan gagasan bnf679 tentang menambahkan string untuk menghindari keharusan menghitung koma.
sumber
Python 3.6 (pra-rilis), 133
Sangat sering menggunakan f-string .
Versi tidak disatukan:
sumber
Ruby,
1271101089988 bytesFungsi anonim dengan argumen tunggal sebagai input.Program lengkap, membaca input dari STDIN. (Jika Anda mem-pipe file, baris baru yang tertinggal adalah opsional.)PengembalianMencetak 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
gsub
dansplit
..sumber
05AB1E ,
525047 byteKode:
Menggunakan pengodean CP-1252 . Cobalah online! .
sumber
JavaScript (ES6), 100 byte
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
replace
tetapi ternyata menjadi ikan haring merah.)sumber
[t,n,...m]
hampir sebuah visi mistikPyth -
5350464544 byte2 byte disimpan berkat @FryAmTheEggman.
Test Suite .
sumber
Pip ,
4847 byteMengambil input dari stdin dan mencetak ke stdout.
Penjelasan
Tl; dr: Melakukan penggantian regex, menggunakan grup tangkap dan fungsi panggilan balik untuk menyusun hasilnya.
The
q
variabel 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 mendapatkanfoo[
,] =
dan4, 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,b
dapatkan grup tangkapan 1,c
grup 2, dand
grup 3.Kami membangun daftar, tiga item pertama yang akan
"foo["
,6
dan"]"
. Untuk mendapatkan6
, kita membagid
variabel bawaank
=", "
,Y
letakkan daftar bilangan bulat yang dihasilkan ke dalamy
variabel 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 Pythonrange(len(y))
),c
(2 capture kelompok), dany
. Penggabungan bekerja secara itemwise pada daftar dan rentang, sehingga hasilnya adalah daftar string. Menyatukan semuanya, nilai kembali fungsi akan menjadi daftar seperti ini:Karena daftar ini digunakan dalam
R
penempatan string , secara implisit dilemparkan ke string. Konversi list-to-string default di Pip menggabungkan semua elemen:Akhirnya, hasilnya (termasuk jenis dan titik koma akhir, yang tidak cocok dengan regex dan dengan demikian tetap tidak berubah) dicetak secara otomatis.
sumber
Perl 5.10,
73726866 +1 + (untuk -n switch) = 67 byteIni adalah tantangan yang bagus untuk Perl dan yang terpendek di antara bahasa tujuan umum sejauh ini. Setara dengan
sumber
PowerShell v2 +,
114105 byteMengambil string input
$args
dan-replace
s bracket persegi dengan apa-apa, kemudian melakukan-split
pada 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 menyimpanfoo
ke$a
danbar
ke$b
, dan semua array ke$d
.Kami maka output baris pertama kami dengan
"$a ..."
dan di tengah transformasi$d
dari array string bentuk sebuah{1,
,2,
, ...100};
untuk int array biasa oleh-join
ing bersama-sama menjadi satu string, maka berjalan melaluiiex
dua kali (mirip denganeval
). Kami menyimpan array yang dihasilkan kembali$d
sebelum memanggil.length
metode untuk mengisi nomor yang sesuai di antara[]
di dalam garis output.Kami kemudian mengirimkan
$d
melalui satu lingkaran dengan|%{...}
. Setiap iterasi yang kita hasilkan"$b..."
dengan variabel penghitung yang$i
dienkapsulasi dalam tanda kurung dan nilai saat ini$_
. The$i
variabel mulai uninitialized (setara dengan$null
) tetapi++
akan dilemparkan keint
sebelum output, sehingga akan mulai produksi pada0
, semua sebelum incrementing$i
untuk loop iterasi berikutnya.Semua jalur keluaran ditinggalkan di jalur pipa, dan keluaran ke terminal tersirat pada penghentian program.
Contoh
sumber
C,
278280 bytegolf:
ungolfed:
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 ...
sumber
Awk, 101 byte
Lebih mudah dibaca:
-
. Jadi, bidangnya adalah nama jenis, nama variabel, dan angka.};
). Jadi, ukuran array adalahNF - 3
.FS
apakah ketika memanggil awk (menggunakan-F
) atau diBEGIN
blok. Demi singkatnya, ....sumber
FS
harus ditugaskan diBEGIN
atau menggunakan-F
jika tidak, itu tidak akan digunakan untuk membagi baris pertama, dan karena hanya ada 1 baris input ...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 denganawk
sendirinya. Hmmm. Apakah saya bisa mengecualikan penawaran?C+O bytes
manaC
danO
masing-masing mewakili byte dari kode dan opsi. Tentu saja saya biasanya hanya menggunakanBEGIN
blok, jadi saya tidak perlu memikirkannya. : pJavaScript ES6,
134132130129 byteDisimpan 1 byte berkat Neil.
sumber
`[${i}] = `+t+";"
seharusnya`[${i}] = ${t};`
?bash,
133129 byteUpaya pertama, pastikan posisinya lebih pendek.
sumber
D,
197, 188 byteatau ungolfed:
sumber
Julia,
154134101 byteIni adalah fungsi yang menerima string dan mengembalikan string dengan satu baris baru.
Tidak Disatukan:
Kami mendefinisikan
c
sebagai array yang cocok dengan input pada ekspresi reguler-?\w+
. Ini mencakup jenis, nama array, lalu setiap nilai. Kami menyimpann
sebagai 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 denganc[1]
.Disimpan 32 byte dengan bantuan dari Dennis!
sumber
Python 2, 159 byte
Cobalah online
Terima kasih Kevin Lau untuk beberapa saran golf
sumber
Python 3, 116 byte
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:
Idenya adalah
eval
daftar nomor sebagai tuple, dengan koma di akhir sehingga nomor tunggal diakui sebagai tipe. Daftar angka yang disebutkan memberikan tupel ke format string di.sumber
PHP, 143 byte
Golf
Tidak disatukan
Input diambil melalui argumen baris perintah. Mencicipi:
Keluaran:
sumber
MATL ,
686458 byteIni bukan C,
tetapi ia menggunakanNah, itu membuang-buang 4 byte.sprintf
fungsi C-likeCobalah online!
sumber
Clojure, 115 byte
Saya tidak dapat menggabungkan
awful_array_name[5];
danawful_array_name[0] = 7;
bagian dengan baik sehingga mereka akan menggunakan kembali kode: /sumber