Mój współpracownik, Jimmy, jest nowy w C / C ++. Jest także trochę powolnym uczniem. Teraz, żeby być uczciwym, jego kod zawsze się kompiluje, ale ma kilka naprawdę niechlujnych nawyków. Na przykład wszyscy wiedzą, że możesz zdefiniować tablicę w następujący sposób:
int spam[] = {4, 8, 15, 16, 23, 42};
Wszyscy, z wyjątkiem Jimmy'ego. Jest przekonany, że jedynym sposobem na utworzenie tablicy jest:
int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;
Ciągle go naprawiam w przeglądzie kodu, ale się nie nauczy. Potrzebuję więc napisać narzędzie, które zrobi to za niego automatycznie, gdy się zaangażuje¹.
Wyzwanie
Chcę, abyś napisał pełny program lub funkcję, która pobiera ciąg danych wielowierszowych jako dane wejściowe i wyświetla bardziej zwartą wersję tablicy C. Dane wejściowe zawsze będą miały ten format, łącznie z białymi znakami:
identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;
Krótko mówiąc, dane wejściowe zawsze będą prawidłowe i dobrze zdefiniowane C. Bardziej szczegółowo:
Wszystkie identyfikatory będą się składały z samych liter i znaków podkreślenia. Długość zawsze będzie wynosić co najmniej jeden i nigdy nie będzie żadnych brakujących lub poza granicami indeksów. Możesz także założyć, że indeksy są w porządku. Na przykład:
foo bar[3];
bar[0] = 1
bar[2] = 9;
foo bar[1];
bar[0] = 1;
bar[1] = 3;
i
foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3
wszystkie są nieprawidłowymi danymi wejściowymi i mogą powodować nieokreślone zachowanie w zgłoszeniu. Możesz również założyć, że wszystkie liczby będą prawidłowymi liczbami dziesiętnymi, ujemnymi lub dodatnimi. Wejście nie będzie miało obcych przestrzeni. Dane wyjściowe powinny zawsze mieć ten format, łącznie z białymi znakami:
identifier_one identifier_two[] = {n1, n2, n3, ...};
Oto kilka przykładowych danych:
Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;
Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;
Output:
char ans[] = {52, 50};
Input:
blah_blah quux[1];
quux[0] = 105;
Output:
blah_blah quux[] = {105};
Możesz przyjmować dane wejściowe i wyjściowe w dowolnym rozsądnym formacie, takim jak STDIN / STDOUT, argumenty funkcji i wartość zwracana, odczytywanie i zapisywanie plików itp. Obowiązują standardowe luki. Najkrótsza odpowiedź w bajtach wygrywa!
¹ Jest to pasywno-agresywny i okropny pomysł. Ty nie nie dostać ten pomysł ode mnie.
Odpowiedzi:
Wigor,
4336 bajtówNie musisz dawać Jimmy'emu skryptu, po prostu naucz go, jak używać odpowiedniego edytora tekstu. (dosłowne zwroty dla jasności)
źródło
<C-a>
jest krótszy niżt]
, co jest zabawnym małym hakiem. Myślę też, że technicznie potrzebujesz 2,<cr>
ponieważ prosi o potwierdzenie.norm df=
krótszy niżs/.*=//g
3wC] = {<esc>
krótszy niż<C-a>di]$s = {<esc>
.CJam,
4336 bajtówPrzykład online
Wyjaśnienie:
Ogromne podziękowania dla Martina Endera za ulepszenia mojej pierwszej odpowiedzi CJam.
źródło
JavaScript (ES6),
656463 bajtówźródło
Siatkówka ,
3028 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
Jako przykład wykorzystamy następujące dane wejściowe:
Scena 1
Zauważ, że w pierwszym wierszu jest spacja.
Zaczynamy od dopasowania liczby za
];
i linii, a następnie wszystkiego do ostatniego miejsca w następnym wierszu. To dopasowanie można znaleźć tylko na końcu pierwszego wiersza (z powodu];
). Wszystko to zostało zastąpione przez] = {
. Oznacza to, że przekształca nasze przykładowe dane wejściowe na:Etap 2
Teraz możemy dopasować wszystko od
;
góry do=
następnego wiersza i zastąpić,
. To przekształca ciąg do:Etap 3
Wszystko, co pozostało jest ustalenie końca i robimy to poprzez zastąpienie jedyne
;
z};
:źródło
Julia,
112108105 bajtówWyjaśnienie
Zapisane bajty poprzez zastąpienie metody collect (eachmatch ()) wartością [eachmatch () ...] i krótszym wyrażeniem regularnym
źródło
eachmatch
wywołaniu funkcji, aby uzyskać mniej ładny wynik i -1 bajt. Nigdy sam nie programowałem w Julii, ale ten post może Cię zainteresować: Porady dotyczące gry w golfa w Julii . Ponownie witamy i życzymy miłego pobytu. :)matchall
byłoby prawdopodobnie krótsze niż rozpryskiwanieeachmatch
.Lua, 121 bajtów.
Wyjaśnił
źródło
Partia, 160 bajtów
Uwaga: linia
set s=,
kończy się spacją. Pobiera dane wejściowe na STDIN. Ta dziwna linia 3 pobiera dane wejściowe (np.int spam[6];
I zmienia wynik na,[
w[] = {&rem
wynikuset s=int spam[] = {&rem 6];
którego następnie interpretowane są jako dwie instrukcje,set s=int spam[] = {
arem 6];
ta ostatnia jest komentarzem. Następnie dla każdej linii usuwamy tekst do pierwszej spacji (ponieważ możesz użyj=
wzorca, a dopasowanie nie jest zachłanne) i wyodrębnij wartość.źródło
C, 121 bajtów
źródło
Python
112111Dla mnie bardzo proste, proszę zasugerować wszelkie usprawnienia, które przychodzą mi do głowy.
źródło
[:-1] for
.05AB1E ,
313028 bajtówWyjaśnienie
Wypróbuj online!
Oszczędność bajtu dzięki Adnanowi
źródło
žuDÀÀ
zamiast„[]„{}
zapisuje bajt :).Java 7,
159158149154 bajtówWiele bajtów zapisanych dzięki @cliffroot .
Kod niepoznany i testowy:
Wypróbuj tutaj.
Wydajność:
źródło
String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
String
parametru in i zastąpienie ostatniego znaku"};");
zamiast zamiast"")+"};";
.Perl, 42 + 2 (
-0p
) = 44 bajtyPotrzebuje
-p
i-0
flagi do uruchomienia. Na przykład :źródło
Galaretka , 27 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
sed 51
źródło
Java, 106 bajtów
Jak zwykle manipulowanie ciągami w Javie to piekło.
To jest czysta odpowiedź regularna. Zrób pojedynczy konkatenowany
String
, a następnie wykonaj,replaceXxx
aż będzie w porządku.Testowanie i niestosowanie:
źródło
Galaretka , 33 bajty
TryItOnline
W jaki sposób?
źródło
Rubinowy, 64 bajty
źródło
JavaScript, 125 bajtów
Wiem, że jest dłuższy niż inne, ale naprawdę chciałem go użyć
eval
. Dla żartu.Aby uruchomić, wklej tutaj :
źródło
Haxe, 234 bajty
Długie nazwy funkcji zabiły to: D
Wypróbuj testcases tutaj !
źródło
V ,
25, 24 bajtówWypróbuj online! Zawiera on
<esc>
znak, którego nie można wydrukować , więc oto zrzut heksowy:Wyjaśnienie:
źródło