C dizisini genişlet


36

C programlama dilinde, diziler şöyle tanımlanır:

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

Dizinin boyutu, bu durumda 6 olan, başlatıcı öğelerden çıkarılır. Bu şekilde bir C dizisi de yazabilir, açıkça sıralayarak her bir öğeyi sırayla tanımlayarak:

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;

Meydan okuma

Dizileri birinciden diğerine genişleten bir program veya işlev yazmalısınız. Kodu daha uzun yapmak için bir program yazdığınızdan ve ironiyi sevdiğiniz için, kodunuzu mümkün olduğunca kısa tutmalısınız.

Giriş, orijinal diziyi temsil eden bir dize olacak ve çıktı genişletilmiş dizi tanımı olacaktır. Girişin her zaman şöyle görüneceğini güvenle kabul edebilirsiniz:

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

"Tip" ve "dizi_adı" tamamen alfabe karakterlerinden ve alt çizgilerden oluşacaktır _. Listenin öğeleri her zaman -2,147,483,648 ila 2,147,483,647 arasında bir sayı olacaktır. Başka bir formattaki girişlerin ele alınması gerekmez.

Çıktınızdaki beyaz alan, test satırındaki boşlukla tam olarak eşleşmelidir, ancak takip eden bir yeni satır olmasına izin verilir.

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

Herhangi bir dilde Gönderimler teşvik edilir, ancak bonus puan yapabilirsin eğer içinde C

Liderler Sıralaması:

İşte en iyi cevapları gösteren bir afiş:


2
Dizi indeksi, eşittir işareti ve çıktıda gereken değerler arasındaki boşluklar mı? Örneğin, foo[0]=1;kabul edilebilir mi?
Mego

@Mego Bu kabul edilemezdi. Boşluk gereklidir. Bunu düzenleyeceğim.
DJMcMayhem

İzleyen newline izin veriliyor mu?
Luis Mendo,

İşlevlere izin verilir mi?
Mego

Çıktıyı yazdırmak yerine iade etmek uygun mudur? (işlevler halinde)
vaultah

Yanıtlar:


12

Pyth, 44 bayt

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

Test odası

Düzenli ifade ve dize doğrama. Özellikle akıllıca değil.

Açıklama:

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

Bu cevap benim tarafımdaki diken. Bunu vim içinde kazanabileceğimi düşündüm, ama benim hayatım için son 2-3 baytı alamıyorum. = D Güzel cevap!
DJMcMayhem

28

Vim, 54, 52, 49 47 tuş vuruşlarını


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

Açıklama:

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

Şimdi tamponumuz şöyle görünüyor:

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

ve imlecimiz son satırda.

İkinci yarı:

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

Şimdi her şey yolunda görünüyor, sadece orijinal dizi bildirimini eklememiz gerekiyor. Yani yapıyoruz:

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
Ne zaman bir vim-golf okuduğumda, yaptığım tüm kodlamanın farkına varıyorum (çoğunlukla çeşitli GUI editörümde klavye komutları) buna çok benziyor ve aklım bir dakika boyunca kıvrılıyor (Vim sadece tam (ve daha soğuk)) : P
kedi

