Wyzwanie to 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: kopia .
Wprowadzenie
Schowek funkcji MATL przechowuje („kopiuje”) dane wejściowe czterech ostatnich wywołań normalnych funkcji pobierających dane. Funkcje normalne są najczęstszym typem funkcji w MATL. Pobieranie danych oznacza, że funkcja pobiera co najmniej jedno wejście. Zapisaną zawartość schowka można wepchnąć na stos („wkleić”).
To wyzwanie weźmie zawartość schowka jako dane wejściowe. Zakłada się, że wszystkie funkcje, które wytworzyły ten stan schowka, przyjęły jedną lub więcej dodatnich liczb całkowitych jako dane wejściowe. Tak więc stan schowka może być reprezentowany przez listę list liczb. (Aby uzyskać więcej informacji na temat faktycznego wypełnienia schowka, zobacz powiązane wyzwanie; ale nie jest to konieczne w przypadku bieżącego).
Interpretacja zawartości schowka
Przykład 1
Pierwsza lista wewnętrzna odnosi się do najnowszego wywołania funkcji, i tak dalej, w ten sposób stan schowka
[[11, 28], [12, 16], [4], [5, 6]]
wskazuje, że ostatnie wywołanie funkcji trwało dwa wejścia, a mianowicie 11
, 28
; przedostatni wezwanie wziął wejść 12
, 16
; itp. (Ten stan schowka jest generowany przez kod w pierwszym przykładzie pokrewnego wyzwania).
Przykład 2
Jeśli nie ma wystarczającej liczby wywołań funkcji , niektóre końcowe listy wewnętrzne w schowku będą puste:
[[7, 5], [], [], []]
(Jest to wytwarzane przez program, który po prostu dodaje 7
i 5
).
Przykład 3
Wywołania funkcji mogą mieć dowolną liczbę wejść , ale zawsze przynajmniej 1
(funkcje nie przyjmujące danych wejściowych nie zmieniają stanu schowka). Możliwe są również następujące kwestie.
[[3], [2, 40, 34], [7, 8, 15], []]
Dostęp do zawartości schowka
Zawartość schowka funkcji jest wypychana na stos za pomocą funkcji MATL M
(która, nawiasem mówiąc, nie jest normalną funkcją, ale funkcją schowka). Ta funkcja przyjmuje na wejściu dodatnią liczbę całkowitą i wypycha część zawartości schowka na stos, w następujący sposób. W odniesieniu do stanu schowka w przykładzie 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
zwraca wszystkie dane wejściowe do ostatniego wywołania funkcji. Tak więc, na rozpatrywanym przykładzie, to daje11
,28
.- Podobnie
2M
,3M
i4M
zwrócić wszystkie wejścia do drugiej, trzeciej i czwartej najnowsze wywołania funkcji. Więc2M
daje12
,16
;3M
daje4
; i4M
daje5
,6
. - Liczby poza
4
wybranymi pojedynczymi wejściami do wywołań funkcji, które wymagały więcej niż jednego wejścia.5M
Zwraca więc ostatnie dane wejściowe do ostatniego takiego wywołania. W naszym przypadku daje to28
.6M
zwraca poprzednie indywidualne wejście, którym jest11
.7M
zwraca ostatnie wejście drugiego przedostatniego wywołania, czyli16
, i8M
daje12
. Teraz9M
daje6
. Zwróć uwagę, w jaki sposób dane wejściowe4
są pomijane, ponieważ były to jedyne dane wejściowe w wywołaniu funkcji. Wreszcie10M
daje5
.
Dla stanu schowka w przykładzie 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
daje3
.2M
daje2
,40
,34
.3M
daje7
,8
,15
.4M
ma niezdefiniowane zachowanie (na potrzeby tego wyzwania), ponieważ były tylko trzy wywołania funkcji.5M
daje34
.6M
daje40
.7M
daje2
.8M
daje15
.9M
daje8
,10M
daje7
.11M
,12M
... także niezdefiniowane zachowanie .
Wyzwanie
Wejście :
- stan schowka, jako listę list lub w dowolnym innym rozsądnym formacie;
- dodatnia liczba całkowita n .
Wyjście : wynik wywołania funkcji M
z n jako wejściem. Dane wyjściowe będą jedną lub kilkoma liczbami z jednoznacznym separatorem lub w dowolnym rozsądnym formacie, takim jak lista lub tablica.
Wyjaśnienia:
- Stan schowka składa się z czterech list liczb. Niektóre końcowe listy mogą być puste, jak w przykładach 2 i 3. W razie potrzeby można wprowadzić schowek bez tych końcowych pustych list. Tak stałby się przykład 3
[[3], [2, 40, 34], [7, 8, 15]]
. - Wszystkie liczby w schowku będą dodatnimi liczbami całkowitymi, prawdopodobnie z więcej niż jedną cyfrą.
- Gwarantowana jest liczba n . Na przykład 3 powyżej
n
nie może być4
lub11
.
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
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
źródło
Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online!
źródło
ḊƇ
zaznacz wszystkie nie singletony,U
odwróć iẎ
spłaszcz. Dla danych wejściowych pobierane[[11, 28], [12, 16], [4], []]
są[16, 12, 28, 11]
wartości5M
przelotowe8M
. Teraz dodaj oryginalne dane wejściowe do tej listy⁸;
i indeksuj do listy wynikowej przez inne dane wejściowe⁹ị
.U
nie odwraca wynikuḊƇ
, ale raczej każdy z jego elementów. Tylko gdybym mógł jakoś zmniejszyćḊƇUẎ⁸;
...Haskell ,
56 5147 bajtów-5-9 bajtów dzięki Laikoni (dopasowanie wzorca, aby zapewnić długość> 1 i użyciedo
-notacji na liście)!Wypróbuj online!
Pointfree,
5855 bajtów-3 bajty dzięki Laikoni (przenoszenie
([]:)
i wymianaid
)!Alternatywnie moglibyśmy użyć tej wersji bez pointów
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
.źródło
APL (Dyalog Unicode) , 17 bajtów
Wypróbuj online!
źródło
JavaScript (Node.js) , 57 bajtów
Wypróbuj online!
To anonimowa funkcja curry. Uruchom to z
( function code )(clipboard)(n)
Wyjaśnienie
źródło
JavaScript (ES6), 72 bajty
Pobiera dane wejściowe w składni curry
(clipboard)(n)
.Wypróbuj online!
źródło
Python 2 ,
6056 bajtówdzięki Jonathanowi Allanowi za -4 bajty.
Wypróbuj online!
źródło
Java 8, 110 bajtów
Lambda (curry) przyjmująca stan schowka jako
int[][]
cyfrę i liczbę jakoint
i zwracaint
lubint[]
(pojedyncza liczba może zostać zwrócona przez dowolny typ).Wypróbuj online
Nie golfił
źródło
05AB1E , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Łuska , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Prawie bezpośredni port odpowiedzi Haskell:
źródło
R , 58 bajtów
Wypróbuj online!
Pobiera
M
jakolist
wektoryc()
; więc zastąpienie[[
zelist(
,[
zec(
i]
ze)
powinien przekształcić przypadków testowych do przypadków testowych R.W przypadku danych wejściowych
n<=4
z „niezdefiniowanym zachowaniem” zwraca wartość,NULL
a dla innych nieprawidłowych danych wejściowych wyrzuca błąd „poza indeksem”.źródło
[n]
zamiast[[n]]
.Stax ,
121413 bajtówUruchom i debuguj
Wyjaśnienie:
Stax, 12 bajtów
Rozpakowane:
To jest blok, więc mogę się go pozbyć
]|u
, ale nie wiem, czy jest to poprawne, ponieważ pakuje blok.źródło
J ,
3322 bajtów-11 bajtów (1/3 mniej) dzięki rozwiązaniu FrownyFrog!
Wypróbuj online!
Moje wstępne rozwiązanie:
J , 33 bajty
Nie jestem szczęśliwy - jestem pewien, że można grać w golfa znacznie dalej.
Wyjaśnienie:
Funkcja dyadyczna, przyjmująca stan schowka jako swój argument, lewy argument to
n
<:@[
odejmij 1 od lewego argumentu{
wybierai
element th (obliczony powyżej) z listy po prawej stronie(...)
cała lista#
Kopiuj]
z listy stanu schowka(1<#)
podlisty o długości większej niż 1|.&.>
obróć każdą skopiowaną podlistę<"0@;
raze and box - umieszcza każdą liczbę w osobnym polu,
dołącz nową listę do listy stanu schowka@]
czyni cały czasownik w (...) monadycznymWypróbuj online!
źródło
0;
Najbardziej lubię . Dzięki!V + coreutils ,
53 45 43 4240 bajtów-9 bajty dzięki DJMcMayhem (przy użyciu
VGÇ /d
ponad:,$g/^[^ ]*$/d
,D@"dd
ponad"aDÀdd
i!!
powyżej:.!
)!Moja pierwsza próba V (porady mile widziane!), Poniższy kod używa kółka (np.
ⓞ
Dla\xf
) dla czytelności:Wypróbuj online!
Hexdump
Wyjaśnienie
Pierwszy wiersz zawiera n, a poniższe wiersze zawierają wpisy schowka, każdy wpis jest oddzielony spacjami, jeśli było wiele danych wejściowych:
źródło
Czerwony , 91 bajtów
Wypróbuj online!
źródło
C (gcc) , 176 bajtów
Wypróbuj online!
Bierze tablicę jako listę 4 par wskaźników początek / koniec, a następnie n.
Opis:
źródło