W języku programowania C tablice są zdefiniowane w następujący sposób:
int foo[] = {4, 8, 15, 16, 23, 42}; //Foo implicitly has a size of 6
Rozmiar tablicy wynika z elementów inicjujących, które w tym przypadku wynoszą 6. Możesz również napisać tablicę C w ten sposób, jawnie zmieniając jej rozmiar, a następnie definiując każdy element w kolejności:
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;
Wyzwanie
Musisz napisać program lub funkcję, która rozwija tablice od pierwszej do drugiej. Ponieważ piszesz program, aby wydłużyć kod i kochasz ironię, musisz go skrócić tak krótko, jak to możliwe.
Dane wejściowe będą ciągiem znaków reprezentującym oryginalną tablicę, a dane wyjściowe będą rozszerzoną definicją tablicy. Możesz bezpiecznie założyć, że dane wejściowe zawsze będą wyglądać następująco:
<type> <array_name>[] = {<int>, <int>, <int> ... };
„Type” i „array_name” składają się wyłącznie ze znaków alfabetu i znaków podkreślenia _
. Elementami listy zawsze będzie liczba z zakresu od -2 147 483 648 do 2 147 483 647. Wejścia w dowolnym innym formacie nie muszą być obsługiwane.
Biała spacja na wyjściu musi dokładnie pasować do białej spacji na wyjściu testowym, chociaż dozwolony jest końcowy znak nowej linii.
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;
Zgłoszenia w dowolnym języku są zachęcane, ale punkty bonusowe, jeśli możesz to zrobić w C.
Tabela liderów:
Oto tabela liderów przedstawiająca najlepsze odpowiedzi:
foo[0]=1;
byłby do przyjęcia?Odpowiedzi:
Pyth, 44 bajty
Zestaw testowy
Wyrażenie regularne i odcinanie łańcucha. Niezbyt sprytnie.
Wyjaśnienie:
źródło
Vim,
54, 52, 4947 klawiszyWyjaśnienie:
Teraz nasz bufor wygląda następująco:
a nasz kursor znajduje się w ostatniej linii.
Druga połowa:
Teraz wszystko wygląda dobrze, wystarczy dodać oryginalną deklarację tablicową. Więc robimy:
źródło
int foo[6] = {
i kończące sięint foo[12
(kursor na „2”)df<space>
na,dW
aby zapisać bajt, ale zapomniałem, żedf<space>
wyrwie się z makra w linii 6, aledW
nie robi tego. Cofam wersję. Dzięki za zwrócenie na to uwagi!Siatkówka,
10810410069 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Pokonaj to, PowerShell ...
Wyjaśnienie kodu
Pierwsza linia:
].+{((\S+ ?)+)
Po pierwsze, musimy zachować typ, nazwę tablicy i nawias otwierający (to oszczędza bajt), więc nie pasujemy do nich. Więc dopasować wspornik zamykający dowolną liczbę znaków, a otwór nawias klamrowy:
].+{
. Następnie dopasowujemy listę numerów. Najkrótsza udało mi się znaleźć do tej pory to:((\S+ ?)+)
. Pasuje do dowolnej liczby znaków niż kosmiczne (w tym numery możliwe znak ujemny i możliwe przecinek), a następnie za pomocą przestrzeni, które mogą lub nie mogą być tam:\S+ ?
. Ta grupa znaków jest następnie powtarzana tyle razy, ile potrzeba:(\S+ ?)+
i umieszczana w dużej grupie przechwytywania. Pamiętaj, że nie pasujemy do zamykającego nawiasu klamrowego ani średnika. Wyjaśnienie trzeciego wiersza mówi dlaczego.Druga linia:
$#2];$1
Ponieważ dopasowaliśmy tylko część danych wejściowych, niedopasowane części nadal tam będą. Więc umieścić długość listy po nawiasie otwierającym niedopasowanej:
$#2
. Modyfikator zastępowania#
pomaga nam w tym, ponieważ daje nam liczbę dopasowań wykonanych przez konkretną grupę przechwytującą. W tym przypadku grupa przechwytująca2
. Następnie dodajemy nawias zamykający i średnik, a na koniec całą naszą listę.Z wejściem
short array[] = {4, 3, 2, 1};
wewnętrzna reprezentacja po tym zastąpieniu to:(zwróć uwagę na zamykający nawias klamrowy i średnik)
Trzecia linia:
+`((\w+[).+;(\S+ )*)(-?\d+).+
To jest sekcja zapętlona. Oznacza to, że działa, dopóki żaden stopień w pętli nie zmieni danych wejściowych. Najpierw musimy dopasować nazwę tablicy, a następnie za pomocą uchwytu otwierającego:
(\w+\[)
. Potem dowolną ilość dowolnych znaków i średnik:.+;
. Następnie dopasować listę ponownie, ale tym razem tylko liczby i przecinek po każdym numerze, który ma miejsce po nich:(\S+ )*
. Następnie uchwycić ostatni numer w liście:(-?\d+)
i wszelkie pozostałe znaki za nim:.+
.Czwarta linia:
$1¶$2$#3] = $4;
Następnie zastąp go nazwą tablicy i listy zakończoną nową linią:
$1¶
. Następnie kładziemy nazwę tablicy, a następnie długości poprzednio dopasowane listy, bez ostatniego elementu (zasadniczolist.length - 1
)$2$#3
. Po nim nawias zamykający i operator przypisania ze spacjami, a następnie ostatni element naszej listy liczb:] = $4;
Po pierwszej wymianie wewnętrzna reprezentacja wygląda następująco:
Zauważ, że zamykające się nawiasy klamrowe i średnik zniknęły dzięki
.+
końcowi trzeciej linii. Po trzech kolejnych zamianach wewnętrzna reprezentacja wygląda następująco:Ponieważ nic nie pasuje do trzeciej linii, czwarta nic nie zastępuje, a łańcuch jest zwracany.
TL; DR: Najpierw nieco zmienimy format listy int. Następnie bierzemy ostatni element listy i nazwę i umieszczamy je po inicjalizacji tablicy. Robimy to, dopóki lista int nie będzie pusta. Następnie zwracamy zmieniony kod.
Wypróbuj online!
źródło
M!`
iG`
są podobne, ale nie do końca takie same. Bądź ostrożny.V, 37 bajtów
V to napisany przeze mnie napisany w 2D język golfowy oparty na łańcuchach. Działa to od zatwierdzenia 17 .
Wyjaśnienie:
Jest to prawie bezpośrednie tłumaczenie mojej odpowiedzi vima , choć znacznie krótsze.
Mamy po prostu:
Ponieważ trudno jest wprowadzić to szaleństwo w trybie Unicode, możesz utworzyć plik za pomocą tego odwracalnego zrzutu heksadecymalnego:
Można to uruchomić, instalując V i wpisując:
źródło
Designed off of vim.
2 notatki: 1. większość ludzi mówi , żefrom
nieoff of
, i 2. dlaczego tak nie było. +1C,
215 bajtów, 196 bajtów19 bajtów zapisanych dzięki @tucuxi!
Gra w golfa:
Nie golfowany:
Połączyć:
http://ideone.com/h81XbI
Wyjaśnienie:
Aby uzyskać
<type> <array_name>
,sscanf()
ciąg formatu jest następujący:Aby wyodrębnić wartości int z ciągu
int foo[] = {4, 8, 15, 16, 23, 42};
, zasadniczo tokenizuję ciąg za pomocą tej funkcji:gdzie:
i
to ciąg wejściowy (achar*
)t
to przesunięcie położenia wskaźnika nai
x
to rzeczywistaint
parsowana z ciągun
to łączna liczba zużytych znaków, w tym znaleziona cyfrasscanf()
Ciąg formatu oznacza to:Jeśli wizualizujesz ciąg wejściowy jako tablicę znaków:
z
int
4
byciem zlokalizowanym pod indeksem 13,8
pod indeksem 16 i tak dalej, tak wygląda wynik każdego uruchomienia w pętli:źródło
o
wewnątrz sprintf, przez%s
. Powinno to ogolić około 7 znaków.C,
195180 bajtów195-bajtowy oryginał:
grał w golfa:
bez golfa:
Oba skróty używają
m
modyfikatora, aby uzyskać od skanów%s
przydział własnej pamięci (zapisuje deklarowanie tablic znaków) i używająstrtok
(która jest domyślnie dostępna, bez uwzględnienia) do wykonania analizy składni liczbowej.Aktualizacja 180-bajtowa:
bez golfa:
Wykorzystuje pomysł bnf679 dołączania do ciągu, aby uniknąć konieczności liczenia przecinków.
źródło
Python 3.6 (wersja wstępna), 133
Często korzysta z struny typu F. .
Wersja bez golfa:
źródło
Ruby,
1271101089988 bajtówFunkcja anonimowa z jednym argumentem wejściowym.Pełny program odczytuje dane wejściowe ze STDIN. (Jeśli wpiszesz plik do potoku, końcowy znak nowej linii jest opcjonalny).ZwracaDrukuje ciąg wyjściowy.@TimmyD chwalił się swoim rozwiązaniem pokonując wszystkie inne nie-esolangi jako wyzwanie, i wreszcie pokonał (w chwili pisania) 114 bajtowe rozwiązanie Powershell, które opublikowali.
Sztuczka Cᴏɴᴏʀ O'Bʀɪᴇɴ z dzieleniem się]
i drugiej połowy w celu uzyskania liczb.Muszę więcej korzystać z operatora splat. To takie przydatne!
Wypożyczył sztuczkę z odpowiedzi JavaScript ES6 @ Neil, aby zaoszczędzić więcej bajtów, skanując w poszukiwaniu słów zamiast używać
gsub
isplit
...źródło
05AB1E ,
525047 bajtówKod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
JavaScript (ES6), 100 bajtów
Ponieważ tylko słowa są ważne, działa to po prostu dopasowując wszystkie słowa w oryginalnym ciągu, plus poprzedzające znaki minus, a następnie budując wynik. (Początkowo myślałem, że zamierzam użyć,
replace
ale okazało się, że to czerwony śledź.)źródło
[t,n,...m]
prawie mistyczna wizjaPyth -
5350464544 bajtów2 bajty zapisane dzięki @FryAmTheEggman.
Pakiet testowy .
źródło
Pip ,
4847 bajtówPobiera dane wejściowe ze standardowego wejścia i drukuje na standardowe wyjście.
Wyjaśnienie
Tl; dr: Wykonuje zamianę wyrażenia regularnego, używając grup przechwytywania i funkcji zwrotnej do skonstruowania wyniku.
q
Specjalna zmienna czyta wiersz wejścia. Wyrażenie regularne to(\S+)(. = ).(.+)}
, które pasuje do wszystkiego oprócz typu (w tym spacji końcowej) i końcowego średnika. Korzystając z pierwszego przykładu z pytania, grupy przechwytujące otrzymująfoo[
:] =
i4, 8, 15, 16, 23, 42
.Zastąpienie jest wartością zwracaną funkcji bez nazwy
{[b#Yd^k']';.n.b.,#y.c.y]}
, która jest wywoływana z całym dopasowaniem plus grupy przechwytywania jako argumenty. Zatem w ramach funkcjib
pobiera grupę przechwytywania 1,c
grupę 2 id
grupę 3.Budujemy listy, pierwsze trzy pozycje, które będą
"foo["
,6
i"]"
. Aby uzyskać6
, podzieliliśmyd
się na wbudowaną zmiennąk
=", "
,Y
przekartkowaliśmy wynikową listę liczb całkowitych nay
zmienną do przyszłego wykorzystania, i wzięliśmy długość (#
).']
to dosłowny charakter.Pozostaje zbudować serię ciągów formy
";\nfoo[i] = x"
. Aby to zrobić, możemy złączyć co następuje:';
,n
(wbudowany do nowej linii),b
(grupa 1-ty capture),,#y
(odpowiednik Pythonrange(len(y))
),c
(grupa 2-ty capture), ay
. Łączenie działa itemowo na listach i zakresach, więc wynikiem jest lista ciągów. Podsumowując, zwracaną wartością funkcji będzie lista taka jak ta:Ponieważ ta lista jest używana w
R
zastępowaniu ciągów , jest ona domyślnie rzutowana na ciąg. Domyślna konwersja list-to-string w Pip łączy wszystkie elementy:Ostatecznie wynik (w tym typ i końcowy średnik, które nie zostały dopasowane przez wyrażenie regularne, a zatem pozostają niezmienione) jest drukowany automatycznie.
źródło
Perl 5.10,
73726866 + 1 (dla przełącznika -n) = 67 bajtówTo miłe wyzwanie dla Perla i jak najkrótsze spośród języków ogólnego przeznaczenia. Równoważny
źródło
PowerShell v2 +,
114105 bajtówPobiera ciąg wejściowy
$args
i-replace
nawias kwadratowy bez niczego, a następnie wykonuje znak-split
spacji. Pierwszy bit przechowujemy w$a
, drugi bit w$b
, elementy=
w$c
i elementy tablicy w$d
. W poniższym przykładzie przechowuje sięfoo
w$a
ibar
do$b
, a cała tablica w$d
.Następnie wyjście z nasza pierwsza linia
"$a ..."
w środku przekształcić$d
z tablicą ciągów postaci{1,
,2,
...100};
do zwykłego int tablicy przez-join
ing go ze sobą w jeden ciąg, a następnie uruchomić go poprzeziex
dwa razy (podobnie jakeval
). Przechowujemy wynikową tablicę z powrotem$d
przed wywołaniem.length
metody w celu wypełnienia odpowiedniej liczby pomiędzy[]
wierszem wyjściowym.Następnie wysyłamy
$d
za pomocą pętli|%{...}
. Każdą iterację wyprowadzamy"$b..."
za pomocą zmiennej przeciwnej$i
zawartej w nawiasach i bieżącej wartości$_
.$i
Zmienna zaczyna niezainicjowanymi (odpowiednik$null
), ale++
rzuci go doint
przed wyjściem, więc będzie rozpocząć produkcję na0
wszystko przed zwiększany$i
do następnej iteracji pętli.Wszystkie linie wyjściowe są pozostawione w potoku, a dane wyjściowe do terminala są niejawne przy zakończeniu programu.
Przykład
źródło
DO,
278280 bajtówgrał w golfa:
bez golfa:
Podczas pracy nad tym ktoś opublikował krótszą wersję używającą sscanf do analizowania zamiast używania wskaźników danych ... ładna!
AKTUALIZACJA: Wykryto brakujące spacje wokół równych w drukowanym elemencie, internetowy link IDE: http://ideone.com/KrgRt0 . Uwaga: ta implementacja obsługuje liczby ujemne ...
źródło
Awk, 101 bajtów
Bardziej czytelnie:
-
. Tak więc pola byłyby nazwą typu, nazwą zmiennej i liczbami.};
). Rozmiar tablicy toNF - 3
.FS
zarówno podczas wywoływania awk (za pomocą-F
) albo wBEGIN
bloku. W trosce o zwięzłość….źródło
FS
należy go przypisać alboBEGIN
użyć,-F
inaczej nie zostanie użyty do podzielenia pierwszego wiersza, a ponieważ jest tylko 1 wiersz danych wejściowych ...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 bajtów, nie liczącawk
się. Hmmm. Czy mogę wykluczyć cytaty?C+O bytes
gdzieC
iO
reprezentujesz bajty odpowiednio z kodu i opcji. Oczywiście na ogół używam tylkoBEGIN
bloku, więc nie muszę o tym myśleć. : pJavaScript ES6,
134132130129 bajtówZapisano 1 bajt dzięki Neilowi.
źródło
`[${i}] = `+t+";"
być`[${i}] = ${t};`
?bash,
133129 bajtówPierwsza próba, na pewno można ją skrócić.
źródło
D,
197,188bajtówlub bez golfa:
źródło
Julia,
154134101 bajtówJest to funkcja, która akceptuje ciąg i zwraca ciąg z pojedynczym końcowym znakiem nowej linii.
Nie golfowany:
Definiujemy,
c
że jest tablicą dopasowań danych wejściowych wyrażenia regularnego-?\w+
. Uwzględnia typ, nazwę tablicy, a następnie każdą wartość. Przechowujemyn
jako długośćc
- 2, która jest liczbą wartości. Dane wyjściowe są konstruowane jako interpolowany ciąg typu, nazwy i długości, połączony z każdą linią definicji oddzieloną znakami nowej linii. Z jakiegokolwiek powoduc[]
jest taki sam jakc[1]
.Zapisano 32 bajty z pomocą Dennisa!
źródło
Python 2, 159 bajtów
Wypróbuj online
Dzięki Kevin Lau za sugestie dotyczące gry w golfa
źródło
Python 3, 116 bajtów
Dzieli dane wejściowe na typ, nazwę i listę liczb. Po wydrukowaniu deklaracji macierzy drukuje elementy, ręcznie wyliczając liczby, usuwając nadmiar interpunkcji dołączonej do pierwszej i ostatniej.
Inne podejście w Pythonie 2 wyszło na 122 bajty:
Chodzi o
eval
listę liczb jako krotkę z przecinkiem na końcu, aby pojedynczy numer był rozpoznawany jako typ. Wymieniona lista liczb zawiera krotki w formacie ciągu.źródło
PHP, 143 bajty
Grał w golfa
Bez golfa
Dane wejściowe są pobierane za pomocą argumentu wiersza poleceń. Próba:
Wydajność:
źródło
MATL ,
686458 bajtówTo nie jest C,
ale używaNah, która marnowała 4 bajty.sprintf
funkcji podobnej do CWypróbuj online!
źródło
Clojure, 115 bajtów
Nie byłem w stanie ładnie połączyć
awful_array_name[5];
iawful_array_name[0] = 7;
części, aby ponownie użyły kodu: /źródło