To wyzwanie jest związane z niektórymi funkcjami języka MATL w ramach wydarzenia Język miesiąca miesiąca 2018 . Powiązane wyzwanie : Schowek funkcji: wklej .
Wprowadzenie
Mátl ma kilka schowków , w których można przechowywać wartości (kopia) do późniejszego pobrania (wklej). Niektóre schowki są automatyczne , co oznacza, że kopiowanie jest uruchamiane automatycznie przez określone zdarzenia. To wyzwanie koncentruje się na jednym z automatycznych schowka, zwanym schowkiem wprowadzania funkcji lub po prostu schowkiem funkcji .
Ten schowek przechowuje dane wejściowe czterech ostatnich wywołań normalnych funkcji pobierania danych. Funkcje normalne są najczęstszym typem funkcji w MATL. Pobieranie danych oznacza, że funkcja pobiera co najmniej jedno wejście (funkcje, które nie przyjmują żadnych danych wejściowych, nie są uwzględniane przez schowek funkcji).
Można to najlepiej wyjaśnić za pomocą następujących przykładów, które wykorzystują dwie normalne funkcje:
+
, który wyrzuca dwie liczby ze stosu i wypycha ich sumę.U
, która wyskakuje o jedną liczbę i przesuwa jej kwadrat.
Przykład 1 :
3 2 + 6 + 12 4 U + +
daje wynik 39
. Kod jest interpretowany w następujący sposób:
- Literały liczbowe, takie jak
3
lub12
wypychane na stos - Funkcje takie jak
+
wyskakiwanie danych wejściowych i wypychanie danych wyjściowych na stos.
Wywołania funkcji w porządku chronologicznym to:
3 2 +
daje5
5 6 +
daje11
4 U
daje16
12 16 +
28
11 28 +
daje39
.
Schowek można wyświetlić jako listę czterech list. Każda wewnętrzna lista zawiera dane wejściowe do wywołania funkcji, najpierw najnowsze . W obrębie każdej wewnętrznej listy dane wejściowe są w oryginalnej kolejności .
Więc po uruchomieniu kodu zawartość schowka jest (w notacji Python):
[[11, 28], [12, 16], [4], [5, 6]]
Przykład 2 :
10 20 U 30 +
pozostawia liczby 10
i 430
na stosie. Stos jest wyświetlany od dołu do góry na końcu programu.
Wywołania funkcji to
20 U
daje400
400 30 +
daje430
Ponieważ były tylko dwa wywołania funkcji, niektóre wewnętrzne listy definiujące schowek będą puste . Zwróć też uwagę, w jaki sposób 10
nie jest wykorzystywany jako dane wejściowe do żadnej funkcji.
Zatem zawartość schowka po uruchomieniu kodu to:
[[400, 30], [20], [], []]
Przykład 3 (nieprawidłowy):
10 20 + +
jest uważany za niepoprawny, ponieważ +
brakuje danych wejściowych do drugiego (w MATL-u domyślnie wyzwalałoby to dane wejściowe użytkownika).
Wyzwanie
Dane wejściowe : ciąg S z literałami liczb +
i U
oddzielony spacjami.
Wyjście : zawartość schowka Funkcja po ocenie ciąg S .
Wyjaśnienia:
- Możesz użyć dowolnych dwóch spójnych symboli do przedstawienia tych funkcji, innych niż cyfry. Możesz także użyć dowolnego spójnego symbolu jako separatora zamiast spacji.
- Uwzględnione zostaną tylko dwie wskazane funkcje.
- Łańcuch wejściowy będzie zawierał co najmniej jeden literał liczbowy i co najmniej jedną funkcję.
- Wszystkie liczby będą dodatnimi liczbami całkowitymi, prawdopodobnie z więcej niż jedną cyfrą.
- Możliwe jest, że niektóre literały liczbowe nie są używane przez żadną funkcję, jak w przykładzie 2.
- Gwarantujemy, że wprowadzony kod jest prawidłowym kodem, bez dodatkowych liczb. Tak więc ciąg jak w przykładzie 3 nigdy nie wystąpi.
- Końcowe puste wewnętrzne listy w danych wyjściowych można pominąć. Tak więc wynik w przykładzie 2 może być
[[400, 30], [20]]
- Każdy rozsądny, jednoznaczny format wyjściowy jest dopuszczalny. Na przykład, ciąg z przecinkiem, jak wewnętrzna rozdzielacza i średnikiem jako zewnętrzną separatora:
400,30;20;;
.
Dodatkowe zasady:
Dane wejściowe i wyjściowe można przyjmować dowolnymi rozsądnymi środkami .
Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione .
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
[[28, 11], [16, 12], [4], [6, 5]]
dane wyjściowe są prawidłowe dla pierwszego przykładu?M
?M
. Zrobię to w wyzwaniu „wklej”Odpowiedzi:
05AB1E , 20 bajtów
Wypróbuj online!
-4 podziękowania dla Emigny (oraz -8 podziękowania dla niego za aktualizowanie mnie o zasadach).
a
b
źródło
Bash , 43 bajty
Wypróbuj online!
Spowoduje to wydrukowanie schowka w następującym formacie, zwróć uwagę na użycie \ x0F jako separatora.
Kluczową ideą jest przekazanie tego do dc, języka opartego na stosie, tak aby wydrukować wymagane elementy stosu.
Dane wejściowe są przesyłane do sed, gdzie każdy
+
jest zamieniany nardnFPrp+
, który w dc wypisuje drugą liczbę na stosie, a następnie \ x0F, a następnie najwyższą liczbę przed wykonaniem dodawania. sed zastępuje również każdyU
zp2^
wydrukować element góry stosu i kwadratu.Wynik sed jest analizowany jako kod dc, drukując cały schowek.
Ponieważ linie są w odwrotnej kolejności, do naprawy tego służy
tac
(odwrotnycat
).I wreszcie sed wybiera pierwsze 4 linie z tac.
źródło
Python 2 , 126 bajtów
Wypróbuj online!
źródło
Haskell ,
113109 bajtówPierwsza linia definiuje anonimową funkcję, która pobiera ciąg, np
"3 2 + 6 + 12 4 U + +"
, i zwraca listę list wskazówki:[[11,28],[12,16],[4],[5,6]]
. Wypróbuj online!źródło
Czysty , 140 bajtów
Wypróbuj online!
W klasycznym stylu Clean jest to rozwiązanie Haskell, z wyjątkiem około 50% dłuższego.
źródło
JavaScript (ES6), 107 bajtów
Pobiera dane wejściowe jako listę składającą się z liczb całkowitych
'+'
i'U'
. Zwraca inną listę składającą się z liczb całkowitych, tablic 2 liczb całkowitych i'_'
pustych miejsc.Wypróbuj online!
Skomentował
źródło
Idź,
305303295 bajtówUsunięto 8 bajtów dzięki @ovs
Wypróbuj online!
źródło
Oktawa , 206 bajtów
Wypróbuj online!
Gdyby tylko Octave miał
pop
składnię.m
to schowek pamięci,t
stos.źródło
m
it
odwrotnie, dodając elementy z przodu, a nie do końca?Python 3 ,
218204 bajtów-14 bajtów dzięki ovs
Wypróbuj online!
źródło
Czerwony ,
335330 bajtówWypróbuj online!
Bardziej czytelny:
źródło
R ,
205182 bajtówWypróbuj online!
M
jest schowkiem pamięci,P
program iS
stos.Technicznie
S
jest inicjowany jako wektor zawierający pojedyncze zero, ale ponieważ nigdy nie otrzymujemy nieprawidłowego wejścia, oszczędza mi to bajtS={}
.źródło
C (gcc) , 264 bajty
Użyłem rekurencji, aby móc użyć stosu funkcji jako stosu danych: lista wejściowa jest przeglądana i wykonywane są operacje: wyniki są wyświetlane w odwrotnej kolejności, a wypychania stosu nie są wyświetlane.
Stos jest implementowany jako lista połączona. Oto jak to działa:
Pierwotnie użyłem struktury dla węzłów, ale przełączyłem się na czyste wskaźniki, aby zaoszczędzić miejsce. Ciekawą cechą tej połączonej listy jest to, że czyści się ona po zakończeniu rekurencji.
Wypróbuj online!
źródło