Bunu işe alamıyorum - ilk "@q" ("@ qq @ q" dan) yazdığımda, makro daha sonra çalışır ve görünüşe göre olması gerektiği gibi çalışır, gibi şeyler alır int foo[6] = {ve biter int foo[12(imleç açık "2")
LordAro

@ LordAro Muhtemelen bundan bahsetmeliydim. Çünkü zaten q'da bir makro var ve siz kayıt yaparken aklınızı karıştıran şekilde çalışıyor. Burada nasıl aşılacağını
DJMcMayhem

1
@ LordAro Oh, ah, buna neyin sebep olduğunu biliyorum. Değiştim df<space>için dWbir byte kaydetmek için, ama o unuttu df<space>hat 6 makro patlak, ama dWyok. Düzeltmeyi geri alacağım. Bunu işaret ettiğin için teşekkürler!
DJMcMayhem

1
Bu en kısa cevap olmasa da, bugüne kadarki en etkileyici.
isaacg

10

Retina, 108 104 100 69 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Bunu yen, PowerShell ...

Kod açıklaması

İlk satır: ].+{((\S+ ?)+)

Öncelikle tür, dizi adı ve açılış parantezini tutmamız gerekir (bu byte değerini korur), bu yüzden onlarla eşleşmiyoruz. Bu yüzden kapanış parantezi, herhangi bir karakter sayısı ve açma küme ayracı maç: ].+{. Sonra sayı listesini eşleştiriyoruz. En kısa şimdiye kadar bulmak mümkün oldum şudur: ((\S+ ?)+). Herhangi bir boşluk olmayan karakterle (sayı, olası negatif işaret ve olası virgül dahil) eşleşir, ardından orada olabilir veya olmayabilir \S+ ?. Bu karakter grubu daha sonra gerektiği kadar tekrarlanır: (\S+ ?)+ve büyük yakalama grubuna yerleştirilir. Kapanış kaşlı ayraç veya noktalı virgülle eşleşmediğimizi unutmayın. Üçüncü satırdaki açıklama nedenini açıklar.

İkinci çizgi: $#2];$1

Girdinin yalnızca bir kısmını eşleştirdiğimiz için, eşleşmeyen kısımlar hala orada olacak. Bu yüzden eşsiz Açılış ayracı sonra listenin uzunluğunu koyun: $#2. Değişim değiştirici #, bize belirli bir yakalama grubunun eşleşmesi sayısını verdiği için bize yardımcı olur. Bu durumda grup yakalama 2. Sonra bir kapanış braketi ve noktalı virgül ve son olarak da tüm listemizi koyduk.

Girdi ile short array[] = {4, 3, 2, 1};, bu değiştirmeden sonraki dahili temsil:

kısa dizi [4], 4, 3, 2, 1};

(kapanış kaşlı ayraç ve noktalı virgül dikkat edin)

Üçüncü satır: +`((\w+[).+;(\S+ )*)(-?\d+).+

Bu ilmekledi bir bölümdür. Bu, döngüdeki hiçbir aşama girişinde bir değişiklik yapmayıncaya kadar çalıştığı anlamına gelir. Öncelikle bir açılış parantez ardından dizinin adını eşleşmesi: (\w+\[). Sonra herhangi rastgele karakter numarası ve noktalı virgül: .+;. Sonra tekrar listeyi maç, ama bu kez sadece sayılar ve bunları takip eden bir alana sahip her bir sayıdan sonra virgül,: (\S+ )*. : Sonra listedeki son sayısını kaydetmek (-?\d+)ve arkasında kalan karakterler: .+.

Dördüncü satır: $1¶$2$#3] = $4;

Daha sonra dizinin adı ve listesi ile değiştiririz $1¶. Daha sonra, (esas olarak son öğe olmaksızın, önceden eşleşen liste uzunluğu ardından dizi isim, koyun list.length - 1) $2$#3. Ardından boşluklu bir kapanış dirseği ve atama operatörü ve bunu numara listemizin son elemanı izler:] = $4;

İlk değiştirmeden sonra, iç gösterimi şöyle görünür:

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

.+Üçüncü satırın sonunda , kapanış kaşlı ayraç ve noktalı virgülün kaybolduğunu unutmayın . Üç değişiklikten sonra, dahili gösterim şöyle görünür:

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

Üçüncü satıra göre daha fazla eşleşecek bir şey olmadığı için dördüncü şey hiçbir şeyin yerini almaz ve ip döndürülür.

TL; DR: Öncelikle int liste formatını biraz değiştiriyoruz. Sonra listenin son adını ve ismini alırız ve bunları dizinin başlatılmasından sonra koyarız. İnt listesi boşalana kadar bunu yapıyoruz. Sonra değiştirilen kodu geri veriyoruz.

Çevrimiçi deneyin!


Birisi beni dövdü .... :(
CalculatorFeline

M!`ve G`benzer, ancak tamamen aynı değil. Dikkatli ol.
Hesap MakinesiFeline

Üçüncü satırdaki açıklama beni şaşırtıyor. İlk öğe, arkasında boşluk bırakmayan tek şeydir, sonuncusu değil.
Hesap MakinesiFeline

@CatsAreFluffy Şimdilik ifadeleri biraz değiştirmeyi denedim. Demek istediğim, bir sayıyı takip eden bir boşluktu , ondan önce değil. Sanırım "geride" nin anlamını tam olarak anlamadım. Gerçekten de 2 am kod açıklamaları yazmamalıyım.
daavko

@daavko "Arkasında" normalde "sonra" yani "sonra" anlamına gelir, konuşma dili İngilizcedir. İyisin
Nic Hartley

9

V, 37 Bayt

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

V, yazdığım, vim dışında tasarlanmış 2B, string tabanlı bir golf dilidir. Bu taahhüt 17 olarak çalışır .

Açıklama:

Bu hemen hemen kısa olsa da, vim cevabımın doğrudan bir çevirisi .

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

O zaman biz sadece var:

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

Bu unicode çılgınlığına girmek zor olabileceğinden, bu geri dönüşümlü hexdump ile dosyayı oluşturabilirsiniz:

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.

Bu V yükleyerek ve yazarak çalıştırılabilir:

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

1
Designed off of vim.2 notlar: 1. çoğu insan diyor fromdeğil off ofve bu olmasaydı neden 2.. +1
Rɪᴋᴇʀ

8

C, 215 bayt , 196 bayt

@Tucuxi sayesinde 19 bayt kurtarıldı!

golfed:

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

Ungolfed:

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

Bağlantı:

http://ideone.com/h81XbI

Açıklama:

Almak için <type> <array_name>, sscanf()biçim dizesi şudur:

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

Dizgeden int değerlerini çıkarmak için int foo[] = {4, 8, 15, 16, 23, 42};, aslında bu işlevle dizgiyi belirtmeliyim:

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

nerede:

  • igiriş dizesi (a char*)
  • t işaretçi konum ofset değeri i
  • xintdizeden ayrıştırılan asıl
  • n Bulunan rakam da dahil olmak üzere tüketilen toplam karakter sayısı

sscanf()Biçim dizesi bu şu anlama gelir:

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

Giriş dizesini karakter dizisi olarak görselleştirirseniz:

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

ile int 4, endeks 13 üzerinde bulunan varlık 8ve benzeri endeksi 16, bu neyi gibi döngü görünüyor her çalışma sonucudur:

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
strcat'i kullanarak osprintf içinde birleştirerek önleyebilirsiniz %s. Bu yaklaşık 7 karakter traş olmalı.
tucuxi

@tucuxi Ah, iyi yakala. Teşekkürler!
homersimpson

7

C, 195 180 bayt

195 baytlık orijinal:

golfed:

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
}

İki kısayol, mscanf'lerin %skendi hafızasını tahsis etmek için değiştirici kullanmak ( değiştirilen karakter dizilerini kaydetmek) kaydeder strtokve sayı ayrıştırma bölümünü yapmak için (varsayılan olarak da bulunur) da kullanılır.


180 bayt güncelleme:

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

Virgül saymak zorunda kalmamak için bnf679'un bir dizeye ekleme fikrini kullanır .


6

Python 3.6 (yayın öncesi), 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]};')

F-dizgilerinin yoğun kullanılmasını sağlar .

Ungolfed versiyonu:

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, f-string'leri unuttum. Bunlar golf için süper yararlı olacak!
Morgan Thrapp

Ben normal döngü yerine bir liste anlama kullanarak bir bayt kurtarabilir miyiz
someonewithpc

@someonewithpc: hayır, aslında 1 ekstra bayt
eklerdi

5

Ruby, 127 110 108 99 88 bayt

Girdi olarak tek bir argüman olan adsız işlev. Tam program, girişi STDIN'den okur. (Bir dosyayı aktarırsanız, izleyen satırsonu isteğe bağlıdır.) İadeler Çıktı dizesini yazdırır.

@TimmyD, diğer tüm esolancıları bir meydan okuma olarak yenerek çözümleriyle övündü ve son olarak (yazdıkları sırada) 114 byte Powershell çözümünün üstesinden geldi. Cᴏɴᴏʀ O'Bʀɪᴇɴ ], numaraların yardımını almak için ikinci yarıda ayrılmaya ve eklemeye hileli .

Uyarıcı operatörünü daha fazla kullanmam gerekiyor. Çok kullanışlı!

Kelimeleri tarayarak yerine kullanarak daha bayt kaydetmek için Neil'in JavaScript ES6 cevap @, bir hileyi ödünç gsubve split..

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

AFAICT görev tam bir program yazmaktır.
vaultah

@vaultah Golf kodu için varsayılan bir program veya işlevdir
Mego

@Mego: OP "Bir program
yazmalısın

@vaultah normal kod golf'ün bir işlevi kullanmama izin verdiğini söyleyebilirim ama tam bir program bana 2 bayt kazandırdı, neden olmasın?
Value Ink,

Ooof ... PowerShell'in buna katlanabileceğini sanmıyorum. +1
AdmBorkBork

4

05AB1E , 52 50 47 bayt

Kod:

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

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


1
Sadece 05AB1E cevaplarınızı ararken diğer tüm cevapları atladığım noktaya geldi. Dil beni kesinlikle etkiliyor.
WorseDoughnut

1
@WorseDoughnut Teşekkürler! Bu birisinin bana 05AB1E hakkında söylediği en güzel şey :)!
Adnan

4

JavaScript (ES6), 100 bayt

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

Yalnızca kelimeler önemli olduğu için, orijinal dizideki tüm sözcükleri ve eksi eksi işaretlerini eşleştirerek ve ardından sonucu oluşturarak çalışır. (Aslında kullanacağımı sanıyordum replaceama bu kırmızı bir ringa balığı oldu.)


[t,n,...m]Neredeyse gizemli bir vizyon
edc65

4

Pyth - 53 50 46 45 44 bayt

@FryAmTheEggman sayesinde 2 bayt kaydedildi.

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

Test Takımı .


4

Pip , 48 47 bayt

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

Stdin'den girdi alır ve stdout'a yazdırır.

açıklama

Tl; dr: Sonuç oluşturmak için yakalama gruplarını ve geri çağırma işlevini kullanarak regex değişimini yapar.

qÖzel değişken girdi bir satır okur. Düzenli ifade, (\S+)(. = ).(.+)}tür (sondaki boşluk dahil) ve son noktalı virgül dışındaki her şeyle eşleşendir. Söz ilk örneği kullanarak, yakalama grupları olsun foo[, ] = ve 4, 8, 15, 16, 23, 42.

Değişim, {[b#Yd^k']';.n.b.,#y.c.y]}tüm eşleşme artı yakalama grupları argüman olarak adlandırılan adlandırılmamış işlevin döndürdüğü değerdir . Böylece, fonksiyonun içinde b1. grubu yakalar, c2. dgrubu alır ve 3. grubu alır.

Biz bir liste oluşturmak, ilk üç madde olacak "foo[", 6ve "]". Almak için 6, biz bölmek dyerleşik değişkeni k= ", ", Yiçine tamsayılar ank çıkan listede ygelecekte kullanılmak üzere değişken ve uzunluğunu almak ( #). ']bir karakter değişmezidir.

Geriye kalan, formun bir dizi dizisini oluşturmaktır ";\nfoo[i] = x". Bunu yapmak için, aşağıdakileri bitiştirmek: ';, n(dahili Yenisatır için), b(1 yakalama grubu), ,#y(Python eşdeğer range(len(y))), c(2 yakalama grubu) ve y. Birleştirme, listelerde ve aralıklarda öğe bazında çalışır, bu nedenle sonuç bir dize listesidir. Hepsini bir araya koyarak, fonksiyonun dönüş değeri şöyle bir liste olacaktır:

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

Bu liste bir dize Ryerleşiminde kullanıldığından , dolaylı olarak bir dizgiye yayınlanır. Pip'deki varsayılan listeden dizeye dönüştürme, tüm öğeleri birleştiriyor:

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

Son olarak, sonuç (regex ile eşleşmeyen ve dolayısıyla değişmeyen son tür noktalı virgül dahil) otomatik olarak yazdırılır.


4

Perl 5.10, 73 72 68 66 + 1 (-n anahtarı için) = 67 bayt

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

Bu, Perl için ve şimdiye kadarki genel diller arasında en kısa süre için güzel bir mücadeledir. Eşittir

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

4

PowerShell v2 +, 114 105 bayt

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

Giriş dizesini alır $argsve -replacehiçbir şey olmadan köşeli parantezi s, sonra bir -splitbeyaz boşlukta gerçekleştirir . İlk biti içine $a, ikinci biti içine $b, =içine $cve dizi elemanlarını depolarız $d. Aşağıdaki örnek için bu, fooiçine $ave bariçine $bve dizinin tümünü depolar $d.

Sonra çıkış ile ilk hat "$a ..."ve ortada dönüşümü $dformun dizeleri bir bir diziden {1,, 2,... 100};tarafından düzenli int diziye -joinardından, tek dizede birlikte ing akıtarak iexiki kez (benzer eval). Çıktı satırında uygun sayıyı doldurma yöntemini $dçağırmadan önce bu sonuç dizisini geri saklarız ..length[]

Daha sonra $dile bir döngü aracılığıyla göndeririz |%{...}. Her yineleme parantez içine alınmış "$b..."bir sayaç değişkeni $ive akım değeri ile çıktı $_. $iDeğişken (eşdeğer başlatılmamış başlar $null) ama ++bir o döküm olacak inten çıkışını başlayacak böylece, çıkıştan önce 0tüm arttırımdan önce, $ibir sonraki döngü tekrarında için.

Tüm çıkış hatları boru hattında bırakılır ve terminale çıkış program sonlandırmasında örtüktür.

Örnek

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;

Whew! Ruby'nin cevabını diğer esolancıları yenmek için bir yorumda bulunarak yorumunu alarak geçmişe bırakmayı başardım! Yine de iyi iş çıkardın, +1.
Value Ink,

@KevinLau Teşekkürler! Şimdi 105 olacaksın. ;-)
AdmBorkBork 15:16

105'ini arayacağım ve sana 99 yetiştireceğim! : D
Değerli Mürekkep

Artık Retina'yı geçerken kapanmıyor.
Hesap MakinesiFeline

3

C, 278 280 bayt

golfed:

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

Bu kişiler üzerinde çalışırken, veri işaretçileri kullanmak yerine, ayrıştırma için sscanf kullanarak daha kısa bir sürüm yayınlandı ... nice one!

GÜNCELLEME: Öğe yazdırma, IDE çevrimiçi bağlantıda eşittir etrafında eksik boşluklar tespit edildi: http://ideone.com/KrgRt0 . Bu uygulamanın negatif numaraları desteklediğini unutmayın ...


2

Awk, 101 bayt

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

Daha okunaklı:

{
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
}
  • Alan ayırıcısını alfabe, rakam, alt çizgi ve dışındaki herşeye ayarladım -. Bu nedenle, alanlar tür adı, değişken adı ve sayıları olacaktır.
  • Alan sayısı 1 (tür için) + 1 (ad için) + N (sayılar) + 1 (takipten sonra boş bir alan };) olacaktır. Yani, dizinin boyutu NF - 3.
  • O zaman sadece bildirim için özel bir satır basıyor ve sayıları geçiyor.
  • I gerekir atama FSya awk (kullanarak baþlatýrken -F) ya da bir de BEGINblok. Kısalık çıkarlarına,….

1
Aslında, FSya içinde BEGINya da içinde kullanılmalıdır, -Faksi takdirde ilk satırı ayırmak için kullanılmaz ve yalnızca 1 satırlık bir giriş olduğundan ...
Robert Benson

@RobertBenson haklısın, bu yüzden komut 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}', 102 bayt sayılmaz awk. Hmmm. Alıntıları hariç tutabilir miyim?
muru

Evet, teklifleri hariç tutabilirsiniz. Bazen olarak listelemelisiniz C+O bytesnerede Cve Osırasıyla kod ve seçenekler arasından bayt temsil eder. Tabii ki genellikle sadece bir BEGINblok kullanırım , bu yüzden düşünmek zorunda değilim. : p
Robert Benson

2

JavaScript ES6, 134 132 130 129 bayt

Neil sayesinde 1 byte kurtarıldı.

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

Gerekmiyor `[${i}] = `+t+";"olmak `[${i}] = ${t};`?
Neil

@Neil Teşekkürler, bir bayt kurtardı!
Conor O'Brien,

2

bash, 133 129 bayt

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

İlk girişim, daha kısa olması için mümkün olduğundan emin olun.


2

D, 197 , 188 bayt

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

veya sırsız:

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

D bilmiyorum, ama açılış köşeli ayraç adını adın bir parçası olarak okuyabilir misin? Bu, daha sonra ayrı ayrı bir köşeli ayraç yazmak zorunda kalmanızı sağlar.
DLosc

2

Julia, 154 134 101 bayt

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

Bu, bir dizgeyi kabul eden ve tek bir izleyen yeni satırlı bir dize döndüren bir işlevdir.

Ungolfed:

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

cNormal ifadedeki girdi eşleşmeleri dizisi olarak tanımlarız -?\w+. Tür, dizi adı, ardından her bir değerin içine tutturur. Biz mağaza nuzunluğu gibi cdeğerlerin sayısı 2, -. Çıktı enterpolasyonlu tip, ad ve uzunluk dizgisi olarak inşa edilir ve her satır yeni satırlarla ayrılır. Sebep ne olursa olsun c[], aynı c[1].

Dennis'in yardımıyla 32 byte kurtarıldı!


1

Python 2, 159 bayt

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

Çevrimiçi deneyin

Bazı golf önerileri için teşekkürler Kevin Lau


1

Python 3, 116 bayt

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

Girişi tür, ad ve sayı listesine böler. Dizi bildirimini yazdırdıktan sonra, ilk ve sonuncuya eklenen fazla noktalama işaretini kaldırarak sayıları el ile sıralayarak öğeleri yazdırır.

Python 2'de farklı bir yaklaşım 122 bayta ulaştı:

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

Fikir, evalbir tuple olarak sayılar listesine, sonunda bir virgül olacak ve böylelikle tek bir sayının tür olarak tanınmasıdır. Bir numaralandırılmış sayı listesi, içinde dize formatı için tuples sağlar.


1

PHP, 143 bayt

golfed

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

Ungolfed

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

Giriş, komut satırı argümanı ile alınır. Numune:

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

Çıktı:

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 bayt

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

Bu C değil, fakatsprintf 4 byte israf eden C benzeri fonksiyonu kullanıyor .

Çevrimiçi deneyin!

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

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

Kodu tekrar kullanabilmeleri için güzel bir şekilde birleştiremedim awful_array_name[5];ve awful_array_name[0] = 7;bölümleri bulamadım : /

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.